From 959ef3dc4eabbf57062db598cf920cee1ec0e152 Mon Sep 17 00:00:00 2001 From: zhuoda Date: Thu, 2 Sep 2021 21:34:21 +0800 Subject: [PATCH] 2.0 alpha --- .gitignore | 12 + README.md | 1 - .../go-api/readme.md | 0 .../index.js => admin-api/java-api/README.md | 0 admin-api/java-api/pom.xml | 401 + .../service}/SmartAdminApplication.java | 15 +- .../service/common/anno/NoNeedLogin.java | 13 +- .../service/common/anno/NoRepeatSubmit.java | 29 + .../service/common/anno/NoValidPrivilege.java | 14 + .../DepartmentResponseCodeConst.java | 4 +- .../codeconst}/EmployeeResponseCodeConst.java | 21 +- .../codeconst/FileResponseCodeConst.java | 47 + .../codeconst}/LoginResponseCodeConst.java | 6 +- .../codeconst}/PositionResponseCodeConst.java | 6 +- .../PrivilegeResponseCodeConst.java | 12 +- .../common/codeconst/ResponseCodeConst.java | 111 + .../codeconst/ResponseCodeContainer.java | 73 + .../codeconst/ResponseCodeRegister.java | 30 + .../codeconst}/RoleResponseCodeConst.java | 6 +- .../service/common/constant}/BaseEnum.java | 17 +- .../common/constant/CacheModuleBaseConst.java | 63 + .../service/common/constant/CommonConst.java | 150 + .../service/common/constant/GenderEnum.java | 52 + .../common/constant/RedisKeyConst.java | 27 + .../common/constant/SwaggerTagConst.java | 55 + .../constant/SystemEnvironmentEnum.java | 14 +- .../controller/AdminBaseController.java | 15 + .../controller/SupportBaseController.java | 14 + .../service/common/domain/PageBaseDTO.java | 52 + .../service}/common/domain/PageResultDTO.java | 7 +- .../service}/common/domain/ResponseDTO.java | 48 +- .../service/common/excel/ExcelStyle.java | 183 + .../exception/SmartBusinessException.java | 20 +- .../json/BigDecimalNullZeroSerializer.java | 26 + .../common/json/FileKeySerializer.java | 42 + .../common/json/FileKeyVoSerializer.java | 43 + .../security/SmartSecurityMetadataSource.java | 114 + .../security/SmartSecurityNoLoginUrl.java | 72 + .../common/swagger}/ApiModelPropertyEnum.java | 18 +- .../swagger/ApiModelPropertyEnumPlugin.java | 46 +- .../validator/BigDecimalSymbolEnum.java | 4 +- .../validator}/BigDecimalValidator.java | 6 +- .../common/validator}/CheckBigDecimal.java | 4 +- .../service/common/validator}/CheckEnum.java | 7 +- .../common/validator/CheckEnumValidator.java | 7 +- .../common/validator}/ValidateList.java | 4 +- .../service/config/SecurityConfig.java | 113 + .../service/config/SecurityMethodConfig.java | 35 + .../config/SecurityNoLoginUrlConfig.java | 24 + .../service/config/SmartAsyncConfig.java | 66 + .../service/config/SmartCacheConfig.java | 63 + .../service/config/SmartCaptchaConfig.java | 50 +- .../SmartConverterStringToLocalDate.java | 34 + .../SmartConverterStringToLocalDateTime.java | 37 + .../config/SmartDruidDataSourceConfig.java | 99 +- .../service/config/SmartHeartBeatConfig.java | 40 + .../config/SmartMybatisPlusConfig.java | 30 + .../service}/config/SmartRedisConfig.java | 11 +- .../service/config/SmartRedisMqConfig.java | 68 + .../config/SmartRepeatSubmitAspectConfig.java | 43 + .../SmartResponseEncryptAspectConfig.java | 45 + .../config/SmartRestTemplateConfig.java | 126 + .../service/config/SmartSchedulingConfig.java | 51 + .../SmartSerializerLocalDateTimeConfig.java | 31 + .../config/SmartStorageCloudConfig.java | 64 + .../SmartSwaggerDynamicGroupConfig.java | 143 +- .../SmartSystemEnvNotProdCondition.java | 35 + .../service/config/SmartWebAppConfig.java | 48 + .../service/filters/SmartTokenFilter.java | 66 + .../handler/AuthenticationFailHandler.java | 39 + .../handler/SmartGlobalExceptionHandler.java | 104 + .../BusinessAuthorityInterceptor.java | 60 + .../SupportAuthorityInterceptor.java | 54 + .../listener/SmartAdminStartupRunner.java | 29 + .../business/category/CategoryController.java | 57 + .../module/business/category/CategoryDao.java | 50 + .../category/CategoryQueryService.java | 333 + .../business/category/CategoryService.java | 207 + .../category/constant/CategoryTypeEnum.java | 54 + .../category/domain/CategoryAddDTO.java | 14 + .../category/domain/CategoryBaseDTO.java | 44 + .../category/domain/CategoryEntity.java | 63 + .../category/domain/CategorySimpleDTO.java | 26 + .../category/domain/CategoryTreeQueryDTO.java | 24 + .../category/domain/CategoryTreeVO.java | 25 + .../category/domain/CategoryUpdateDTO.java | 20 + .../business/category/domain/CategoryVO.java | 23 + .../business/category/package-info.java | 5 + .../business/goods/GoodsController.java | 64 + .../module/business/goods/GoodsDao.java | 39 + .../module/business/goods/GoodsManager.java | 16 + .../module/business/goods/GoodsService.java | 146 + .../goods/constant/GoodsTypeEnum.java | 54 + .../business/goods/domain/GoodsAddDTO.java | 20 + .../business/goods/domain/GoodsAdminVO.java | 26 + .../module/business/goods/domain/GoodsBO.java | 36 + .../business/goods/domain/GoodsBaseDTO.java | 60 + .../business/goods/domain/GoodsDelDTO.java | 29 + .../business/goods/domain/GoodsEntity.java | 77 + .../business/goods/domain/GoodsQueryDTO.java | 36 + .../business/goods/domain/GoodsUpdateDTO.java | 20 + .../business/notice/NoticeController.java | 73 +- .../module/business/notice/NoticeManage.java | 86 + .../module/business/notice/NoticeService.java | 215 + .../module/business/notice/dao/NoticeDao.java | 112 + .../notice/dao/NoticeReceiveRecordDao.java | 11 +- .../notice/domain/dto/NoticeAddDTO.java | 12 +- .../notice/domain/dto/NoticeQueryDTO.java | 29 + .../notice/domain/dto/NoticeReadCountDTO.java | 21 + .../notice/domain/dto/NoticeReceiveDTO.java | 33 + .../domain/dto/NoticeReceiveQueryDTO.java | 20 + .../notice/domain/dto/NoticeUpdateDTO.java | 16 + .../notice/domain/entity/NoticeEntity.java | 58 + .../entity/NoticeReceiveRecordEntity.java | 45 + .../notice/domain/vo/NoticeDetailVO.java | 23 + .../business/notice/domain/vo/NoticeVO.java | 34 + .../cache/AbstractCaffeineCache.java | 220 + .../beancache/cache/AbstractDisableCache.java | 119 + .../support/beancache/cache/IBeanCache.java | 128 + .../support/beancache/domain/CacheClear.java | 18 + .../support/beancache/domain/CacheData.java | 23 + .../beancache/domain/CacheStatsVO.java | 56 + .../support/beancache/key/CacheKey.java | 94 + .../beancache/key/CacheKeyBuilder.java | 25 + .../support/beancache/load/CacheLoad.java | 26 + .../beancache/load/CacheLoadMethod.java | 29 + .../support/beanrecord/BeanRecordService.java | 460 + .../support/beanrecord/OperateTypeEnum.java | 32 + .../annotation/FieldBigDecimalValue.java | 17 + .../beanrecord/annotation/FieldDoc.java | 22 + .../beanrecord/annotation/FieldEnumValue.java | 21 + .../beanrecord/annotation/FieldSqlValue.java | 36 + .../support/captcha/CaptchaController.java | 35 + .../support/captcha/CaptchaService.java | 98 + .../support/captcha/domain/CaptchaDTO.java | 24 + .../support/captcha/domain/CaptchaVO.java | 20 + .../support/captcha/render/CaptchaColor.java | 10 +- .../support/captcha/render/CaptchaNoise.java | 21 +- .../captcha/render/CaptchaWordRenderer.java | 22 +- .../datatracer/DataTracerController.java | 37 + .../support/datatracer/DataTracerDao.java | 37 + .../support/datatracer/DataTracerManger.java | 15 + .../support/datatracer/DataTracerService.java | 116 + .../constant/DataTracerBusinessTypeEnum.java | 37 + .../constant/DataTracerOperateTypeEnum.java | 42 + .../datatracer/domain/DataTracerDTO.java | 48 + .../datatracer/domain/DataTracerEntity.java | 74 + .../domain/DataTracerExtraDataDTO.java | 34 + .../domain/DataTracerQueryForm.java | 28 + .../datatracer/domain/DataTracerVO.java | 46 + .../support/datatracer/package-info.java | 6 + .../module/support/file/FileController.java | 90 + .../service/module/support/file/FileDao.java | 44 + .../support/file/domain/FileEntity.java | 65 + .../file/domain/FileFolderTypeEnum.java | 53 + .../support/file/domain/dto/FileDTO.java | 15 +- .../file/domain/dto/FileDownloadDTO.java | 25 + .../file/domain/dto/FileMetadataDTO.java | 28 + .../support/file/domain/dto/FileQueryDTO.java | 27 + .../file/domain/dto/FileUrlQueryDTO.java | 25 + .../file/domain/dto/FileUrlResultDTO.java | 21 + .../file/domain/dto/FileUrlUploadDTO.java | 39 + .../support/file/domain/vo/FileSimpleVO.java | 21 + .../support/file/domain/vo/FileUploadVO.java | 32 + .../module/support/file/domain/vo/FileVO.java | 45 + .../support/file/service/FileService.java | 334 + .../service/FileStorageCloudServiceImpl.java | 208 + .../service/FileStorageLocalServiceImpl.java | 144 + .../file/service/IFileStorageService.java | 310 + .../heartbeat/HeartBeatController.java | 31 + .../support/heartbeat/HeartBeatRecordDao.java | 18 +- .../heartbeat/HeartBeatRecordEntity.java | 32 +- .../heartbeat/HeartBeatRecordHandler.java | 37 + .../support/heartbeat/HeartBeatRecordVO.java | 11 +- .../support/heartbeat/HeartBeatService.java | 33 + .../core/AbstractHeartBeatManager.java | 20 +- .../heartbeat/core}/HeartBeatConfig.java | 10 +- .../heartbeat/core/HeartBeatLogger.java | 15 + .../heartbeat/core/HeartBeatManager.java | 54 + .../heartbeat/core}/HeartBeatRecordDTO.java | 4 +- .../heartbeat/core}/HeatBeatRecordHelper.java | 19 +- .../core/IHeartBeatRecordHandler.java | 16 + .../idgenerator/IdGeneratorController.java | 39 + .../support/idgenerator/IdGeneratorDao.java | 32 + .../idgenerator/IdGeneratorService.java | 147 + .../idgenerator/constant/IdGeneratorEnum.java | 45 + .../constant/IdGeneratorRuleTypeEnum.java | 9 +- .../idgenerator/domain/IdGeneratorEntity.java | 68 + .../domain/IdGeneratorLastNumberDTO.java | 17 + .../domain/IdGeneratorRecordDTO.java | 31 + .../support/operatelog}/OperateLog.java | 9 +- .../operatelog/OperateLogController.java | 44 + .../support/operatelog/OperateLogDao.java | 28 +- .../support/operatelog/OperateLogService.java | 86 + .../operatelog/SmartOperateLogAspect.java | 273 + .../operatelog/domain/OperateLogEntity.java | 35 +- .../operatelog/domain/dto/OperateLogDTO.java | 17 +- .../domain/dto/OperateLogQueryDTO.java | 13 +- .../domain/dto/SmartOperateLogConfigDTO.java | 51 + .../domain/dto/SmartOperateLogUserDTO.java | 29 + .../module/support/redismq/RedisMqHandle.java | 20 + .../support/redismq/RedisMqTopicEnum.java | 46 + .../module/support/redismq/RedisMsgDTO.java | 25 + .../support/redismq/RedisMsgHandler.java | 79 + .../support/redismq/RedisMsgTypeEnum.java | 47 + .../repeatsubmit/SmartRepeatSubmitAspect.java | 85 + .../SmartRepeatSubmitUserDTO.java | 30 + .../support/responseencrypt/DecryptDTO.java | 15 + .../responseencrypt/ResponseDecrypt.java | 17 + .../responseencrypt/ResponseEncrypt.java | 17 + .../ResponseEncryptDecryptAspect.java | 118 + .../ResponseEncryptDecryptUserDTO.java | 29 + .../systemconfig/SystemConfigConst.java | 79 + .../systemconfig/SystemConfigController.java | 57 + .../support/systemconfig/SystemConfigDao.java | 38 + .../systemconfig/SystemConfigService.java | 203 + .../domain}/SystemConfigAddDTO.java | 9 +- .../systemconfig/domain}/SystemConfigDTO.java | 25 +- .../domain}/SystemConfigEntity.java | 23 +- .../domain/SystemConfigQueryDTO.java | 24 + .../domain/SystemConfigUpdateDTO.java | 23 + .../systemconfig/domain}/SystemConfigVO.java | 22 +- .../module/system/datascope}/DataScope.java | 23 +- .../system/datascope/DataScopeController.java | 32 +- .../system/datascope/DataScopeRoleDao.java | 11 +- .../system/datascope/MyBatisPlugin.java | 56 +- .../datascope/constant/DataScopeTypeEnum.java | 19 +- .../constant/DataScopeViewTypeEnum.java | 46 + .../constant/DataScopeWhereInTypeEnum.java | 18 +- .../domain/dto/DataScopeAndViewTypeVO.java | 9 +- .../domain/dto/DataScopeBatchSetDTO.java | 9 +- .../domain/dto/DataScopeBatchSetRoleDTO.java | 9 +- .../datascope/domain/dto/DataScopeDTO.java | 9 +- .../domain/dto/DataScopeSelectVO.java | 9 +- .../domain/dto/DataScopeSqlConfigDTO.java | 15 +- .../domain/dto/DataScopeViewTypeVO.java | 9 +- .../domain/entity/DataScopeRoleEntity.java | 50 + .../datascope/service/DataScopeService.java | 33 +- .../service/DataScopeSqlConfigService.java | 47 +- .../service/DataScopeViewService.java | 55 +- .../strategy/DataScopePowerStrategy.java | 22 + .../department/DepartmentCacheService.java | 71 + .../department/DepartmentController.java | 105 + .../system/department/DepartmentDao.java | 15 +- .../system/department/DepartmentManager.java | 31 + .../system/department/DepartmentService.java | 522 + .../department/DepartmentTreeService.java | 137 + .../domain/dto/DepartmentCreateDTO.java | 14 +- .../domain/dto/DepartmentUpdateDTO.java | 9 +- .../domain/entity/DepartmentEntity.java | 70 + .../domain/vo/DepartmentEmployeeTreeVO.java | 22 + .../domain/vo/DepartmentTreeVO.java | 18 + .../department/domain/vo}/DepartmentVO.java | 25 +- .../system/employee/EmployeeCacheService.java | 81 + .../system/employee/EmployeeController.java | 118 + .../module/system/employee/EmployeeDao.java | 169 + .../system/employee/EmployeeManager.java | 78 + .../system/employee/EmployeeService.java | 514 + .../employee/domain/dto/EmployeeAddDTO.java | 56 + .../employee/domain/dto/EmployeeDTO.java | 43 + .../dto/EmployeeDepartmentUpdateDTO.java | 28 + .../domain/dto/EmployeeDisabledUpdateDTO.java | 28 + .../employee/domain/dto/EmployeeLoginDTO.java | 36 + .../employee/domain/dto/EmployeeQueryDTO.java | 36 + .../domain/dto/EmployeeQueryExportDTO.java | 16 +- .../domain/dto/EmployeeRoleUpdateDTO.java | 15 +- .../domain/dto/EmployeeUpdateDTO.java | 20 + .../domain/dto/EmployeeUpdatePwdDTO.java | 31 + .../domain/entity/EmployeeEntity.java | 74 + .../system/employee/domain/vo/EmployeeVO.java | 50 + .../system/login/EmployeeLoginController.java | 53 + .../system/login/EmployeeLoginService.java | 143 + .../login/EmployeeLoginTokenService.java | 139 + .../system/login/domain/EmployeeLoginBO.java | 75 + .../login/domain/EmployeeLoginInfoDTO.java | 54 + .../domain/EmployeeLoginPrivilegeDTO.java | 25 + .../system/login/domain/EmployeeLoginVO.java | 27 + .../module/system/menu/MenuController.java | 71 + .../service/module/system/menu/MenuDao.java | 85 + .../system/menu/MenuEmployeeService.java | 156 + .../module/system/menu/MenuManager.java | 65 + .../system/menu/MenuPermissionService.java | 33 + .../module/system/menu/MenuService.java | 338 + .../module/system/menu/RequestUrlService.java | 44 +- .../system/menu/constant/MenuTypeEnum.java | 45 + .../system/menu/domain/MenuAddForm.java | 22 + .../system/menu/domain/MenuBasicDTO.java | 72 + .../module/system/menu/domain/MenuEntity.java | 114 + .../system/menu/domain/MenuLoginBO.java | 33 + .../menu/domain/MenuPointsOperateForm.java | 37 + .../system/menu/domain/MenuSimpleTreeVO.java | 34 + .../module/system/menu/domain/MenuTreeVO.java | 19 + .../system/menu/domain/MenuUpdateForm.java | 27 + .../module/system/menu/domain/MenuVO.java | 29 + .../system/menu/domain/RequestUrlVO.java | 23 + .../system/role/basic/RoleController.java | 18 +- .../module/system/role/basic/RoleDao.java | 11 +- .../module/system/role/basic/RoleService.java | 49 +- .../role/basic/domain/dto/RoleAddDTO.java | 2 +- .../role/basic/domain/dto/RoleQueryDTO.java | 20 + .../role/basic/domain/dto/RoleUpdateDTO.java | 2 +- .../role/basic/domain/entity/RoleEntity.java | 37 + .../role/basic/domain/vo/RoleSelectedVO.java | 16 + .../system/role/basic/domain/vo}/RoleVO.java | 9 +- .../roleemployee/RoleEmployeeController.java | 31 +- .../role/roleemployee/RoleEmployeeDao.java | 34 +- .../roleemployee/RoleEmployeeManager.java | 33 + .../roleemployee/RoleEmployeeService.java | 155 + .../domain/RoleEmployeeBatchDTO.java | 13 +- .../roleemployee/domain/RoleEmployeeDTO.java | 16 + .../domain/RoleEmployeeEntity.java | 37 + .../role/rolemenu/RoleMenuController.java | 39 + .../system/role/rolemenu/RoleMenuDao.java | 39 + .../system/role/rolemenu/RoleMenuManager.java | 35 + .../system/role/rolemenu/RoleMenuService.java | 106 + .../role/rolemenu/domain/RoleMenuDTO.java | 31 + .../role/rolemenu/domain/RoleMenuEntity.java | 46 + .../role/rolemenu/domain/RoleMenuTreeVO.java | 26 + .../third/SmartApplicationContext.java | 30 +- .../service}/third/SmartRedisService.java | 135 +- .../smartadmin/service/util/SmartAesUtil.java | 104 + .../service/util/SmartBaseEnumUtil.java | 121 + .../service}/util/SmartBeanUtil.java | 2 +- .../service}/util/SmartBigDecimalUtil.java | 2 +- .../service/util/SmartCollectionUtil.java | 78 + .../service}/util/SmartDateUtil.java | 6 +- .../service/util/SmartDigestUtil.java | 27 + .../service}/util/SmartEasyPoiExcelUtil.java | 32 +- .../service/util/SmartEmployeeTokenUtil.java | 31 + .../service}/util/SmartFileUtil.java | 21 +- .../service}/util/SmartHttpUtil.java | 9 +- .../smartadmin/service}/util/SmartIPUtil.java | 37 +- .../service/util/SmartPageUtil.java | 144 + .../service/util/SmartRandomUtil.java | 181 + .../service/util/SmartSecurityUtil.java | 80 + .../service}/util/SmartStringUtil.java | 2 +- .../service}/util/SmartThreadFactory.java | 2 +- .../service}/util/SmartVerificationUtil.java | 5 +- .../util/date/SmartDateFormatterEnum.java | 78 + .../service/util/date/SmartLocalDateUtil.java | 121 + .../service}/util/excel/SmartExcel.java | 10 +- .../util/excel/SmartExcelFileType.java | 10 + .../service}/util/excel/SmartExcelReader.java | 11 +- .../service}/util/excel/SmartSheet.java | 4 +- .../java-api}/src/main/resources/banner.txt | 8 +- .../main/resources/dev/application.properties | 98 + .../src/main/resources/dev/log4j2.xml | 2 + .../src/main/resources/dev/spy.properties | 0 .../business/category/CategoryMapper.xml | 43 + .../mapper/business/goods/GoodsMapper.xml | 51 + .../mapper/business/notice/NoticeMapper.xml | 32 +- .../notice/NoticeReceiveRecordMapper.xml | 4 +- .../mapper/support/DataTracerMapper.xml | 25 + .../resources/mapper/support/FileMapper.xml | 32 + .../mapper/support}/HeartBeatRecordMapper.xml | 13 +- .../mapper/support/IdGeneratorMapper.xml | 21 + .../mapper/support/OperateLogMapper.xml | 9 +- .../mapper/support/SystemConfigMapper.xml | 25 + .../system/datascope/DataScopeRoleMapper.xml | 4 +- .../system/department/DepartmentMapper.xml | 41 + .../mapper/system/employee/EmployeeMapper.xml | 158 + .../mapper/system/menu/MenuMapper.xml | 76 + .../mapper/system/role/RoleEmployeeMapper.xml | 108 +- .../mapper/system/role/RoleMapper.xml | 4 +- .../mapper/system/role/RoleMenuMapper.xml | 18 + admin-web/typescript-ant-design-vue/.env | 2 + .../.env.development | 7 + .../typescript-ant-design-vue/.env.localhost | 7 + admin-web/typescript-ant-design-vue/.env.pre | 8 + .../typescript-ant-design-vue/.env.production | 6 + admin-web/typescript-ant-design-vue/.env.sit | 7 + .../typescript-ant-design-vue/.eslintignore | 17 + .../typescript-ant-design-vue/.eslintrc.js | 76 + .../typescript-ant-design-vue/.gitignore | 6 + .../typescript-ant-design-vue/.prettierrc.js | 21 + .../.stylelintignore | 3 + .../typescript-ant-design-vue/.stylelintrc.js | 70 + .../typescript-ant-design-vue/README.en.md | 36 + admin-web/typescript-ant-design-vue/README.md | 0 .../typescript-ant-design-vue/index.html | 24 + .../package-lock.json | 5012 +++++ .../typescript-ant-design-vue/package.json | 68 + .../postcss.config.js | 6 +- .../public/favicon.ico | Bin .../public/images/1024lab-gzh.jpg | Bin 0 -> 27898 bytes .../public/images/ali-icon.png | Bin 0 -> 7011 bytes .../public/images/google-icon.png | Bin 0 -> 6228 bytes .../public/images/login-bg.png | Bin 0 -> 1787654 bytes .../images/login-form-open-eyes-close.png | Bin 0 -> 4914 bytes .../public/images/login-form-open-eyes.png | Bin 0 -> 6557 bytes .../public/images/login-person.png | Bin 0 -> 100798 bytes .../public/images/login-qr.png | Bin 0 -> 11297 bytes .../public}/images/logo-min.png | Bin .../public/images/logo.png | Bin 0 -> 6053 bytes .../public/images/qq-icon.png | Bin 0 -> 5353 bytes .../public/images/wechat-icon.png | Bin 0 -> 6657 bytes .../public/images/weibo-icon.png | Bin 0 -> 7799 bytes .../typescript-ant-design-vue/src/App.vue | 50 + .../src/api/base-model/page-param-model.ts | 35 + .../src/api/base-model/page-result-model.ts | 50 + .../src/api/base-model/response-model.ts | 30 + .../src/api/base-model/sort-item-model.ts | 24 + .../src/api/business/category/category-api.ts | 38 + .../category/model/category-add-form.ts | 43 + .../model/category-tree-query-form.ts | 19 + .../category/model/category-tree-vo.ts | 49 + .../category/model/category-update-form.ts | 49 + .../business/category/model/category-vo.ts | 61 + .../src/api/business/file/file-api.ts | 19 + .../api/business/file/model/file-upload-vo.ts | 38 + .../src/api/business/goods/goods-api.ts | 30 + .../business/goods/model/goods-add-form.ts | 67 + .../business/goods/model/goods-admin-vo.ts | 93 + .../api/business/goods/model/goods-del-dto.ts | 13 + .../business/goods/model/goods-query-dto.ts | 60 + .../business/goods/model/goods-update-form.ts | 73 + .../src/api/business/goods/model/goods-vo.ts | 25 + .../src/api/business/goods/model/goods.ts | 15 + .../api/system/department/department-api.ts | 66 + .../department/model/department-create-dto.ts | 32 + .../department/model/department-simple-vo.ts | 30 + .../department/model/department-tree-vo.ts | 63 + .../department/model/department-update-dto.ts | 36 + .../system/department/model/department-vo.ts | 59 + .../src/api/system/employee/employee-api.ts | 102 + .../system/employee/model/employee-add-dto.ts | 50 + .../model/employee-department-update-dto.ts | 22 + .../employee/model/employee-query-dto.ts | 45 + .../employee/model/employee-update-dto.ts | 54 + .../api/system/employee/model/employee-vo.ts | 71 + .../src/api/system/home/home-api.ts | 30 + .../home/model/home-amount-statistics-vo.ts | 22 + .../home/model/home-employee-order-vo.ts | 24 + .../home/model/home-employee-receive-vo.ts | 24 + .../model/home-employee-sale-target-vo.ts | 28 + .../system/home/model/home-wait-handle-vo.ts | 40 + .../src/api/system/login/login-model.ts | 40 + .../src/api/system/login/login.ts | 30 + .../system/login/model/employee-login-vo.ts | 84 + .../src/api/system/menu/menu-api.ts | 59 + .../api/system/menu/model/menu-add-form.ts | 83 + .../menu/model/menu-points-operate-form.ts | 42 + .../system/menu/model/menu-simple-tree-vo.ts | 46 + .../src/api/system/menu/model/menu-tree-vo.ts | 100 + .../api/system/menu/model/menu-update-form.ts | 88 + .../src/api/system/menu/model/menu-vo.ts | 103 + .../src/api/system/menu/model/models.ts | 3 + .../api/system/menu/model/request-url-vo.ts | 28 + .../system/role-menu/modal/role-menu-dto.ts | 24 + .../role-menu/modal/role-menu-tree-vo.ts | 38 + .../src/api/system/role-menu/role-menu-api.ts | 30 + .../role/model/data-scope-and-view-type-vo.ts | 37 + .../role/model/data-scope-batch-set-dto.ts | 24 + .../model/data-scope-batch-set-role-dto.ts | 25 + .../system/role/model/data-scope-select-vo.ts | 24 + .../role/model/data-scope-view-type-vo.ts | 28 + .../src/api/system/role/model/role-add-dto.ts | 24 + .../role/model/role-employee-batch-dto.ts | 24 + .../api/system/role/model/role-query-dto.ts | 49 + .../api/system/role/model/role-update-dto.ts | 28 + .../src/api/system/role/model/role-vo.ts | 28 + .../src/api/system/role/role-api.ts | 119 + .../src/assets/img}/logo.png | Bin .../src/assets/logo.png | Bin 0 -> 6849 bytes .../src/components/HelloWorld.vue | 70 + .../components/category-tree-select/index.vue | 93 + .../department-tree-select/index.vue | 72 + .../src/components/employee-select/index.vue | 80 + .../menu-location-breadcrumb/index.vue | 31 + .../src/components/recursion-menu/index.vue | 115 + .../components/recursion-menu/sub-menu.vue | 56 + .../school-department-select/index.vue | 96 + .../select-employee-modal/index.vue | 177 + .../side-expand/side-menu/index.vue | 61 + .../side-expand/side-menu/recursion-menu.vue | 87 + .../side-expand/side-menu/sub-menu.vue | 56 + .../side-expand/side-menu/top-menu.vue | 113 + .../src/components/side-menu/index.less | 38 + .../src/components/side-menu/index.vue | 69 + .../components/smart-area-cascader/index.vue | 87 + .../province-city-district.ts | 17546 ++++++++++++++++ .../smart-area-cascader/province-city.ts | 1727 ++ .../smart-area-cascader/smart-area-option.ts | 14 + .../components/smart-boolean-select/index.vue | 73 + .../components/smart-enum-select/index.vue | 71 + .../src/components/smart-loading/index.ts | 21 + .../components/smart-table-operator/index.vue | 60 + .../src/components/upload/index.vue | 160 + .../src/config/app-config.ts | 38 + .../src/config/project-config.ts | 27 + .../src/constants/business/category.ts | 22 + .../src/constants/business/file.ts | 30 + .../src/constants/business/goods.ts | 23 + .../src/constants/common.ts | 38 + .../src/constants/index.ts | 22 + .../src/constants/regular.ts | 26 + .../src/constants/system/employee.ts | 28 + .../src/constants/system/local-storage-key.ts | 25 + .../src/constants/system/menu/menu-enum.ts | 25 + .../src/i18n/index.ts | 19 + .../src/i18n/lang/en-US/account.js | 5 + .../src/i18n/lang/en-US/account/settings.js | 62 + .../src/i18n/lang/en-US/dashboard.js | 5 + .../src/i18n/lang/en-US/dashboard/analysis.js | 36 + .../src/i18n/lang/en-US/form.js | 5 + .../src/i18n/lang/en-US/form/basicForm.js | 61 + .../src/i18n/lang/en-US/global.js | 6 + .../src/i18n/lang/en-US/index.js | 35 + .../src/i18n/lang/en-US/menu.js | 39 + .../src/i18n/lang/en-US/result.js | 7 + .../src/i18n/lang/en-US/result/fail.js | 11 + .../src/i18n/lang/en-US/result/success.js | 19 + .../src/i18n/lang/en-US/setting.js | 29 + .../src/i18n/lang/en-US/user.js | 45 + .../src/i18n/lang/zh-CN/account.js | 5 + .../src/i18n/lang/zh-CN/account/settings.js | 57 + .../src/i18n/lang/zh-CN/dashboard.js | 5 + .../src/i18n/lang/zh-CN/dashboard/analysis.js | 36 + .../src/i18n/lang/zh-CN/form.js | 5 + .../src/i18n/lang/zh-CN/form/basicForm.js | 58 + .../src/i18n/lang/zh-CN/global.js | 6 + .../src/i18n/lang/zh-CN/index.ts | 34 + .../src/i18n/lang/zh-CN/menu.js | 39 + .../src/i18n/lang/zh-CN/result.js | 7 + .../src/i18n/lang/zh-CN/result/fail.js | 10 + .../src/i18n/lang/zh-CN/result/success.js | 19 + .../src/i18n/lang/zh-CN/setting.js | 29 + .../src/i18n/lang/zh-CN/user.js | 43 + .../layout/components/smart-footer/index.vue | 44 + .../smart-header-user-space/header-avatar.vue | 96 + .../smart-header-user-space/header-notice.vue | 111 + .../smart-header-user-space/i18n-selector.vue | 39 + .../smart-header-user-space/index.vue | 47 + .../smart-header/components/header-avatar.vue | 73 + .../smart-header/components/header-notice.vue | 123 + .../smart-header/components/header-search.vue | 91 + .../layout/components/smart-header/index.less | 92 + .../layout/components/smart-header/index.vue | 150 + .../components/smart-page-tag/index.vue | 236 + .../src/layout/smart-layout.vue | 23 + .../src/layout/smart-parent-view.vue | 3 + .../src/layout/smart-side-expand-layout.vue | 160 + .../src/layout/smart-side-layout.vue | 175 + .../src/lib/axios.ts | 116 + .../src/lib/smart-sentry.ts | 22 + .../src/lib/smart-wartermark.ts | 93 + .../typescript-ant-design-vue/src/main.ts | 34 + .../src/plugins/smart-enums-plugin.ts | 77 + .../src/router/index.ts | 145 + .../src/router/routers.ts | 9 + .../src/router/system/home.ts | 38 + .../src/router/system/login.ts | 20 + .../src/shims-vue.d.ts | 27 + .../src/store/index.ts | 3 + .../src/store/modules/model/UserTagNav.ts | 36 + .../src/store/modules/system/app-config.ts | 52 + .../store/modules/system/project-config.ts | 13 + .../src/store/modules/system/role.ts | 98 + .../src/store/modules/system/spin.ts | 17 + .../src/store/modules/system/user.ts | 160 + .../src/theme/index.less | 87 + .../src/theme/smart-admin.less | 84 + .../src/types/config.d.ts | 65 + .../src/types/env.d.ts | 18 + .../src/types/smart-enum.d.ts | 28 + .../src/types/user.d.ts | 44 + .../src/utils/cookie-util.ts | 27 + .../src/utils/local-util.ts | 16 + .../goods/components/goods-operate-modal.vue | 167 + .../src/views/business/goods/goods-list.vue | 243 + .../components/category-operate-modal.vue | 116 + .../components/category-tree-table.vue | 156 + .../views/business/setting/demo-setting.vue | 11 + .../views/business/setting/goods-setting.vue | 11 + .../child-department-list/index.vue | 59 + .../components/department-tree/index.vue | 268 + .../components/employee-list/index.vue | 308 + .../operate-department-modal/index.vue | 146 + .../operate-employee-modal/index.vue | 227 + .../index.vue | 96 + .../employee/department/department-mitt.ts | 13 + .../system/employee/department/index.vue | 73 + .../components/operate-role-modal/index.vue | 119 + .../role/components/role-data-scope/index.vue | 150 + .../components/role-employee-list/index.vue | 226 + .../role/components/role-list/index.vue | 108 + .../role/components/role-setting/index.vue | 50 + .../role/components/role-tree/index.less | 78 + .../role/components/role-tree/index.vue | 79 + .../role-tree/role-tree-checkbox.vue | 54 + .../components/role-tree/role-tree-menu.vue | 71 + .../components/role-tree/role-tree-point.vue | 43 + .../src/views/system/employee/role/index.vue | 53 + .../views/system/home/components/gauge.vue | 117 + .../src/views/system/home/index.less | 68 + .../src/views/system/home/index.vue | 258 + .../src/views/system/login/login.less | 152 + .../src/views/system/login/login.vue | 128 + .../menu/components/menu-operate-modal.vue | 280 + .../menu/components/menu-tree-select.vue | 73 + .../system/menu/menu-list-table-columns.ts | 72 + .../src/views/system/menu/menu-list.vue | 402 + .../src/vite-env.d.ts | 1 + .../typescript-ant-design-vue/tsconfig.json | 42 + .../typescript-ant-design-vue/vite.config.ts | 70 + smart-admin-h5/.browserslistrc | 2 - smart-admin-h5/.editorconfig | 15 - smart-admin-h5/.env.development | 3 - smart-admin-h5/.env.local | 3 - smart-admin-h5/.env.pre | 3 - smart-admin-h5/.env.prod | 3 - smart-admin-h5/.env.sit | 3 - smart-admin-h5/.eslintignore | 7 - smart-admin-h5/.eslintrc.js | 232 - smart-admin-h5/.gitignore | 22 - smart-admin-h5/.postcssrc.js | 11 - smart-admin-h5/.prettierrc.js | 31 - smart-admin-h5/.sentryclirc | 7 - smart-admin-h5/README.md | 4 - smart-admin-h5/babel.config.js | 16 - smart-admin-h5/package.json | 58 - smart-admin-h5/public/index.html | 47 - smart-admin-h5/src/App.vue | 16 - smart-admin-h5/src/api/employee.js | 43 - smart-admin-h5/src/api/file.js | 14 - smart-admin-h5/src/api/login.js | 10 - smart-admin-h5/src/api/system-config.js | 31 - smart-admin-h5/src/api/user.js | 7 - smart-admin-h5/src/assets/css/index.scss | 5 - .../employee/department-employee-selector.vue | 121 - .../select-picker/SmartEnumSelectPicker.vue | 61 - .../form/select-picker/SmartSelectPicker | 59 - .../src/components/mixin/session-mixin.js | 25 - .../src/components/van-bar/BackNavBar.vue | 24 - .../src/components/van-bar/RouterNavBar.vue | 27 - smart-admin-h5/src/config/index.js | 46 - smart-admin-h5/src/constants/area.js | 4047 ---- .../src/constants/erp/contact-company.js | 165 - smart-admin-h5/src/constants/erp/index.js | 6 - smart-admin-h5/src/constants/file.js | 92 - smart-admin-h5/src/constants/index.js | 7 - smart-admin-h5/src/constants/school.js | 71 - smart-admin-h5/src/filters/filter.js | 298 - smart-admin-h5/src/filters/index.js | 5 - smart-admin-h5/src/lib/cookie.js | 21 - smart-admin-h5/src/lib/erp-http.js | 65 - smart-admin-h5/src/lib/http.js | 65 - smart-admin-h5/src/lib/local.js | 8 - smart-admin-h5/src/lib/menu-func.js | 276 - smart-admin-h5/src/lib/printPlugs.js | 133 - smart-admin-h5/src/lib/render-dom.js | 10 - smart-admin-h5/src/lib/smart-sentry.js | 21 - smart-admin-h5/src/lib/util.js | 515 - smart-admin-h5/src/lib/watermark.js | 49 - smart-admin-h5/src/main.js | 62 - smart-admin-h5/src/plugins/smart-sentry.js | 17 - smart-admin-h5/src/plugins/smart.js | 24 - smart-admin-h5/src/plugins/vant.js | 8 - smart-admin-h5/src/router/dashboard/index.js | 42 - smart-admin-h5/src/router/develop/develop.js | 21 - smart-admin-h5/src/router/error/error.js | 26 - smart-admin-h5/src/router/index.js | 150 - smart-admin-h5/src/router/login/login.js | 15 - smart-admin-h5/src/router/router-const.js | 23 - smart-admin-h5/src/router/routers.js | 32 - smart-admin-h5/src/router/user/user.js | 21 - smart-admin-h5/src/store/index.js | 23 - smart-admin-h5/src/store/module/app.js | 32 - smart-admin-h5/src/store/module/user.js | 41 - smart-admin-h5/src/themes/index.scss | 6 - smart-admin-h5/src/utils/index.js | 110 - smart-admin-h5/src/utils/request.js | 58 - smart-admin-h5/src/utils/validate.js | 20 - .../src/views/dashboard/dashboard.vue | 99 - smart-admin-h5/src/views/develop/config.vue | 47 - smart-admin-h5/src/views/error/404.vue | 23 - smart-admin-h5/src/views/login/login.vue | 68 - .../src/views/user/change-password.vue | 76 - smart-admin-h5/src/views/user/index.vue | 79 - smart-admin-h5/vue.config.js | 200 - smart-admin-service/.gitignore | 31 - smart-admin-service/README.md | 17 - smart-admin-service/pom.xml | 349 - .../smart-admin-api/doc/readme.txt | 15 - smart-admin-service/smart-admin-api/pom.xml | 276 - .../smartadmin/common/anno/NoNeedLogin.java | 22 - .../common/anno/NoValidPrivilege.java | 20 - .../common/constant/CommentSortTypeEnum.java | 57 - .../smartadmin/common/constant/JudgeEnum.java | 52 - .../common/constant/ResponseCodeConst.java | 181 - .../common/controller/BaseController.java | 42 - .../smartadmin/common/domain/BaseEntity.java | 39 - .../smartadmin/common/domain/ITask.java | 16 - .../common/domain/OrderItemDTO.java | 16 - .../common/domain/PageParamDTO.java | 33 - .../exception/SmartResponseCodeException.java | 24 - .../common/heartbeat/HeartBeatLogger.java | 20 - .../HeartBeatRecordCommendInterface.java | 17 - .../smartadmin/common/heartbeat/IpUtil.java | 81 - .../common/heartbeat/StringUtil.java | 60 - .../common/json/LongJsonDeserializer.java | 21 - .../common/json/LongJsonSerializer.java | 19 - .../common/reload/SmartReloadManager.java | 134 - .../common/reload/SmartReloadScheduler.java | 87 - .../abstracts/AbstractSmartReloadCommand.java | 66 - .../AbstractSmartReloadCommand4Spring.java | 67 - .../domain/AbstractSmartReloadObject.java | 31 - .../reload/domain/AnnotationReloadObject.java | 44 - .../reload/domain/InterfaceReloadObject.java | 37 - .../reload/domain/entity/ReloadItem.java | 55 - .../domain/entity/SmartReloadResult.java | 102 - .../SmartReloadCommandInterface.java | 38 - .../interfaces/SmartReloadThreadLogger.java | 12 - .../reload/interfaces/SmartReloadable.java | 19 - .../config/SmartAdminWebAppConfig.java | 25 - .../config/SmartHeartBeatConfig.java | 33 - .../config/SmartMybatisPlusConfig.java | 27 - .../smartadmin/config/SmartReloadConfig.java | 45 - .../config/SmartRestTemplateConfig.java | 109 - .../SmartSwaggerApiModelEnumConfig.java | 29 - .../config/SmartWebSocketConfig.java | 25 - .../config/SystemEnvironmentCondition.java | 22 - .../smartadmin/constant/CommonConst.java | 51 - .../constant/SmartReloadTagConst.java | 16 - .../smartadmin/constant/SwaggerTagConst.java | 69 - .../handler/SmartGlobalExceptionHandler.java | 73 - .../handler/SmartOperateLogAspect.java | 167 - .../SmartAuthenticationInterceptor.java | 158 - .../listener/SmartAdminStartupRunner.java | 22 - .../business/email/EmailController.java | 81 - .../business/email/EmailSendStatusEnum.java | 37 - .../module/business/email/EmailService.java | 122 - .../email/domain/dto/EmailConfigDTO.java | 30 - .../business/email/domain/dto/EmailDTO.java | 44 - .../email/domain/dto/EmailQueryDTO.java | 35 - .../business/email/domain/dto/EmailVO.java | 45 - .../email/domain/entity/EmailEntity.java | 40 - .../module/business/log/LogService.java | 75 - .../OrderOperateLogController.java | 44 - .../orderoperatelog/OrderOperateLogDao.java | 30 - .../OrderOperateLogService.java | 64 - .../OrderOperateLogDefaultEmpEnum.java | 37 - .../OrderOperateLogOperateTypeConst.java | 30 - .../OrderOperateLogOrderTypeEnum.java | 51 - .../domain/dto/OrderOperateLogSaveDTO.java | 80 - .../domain/dto/SupplierOrderOperateVO.java | 44 - .../domain/entity/OrderOperateLogEntity.java | 58 - .../domain/vo/OrderOperateLogVO.java | 69 - .../userloginlog/UserLoginLogController.java | 54 - .../log/userloginlog/UserLoginLogDao.java | 47 - .../log/userloginlog/UserLoginLogService.java | 82 - .../userloginlog/domain/UserLoginLogDTO.java | 53 - .../domain/UserLoginLogEntity.java | 60 - .../domain/UserLoginLogQueryDTO.java | 31 - .../UserOperateLogController.java | 50 - .../log/useroperatelog/UserOperateLogDao.java | 47 - .../useroperatelog/UserOperateLogService.java | 91 - .../module/business/notice/NoticeManage.java | 97 - .../module/business/notice/NoticeService.java | 235 - .../module/business/notice/dao/NoticeDao.java | 103 - .../notice/domain/dto/NoticeDetailVO.java | 30 - .../notice/domain/dto/NoticeQueryDTO.java | 34 - .../notice/domain/dto/NoticeReadCountDTO.java | 26 - .../notice/domain/dto/NoticeReceiveDTO.java | 43 - .../domain/dto/NoticeReceiveQueryDTO.java | 25 - .../notice/domain/dto/NoticeUpdateDTO.java | 21 - .../business/notice/domain/dto/NoticeVO.java | 42 - .../notice/domain/entity/NoticeEntity.java | 45 - .../entity/NoticeReceiveRecordEntity.java | 33 - .../peony/controller/PeonyController.java | 88 - .../module/business/peony/dao/PeonyDao.java | 64 - .../peony/domain/dto/PeonyAddDTO.java | 41 - .../peony/domain/dto/PeonyQueryDTO.java | 44 - .../peony/domain/dto/PeonyUpdateDTO.java | 20 - .../peony/domain/entity/PeonyEntity.java | 44 - .../peony/domain/vo/PeonyExcelVO.java | 42 - .../business/peony/domain/vo/PeonyVO.java | 45 - .../business/peony/service/PeonyService.java | 108 - .../constant/SqlOperateTypeEnum.java | 34 - .../support/codegenerator/dao/TableDao.java | 40 - .../domain/CodeGeneratorDTO.java | 56 - .../domain/CodeGeneratorQueryColumnDTO.java | 30 - .../codegenerator/domain/ColumnVO.java | 36 - .../codegenerator/domain/QueryFieldVO.java | 30 - .../service/CodeGeneratorComponent.java | 92 - .../service/CodeGeneratorService.java | 336 - .../module/support/file/FileController.java | 93 - .../module/support/file/FileDao.java | 72 - .../file/constant/FileModuleTypeEnum.java | 47 - .../file/constant/FileResponseCodeConst.java | 37 - .../file/constant/FileServiceNameConst.java | 24 - .../file/constant/FileServiceTypeEnum.java | 52 - .../support/file/domain/dto/FileAddDTO.java | 39 - .../support/file/domain/dto/FileQueryDTO.java | 33 - .../support/file/domain/dto/OSSConfig.java | 35 - .../file/domain/entity/FileEntity.java | 58 - .../module/support/file/domain/vo/FileVO.java | 58 - .../support/file/domain/vo/UploadVO.java | 27 - .../support/file/service/FileService.java | 198 - .../file/service/FileServiceAliYun.java | 182 - .../file/service/FileServiceLocal.java | 123 - .../file/service/FileServiceQiNiuYun.java | 175 - .../support/file/service/IFileService.java | 152 - .../heartbeat/HeartBeatController.java | 32 - .../support/heartbeat/HeartBeatService.java | 90 - .../support/idgenerator/IdGeneratorDao.java | 36 - .../idgenerator/IdGeneratorManager.java | 66 - .../idgenerator/IdGeneratorService.java | 140 - .../idgenerator/constant/IdGeneratorEnum.java | 45 - .../idgenerator/domain/IdGeneratorEntity.java | 45 - .../domain/IdGeneratorLastNumberDTO.java | 38 - .../idgenerator/domain/IdGeneratorPOJO.java | 71 - .../domain/IdGeneratorRecordDTO.java | 22 - .../support/quartz/constant/QuartzConst.java | 17 - .../quartz/constant/TaskResultEnum.java | 47 - .../quartz/constant/TaskStatusEnum.java | 47 - .../quartz/controller/QuartzController.java | 81 - .../support/quartz/dao/QuartzTaskDao.java | 42 - .../support/quartz/dao/QuartzTaskLogDao.java | 35 - .../quartz/domain/dto/QuartzLogQueryDTO.java | 25 - .../quartz/domain/dto/QuartzQueryDTO.java | 16 - .../quartz/domain/dto/QuartzTaskDTO.java | 45 - .../quartz/domain/dto/QuartzTaskLogVO.java | 49 - .../quartz/domain/dto/QuartzTaskVO.java | 45 - .../domain/entity/QuartzTaskEntity.java | 50 - .../domain/entity/QuartzTaskLogEntity.java | 50 - .../support/quartz/service/QuartzTask.java | 85 - .../quartz/service/QuartzTaskLogService.java | 28 - .../quartz/service/QuartzTaskService.java | 349 - .../support/quartz/task/test/Example.java | 28 - .../smartreload/SmartReloadCommand.java | 52 - .../smartreload/SmartReloadController.java | 52 - .../smartreload/SmartReloadService.java | 103 - .../smartreload/dao/ReloadItemDao.java | 15 - .../smartreload/dao/ReloadResultDao.java | 23 - .../domain/dto/ReloadItemUpdateDTO.java | 29 - .../smartreload/domain/dto/ReloadItemVO.java | 46 - .../domain/dto/ReloadResultVO.java | 45 - .../domain/entity/ReloadItemEntity.java | 46 - .../domain/entity/ReloadResultEntity.java | 48 - .../support/websocket/MessageTypeEnum.java | 44 - .../support/websocket/WebSocketServer.java | 199 - .../websocket/domain/MessageCommonDTO.java | 29 - .../support/websocket/domain/MessageDTO.java | 41 - .../domain/WebSocketHeartBeatDTO.java | 23 - .../constant/DataScopeViewTypeEnum.java | 54 - .../domain/entity/DataScopeRoleEntity.java | 33 - .../strategy/DataScopePowerStrategy.java | 24 - .../department/DepartmentController.java | 99 - .../system/department/DepartmentService.java | 285 - .../department/DepartmentTreeService.java | 99 - .../domain/entity/DepartmentEntity.java | 48 - .../system/employee/EmployeeController.java | 103 - .../module/system/employee/EmployeeDao.java | 138 - .../system/employee/EmployeeService.java | 369 - .../employee/constant/EmployeeStatusEnum.java | 56 - .../system/employee/domain/bo/EmployeeBO.java | 73 - .../employee/domain/dto/EmployeeAddDTO.java | 63 - .../employee/domain/dto/EmployeeBaseDTO.java | 52 - .../dto/EmployeeBatchUpdateStatusDTO.java | 26 - .../employee/domain/dto/EmployeeDTO.java | 73 - .../domain/dto/EmployeeLoginFormDTO.java | 31 - .../employee/domain/dto/EmployeeQueryDTO.java | 39 - .../domain/dto/EmployeeUpdateDTO.java | 28 - .../domain/dto/EmployeeUpdatePwdDTO.java | 25 - .../domain/entity/EmployeeEntity.java | 91 - .../system/employee/domain/vo/EmployeeVO.java | 72 - .../module/system/login/LoginController.java | 71 - .../module/system/login/LoginService.java | 215 - .../system/login/LoginTokenService.java | 118 - .../module/system/login/domain/KaptchaVO.java | 28 - .../system/login/domain/LoginCacheDTO.java | 28 - .../system/login/domain/LoginDetailVO.java | 68 - .../login/domain/LoginPrivilegeDTO.java | 33 - .../system/login/domain/RequestTokenBO.java | 26 - .../system/position/PositionController.java | 59 - .../module/system/position/PositionDao.java | 63 - .../system/position/PositionService.java | 124 - .../position/domain/dto/PositionAddDTO.java | 28 - .../position/domain/dto/PositionQueryDTO.java | 18 - .../domain/dto/PositionRelationAddDTO.java | 32 - .../domain/dto/PositionRelationQueryDTO.java | 20 - .../domain/dto/PositionRelationResultDTO.java | 40 - .../position/domain/dto/PositionResultVO.java | 41 - .../domain/dto/PositionUpdateDTO.java | 16 - .../domain/entity/PositionEntity.java | 26 - .../domain/entity/PositionRelationEntity.java | 26 - .../privilege/constant/PrivilegeTypeEnum.java | 49 - .../controller/PrivilegeController.java | 75 - .../system/privilege/dao/PrivilegeDao.java | 94 - .../domain/dto/PrivilegeFunctionDTO.java | 40 - .../domain/dto/PrivilegeFunctionVO.java | 40 - .../domain/dto/PrivilegeMenuDTO.java | 45 - .../privilege/domain/dto/PrivilegeMenuVO.java | 35 - .../domain/dto/PrivilegeRequestUrlVO.java | 27 - .../domain/entity/PrivilegeEntity.java | 57 - .../service/PrivilegeEmployeeService.java | 199 - .../privilege/service/PrivilegeService.java | 285 - .../role/basic/domain/dto/RoleQueryDTO.java | 25 - .../role/basic/domain/dto/RoleSelectedVO.java | 21 - .../role/basic/domain/entity/RoleEntity.java | 25 - .../roleemployee/RoleEmployeeService.java | 132 - .../roleemployee/domain/RoleEmployeeDTO.java | 21 - .../domain/RoleEmployeeEntity.java | 24 - .../RolePrivilegeController.java | 45 - .../role/roleprivilege/RolePrivilegeDao.java | 58 - .../roleprivilege/RolePrivilegeService.java | 129 - .../domain/dto/RolePrivilegeDTO.java | 35 - .../domain/dto/RolePrivilegeSimpleDTO.java | 43 - .../domain/dto/RolePrivilegeTreeVO.java | 19 - .../domain/entity/RolePrivilegeEntity.java | 32 - .../systemconfig/SystemConfigController.java | 70 - .../system/systemconfig/SystemConfigDao.java | 62 - .../systemconfig/SystemConfigService.java | 262 - .../constant/SystemConfigDataType.java | 67 - .../constant/SystemConfigEnum.java | 68 - .../SystemConfigResponseCodeConst.java | 29 - .../domain/dto/SystemConfigQueryDTO.java | 29 - .../domain/dto/SystemConfigUpdateDTO.java | 25 - .../smartadmin/util/SmartBaseEnumUtil.java | 85 - .../smartadmin/util/SmartDigestUtil.java | 17 - .../smartadmin/util/SmartPageUtil.java | 97 - .../smartadmin/util/SmartQuartzUtil.java | 43 - .../util/SmartRequestTokenUtil.java | 51 - .../smartadmin/util/SmartSendMailUtil.java | 243 - .../util/excel/SmartExcelFileType.java | 10 - .../main/resources/dev/application.properties | 123 - .../mapper/business/email/EmailMapper.xml | 44 - .../business/log/OrderOperateLogMapper.xml | 50 - .../business/log/UserLoginLogMapper.xml | 46 - .../mapper/business/peony/PeonyMapper.xml | 116 - .../support/codegenerator/TableMapper.xml | 27 - .../mapper/support/file/FileMapper.xml | 100 - .../support/idgenerator/IdGeneratorMapper.xml | 48 - .../support/quartz/QuartzTaskLogMapper.xml | 38 - .../support/quartz/QuartzTaskMapper.xml | 36 - .../support/smartreload/ReloadItemMapper.xml | 6 - .../smartreload/ReloadResultMapper.xml | 18 - .../system/department/DepartmentMapper.xml | 54 - .../mapper/system/employee/EmployeeMapper.xml | 186 - .../mapper/system/position/PositionMapper.xml | 77 - .../system/privilege/PrivilegeMapper.xml | 124 - .../system/role/RolePrivilegeMapper.xml | 72 - .../systemconfig/SystemConfigMapper.xml | 102 - .../main/resources/pre/application.properties | 121 - .../src/main/resources/pre/log4j2.xml | 97 - .../resources/prod/application.properties | 120 - .../src/main/resources/prod/log4j2.xml | 97 - .../main/resources/sit/application.properties | 121 - .../src/main/resources/sit/log4j2.xml | 97 - .../src/main/resources/sit/spy.properties | 20 - .../main/resources/sql/quartz_mysql_2.3.0.sql | 179 - .../src/main/resources/sql/smart-admin.sql | 1588 -- .../codegenerator/java/AddDTO.java.vm | 36 - .../codegenerator/java/Controller.java.vm | 88 - .../templates/codegenerator/java/Dao.java.vm | 64 - .../templates/codegenerator/java/Dao.xml.vm | 144 - .../codegenerator/java/Entity.java.vm | 33 - .../codegenerator/java/ExcelVO.java.vm | 33 - .../codegenerator/java/QueryDTO.java.vm | 45 - .../codegenerator/java/Service.java.vm | 108 - .../codegenerator/java/UpdateDTO.java.vm | 20 - .../templates/codegenerator/java/VO.java.vm | 35 - .../templates/codegenerator/web/Api.js.vm | 28 - .../templates/codegenerator/web/List.vue.vm | 439 - .../codegenerator/web/ListForm.vue.vm | 132 - .../templates/codegenerator/web/Router.js.vm | 32 - .../java/net/lab1024/smartadmin/BaseTest.java | 28 - .../SmartAdminApplicationTests.java | 11 - .../CodeGeneratorServiceTest.java | 66 - smart-admin-web/.babelrc | 5 - smart-admin-web/.editorconfig | 9 - smart-admin-web/.env.development | 4 - smart-admin-web/.env.local | 4 - smart-admin-web/.env.prod | 8 - smart-admin-web/.env.sit | 3 - smart-admin-web/.eslintrc.js | 34 - smart-admin-web/.gitignore | 22 - smart-admin-web/.travis.yml | 5 - smart-admin-web/README.md | 13 - smart-admin-web/cypress.json | 3 - smart-admin-web/doc/notice.txt | 2 - smart-admin-web/package-lock.json | 15500 -------------- smart-admin-web/package.json | 89 - smart-admin-web/public/favicon.ico | Bin 16958 -> 0 bytes smart-admin-web/public/index.html | 19 - smart-admin-web/src/App.vue | 31 - smart-admin-web/src/api/data-scope.js | 15 - smart-admin-web/src/api/department.js | 47 - smart-admin-web/src/api/email.js | 27 - smart-admin-web/src/api/employee.js | 43 - smart-admin-web/src/api/file.js | 28 - smart-admin-web/src/api/heart-beat.js | 7 - smart-admin-web/src/api/login.js | 19 - smart-admin-web/src/api/notice.js | 43 - smart-admin-web/src/api/online-user.js | 12 - smart-admin-web/src/api/peony.js | 28 - smart-admin-web/src/api/position.js | 19 - smart-admin-web/src/api/privilege.js | 36 - smart-admin-web/src/api/role.js | 58 - smart-admin-web/src/api/smart-reload.js | 20 - smart-admin-web/src/api/system-config.js | 31 - smart-admin-web/src/api/task-manage.js | 35 - smart-admin-web/src/api/user-log.js | 28 - smart-admin-web/src/api/user.js | 20 - smart-admin-web/src/assets/icons/demo.css | 539 - .../src/assets/icons/demo_index.html | 722 - .../font_1299963_2zqwx2axi0j/demo.css | 539 - .../font_1299963_2zqwx2axi0j/demo_index.html | 722 - .../font_1299963_2zqwx2axi0j/iconfont.css | 113 - .../font_1299963_2zqwx2axi0j/iconfont.eot | Bin 8812 -> 0 bytes .../font_1299963_2zqwx2axi0j/iconfont.js | 1 - .../font_1299963_2zqwx2axi0j/iconfont.svg | 98 - .../font_1299963_2zqwx2axi0j/iconfont.ttf | Bin 8644 -> 0 bytes .../font_1299963_2zqwx2axi0j/iconfont.woff | Bin 5436 -> 0 bytes .../font_1299963_2zqwx2axi0j/iconfont.woff2 | Bin 4584 -> 0 bytes smart-admin-web/src/assets/icons/iconfont.css | 113 - smart-admin-web/src/assets/icons/iconfont.eot | Bin 8812 -> 0 bytes smart-admin-web/src/assets/icons/iconfont.js | 1 - smart-admin-web/src/assets/icons/iconfont.svg | 98 - smart-admin-web/src/assets/icons/iconfont.ttf | Bin 8644 -> 0 bytes .../src/assets/icons/iconfont.woff | Bin 5436 -> 0 bytes .../src/assets/icons/iconfont.woff2 | Bin 4584 -> 0 bytes .../src/assets/images/default_icon.png | Bin 2364 -> 0 bytes .../assets/images/error-page/error-401.svg | 1 - .../assets/images/error-page/error-404.svg | 1 - .../assets/images/error-page/error-500.svg | 1 - .../src/assets/images/icon-qr-qq-wechat.png | Bin 43541 -> 0 bytes .../assets/images/icon-social-bilibili.svg | 1 - .../src/assets/images/icon-social-juejin.svg | 1 - .../src/assets/images/icon-social-twitter.svg | 1 - .../src/assets/images/icon-social-zhihu.svg | 1 - .../src/assets/images/login-alipay.png | Bin 1881 -> 0 bytes .../src/assets/images/login-bg.jpg | Bin 547587 -> 0 bytes .../src/assets/images/login-logo.png | Bin 4900 -> 0 bytes .../src/assets/images/login-sina.png | Bin 1851 -> 0 bytes .../src/assets/images/login-taobao.png | Bin 1898 -> 0 bytes .../src/assets/images/login_desc_bg.png | Bin 272693 -> 0 bytes .../src/assets/images/login_logo.png | Bin 3523 -> 0 bytes smart-admin-web/src/assets/images/logo.png | Bin 3839 -> 0 bytes smart-admin-web/src/assets/images/logo1.png | Bin 3259 -> 0 bytes smart-admin-web/src/assets/images/message.png | Bin 1873 -> 0 bytes smart-admin-web/src/assets/images/shadow.png | Bin 224307 -> 0 bytes .../images/slider/sub_slider_active.png | Bin 3103 -> 0 bytes .../images/slider/sub_slider_default.png | Bin 3105 -> 0 bytes .../src/assets/style/lib/animate.css | 3625 ---- .../components/active-plate/active-plate.vue | 67 - smart-admin-web/src/components/charts/bar.vue | 73 - .../src/components/charts/index.js | 3 - smart-admin-web/src/components/charts/pie.vue | 85 - .../src/components/charts/theme.json | 490 - .../components/common-icon/common-icon.vue | 52 - .../src/components/common-icon/index.js | 2 - .../src/components/count-to/count-to.vue | 198 - .../src/components/count-to/index.js | 2 - .../src/components/count-to/index.less | 10 - .../src/components/editor/editor.vue | 77 - .../src/components/editor/index.js | 2 - .../components/employee/employee-selector.vue | 54 - .../src/components/icons/icons.vue | 38 - smart-admin-web/src/components/icons/index.js | 2 - .../main/components/a-back-top/index.js | 2 - .../main/components/a-back-top/index.vue | 130 - .../main/components/fullscreen/fullscreen.vue | 92 - .../main/components/fullscreen/index.js | 2 - .../custom-bread-crumb.less | 4 - .../custom-bread-crumb/custom-bread-crumb.vue | 44 - .../header-bar/custom-bread-crumb/index.js | 2 - .../components/header-bar/header-bar.less | 19 - .../main/components/header-bar/header-bar.vue | 106 - .../main/components/header-bar/index.js | 2 - .../header-bar/sider-trigger/index.js | 2 - .../sider-trigger/sider-trigger.less | 21 - .../sider-trigger/sider-trigger.vue | 35 - .../main/components/language/index.js | 2 - .../main/components/language/language.vue | 54 - .../main/components/notice/notice.vue | 371 - .../components/side-menu/collapsed-menu.vue | 84 - .../main/components/side-menu/index.js | 2 - .../main/components/side-menu/item-mixin.js | 30 - .../main/components/side-menu/mixin.js | 18 - .../components/side-menu/side-menu-item.vue | 35 - .../main/components/side-menu/side-menu.less | 39 - .../main/components/side-menu/side-menu.vue | 197 - .../main/components/tags-nav/index.js | 2 - .../main/components/tags-nav/tags-nav.less | 136 - .../main/components/tags-nav/tags-nav.vue | 256 - .../components/main/components/user/index.js | 2 - .../components/main/components/user/user.less | 25 - .../components/main/components/user/user.vue | 131 - smart-admin-web/src/components/main/index.js | 2 - smart-admin-web/src/components/main/main.less | 129 - smart-admin-web/src/components/main/main.vue | 533 - .../src/components/smart-admin-ad/ad.vue | 34 - .../src/components/smart-admin-ad/index.js | 2 - .../src/components/tables/edit.vue | 102 - .../src/components/tables/handle-btns.js | 70 - .../src/components/tables/index.js | 2 - .../src/components/tables/index.less | 17 - .../src/components/tables/tables.vue | 342 - smart-admin-web/src/config/index.js | 38 - smart-admin-web/src/constants/file.js | 24 - smart-admin-web/src/constants/index.js | 10 - smart-admin-web/src/constants/login.js | 13 - smart-admin-web/src/constants/notice.js | 13 - smart-admin-web/src/constants/privilege.js | 14 - smart-admin-web/src/constants/table-page.js | 6 - smart-admin-web/src/directives/directives.js | 11 - smart-admin-web/src/directives/index.js | 31 - .../src/directives/module/clipboard.js | 30 - .../src/directives/module/draggable.js | 42 - .../src/directives/module/privilege.js | 23 - smart-admin-web/src/lib/cookie.js | 21 - smart-admin-web/src/lib/http.js | 161 - smart-admin-web/src/lib/local.js | 8 - smart-admin-web/src/lib/menu-func.js | 276 - smart-admin-web/src/lib/printPlugs.js | 133 - smart-admin-web/src/lib/render-dom.js | 10 - smart-admin-web/src/lib/table-action.js | 84 - smart-admin-web/src/lib/util.js | 515 - smart-admin-web/src/locale/index.js | 37 - smart-admin-web/src/locale/lang/en-US.js | 46 - smart-admin-web/src/locale/lang/zh-CN.js | 46 - smart-admin-web/src/locale/lang/zh-TW.js | 46 - smart-admin-web/src/main.js | 80 - smart-admin-web/src/main.less | 37 - .../src/plugins/error-store/index.js | 4 - smart-admin-web/src/plugins/index.js | 12 - smart-admin-web/src/router/before-close.js | 17 - smart-admin-web/src/router/index.js | 218 - .../src/router/module/business/email.js | 40 - .../src/router/module/business/index.js | 29 - .../src/router/module/business/keep-alive.js | 31 - .../src/router/module/business/notice.js | 52 - .../src/router/module/business/peony.js | 49 - .../router/module/business/three-router.js | 63 - smart-admin-web/src/router/module/error.js | 33 - smart-admin-web/src/router/module/home.js | 29 - .../src/router/module/support/api-doc.js | 25 - .../src/router/module/support/heart-beat.js | 31 - .../src/router/module/support/index.js | 30 - .../src/router/module/support/monitor.js | 34 - .../src/router/module/support/reload.js | 40 - .../src/router/module/support/task.js | 63 - .../src/router/module/system/employee.js | 149 - .../src/router/module/system/file.js | 29 - .../src/router/module/system/index.js | 28 - .../router/module/system/system-setting.js | 65 - .../src/router/module/system/user-log.js | 42 - smart-admin-web/src/router/routers.js | 43 - smart-admin-web/src/store/index.js | 25 - smart-admin-web/src/store/module/app.js | 129 - smart-admin-web/src/store/module/notice.js | 19 - smart-admin-web/src/store/module/user.js | 122 - smart-admin-web/src/themes/ReadMe.md | 1 - smart-admin-web/src/themes/index.less | 328 - .../src/views/business/email/email-list.vue | 214 - .../src/views/business/email/send-mail.vue | 215 - .../views/business/keep-alive/add-content.vue | 94 - .../business/keep-alive/content-list.vue | 80 - .../views/business/notice/notice-detail.vue | 49 - .../src/views/business/notice/notice-list.vue | 369 - .../views/business/notice/person-notice.vue | 221 - .../peony/components/peony-list-form.vue | 133 - .../src/views/business/peony/peony-list.vue | 495 - .../three-level-router-view.vue | 58 - smart-admin-web/src/views/error-page/401.vue | 19 - smart-admin-web/src/views/error-page/404.vue | 19 - smart-admin-web/src/views/error-page/500.vue | 19 - .../src/views/error-page/back-btn-group.vue | 40 - .../src/views/error-page/error-content.vue | 28 - .../src/views/error-page/error.less | 46 - .../src/views/home/components/card.vue | 43 - .../src/views/home/components/chart-bar.vue | 140 - .../views/home/components/chart-funnel.vue | 106 - .../src/views/home/components/chart-gauge.vue | 87 - .../src/views/home/components/chart-line.vue | 123 - .../src/views/home/components/chart-pie.vue | 110 - .../src/views/home/components/home-circle.vue | 41 - .../views/home/components/home-progress.vue | 59 - .../src/views/home/components/theme.json | 490 - smart-admin-web/src/views/home/home.vue | 154 - smart-admin-web/src/views/home/index.js | 2 - smart-admin-web/src/views/login/canvas.js | 289 - .../src/views/login/components/login-form.vue | 134 - smart-admin-web/src/views/login/login.less | 128 - smart-admin-web/src/views/login/login.vue | 52 - .../src/views/support/api-doc/swagger.vue | 33 - .../support/heart-beat/heart-beat-list.vue | 115 - .../src/views/support/monitor/online-user.vue | 152 - .../src/views/support/monitor/sql.vue | 33 - .../reload/smart-reload/smart-reload-list.vue | 273 - .../src/views/support/task/task-list.vue | 556 - .../department-employee-tree-item.vue | 124 - .../department-employee-tree.vue | 251 - .../employee/position/position-list.vue | 366 - .../employee-table-add/employee-table-add.vue | 527 - .../employee-table-detail.vue | 72 - .../employee-table/employee-table.vue | 569 - .../role-employee/role-employee-manage.vue | 831 - .../role-data-scope/role-data-scope.vue | 144 - .../role/components/role-list/role-list.vue | 407 - .../role/components/role-tree/role-tree.vue | 431 - .../system/employee/role/role-manage.vue | 339 - .../src/views/system/file/file-list.vue | 279 - .../system-config/system-config.vue | 397 - .../components/privilege-form.vue | 144 - .../system-privilege/system-privilege.vue | 410 - .../views/system/user-log/user-login-log.vue | 185 - .../system/user-log/user-operate-log.vue | 252 - .../src/views/three-router/three-content.vue | 26 - smart-admin-web/tests/e2e/.eslintrc | 12 - smart-admin-web/tests/e2e/plugins/index.js | 9 - smart-admin-web/tests/e2e/specs/test.js | 8 - smart-admin-web/tests/e2e/support/commands.js | 25 - smart-admin-web/tests/e2e/support/index.js | 20 - smart-admin-web/tests/unit/.eslintrc.js | 8 - smart-admin-web/tests/unit/HelloWorld.spec.js | 13 - smart-admin-web/vscode/settings.json | 43 - smart-admin-web/vue.config.js | 77 - 代码规范/api接口规范.md | 38 - 代码规范/front-standard-guide.md | 1148 - 代码规范/java-standard-guide.md | 697 - 1223 files changed, 55849 insertions(+), 73875 deletions(-) rename smart-admin-web/.eslintignore => admin-api/go-api/readme.md (100%) rename smart-admin-web/src/filters/index.js => admin-api/java-api/README.md (100%) create mode 100644 admin-api/java-api/pom.xml rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/SmartAdminApplication.java (62%) rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/annotation/SmartReload.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoNeedLogin.java (60%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoRepeatSubmit.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoValidPrivilege.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst}/DepartmentResponseCodeConst.java (90%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/constant => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst}/EmployeeResponseCodeConst.java (76%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/FileResponseCodeConst.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst}/LoginResponseCodeConst.java (79%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst}/PositionResponseCodeConst.java (70%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/constant => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst}/PrivilegeResponseCodeConst.java (74%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeConst.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeContainer.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeRegister.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst}/RoleResponseCodeConst.java (78%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant}/BaseEnum.java (87%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/CacheModuleBaseConst.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/CommonConst.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/GenderEnum.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/RedisKeyConst.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/SwaggerTagConst.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common}/constant/SystemEnvironmentEnum.java (80%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/controller/AdminBaseController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/controller/SupportBaseController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/domain/PageBaseDTO.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/common/domain/PageResultDTO.java (83%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/common/domain/ResponseDTO.java (67%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/excel/ExcelStyle.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/common/exception/SmartBusinessException.java (69%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/BigDecimalNullZeroSerializer.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/FileKeySerializer.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/FileKeyVoSerializer.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/security/SmartSecurityMetadataSource.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/security/SmartSecurityNoLoginUrl.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/swagger}/ApiModelPropertyEnum.java (67%) rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/swagger/SmartSwaggerApiModelEnumPlugin.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/swagger/ApiModelPropertyEnumPlugin.java (55%) rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/validator/bigdecimal/ComparisonSymbolEnum.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator/BigDecimalSymbolEnum.java (80%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/validator/bigdecimal => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator}/BigDecimalValidator.java (92%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/validator/bigdecimal => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator}/CheckBigDecimal.java (91%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/validator/en => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator}/CheckEnum.java (83%) rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/validator/en/EnumValidator.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator/CheckEnumValidator.java (87%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator}/ValidateList.java (97%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityMethodConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityNoLoginUrlConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartAsyncConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartCacheConfig.java rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartKaptchaConfig.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartCaptchaConfig.java (51%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartConverterStringToLocalDate.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartConverterStringToLocalDateTime.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/config/SmartDruidDataSourceConfig.java (62%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartHeartBeatConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartMybatisPlusConfig.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/config/SmartRedisConfig.java (93%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRedisMqConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRepeatSubmitAspectConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartResponseEncryptAspectConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRestTemplateConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSchedulingConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSerializerLocalDateTimeConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartStorageCloudConfig.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/config/SmartSwaggerDynamicGroupConfig.java (56%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSystemEnvNotProdCondition.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartWebAppConfig.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/filters/SmartTokenFilter.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/handler/AuthenticationFailHandler.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/handler/SmartGlobalExceptionHandler.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/interceptor/BusinessAuthorityInterceptor.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/interceptor/SupportAuthorityInterceptor.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/listener/SmartAdminStartupRunner.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryDao.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryQueryService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/constant/CategoryTypeEnum.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryAddDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryBaseDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategorySimpleDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryTreeQueryDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryTreeVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryUpdateDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/package-info.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsDao.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsManager.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/constant/GoodsTypeEnum.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsAddDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsAdminVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsBO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsBaseDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsDelDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsQueryDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsUpdateDTO.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/business/notice/NoticeController.java (50%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/NoticeManage.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/NoticeService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/dao/NoticeDao.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/business/notice/dao/NoticeReceiveRecordDao.java (73%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/business/notice/domain/dto/NoticeAddDTO.java (59%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeQueryDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReadCountDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReceiveDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReceiveQueryDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeUpdateDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/entity/NoticeEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/entity/NoticeReceiveRecordEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/vo/NoticeDetailVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/vo/NoticeVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/AbstractCaffeineCache.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/AbstractDisableCache.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/IBeanCache.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheClear.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheData.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheStatsVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/key/CacheKey.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/key/CacheKeyBuilder.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/load/CacheLoad.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/load/CacheLoadMethod.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/BeanRecordService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/OperateTypeEnum.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldBigDecimalValue.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldDoc.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldEnumValue.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldSqlValue.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/CaptchaController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/CaptchaService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/domain/CaptchaDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/domain/CaptchaVO.java rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaColor.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaColor.java (80%) rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaNoise.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaNoise.java (67%) rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaWordRenderer.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaWordRenderer.java (79%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerDao.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerManger.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/constant/DataTracerBusinessTypeEnum.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/constant/DataTracerOperateTypeEnum.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerExtraDataDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerQueryForm.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/package-info.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/FileController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/FileDao.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/FileEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/FileFolderTypeEnum.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/support/file/domain/dto/FileDTO.java (68%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileDownloadDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileMetadataDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileQueryDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlQueryDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlResultDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlUploadDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileSimpleVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileUploadVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileStorageCloudServiceImpl.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileStorageLocalServiceImpl.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/IFileStorageService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatController.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/support/heartbeat/HeartBeatRecordDao.java (80%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/support/heartbeat/HeartBeatRecordEntity.java (52%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordHandler.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/support/heartbeat/HeartBeatRecordVO.java (81%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatService.java rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/AbstractHeartBeatCommand.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/AbstractHeartBeatManager.java (78%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core}/HeartBeatConfig.java (54%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatLogger.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatManager.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core}/HeartBeatRecordDTO.java (84%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core}/HeatBeatRecordHelper.java (73%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/IHeartBeatRecordHandler.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorDao.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/constant/IdGeneratorEnum.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/support/idgenerator/constant/IdGeneratorRuleTypeEnum.java (64%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorLastNumberDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorRecordDTO.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog}/OperateLog.java (50%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogController.java rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailDao.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogDao.java (51%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/SmartOperateLogAspect.java rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogEntity.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/OperateLogEntity.java (61%) rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogDTO.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/OperateLogDTO.java (79%) rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogQueryDTO.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/OperateLogQueryDTO.java (52%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/SmartOperateLogConfigDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/SmartOperateLogUserDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMqHandle.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMqTopicEnum.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgHandler.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgTypeEnum.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/repeatsubmit/SmartRepeatSubmitAspect.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/repeatsubmit/SmartRepeatSubmitUserDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/DecryptDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseDecrypt.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncrypt.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncryptDecryptAspect.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncryptDecryptUserDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigConst.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigDao.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigService.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain}/SystemConfigAddDTO.java (81%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain}/SystemConfigDTO.java (63%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/entity => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain}/SystemConfigEntity.java (50%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigQueryDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigUpdateDTO.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain}/SystemConfigVO.java (59%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope}/DataScope.java (57%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/DataScopeController.java (54%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/DataScopeRoleDao.java (75%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/MyBatisPlugin.java (77%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/constant/DataScopeTypeEnum.java (56%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/constant/DataScopeViewTypeEnum.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/constant/DataScopeWhereInTypeEnum.java (50%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/domain/dto/DataScopeAndViewTypeVO.java (69%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/domain/dto/DataScopeBatchSetDTO.java (64%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/domain/dto/DataScopeBatchSetRoleDTO.java (64%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/domain/dto/DataScopeDTO.java (65%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/domain/dto/DataScopeSelectVO.java (53%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/domain/dto/DataScopeSqlConfigDTO.java (54%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/domain/dto/DataScopeViewTypeVO.java (62%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/entity/DataScopeRoleEntity.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/service/DataScopeService.java (73%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/service/DataScopeSqlConfigService.java (76%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/datascope/service/DataScopeViewService.java (68%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/strategy/DataScopePowerStrategy.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentCacheService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentController.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/department/DepartmentDao.java (61%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentManager.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentTreeService.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/department/domain/dto/DepartmentCreateDTO.java (75%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/department/domain/dto/DepartmentUpdateDTO.java (58%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/entity/DepartmentEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo/DepartmentEmployeeTreeVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo/DepartmentTreeVO.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/dto => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo}/DepartmentVO.java (57%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeCacheService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeDao.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeManager.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeAddDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDepartmentUpdateDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDisabledUpdateDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeLoginDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeQueryDTO.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/employee/domain/dto/EmployeeQueryExportDTO.java (63%) rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdateRolesDTO.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeRoleUpdateDTO.java (52%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeUpdateDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeUpdatePwdDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/entity/EmployeeEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/vo/EmployeeVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginTokenService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginBO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginInfoDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginPrivilegeDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuDao.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuEmployeeService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuManager.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuPermissionService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuService.java rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeRequestUrlService.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/RequestUrlService.java (74%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/constant/MenuTypeEnum.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuAddForm.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuBasicDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuLoginBO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuPointsOperateForm.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuSimpleTreeVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuTreeVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuUpdateForm.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuVO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/RequestUrlVO.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/role/basic/RoleController.java (73%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/role/basic/RoleDao.java (53%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/role/basic/RoleService.java (60%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/role/basic/domain/dto/RoleAddDTO.java (89%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/dto/RoleQueryDTO.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/role/basic/domain/dto/RoleUpdateDTO.java (83%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/entity/RoleEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/vo/RoleSelectedVO.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/vo}/RoleVO.java (55%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/role/roleemployee/RoleEmployeeController.java (73%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/module/system/role/roleemployee/RoleEmployeeDao.java (68%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeManager.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeService.java rename smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleBatchDTO.java => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeBatchDTO.java (61%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuController.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuDao.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuManager.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuService.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuDTO.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuEntity.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuTreeVO.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/third/SmartApplicationContext.java (72%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/third/SmartRedisService.java (80%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartAesUtil.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartBaseEnumUtil.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/SmartBeanUtil.java (96%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/SmartBigDecimalUtil.java (99%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartCollectionUtil.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/SmartDateUtil.java (99%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartDigestUtil.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/SmartEasyPoiExcelUtil.java (81%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartEmployeeTokenUtil.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/SmartFileUtil.java (84%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/SmartHttpUtil.java (96%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/SmartIPUtil.java (81%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartPageUtil.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartRandomUtil.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartSecurityUtil.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/SmartStringUtil.java (99%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/SmartThreadFactory.java (96%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/SmartVerificationUtil.java (89%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/date/SmartDateFormatterEnum.java create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/date/SmartLocalDateUtil.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/excel/SmartExcel.java (97%) create mode 100644 admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartExcelFileType.java rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/excel/SmartExcelReader.java (77%) rename {smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin => admin-api/java-api/src/main/java/net/lab1024/smartadmin/service}/util/excel/SmartSheet.java (98%) rename {smart-admin-service/smart-admin-api => admin-api/java-api}/src/main/resources/banner.txt (69%) create mode 100644 admin-api/java-api/src/main/resources/dev/application.properties rename {smart-admin-service/smart-admin-api => admin-api/java-api}/src/main/resources/dev/log4j2.xml (99%) rename {smart-admin-service/smart-admin-api => admin-api/java-api}/src/main/resources/dev/spy.properties (100%) create mode 100644 admin-api/java-api/src/main/resources/mapper/business/category/CategoryMapper.xml create mode 100644 admin-api/java-api/src/main/resources/mapper/business/goods/GoodsMapper.xml rename {smart-admin-service/smart-admin-api => admin-api/java-api}/src/main/resources/mapper/business/notice/NoticeMapper.xml (76%) rename {smart-admin-service/smart-admin-api => admin-api/java-api}/src/main/resources/mapper/business/notice/NoticeReceiveRecordMapper.xml (84%) create mode 100644 admin-api/java-api/src/main/resources/mapper/support/DataTracerMapper.xml create mode 100644 admin-api/java-api/src/main/resources/mapper/support/FileMapper.xml rename {smart-admin-service/smart-admin-api/src/main/resources/mapper/support/heartbeat => admin-api/java-api/src/main/resources/mapper/support}/HeartBeatRecordMapper.xml (75%) create mode 100644 admin-api/java-api/src/main/resources/mapper/support/IdGeneratorMapper.xml rename smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/UserOperateLogMapper.xml => admin-api/java-api/src/main/resources/mapper/support/OperateLogMapper.xml (81%) create mode 100644 admin-api/java-api/src/main/resources/mapper/support/SystemConfigMapper.xml rename {smart-admin-service/smart-admin-api => admin-api/java-api}/src/main/resources/mapper/system/datascope/DataScopeRoleMapper.xml (88%) create mode 100644 admin-api/java-api/src/main/resources/mapper/system/department/DepartmentMapper.xml create mode 100644 admin-api/java-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml create mode 100644 admin-api/java-api/src/main/resources/mapper/system/menu/MenuMapper.xml rename {smart-admin-service/smart-admin-api => admin-api/java-api}/src/main/resources/mapper/system/role/RoleEmployeeMapper.xml (50%) rename {smart-admin-service/smart-admin-api => admin-api/java-api}/src/main/resources/mapper/system/role/RoleMapper.xml (72%) create mode 100644 admin-api/java-api/src/main/resources/mapper/system/role/RoleMenuMapper.xml create mode 100644 admin-web/typescript-ant-design-vue/.env create mode 100644 admin-web/typescript-ant-design-vue/.env.development create mode 100644 admin-web/typescript-ant-design-vue/.env.localhost create mode 100644 admin-web/typescript-ant-design-vue/.env.pre create mode 100644 admin-web/typescript-ant-design-vue/.env.production create mode 100644 admin-web/typescript-ant-design-vue/.env.sit create mode 100644 admin-web/typescript-ant-design-vue/.eslintignore create mode 100644 admin-web/typescript-ant-design-vue/.eslintrc.js create mode 100644 admin-web/typescript-ant-design-vue/.gitignore create mode 100644 admin-web/typescript-ant-design-vue/.prettierrc.js create mode 100644 admin-web/typescript-ant-design-vue/.stylelintignore create mode 100644 admin-web/typescript-ant-design-vue/.stylelintrc.js create mode 100644 admin-web/typescript-ant-design-vue/README.en.md create mode 100644 admin-web/typescript-ant-design-vue/README.md create mode 100644 admin-web/typescript-ant-design-vue/index.html create mode 100644 admin-web/typescript-ant-design-vue/package-lock.json create mode 100644 admin-web/typescript-ant-design-vue/package.json rename smart-admin-web/.postcssrc.js => admin-web/typescript-ant-design-vue/postcss.config.js (51%) rename {smart-admin-h5 => admin-web/typescript-ant-design-vue}/public/favicon.ico (100%) create mode 100644 admin-web/typescript-ant-design-vue/public/images/1024lab-gzh.jpg create mode 100644 admin-web/typescript-ant-design-vue/public/images/ali-icon.png create mode 100644 admin-web/typescript-ant-design-vue/public/images/google-icon.png create mode 100644 admin-web/typescript-ant-design-vue/public/images/login-bg.png create mode 100644 admin-web/typescript-ant-design-vue/public/images/login-form-open-eyes-close.png create mode 100644 admin-web/typescript-ant-design-vue/public/images/login-form-open-eyes.png create mode 100644 admin-web/typescript-ant-design-vue/public/images/login-person.png create mode 100644 admin-web/typescript-ant-design-vue/public/images/login-qr.png rename {smart-admin-web/src/assets => admin-web/typescript-ant-design-vue/public}/images/logo-min.png (100%) create mode 100644 admin-web/typescript-ant-design-vue/public/images/logo.png create mode 100644 admin-web/typescript-ant-design-vue/public/images/qq-icon.png create mode 100644 admin-web/typescript-ant-design-vue/public/images/wechat-icon.png create mode 100644 admin-web/typescript-ant-design-vue/public/images/weibo-icon.png create mode 100644 admin-web/typescript-ant-design-vue/src/App.vue create mode 100644 admin-web/typescript-ant-design-vue/src/api/base-model/page-param-model.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/base-model/page-result-model.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/base-model/response-model.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/base-model/sort-item-model.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/category/category-api.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/category/model/category-add-form.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/category/model/category-tree-query-form.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/category/model/category-tree-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/category/model/category-update-form.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/category/model/category-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/file/file-api.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/file/model/file-upload-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/goods/goods-api.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-add-form.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-admin-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-del-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-query-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-update-form.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/department/department-api.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/department/model/department-create-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/department/model/department-simple-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/department/model/department-tree-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/department/model/department-update-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/department/model/department-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/employee/employee-api.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-add-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-department-update-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-query-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-update-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/home/home-api.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/home/model/home-amount-statistics-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-order-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-receive-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-sale-target-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/home/model/home-wait-handle-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/login/login-model.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/login/login.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/login/model/employee-login-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/menu/menu-api.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-add-form.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-points-operate-form.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-simple-tree-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-tree-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-update-form.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/menu/model/models.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/menu/model/request-url-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role-menu/modal/role-menu-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role-menu/modal/role-menu-tree-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role-menu/role-menu-api.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-and-view-type-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-batch-set-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-batch-set-role-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-select-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-view-type-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role/model/role-add-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role/model/role-employee-batch-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role/model/role-query-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role/model/role-update-dto.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role/model/role-vo.ts create mode 100644 admin-web/typescript-ant-design-vue/src/api/system/role/role-api.ts rename {smart-admin-h5/src/assets => admin-web/typescript-ant-design-vue/src/assets/img}/logo.png (100%) create mode 100644 admin-web/typescript-ant-design-vue/src/assets/logo.png create mode 100644 admin-web/typescript-ant-design-vue/src/components/HelloWorld.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/category-tree-select/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/department-tree-select/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/employee-select/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/menu-location-breadcrumb/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/recursion-menu/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/recursion-menu/sub-menu.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/school-department-select/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/select-employee-modal/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/recursion-menu.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/sub-menu.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/top-menu.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/side-menu/index.less create mode 100644 admin-web/typescript-ant-design-vue/src/components/side-menu/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/province-city-district.ts create mode 100644 admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/province-city.ts create mode 100644 admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/smart-area-option.ts create mode 100644 admin-web/typescript-ant-design-vue/src/components/smart-boolean-select/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/smart-enum-select/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/smart-loading/index.ts create mode 100644 admin-web/typescript-ant-design-vue/src/components/smart-table-operator/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/components/upload/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/config/app-config.ts create mode 100644 admin-web/typescript-ant-design-vue/src/config/project-config.ts create mode 100644 admin-web/typescript-ant-design-vue/src/constants/business/category.ts create mode 100644 admin-web/typescript-ant-design-vue/src/constants/business/file.ts create mode 100644 admin-web/typescript-ant-design-vue/src/constants/business/goods.ts create mode 100644 admin-web/typescript-ant-design-vue/src/constants/common.ts create mode 100644 admin-web/typescript-ant-design-vue/src/constants/index.ts create mode 100644 admin-web/typescript-ant-design-vue/src/constants/regular.ts create mode 100644 admin-web/typescript-ant-design-vue/src/constants/system/employee.ts create mode 100644 admin-web/typescript-ant-design-vue/src/constants/system/local-storage-key.ts create mode 100644 admin-web/typescript-ant-design-vue/src/constants/system/menu/menu-enum.ts create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/index.ts create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/account.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/account/settings.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/dashboard.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/dashboard/analysis.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/form.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/form/basicForm.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/global.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/index.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/menu.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result/fail.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result/success.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/setting.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/user.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/account.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/account/settings.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/dashboard.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/dashboard/analysis.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/form.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/form/basicForm.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/global.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/index.ts create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/menu.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result/fail.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result/success.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/setting.js create mode 100644 admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/user.js create mode 100644 admin-web/typescript-ant-design-vue/src/layout/components/smart-footer/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/header-avatar.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/header-notice.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/i18n-selector.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-avatar.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-notice.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-search.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/components/smart-header/index.less create mode 100644 admin-web/typescript-ant-design-vue/src/layout/components/smart-header/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/components/smart-page-tag/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/smart-layout.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/smart-parent-view.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/smart-side-expand-layout.vue create mode 100644 admin-web/typescript-ant-design-vue/src/layout/smart-side-layout.vue create mode 100644 admin-web/typescript-ant-design-vue/src/lib/axios.ts create mode 100644 admin-web/typescript-ant-design-vue/src/lib/smart-sentry.ts create mode 100644 admin-web/typescript-ant-design-vue/src/lib/smart-wartermark.ts create mode 100644 admin-web/typescript-ant-design-vue/src/main.ts create mode 100644 admin-web/typescript-ant-design-vue/src/plugins/smart-enums-plugin.ts create mode 100644 admin-web/typescript-ant-design-vue/src/router/index.ts create mode 100644 admin-web/typescript-ant-design-vue/src/router/routers.ts create mode 100644 admin-web/typescript-ant-design-vue/src/router/system/home.ts create mode 100644 admin-web/typescript-ant-design-vue/src/router/system/login.ts create mode 100644 admin-web/typescript-ant-design-vue/src/shims-vue.d.ts create mode 100644 admin-web/typescript-ant-design-vue/src/store/index.ts create mode 100644 admin-web/typescript-ant-design-vue/src/store/modules/model/UserTagNav.ts create mode 100644 admin-web/typescript-ant-design-vue/src/store/modules/system/app-config.ts create mode 100644 admin-web/typescript-ant-design-vue/src/store/modules/system/project-config.ts create mode 100644 admin-web/typescript-ant-design-vue/src/store/modules/system/role.ts create mode 100644 admin-web/typescript-ant-design-vue/src/store/modules/system/spin.ts create mode 100644 admin-web/typescript-ant-design-vue/src/store/modules/system/user.ts create mode 100644 admin-web/typescript-ant-design-vue/src/theme/index.less create mode 100644 admin-web/typescript-ant-design-vue/src/theme/smart-admin.less create mode 100644 admin-web/typescript-ant-design-vue/src/types/config.d.ts create mode 100644 admin-web/typescript-ant-design-vue/src/types/env.d.ts create mode 100644 admin-web/typescript-ant-design-vue/src/types/smart-enum.d.ts create mode 100644 admin-web/typescript-ant-design-vue/src/types/user.d.ts create mode 100644 admin-web/typescript-ant-design-vue/src/utils/cookie-util.ts create mode 100644 admin-web/typescript-ant-design-vue/src/utils/local-util.ts create mode 100644 admin-web/typescript-ant-design-vue/src/views/business/goods/components/goods-operate-modal.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/business/goods/goods-list.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/business/setting/components/category-operate-modal.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/business/setting/components/category-tree-table.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/business/setting/demo-setting.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/business/setting/goods-setting.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/child-department-list/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/department-tree/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/employee-list/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/operate-department-modal/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/operate-employee-modal/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/update-employee-department-modal/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/department/department-mitt.ts create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/department/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/operate-role-modal/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-data-scope/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-employee-list/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-list/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-setting/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/index.less create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-checkbox.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-menu.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-point.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/employee/role/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/home/components/gauge.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/home/index.less create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/home/index.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/login/login.less create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/login/login.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/menu/components/menu-operate-modal.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/menu/components/menu-tree-select.vue create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/menu/menu-list-table-columns.ts create mode 100644 admin-web/typescript-ant-design-vue/src/views/system/menu/menu-list.vue create mode 100644 admin-web/typescript-ant-design-vue/src/vite-env.d.ts create mode 100644 admin-web/typescript-ant-design-vue/tsconfig.json create mode 100644 admin-web/typescript-ant-design-vue/vite.config.ts delete mode 100644 smart-admin-h5/.browserslistrc delete mode 100644 smart-admin-h5/.editorconfig delete mode 100644 smart-admin-h5/.env.development delete mode 100644 smart-admin-h5/.env.local delete mode 100644 smart-admin-h5/.env.pre delete mode 100644 smart-admin-h5/.env.prod delete mode 100644 smart-admin-h5/.env.sit delete mode 100644 smart-admin-h5/.eslintignore delete mode 100644 smart-admin-h5/.eslintrc.js delete mode 100644 smart-admin-h5/.gitignore delete mode 100644 smart-admin-h5/.postcssrc.js delete mode 100644 smart-admin-h5/.prettierrc.js delete mode 100644 smart-admin-h5/.sentryclirc delete mode 100644 smart-admin-h5/README.md delete mode 100644 smart-admin-h5/babel.config.js delete mode 100644 smart-admin-h5/package.json delete mode 100644 smart-admin-h5/public/index.html delete mode 100644 smart-admin-h5/src/App.vue delete mode 100644 smart-admin-h5/src/api/employee.js delete mode 100644 smart-admin-h5/src/api/file.js delete mode 100644 smart-admin-h5/src/api/login.js delete mode 100644 smart-admin-h5/src/api/system-config.js delete mode 100644 smart-admin-h5/src/api/user.js delete mode 100644 smart-admin-h5/src/assets/css/index.scss delete mode 100644 smart-admin-h5/src/components/employee/department-employee-selector.vue delete mode 100644 smart-admin-h5/src/components/form/select-picker/SmartEnumSelectPicker.vue delete mode 100644 smart-admin-h5/src/components/form/select-picker/SmartSelectPicker delete mode 100644 smart-admin-h5/src/components/mixin/session-mixin.js delete mode 100644 smart-admin-h5/src/components/van-bar/BackNavBar.vue delete mode 100644 smart-admin-h5/src/components/van-bar/RouterNavBar.vue delete mode 100644 smart-admin-h5/src/config/index.js delete mode 100644 smart-admin-h5/src/constants/area.js delete mode 100644 smart-admin-h5/src/constants/erp/contact-company.js delete mode 100644 smart-admin-h5/src/constants/erp/index.js delete mode 100644 smart-admin-h5/src/constants/file.js delete mode 100644 smart-admin-h5/src/constants/index.js delete mode 100644 smart-admin-h5/src/constants/school.js delete mode 100644 smart-admin-h5/src/filters/filter.js delete mode 100644 smart-admin-h5/src/filters/index.js delete mode 100644 smart-admin-h5/src/lib/cookie.js delete mode 100644 smart-admin-h5/src/lib/erp-http.js delete mode 100644 smart-admin-h5/src/lib/http.js delete mode 100644 smart-admin-h5/src/lib/local.js delete mode 100644 smart-admin-h5/src/lib/menu-func.js delete mode 100644 smart-admin-h5/src/lib/printPlugs.js delete mode 100644 smart-admin-h5/src/lib/render-dom.js delete mode 100644 smart-admin-h5/src/lib/smart-sentry.js delete mode 100644 smart-admin-h5/src/lib/util.js delete mode 100644 smart-admin-h5/src/lib/watermark.js delete mode 100644 smart-admin-h5/src/main.js delete mode 100644 smart-admin-h5/src/plugins/smart-sentry.js delete mode 100644 smart-admin-h5/src/plugins/smart.js delete mode 100644 smart-admin-h5/src/plugins/vant.js delete mode 100644 smart-admin-h5/src/router/dashboard/index.js delete mode 100644 smart-admin-h5/src/router/develop/develop.js delete mode 100644 smart-admin-h5/src/router/error/error.js delete mode 100644 smart-admin-h5/src/router/index.js delete mode 100644 smart-admin-h5/src/router/login/login.js delete mode 100644 smart-admin-h5/src/router/router-const.js delete mode 100644 smart-admin-h5/src/router/routers.js delete mode 100644 smart-admin-h5/src/router/user/user.js delete mode 100644 smart-admin-h5/src/store/index.js delete mode 100644 smart-admin-h5/src/store/module/app.js delete mode 100644 smart-admin-h5/src/store/module/user.js delete mode 100644 smart-admin-h5/src/themes/index.scss delete mode 100644 smart-admin-h5/src/utils/index.js delete mode 100644 smart-admin-h5/src/utils/request.js delete mode 100644 smart-admin-h5/src/utils/validate.js delete mode 100644 smart-admin-h5/src/views/dashboard/dashboard.vue delete mode 100644 smart-admin-h5/src/views/develop/config.vue delete mode 100644 smart-admin-h5/src/views/error/404.vue delete mode 100644 smart-admin-h5/src/views/login/login.vue delete mode 100644 smart-admin-h5/src/views/user/change-password.vue delete mode 100644 smart-admin-h5/src/views/user/index.vue delete mode 100644 smart-admin-h5/vue.config.js delete mode 100644 smart-admin-service/.gitignore delete mode 100644 smart-admin-service/README.md delete mode 100644 smart-admin-service/pom.xml delete mode 100644 smart-admin-service/smart-admin-api/doc/readme.txt delete mode 100644 smart-admin-service/smart-admin-api/pom.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/NoNeedLogin.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/NoValidPrivilege.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/CommentSortTypeEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/JudgeEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/ResponseCodeConst.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/controller/BaseController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/BaseEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/ITask.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/OrderItemDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/PageParamDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/exception/SmartResponseCodeException.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatLogger.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatRecordCommendInterface.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/IpUtil.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/StringUtil.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/json/LongJsonDeserializer.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/json/LongJsonSerializer.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/SmartReloadManager.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/SmartReloadScheduler.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/abstracts/AbstractSmartReloadCommand.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/abstracts/AbstractSmartReloadCommand4Spring.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/AbstractSmartReloadObject.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/AnnotationReloadObject.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/InterfaceReloadObject.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/entity/ReloadItem.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/entity/SmartReloadResult.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadCommandInterface.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadThreadLogger.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadable.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartAdminWebAppConfig.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartHeartBeatConfig.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartMybatisPlusConfig.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartReloadConfig.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartRestTemplateConfig.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartSwaggerApiModelEnumConfig.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartWebSocketConfig.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SystemEnvironmentCondition.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/CommonConst.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/SmartReloadTagConst.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/SwaggerTagConst.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/handler/SmartGlobalExceptionHandler.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/handler/SmartOperateLogAspect.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/interceptor/SmartAuthenticationInterceptor.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/listener/SmartAdminStartupRunner.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailSendStatusEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailConfigDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/entity/EmailEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/LogService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogDefaultEmpEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogOperateTypeConst.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogOrderTypeEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/dto/OrderOperateLogSaveDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/dto/SupplierOrderOperateVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/entity/OrderOperateLogEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/vo/OrderOperateLogVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/NoticeManage.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/NoticeService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/dao/NoticeDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeDetailVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReadCountDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReceiveDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReceiveQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeUpdateDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/entity/NoticeEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/entity/NoticeReceiveRecordEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/controller/PeonyController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/dao/PeonyDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyAddDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyUpdateDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/entity/PeonyEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/vo/PeonyExcelVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/vo/PeonyVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/service/PeonyService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/constant/SqlOperateTypeEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/dao/TableDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/CodeGeneratorDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/CodeGeneratorQueryColumnDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/ColumnVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/QueryFieldVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/service/CodeGeneratorComponent.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/service/CodeGeneratorService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/FileController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/FileDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileModuleTypeEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileResponseCodeConst.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileServiceNameConst.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileServiceTypeEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/FileAddDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/FileQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/OSSConfig.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/entity/FileEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/vo/FileVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/vo/UploadVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceAliYun.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceLocal.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceQiNiuYun.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/IFileService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorManager.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/constant/IdGeneratorEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorLastNumberDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorPOJO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorRecordDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/QuartzConst.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/TaskResultEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/TaskStatusEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/controller/QuartzController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/dao/QuartzTaskDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/dao/QuartzTaskLogDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzLogQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskLogVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/entity/QuartzTaskEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/entity/QuartzTaskLogEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskLogService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/task/test/Example.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadCommand.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/dao/ReloadItemDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/dao/ReloadResultDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadItemUpdateDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadItemVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadResultVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/entity/ReloadItemEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/entity/ReloadResultEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/MessageTypeEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/WebSocketServer.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/MessageCommonDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/MessageDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/WebSocketHeartBeatDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeViewTypeEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/entity/DataScopeRoleEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/strategy/DataScopePowerStrategy.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentTreeService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/entity/DepartmentEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/constant/EmployeeStatusEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/bo/EmployeeBO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeAddDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeBaseDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeBatchUpdateStatusDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeLoginFormDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdateDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdatePwdDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/entity/EmployeeEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/vo/EmployeeVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginTokenService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/KaptchaVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginCacheDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginDetailVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginPrivilegeDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/RequestTokenBO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionAddDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationAddDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationResultDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionResultVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionUpdateDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/entity/PositionEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/entity/PositionRelationEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/constant/PrivilegeTypeEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/controller/PrivilegeController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/dao/PrivilegeDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeFunctionDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeFunctionVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeMenuDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeMenuVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeRequestUrlVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/entity/PrivilegeEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeEmployeeService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleSelectedVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/entity/RoleEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/RoleEmployeeService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/domain/RoleEmployeeDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/domain/RoleEmployeeEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeSimpleDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeTreeVO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/entity/RolePrivilegeEntity.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigController.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigDao.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigService.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigDataType.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigEnum.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigResponseCodeConst.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigQueryDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigUpdateDTO.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartBaseEnumUtil.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartDigestUtil.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartPageUtil.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartQuartzUtil.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartRequestTokenUtil.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartSendMailUtil.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartExcelFileType.java delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/dev/application.properties delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/business/email/EmailMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/OrderOperateLogMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/UserLoginLogMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/business/peony/PeonyMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/support/codegenerator/TableMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/support/file/FileMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/support/idgenerator/IdGeneratorMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/support/quartz/QuartzTaskLogMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/support/quartz/QuartzTaskMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/support/smartreload/ReloadItemMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/support/smartreload/ReloadResultMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/system/department/DepartmentMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/system/position/PositionMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/system/privilege/PrivilegeMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/system/role/RolePrivilegeMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/mapper/system/systemconfig/SystemConfigMapper.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/pre/application.properties delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/pre/log4j2.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/prod/log4j2.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/sit/application.properties delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/sit/log4j2.xml delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/sit/spy.properties delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/sql/quartz_mysql_2.3.0.sql delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/sql/smart-admin.sql delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/AddDTO.java.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Controller.java.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Dao.java.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Dao.xml.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Entity.java.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/ExcelVO.java.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/QueryDTO.java.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Service.java.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/UpdateDTO.java.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/VO.java.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/Api.js.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/List.vue.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/ListForm.vue.vm delete mode 100644 smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/Router.js.vm delete mode 100644 smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/BaseTest.java delete mode 100644 smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/SmartAdminApplicationTests.java delete mode 100644 smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/module/support/codegenerator/CodeGeneratorServiceTest.java delete mode 100644 smart-admin-web/.babelrc delete mode 100644 smart-admin-web/.editorconfig delete mode 100644 smart-admin-web/.env.development delete mode 100644 smart-admin-web/.env.local delete mode 100644 smart-admin-web/.env.prod delete mode 100644 smart-admin-web/.env.sit delete mode 100644 smart-admin-web/.eslintrc.js delete mode 100644 smart-admin-web/.gitignore delete mode 100644 smart-admin-web/.travis.yml delete mode 100644 smart-admin-web/README.md delete mode 100644 smart-admin-web/cypress.json delete mode 100644 smart-admin-web/doc/notice.txt delete mode 100644 smart-admin-web/package-lock.json delete mode 100644 smart-admin-web/package.json delete mode 100644 smart-admin-web/public/favicon.ico delete mode 100644 smart-admin-web/public/index.html delete mode 100644 smart-admin-web/src/App.vue delete mode 100644 smart-admin-web/src/api/data-scope.js delete mode 100644 smart-admin-web/src/api/department.js delete mode 100644 smart-admin-web/src/api/email.js delete mode 100644 smart-admin-web/src/api/employee.js delete mode 100644 smart-admin-web/src/api/file.js delete mode 100644 smart-admin-web/src/api/heart-beat.js delete mode 100644 smart-admin-web/src/api/login.js delete mode 100644 smart-admin-web/src/api/notice.js delete mode 100644 smart-admin-web/src/api/online-user.js delete mode 100644 smart-admin-web/src/api/peony.js delete mode 100644 smart-admin-web/src/api/position.js delete mode 100644 smart-admin-web/src/api/privilege.js delete mode 100644 smart-admin-web/src/api/role.js delete mode 100644 smart-admin-web/src/api/smart-reload.js delete mode 100644 smart-admin-web/src/api/system-config.js delete mode 100644 smart-admin-web/src/api/task-manage.js delete mode 100644 smart-admin-web/src/api/user-log.js delete mode 100644 smart-admin-web/src/api/user.js delete mode 100644 smart-admin-web/src/assets/icons/demo.css delete mode 100644 smart-admin-web/src/assets/icons/demo_index.html delete mode 100644 smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/demo.css delete mode 100644 smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/demo_index.html delete mode 100644 smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.css delete mode 100644 smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.eot delete mode 100644 smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.js delete mode 100644 smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.svg delete mode 100644 smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.ttf delete mode 100644 smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.woff delete mode 100644 smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.woff2 delete mode 100644 smart-admin-web/src/assets/icons/iconfont.css delete mode 100644 smart-admin-web/src/assets/icons/iconfont.eot delete mode 100644 smart-admin-web/src/assets/icons/iconfont.js delete mode 100644 smart-admin-web/src/assets/icons/iconfont.svg delete mode 100644 smart-admin-web/src/assets/icons/iconfont.ttf delete mode 100644 smart-admin-web/src/assets/icons/iconfont.woff delete mode 100644 smart-admin-web/src/assets/icons/iconfont.woff2 delete mode 100644 smart-admin-web/src/assets/images/default_icon.png delete mode 100644 smart-admin-web/src/assets/images/error-page/error-401.svg delete mode 100644 smart-admin-web/src/assets/images/error-page/error-404.svg delete mode 100644 smart-admin-web/src/assets/images/error-page/error-500.svg delete mode 100644 smart-admin-web/src/assets/images/icon-qr-qq-wechat.png delete mode 100644 smart-admin-web/src/assets/images/icon-social-bilibili.svg delete mode 100644 smart-admin-web/src/assets/images/icon-social-juejin.svg delete mode 100644 smart-admin-web/src/assets/images/icon-social-twitter.svg delete mode 100644 smart-admin-web/src/assets/images/icon-social-zhihu.svg delete mode 100644 smart-admin-web/src/assets/images/login-alipay.png delete mode 100644 smart-admin-web/src/assets/images/login-bg.jpg delete mode 100644 smart-admin-web/src/assets/images/login-logo.png delete mode 100644 smart-admin-web/src/assets/images/login-sina.png delete mode 100644 smart-admin-web/src/assets/images/login-taobao.png delete mode 100644 smart-admin-web/src/assets/images/login_desc_bg.png delete mode 100644 smart-admin-web/src/assets/images/login_logo.png delete mode 100644 smart-admin-web/src/assets/images/logo.png delete mode 100644 smart-admin-web/src/assets/images/logo1.png delete mode 100644 smart-admin-web/src/assets/images/message.png delete mode 100644 smart-admin-web/src/assets/images/shadow.png delete mode 100644 smart-admin-web/src/assets/images/slider/sub_slider_active.png delete mode 100644 smart-admin-web/src/assets/images/slider/sub_slider_default.png delete mode 100644 smart-admin-web/src/assets/style/lib/animate.css delete mode 100644 smart-admin-web/src/components/active-plate/active-plate.vue delete mode 100644 smart-admin-web/src/components/charts/bar.vue delete mode 100644 smart-admin-web/src/components/charts/index.js delete mode 100644 smart-admin-web/src/components/charts/pie.vue delete mode 100644 smart-admin-web/src/components/charts/theme.json delete mode 100644 smart-admin-web/src/components/common-icon/common-icon.vue delete mode 100644 smart-admin-web/src/components/common-icon/index.js delete mode 100644 smart-admin-web/src/components/count-to/count-to.vue delete mode 100644 smart-admin-web/src/components/count-to/index.js delete mode 100644 smart-admin-web/src/components/count-to/index.less delete mode 100644 smart-admin-web/src/components/editor/editor.vue delete mode 100644 smart-admin-web/src/components/editor/index.js delete mode 100644 smart-admin-web/src/components/employee/employee-selector.vue delete mode 100644 smart-admin-web/src/components/icons/icons.vue delete mode 100644 smart-admin-web/src/components/icons/index.js delete mode 100644 smart-admin-web/src/components/main/components/a-back-top/index.js delete mode 100644 smart-admin-web/src/components/main/components/a-back-top/index.vue delete mode 100644 smart-admin-web/src/components/main/components/fullscreen/fullscreen.vue delete mode 100644 smart-admin-web/src/components/main/components/fullscreen/index.js delete mode 100644 smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less delete mode 100644 smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue delete mode 100644 smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/index.js delete mode 100644 smart-admin-web/src/components/main/components/header-bar/header-bar.less delete mode 100644 smart-admin-web/src/components/main/components/header-bar/header-bar.vue delete mode 100644 smart-admin-web/src/components/main/components/header-bar/index.js delete mode 100644 smart-admin-web/src/components/main/components/header-bar/sider-trigger/index.js delete mode 100644 smart-admin-web/src/components/main/components/header-bar/sider-trigger/sider-trigger.less delete mode 100644 smart-admin-web/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue delete mode 100644 smart-admin-web/src/components/main/components/language/index.js delete mode 100644 smart-admin-web/src/components/main/components/language/language.vue delete mode 100644 smart-admin-web/src/components/main/components/notice/notice.vue delete mode 100644 smart-admin-web/src/components/main/components/side-menu/collapsed-menu.vue delete mode 100644 smart-admin-web/src/components/main/components/side-menu/index.js delete mode 100644 smart-admin-web/src/components/main/components/side-menu/item-mixin.js delete mode 100644 smart-admin-web/src/components/main/components/side-menu/mixin.js delete mode 100644 smart-admin-web/src/components/main/components/side-menu/side-menu-item.vue delete mode 100644 smart-admin-web/src/components/main/components/side-menu/side-menu.less delete mode 100644 smart-admin-web/src/components/main/components/side-menu/side-menu.vue delete mode 100644 smart-admin-web/src/components/main/components/tags-nav/index.js delete mode 100644 smart-admin-web/src/components/main/components/tags-nav/tags-nav.less delete mode 100644 smart-admin-web/src/components/main/components/tags-nav/tags-nav.vue delete mode 100644 smart-admin-web/src/components/main/components/user/index.js delete mode 100644 smart-admin-web/src/components/main/components/user/user.less delete mode 100644 smart-admin-web/src/components/main/components/user/user.vue delete mode 100644 smart-admin-web/src/components/main/index.js delete mode 100644 smart-admin-web/src/components/main/main.less delete mode 100644 smart-admin-web/src/components/main/main.vue delete mode 100644 smart-admin-web/src/components/smart-admin-ad/ad.vue delete mode 100644 smart-admin-web/src/components/smart-admin-ad/index.js delete mode 100644 smart-admin-web/src/components/tables/edit.vue delete mode 100644 smart-admin-web/src/components/tables/handle-btns.js delete mode 100644 smart-admin-web/src/components/tables/index.js delete mode 100644 smart-admin-web/src/components/tables/index.less delete mode 100644 smart-admin-web/src/components/tables/tables.vue delete mode 100644 smart-admin-web/src/config/index.js delete mode 100644 smart-admin-web/src/constants/file.js delete mode 100644 smart-admin-web/src/constants/index.js delete mode 100644 smart-admin-web/src/constants/login.js delete mode 100644 smart-admin-web/src/constants/notice.js delete mode 100644 smart-admin-web/src/constants/privilege.js delete mode 100644 smart-admin-web/src/constants/table-page.js delete mode 100644 smart-admin-web/src/directives/directives.js delete mode 100644 smart-admin-web/src/directives/index.js delete mode 100644 smart-admin-web/src/directives/module/clipboard.js delete mode 100644 smart-admin-web/src/directives/module/draggable.js delete mode 100644 smart-admin-web/src/directives/module/privilege.js delete mode 100644 smart-admin-web/src/lib/cookie.js delete mode 100644 smart-admin-web/src/lib/http.js delete mode 100644 smart-admin-web/src/lib/local.js delete mode 100644 smart-admin-web/src/lib/menu-func.js delete mode 100644 smart-admin-web/src/lib/printPlugs.js delete mode 100644 smart-admin-web/src/lib/render-dom.js delete mode 100644 smart-admin-web/src/lib/table-action.js delete mode 100644 smart-admin-web/src/lib/util.js delete mode 100644 smart-admin-web/src/locale/index.js delete mode 100644 smart-admin-web/src/locale/lang/en-US.js delete mode 100644 smart-admin-web/src/locale/lang/zh-CN.js delete mode 100644 smart-admin-web/src/locale/lang/zh-TW.js delete mode 100644 smart-admin-web/src/main.js delete mode 100644 smart-admin-web/src/main.less delete mode 100644 smart-admin-web/src/plugins/error-store/index.js delete mode 100644 smart-admin-web/src/plugins/index.js delete mode 100644 smart-admin-web/src/router/before-close.js delete mode 100644 smart-admin-web/src/router/index.js delete mode 100644 smart-admin-web/src/router/module/business/email.js delete mode 100644 smart-admin-web/src/router/module/business/index.js delete mode 100644 smart-admin-web/src/router/module/business/keep-alive.js delete mode 100644 smart-admin-web/src/router/module/business/notice.js delete mode 100644 smart-admin-web/src/router/module/business/peony.js delete mode 100644 smart-admin-web/src/router/module/business/three-router.js delete mode 100644 smart-admin-web/src/router/module/error.js delete mode 100644 smart-admin-web/src/router/module/home.js delete mode 100644 smart-admin-web/src/router/module/support/api-doc.js delete mode 100644 smart-admin-web/src/router/module/support/heart-beat.js delete mode 100644 smart-admin-web/src/router/module/support/index.js delete mode 100644 smart-admin-web/src/router/module/support/monitor.js delete mode 100644 smart-admin-web/src/router/module/support/reload.js delete mode 100644 smart-admin-web/src/router/module/support/task.js delete mode 100644 smart-admin-web/src/router/module/system/employee.js delete mode 100644 smart-admin-web/src/router/module/system/file.js delete mode 100644 smart-admin-web/src/router/module/system/index.js delete mode 100644 smart-admin-web/src/router/module/system/system-setting.js delete mode 100644 smart-admin-web/src/router/module/system/user-log.js delete mode 100644 smart-admin-web/src/router/routers.js delete mode 100644 smart-admin-web/src/store/index.js delete mode 100644 smart-admin-web/src/store/module/app.js delete mode 100644 smart-admin-web/src/store/module/notice.js delete mode 100644 smart-admin-web/src/store/module/user.js delete mode 100644 smart-admin-web/src/themes/ReadMe.md delete mode 100644 smart-admin-web/src/themes/index.less delete mode 100644 smart-admin-web/src/views/business/email/email-list.vue delete mode 100644 smart-admin-web/src/views/business/email/send-mail.vue delete mode 100644 smart-admin-web/src/views/business/keep-alive/add-content.vue delete mode 100644 smart-admin-web/src/views/business/keep-alive/content-list.vue delete mode 100644 smart-admin-web/src/views/business/notice/notice-detail.vue delete mode 100644 smart-admin-web/src/views/business/notice/notice-list.vue delete mode 100644 smart-admin-web/src/views/business/notice/person-notice.vue delete mode 100644 smart-admin-web/src/views/business/peony/components/peony-list-form.vue delete mode 100644 smart-admin-web/src/views/business/peony/peony-list.vue delete mode 100644 smart-admin-web/src/views/business/three-level-router/three-level-router-view.vue delete mode 100644 smart-admin-web/src/views/error-page/401.vue delete mode 100644 smart-admin-web/src/views/error-page/404.vue delete mode 100644 smart-admin-web/src/views/error-page/500.vue delete mode 100644 smart-admin-web/src/views/error-page/back-btn-group.vue delete mode 100644 smart-admin-web/src/views/error-page/error-content.vue delete mode 100644 smart-admin-web/src/views/error-page/error.less delete mode 100644 smart-admin-web/src/views/home/components/card.vue delete mode 100644 smart-admin-web/src/views/home/components/chart-bar.vue delete mode 100644 smart-admin-web/src/views/home/components/chart-funnel.vue delete mode 100644 smart-admin-web/src/views/home/components/chart-gauge.vue delete mode 100644 smart-admin-web/src/views/home/components/chart-line.vue delete mode 100644 smart-admin-web/src/views/home/components/chart-pie.vue delete mode 100644 smart-admin-web/src/views/home/components/home-circle.vue delete mode 100644 smart-admin-web/src/views/home/components/home-progress.vue delete mode 100644 smart-admin-web/src/views/home/components/theme.json delete mode 100644 smart-admin-web/src/views/home/home.vue delete mode 100644 smart-admin-web/src/views/home/index.js delete mode 100644 smart-admin-web/src/views/login/canvas.js delete mode 100644 smart-admin-web/src/views/login/components/login-form.vue delete mode 100644 smart-admin-web/src/views/login/login.less delete mode 100644 smart-admin-web/src/views/login/login.vue delete mode 100644 smart-admin-web/src/views/support/api-doc/swagger.vue delete mode 100644 smart-admin-web/src/views/support/heart-beat/heart-beat-list.vue delete mode 100644 smart-admin-web/src/views/support/monitor/online-user.vue delete mode 100644 smart-admin-web/src/views/support/monitor/sql.vue delete mode 100644 smart-admin-web/src/views/support/reload/smart-reload/smart-reload-list.vue delete mode 100644 smart-admin-web/src/views/support/task/task-list.vue delete mode 100644 smart-admin-web/src/views/system/employee/components/department-employee-tree-item/department-employee-tree-item.vue delete mode 100644 smart-admin-web/src/views/system/employee/components/department-employee-tree/department-employee-tree.vue delete mode 100644 smart-admin-web/src/views/system/employee/position/position-list.vue delete mode 100644 smart-admin-web/src/views/system/employee/role-employee/components/employee-table-add/employee-table-add.vue delete mode 100644 smart-admin-web/src/views/system/employee/role-employee/components/employee-table-detail/employee-table-detail.vue delete mode 100644 smart-admin-web/src/views/system/employee/role-employee/components/employee-table/employee-table.vue delete mode 100644 smart-admin-web/src/views/system/employee/role-employee/role-employee-manage.vue delete mode 100644 smart-admin-web/src/views/system/employee/role/components/role-data-scope/role-data-scope.vue delete mode 100644 smart-admin-web/src/views/system/employee/role/components/role-list/role-list.vue delete mode 100644 smart-admin-web/src/views/system/employee/role/components/role-tree/role-tree.vue delete mode 100644 smart-admin-web/src/views/system/employee/role/role-manage.vue delete mode 100644 smart-admin-web/src/views/system/file/file-list.vue delete mode 100644 smart-admin-web/src/views/system/system-setting/system-config/system-config.vue delete mode 100644 smart-admin-web/src/views/system/system-setting/system-privilege/components/privilege-form.vue delete mode 100644 smart-admin-web/src/views/system/system-setting/system-privilege/system-privilege.vue delete mode 100644 smart-admin-web/src/views/system/user-log/user-login-log.vue delete mode 100644 smart-admin-web/src/views/system/user-log/user-operate-log.vue delete mode 100644 smart-admin-web/src/views/three-router/three-content.vue delete mode 100644 smart-admin-web/tests/e2e/.eslintrc delete mode 100644 smart-admin-web/tests/e2e/plugins/index.js delete mode 100644 smart-admin-web/tests/e2e/specs/test.js delete mode 100644 smart-admin-web/tests/e2e/support/commands.js delete mode 100644 smart-admin-web/tests/e2e/support/index.js delete mode 100644 smart-admin-web/tests/unit/.eslintrc.js delete mode 100644 smart-admin-web/tests/unit/HelloWorld.spec.js delete mode 100644 smart-admin-web/vscode/settings.json delete mode 100644 smart-admin-web/vue.config.js delete mode 100644 代码规范/api接口规范.md delete mode 100644 代码规范/front-standard-guide.md delete mode 100644 代码规范/java-standard-guide.md diff --git a/.gitignore b/.gitignore index a2a3040a..5b4c80c2 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,15 @@ build/ ### VS Code ### .vscode/ + +/admin-api/java-api/target/ + + +/admin-web/typescript-ant-design-vue/node_modules/ + + + + + + + diff --git a/README.md b/README.md index be05793a..e541689c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -### SmartAdmin 2.0 (即 vue3 的 js版本和ts版本 )正在火热开发中,欢迎持续关注 ! #### 简介 SmartAdmin由河南·洛阳 [1024创新实验室](https://www.1024lab.net/)团队研发的一套互联网企业级的通用型中后台解决方案!使用最前沿的前后台技术栈SpringBoot和Vue,前后端分离,**我们开源一套漂亮的代码和一套整洁的代码规范**,让大家在这浮躁的代码世界里感受到一股把代码写好的清流!同时又让开发者节省大量的时间,减少加班,快乐工作,热爱生活。SmartAdmin 让你从认识到忘不了,绝对是你最想要的! diff --git a/smart-admin-web/.eslintignore b/admin-api/go-api/readme.md similarity index 100% rename from smart-admin-web/.eslintignore rename to admin-api/go-api/readme.md diff --git a/smart-admin-web/src/filters/index.js b/admin-api/java-api/README.md similarity index 100% rename from smart-admin-web/src/filters/index.js rename to admin-api/java-api/README.md diff --git a/admin-api/java-api/pom.xml b/admin-api/java-api/pom.xml new file mode 100644 index 00000000..a49a58fb --- /dev/null +++ b/admin-api/java-api/pom.xml @@ -0,0 +1,401 @@ + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.1 + + + net.1024lab + smart-admin + 2.0.0 + jar + + smart-admin + smart-admin project + + + 1.8 + 4.3.0 + 6.4.3 + 3.4.1 + 3.8.6 + 2.7.0 + 1.2.62 + 1.2.6 + 0.9.1 + 4.2.0 + 4.2.2 + 2.3.2 + 20030203.000550 + 30.1.1-jre + + + + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-logging + + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.boot + spring-boot-starter + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-log4j2 + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-test + test + + + + mysql + mysql-connector-java + + + + com.github.ben-manes.caffeine + caffeine + + + error_prone_annotations + com.google.errorprone + + + + + + org.projectlombok + lombok + + + + org.apache.commons + commons-pool2 + + + + org.springframework + spring-mock + 2.0.8 + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + org.springframework.boot + spring-boot-starter-logging + + + + + + p6spy + p6spy + ${p6spy.version} + + + + io.springfox + springfox-swagger2 + ${swagger.version} + + + guava + com.google.guava + + + + + + com.squareup.okhttp3 + okhttp + + + + io.springfox + springfox-swagger-ui + ${swagger.version} + + + + com.alibaba + fastjson + ${fast-json.version} + + + + com.alibaba + druid + ${druid.version} + + + + io.jsonwebtoken + jjwt + ${jjwt.version} + + + + com.google.guava + guava + ${google-guava.version} + + + + com.github.penggle + kaptcha + ${kaptcha.version} + + + + commons-io + commons-io + ${commons-io.version} + + + + + cn.afterturn + easypoi-spring-boot-starter + ${easypoi.version} + + + + cn.afterturn + easypoi-base + ${easypoi.version} + + + javassist + org.javassist + + + guava + com.google.guava + + + xmlbeans + org.apache.xmlbeans + + + + + + cn.afterturn + easypoi-web + ${easypoi.version} + + + javassist + org.javassist + + + + + cn.afterturn + easypoi-annotation + ${easypoi.version} + + + + + com.googlecode.concurrentlinkedhashmap + concurrentlinkedhashmap-lru + 1.4.2 + + + + org.reflections + reflections + 0.9.11 + + + guava + com.google.guava + + + + + + + org.apache.commons + commons-collections4 + 4.4 + + + + com.amazonaws + aws-java-sdk-s3 + 1.11.842 + + + commons-logging + commons-logging + + + + + + + xerces + xercesImpl + 2.12.0 + + + org.apache.poi + poi-scratchpad + 4.1.1 + + + + + org.apache.poi + ooxml-schemas + 1.3 + + + + + velocity + org.apache.velocity + 1.7 + + + + org.apache.velocity + velocity-engine-core + 2.0 + + + + + + + ${profiles.active}-${project.name} + + + false + src/main/resources + + dev/* + sit/* + pre/* + prod/* + + + + + src/main/resources/${profiles.active} + true + + *.properties + + + + + src/main/resources/${profiles.active} + false + + *.* + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.2 + + 1.8 + 1.8 + UTF-8 + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + true + + + + + + + + dev + + dev + + + true + + + + sit + + sit + + + + pre + + pre + + + + prod + + prod + + + + + \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/SmartAdminApplication.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/SmartAdminApplication.java similarity index 62% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/SmartAdminApplication.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/SmartAdminApplication.java index b22d0670..ade0246a 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/SmartAdminApplication.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/SmartAdminApplication.java @@ -1,5 +1,7 @@ -package net.lab1024.smartadmin; +package net.lab1024.smartadmin.service; +import org.apache.ibatis.annotations.Mapper; +import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; @@ -9,21 +11,18 @@ import org.springframework.scheduling.annotation.EnableScheduling; /** * [ admin 项目启动类 ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 + * @author 罗伊 * */ -@SpringBootApplication(scanBasePackages = {"net.lab1024.smartadmin", "cn.afterturn.easypoi"}) +@SpringBootApplication @EnableCaching @EnableScheduling @EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true) +@MapperScan(value = "net.lab1024.smartadmin.service.*",basePackageClasses = Mapper.class) public class SmartAdminApplication { public static void main(String[] args) { SpringApplication.run(SmartAdminApplication.class, args); + System.out.println("####################### smart-admin-service start #######################"); } } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/annotation/SmartReload.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoNeedLogin.java similarity index 60% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/annotation/SmartReload.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoNeedLogin.java index eac54afd..ec62643e 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/annotation/SmartReload.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoNeedLogin.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.common.reload.annotation; +package net.lab1024.smartadmin.service.common.anno; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -6,13 +6,12 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * 定义 SmartReload 注解 + * [ ] * - * @author zhuoda + * @author 罗伊 + * @date 2020/8/21 14:55 */ -@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface SmartReload { - - String value(); +@Target(ElementType.METHOD) +public @interface NoNeedLogin { } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoRepeatSubmit.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoRepeatSubmit.java new file mode 100644 index 00000000..7c0916d2 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoRepeatSubmit.java @@ -0,0 +1,29 @@ +package net.lab1024.smartadmin.service.common.anno; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 标记 需要防止重复提交 的注解 + * + * @author listen + * @date 2020年11月25日 10:56:58 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface NoRepeatSubmit { + + /** + * 重复提交间隔时间/毫秒 + * + * @return + */ + int value() default 1200; + + /** + * 最长间隔30s + */ + int MAX_INTERVAL = 30000; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoValidPrivilege.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoValidPrivilege.java new file mode 100644 index 00000000..15e8ade4 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/anno/NoValidPrivilege.java @@ -0,0 +1,14 @@ +package net.lab1024.smartadmin.service.common.anno; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/21 15:02 + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface NoValidPrivilege { +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentResponseCodeConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/DepartmentResponseCodeConst.java similarity index 90% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentResponseCodeConst.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/DepartmentResponseCodeConst.java index a7a219e0..e7ce0cb7 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentResponseCodeConst.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/DepartmentResponseCodeConst.java @@ -1,6 +1,4 @@ -package net.lab1024.smartadmin.module.system.department; - -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; +package net.lab1024.smartadmin.service.common.codeconst; /** * 部门返回信息常量类 diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/constant/EmployeeResponseCodeConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/EmployeeResponseCodeConst.java similarity index 76% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/constant/EmployeeResponseCodeConst.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/EmployeeResponseCodeConst.java index 379b8be7..19648743 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/constant/EmployeeResponseCodeConst.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/EmployeeResponseCodeConst.java @@ -1,12 +1,10 @@ -package net.lab1024.smartadmin.module.system.employee.constant; - -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; +package net.lab1024.smartadmin.service.common.codeconst; /** * 员工常量类 * 3001-3999 * - * @author lidoudou + * @author 开云 * @date 2017年12月19日下午19:04:52 */ public class EmployeeResponseCodeConst extends ResponseCodeConst { @@ -34,16 +32,18 @@ public class EmployeeResponseCodeConst extends ResponseCodeConst { /** * 您的账号已被禁用,不得登录系统 */ - public static final EmployeeResponseCodeConst IS_DISABLED = new EmployeeResponseCodeConst(3005, "您的账号已被禁用,不得登录系统!"); + public static final EmployeeResponseCodeConst IS_DISABLED = new EmployeeResponseCodeConst(3005, "您的账号已被禁用"); /** * 登录名已存在 */ public static final EmployeeResponseCodeConst LOGIN_NAME_EXISTS = new EmployeeResponseCodeConst(3006, "登录名已存在!"); + /** - * 密码输入有误,请重新输入 10115 + * 密码输入有误,请重新输入 */ - public static final EmployeeResponseCodeConst PASSWORD_ERROR = new EmployeeResponseCodeConst(3007, "密码输入有误,请重新输入"); + public static final EmployeeResponseCodeConst PASSWORD_ERROR = new EmployeeResponseCodeConst(3007, "密码错误"); + /** * 手机号已存在 */ @@ -53,7 +53,12 @@ public class EmployeeResponseCodeConst extends ResponseCodeConst { public static final EmployeeResponseCodeConst BIRTHDAY_ERROR = new EmployeeResponseCodeConst(3010, "生日格式不正确"); - public static final EmployeeResponseCodeConst VERIFICATION_CODE_INVALID = new EmployeeResponseCodeConst(3011, "验证码无效"); + public static final EmployeeResponseCodeConst VERIFICATION_CODE_INVALID = new EmployeeResponseCodeConst(3011, "请输入正确的验证码"); + + /** + * 用户名或密码错误 多次错误用于前端判断展示验证码 + */ + public static final EmployeeResponseCodeConst LOGIN_FAILED_REPEATEDLY = new EmployeeResponseCodeConst(3012, "用户名或密码错误!"); public EmployeeResponseCodeConst(int code, String msg) { super(code, msg); diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/FileResponseCodeConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/FileResponseCodeConst.java new file mode 100644 index 00000000..bea7e99f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/FileResponseCodeConst.java @@ -0,0 +1,47 @@ +package net.lab1024.smartadmin.service.common.codeconst; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:57 + */ +public class FileResponseCodeConst extends ResponseCodeConst { + + /** + * 4001 -4999 + */ + public static final FileResponseCodeConst FILE_EMPTY = new FileResponseCodeConst(4001, "上传文件不能为空"); + + public static final FileResponseCodeConst FILE_SIZE_ERROR = new FileResponseCodeConst(4002, "上传文件超过%s,请重新上传!"); + + public static final FileResponseCodeConst UNKNOWN_FILE_TYPE = new FileResponseCodeConst(4003, "未知的文件类型!"); + + public static final FileResponseCodeConst LOCAL_UPDATE_PREFIX_ERROR = new FileResponseCodeConst(4004, "文件本地上传缺少URL前缀配置[local_upload_url_prefix]"); + + public static final FileResponseCodeConst UPLOAD_ERROR = new FileResponseCodeConst(4005, "上传失败"); + + public static final FileResponseCodeConst URL_ERROR = new FileResponseCodeConst(4006, "获取URL失败"); + + public static final FileResponseCodeConst FILE_MODULE_ERROR = new FileResponseCodeConst(4007, "文件目录类型错误"); + + public static final FileResponseCodeConst FILE_NOT_EXIST = new FileResponseCodeConst(4008, "文件不存在"); + + public static final FileResponseCodeConst DOWNLOAD_ERROR = new FileResponseCodeConst(4009, "文件下载失败"); + + public static final FileResponseCodeConst VOD_SERVICE_ERROR = new FileResponseCodeConst(4010, "VOD服务错误:"); + + public static final FileResponseCodeConst VOD_FILE_ERROR = new FileResponseCodeConst(4011, "请上传正确的音/视频格式"); + + public static final FileResponseCodeConst VOD_FILE_NOT_EXIST = new FileResponseCodeConst(4012, "视频文件不存在"); + + public static final FileResponseCodeConst FILE_NAME_ERROR = new FileResponseCodeConst(4013, "文件名称必须1-100个字符"); + + public static final FileResponseCodeConst VOD_TOKEN_ERROR = new FileResponseCodeConst(4014, "视频文件TOKEN失效"); + + public static final FileResponseCodeConst VOD_CIPHER_TEXT_ERROR = new FileResponseCodeConst(4015, "视频文件CIPHER_TEXT无效"); + + public FileResponseCodeConst(int code, String msg) { + super(code, msg); + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginResponseCodeConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/LoginResponseCodeConst.java similarity index 79% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginResponseCodeConst.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/LoginResponseCodeConst.java index 0cfb8d22..a24b44e9 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginResponseCodeConst.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/LoginResponseCodeConst.java @@ -1,12 +1,10 @@ -package net.lab1024.smartadmin.module.system.login; - -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; +package net.lab1024.smartadmin.service.common.codeconst; /** * 员工常量类 * 1001-1999 * - * @author lidoudou + * @author 开云 * @date 2017年12月19日下午19:04:52 */ public class LoginResponseCodeConst extends ResponseCodeConst { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionResponseCodeConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/PositionResponseCodeConst.java similarity index 70% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionResponseCodeConst.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/PositionResponseCodeConst.java index 43528034..e9011c48 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionResponseCodeConst.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/PositionResponseCodeConst.java @@ -1,9 +1,7 @@ -package net.lab1024.smartadmin.module.system.position; - -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; +package net.lab1024.smartadmin.service.common.codeconst; /** - * @author zzr + * @author */ public class PositionResponseCodeConst extends ResponseCodeConst { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/constant/PrivilegeResponseCodeConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/PrivilegeResponseCodeConst.java similarity index 74% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/constant/PrivilegeResponseCodeConst.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/PrivilegeResponseCodeConst.java index 3efbd9b2..6a8f0c3d 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/constant/PrivilegeResponseCodeConst.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/PrivilegeResponseCodeConst.java @@ -1,16 +1,8 @@ -package net.lab1024.smartadmin.module.system.privilege.constant; - -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; +package net.lab1024.smartadmin.service.common.codeconst; /** - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 + * @author 罗伊 */ public class PrivilegeResponseCodeConst extends ResponseCodeConst { diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeConst.java new file mode 100644 index 00000000..dae253a7 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeConst.java @@ -0,0 +1,111 @@ +package net.lab1024.smartadmin.service.common.codeconst; + +import lombok.extern.slf4j.Slf4j; + +/** + * 1 表示成功 + * 10 - 100 表示 系统异常,即java报错了 + * 100 以上, 业务 + *

+ * 根据实际业务,设置范围值 + * 正常100就够了 + * + * @author Administrator + */ +@Slf4j +public class ResponseCodeConst { + + public static final ResponseCodeConst SUCCESS = new ResponseCodeConst(1, "操作成功!", true); + + public static final ResponseCodeConst SYSTEM_ERROR = new ResponseCodeConst(11, "系统繁忙,请稍后重试"); + + public static final ResponseCodeConst ERROR_PARAM = new ResponseCodeConst(101, "参数异常"); + + public static final ResponseCodeConst ERROR_PARAM_ANY = new ResponseCodeConst(102, "%s参数异常!"); + + public static final ResponseCodeConst DEVELOPMENT = new ResponseCodeConst(112, "此功能正在开发中"); + + public static final ResponseCodeConst NOT_EXISTS = new ResponseCodeConst(113, "数据不存在"); + + public static final ResponseCodeConst REQUEST_METHOD_ERROR = new ResponseCodeConst(114, "请求方式错误"); + + public static final ResponseCodeConst JSON_FORMAT_ERROR = new ResponseCodeConst(115, "请求前端参数格式错误"); + + public static final ResponseCodeConst PERMISSION_DENIED = new ResponseCodeConst(116, "您没有权限修改数据"); + + public static final ResponseCodeConst ALREADY_EXIST = new ResponseCodeConst(117, "数据已存在"); + + public static final ResponseCodeConst STATUS_ERROR = new ResponseCodeConst(118, "数据状态异常"); + + public static final ResponseCodeConst AREA_ERROR = new ResponseCodeConst(119, "地区数据错误"); + + public static final ResponseCodeConst REQUEST_ERROR = new ResponseCodeConst(120, "请求异常"); + + public static final ResponseCodeConst TOKEN_ERROR = new ResponseCodeConst(121, "登录失效,请重新登录"); + + public static final ResponseCodeConst BUSINESS_HANDING = new ResponseCodeConst(122, "业务正在繁忙处理中,请稍后再试"); + + public static final ResponseCodeConst NOT_SUPPORT = new ResponseCodeConst(123, "暂不支持"); + + public static final ResponseCodeConst REPEAT_SUBMIT = new ResponseCodeConst(125, "太...太快了,请您稍后重试~"); + + protected int code; + + protected String msg; + + protected boolean success; + + public ResponseCodeConst() { + } + + protected ResponseCodeConst(int code, String msg) { + super(); + this.code = code; + this.msg = msg; + ResponseCodeContainer.put(this); + } + + protected ResponseCodeConst(int code, String msg, boolean success) { + super(); + this.code = code; + this.msg = msg; + this.success = success; + ResponseCodeContainer.put(this); + } + + protected ResponseCodeConst(int code) { + super(); + this.code = code; + ResponseCodeContainer.put(this); + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public boolean issucc() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static void init() { + log.info("-------------- ResponseCodeConst init -------------"); + } + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeContainer.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeContainer.java new file mode 100644 index 00000000..d5ff7771 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeContainer.java @@ -0,0 +1,73 @@ +package net.lab1024.smartadmin.service.common.codeconst; + +import lombok.extern.slf4j.Slf4j; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/1/8 11:28 + */ +@Slf4j +public class ResponseCodeContainer { + + private static final Map RESPONSE_CODE_MAP = new HashMap<>(); + + private static final Map, int[]> RESPONSE_CODE_RANGE_MAP = new HashMap<>(); + + /** + * id的范围:[start, end]左闭右闭 + * + * @param clazz + * @param start + * @param end + */ + public static void register(Class clazz, int start, int end) { + if (start > end) { + throw new IllegalArgumentException(" start > end!"); + } + + if (RESPONSE_CODE_RANGE_MAP.containsKey(clazz)) { + throw new IllegalArgumentException(String.format(" Class:%s already exist!", clazz.getSimpleName())); + } + RESPONSE_CODE_RANGE_MAP.forEach((k, v) -> { + if ((start >= v[0] && start <= v[1]) || (end >= v[0] && end <= v[1])) { + throw new IllegalArgumentException(String.format(" Class:%s 's id range[%d,%d] has " + "intersection with " + "class:%s", clazz.getSimpleName(), start, end, + k.getSimpleName())); + } + }); + + RESPONSE_CODE_RANGE_MAP.put(clazz, new int[]{start, end}); + + // 提前初始化static变量,进行范围检测 + Field[] fields = clazz.getFields(); + if (fields.length != 0) { + try { + fields[0].get(clazz); + } catch (IllegalArgumentException | IllegalAccessException e) { + log.error("", e); + } + } + } + + public static void put(ResponseCodeConst codeConst) { + int[] idRange = RESPONSE_CODE_RANGE_MAP.get(codeConst.getClass()); + if (idRange == null) { + throw new IllegalArgumentException(String.format(" Class:%s has not been registered!", codeConst.getClass().getSimpleName())); + } + int code = codeConst.code; + if (code < idRange[0] || code > idRange[1]) { + throw new IllegalArgumentException(String.format(" Id(%d) out of range[%d,%d], " + "class:%s", code, idRange[0], idRange[1], codeConst.getClass().getSimpleName())); + } + if (RESPONSE_CODE_MAP.keySet().contains(code)) { + log.error(String.format(" Id(%d) out of range[%d,%d], " + "class:%s code is repeat!", code, idRange[0], idRange[1], codeConst.getClass().getSimpleName())); + System.exit(0); + } + RESPONSE_CODE_MAP.put(code, codeConst); + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeRegister.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeRegister.java new file mode 100644 index 00000000..decb66d1 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/ResponseCodeRegister.java @@ -0,0 +1,30 @@ +package net.lab1024.smartadmin.service.common.codeconst; + +import lombok.extern.slf4j.Slf4j; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/1/8 15:59 + */ +@Slf4j +public class ResponseCodeRegister { + + // 范围声明 + static { + // 系统功能,从0开始,step=1000 + ResponseCodeContainer.register(ResponseCodeConst.class, 0, 1000); + ResponseCodeContainer.register(LoginResponseCodeConst.class, 1001, 1999); + ResponseCodeContainer.register(DepartmentResponseCodeConst.class, 2001, 2999); + ResponseCodeContainer.register(EmployeeResponseCodeConst.class, 3001, 3999); + ResponseCodeContainer.register(FileResponseCodeConst.class, 4001, 5000); + ResponseCodeContainer.register(RoleResponseCodeConst.class, 6001, 6999); + ResponseCodeContainer.register(PrivilegeResponseCodeConst.class, 7001, 7999); + ResponseCodeContainer.register(PositionResponseCodeConst.class, 13000, 13999); + } + + public static void init() { + log.info("-------------- ResponseCodeConst init -------------"); + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleResponseCodeConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/RoleResponseCodeConst.java similarity index 78% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleResponseCodeConst.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/RoleResponseCodeConst.java index c1818465..e9381db1 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleResponseCodeConst.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/codeconst/RoleResponseCodeConst.java @@ -1,9 +1,7 @@ -package net.lab1024.smartadmin.module.system.role.basic; -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; +package net.lab1024.smartadmin.service.common.codeconst; /** - * - * @author yandanyang + * @author 罗伊 * 角色业务状态码 6001 - 6999 */ public class RoleResponseCodeConst extends ResponseCodeConst { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/BaseEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/BaseEnum.java similarity index 87% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/BaseEnum.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/BaseEnum.java index 61ef2c66..2d8c41c3 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/BaseEnum.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/BaseEnum.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.common.domain; +package net.lab1024.smartadmin.service.common.constant; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONAware; @@ -10,6 +10,8 @@ import java.util.LinkedHashMap; import java.util.Objects; /** + * 枚举类接口 + * * @author listen * @date 2018-07-17 下午 3:52 */ @@ -18,7 +20,7 @@ public interface BaseEnum { /** * 获取枚举类的值 * - * @return Object + * @return */ Object getValue(); @@ -67,24 +69,21 @@ public interface BaseEnum { String enumJson = JSON.toJSONString(json, true); enumJson = enumJson.replaceAll("\"", ""); - enumJson= enumJson.replaceAll("\t","  "); - enumJson = enumJson.replaceAll("\n","
"); + enumJson = enumJson.replaceAll("\t", "  "); + enumJson = enumJson.replaceAll("\n", "
"); String prefix = "
export const
" + CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, clazz.getSimpleName() + " =
"); return prefix + "" + enumJson + "
"; } - @Data class DeletedQuotationAware implements JSONAware { private String value; public DeletedQuotationAware(Object value) { - if(value == null){ - this.value = ""; - }else if (value instanceof String) { + if (value instanceof String) { this.value = "'" + value + "'"; - }else { + } else { this.value = value.toString(); } } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/CacheModuleBaseConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/CacheModuleBaseConst.java new file mode 100644 index 00000000..a4059513 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/CacheModuleBaseConst.java @@ -0,0 +1,63 @@ +package net.lab1024.smartadmin.service.common.constant; + +/** + * @author 罗伊 + * @date 2021-01-31 0:00 + */ +public class CacheModuleBaseConst { + + public static class Employee { + /** + * 某个部门下的员工缓存 + */ + public static final String DEPARTMENT_EMPLOYEE_CACHE = "department_employee_cache"; + + /** + * 单个员工的缓存 + */ + public static final String SINGLE_EMPLOYEE_CACHE = "single_employee_cache"; + + /** + * 单个员工角色 + */ + public static final String SINGLE_EMPLOYEE_ROLE_CACHE = "single_employee_role_cache"; + } + + public static class Department { + + /** + * 部门树 + */ + public static final String DEPARTMENT_CACHE = "department_cache"; + + /** + * 部门树 + */ + public static final String DEPARTMENT_TREE_CACHE = "department_tree_cache"; + + /** + * 某个部门以及下级的id列表 + */ + public static final String DEPARTMENT_TREE_ID_CACHE = "department_tree_id_cache"; + + } + + public static class Category { + + /** + * 类目 + */ + public static final String CATEGORY = "category_cache"; + + /** + * 类目子级 + */ + public static final String CATEGORY_SUB = "category_sub_cache"; + + /** + * 类目层级树 缓存 + */ + public static final String CATEGORY_TREE = "category_tree_cache"; + + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/CommonConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/CommonConst.java new file mode 100644 index 00000000..3c496370 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/CommonConst.java @@ -0,0 +1,150 @@ +package net.lab1024.smartadmin.service.common.constant; + +import com.google.common.collect.ImmutableSet; +import org.springframework.util.CollectionUtils; + +import java.util.*; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/9/14 15:48 + */ +public class CommonConst { + + /** + * 全局通用分隔符 + */ + public static final String SEPARATOR = ","; + + /** + * 全局通用分隔符 逗号 + */ + public static final Character SEPARATOR_CHAR = ','; + + /** + * 全局通用分隔符 斜杠 + */ + public static final String SEPARATOR_SLASH = "/"; + + /** + * 全局通用分隔符 下划线 + */ + public static final String UNDERLINE = "_"; + + /** + * 空字符串 + */ + public static final String EMPTY_STR = ""; + + /** + * 空 MaP + * 注意:放入元素会抛异常 + */ + public static final Map EMPTY_MAP = Collections.unmodifiableMap(new HashMap<>(0)); + + /** + * 空 list + * 注意:放入元素会抛异常 + */ + public static final List EMPTY_LIST = Collections.unmodifiableList(new ArrayList<>(0)); + + /** + * 空字符串 + */ + public static final long DEFAULT_PARENT_ID = 0L; + + /** + * 空字符串 + */ + public static final int ZERO = 0; + + + public static final class Token { + + public static final String DEFAULT_TOKEN = "default-token-"; + + public static final String INNER_TOKEN_NAME = "inner-token"; + + public static final String OUTER_TOKEN_NAME = "x-access-token"; + + } + + public static final class FileFolderConst { + + /** + * 公用读取文件夹 public + */ + public static final String FOLDER_PUBLIC = "pu"; + + /** + * 私有读取文件夹 private + */ + public static final String FOLDER_PRIVATE = "pr"; + + /** + * 文件夹格式 + */ + public static final String FOLDER_FORMAT = "folder"; + + } + + public static final class System { + /** + * oss url redis 过期时间 + */ + public static final int FILE_URL_EXPIRE_SECOND = 3600; + + public static final int FILE_VO_EXPIRE_SECOND = 86400; + + } + + /** + * 长度类常量 + */ + public static final class NumberLimit { + /** + * 文件名称长度 + */ + public static final int FILE_NAME = 100; + + } + + public static final class ApiUrl { + /** + * 基础 api 前缀 + */ + public static final String API_PREFIX_SUPPORT = "/support"; + + /** + * 后管 api 前缀 + */ + public static final String API_PREFIX_ADMIN = "/admin"; + + } + + public static final class Password { + + public static final String DEFAULT = "123456"; + + public static final String SALT_FORMAT = "smart_%s_admin"; + } + + public static final class CommonCollection { + + public static final Set IGNORE_URL = ImmutableSet.of("/swagger", "Excel", "/h5/api"); + + public static Boolean contain(Set ignores, String uri) { + if (CollectionUtils.isEmpty(ignores)) { + return false; + } + for (String ignoreUrl : ignores) { + if (uri.startsWith(ignoreUrl)) { + return true; + } + } + return false; + } + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/GenderEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/GenderEnum.java new file mode 100644 index 00000000..439eb842 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/GenderEnum.java @@ -0,0 +1,52 @@ +package net.lab1024.smartadmin.service.common.constant; + +/** + * 性别枚举类 + * + * @author listen + * @date 2019/09/24 16:50 + */ +public enum GenderEnum implements BaseEnum { + + /** + * 0 未知 + */ + UNKNOWN(0, "未知"), + + /** + * 男 1 奇数为阳 + */ + MAN(1, "男"), + + /** + * 女 2 偶数为阴 + */ + WOMAN(2, "女"); + + private final Integer gender; + + private final String desc; + + GenderEnum(Integer gender, String desc) { + this.gender = gender; + this.desc = desc; + } + /** + * 获取枚举类的值 + * + * @return Integer + */ + @Override + public Integer getValue() { + return gender; + } + /** + * 获取枚举类的说明 + * + * @return String + */ + @Override + public String getDesc() { + return desc; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/RedisKeyConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/RedisKeyConst.java new file mode 100644 index 00000000..5a73ec8f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/RedisKeyConst.java @@ -0,0 +1,27 @@ +package net.lab1024.smartadmin.service.common.constant; + +/** + * redis key 常量类 + * + * @author listen + * @date 2019/09/23 20:48 + */ +public class RedisKeyConst { + + public class Base { + + private static final String PROJECT = "base:"; + + public static final String FILE_URL = PROJECT + "file:"; + + public static final String FILE_VO = PROJECT + "fileVO:"; + + public static final String LOCK = PROJECT + "lock:"; + + public static final String ID_GENERATOR = LOCK + "id:"; + + public static final String CAPTCHA = PROJECT + "captcha:"; + + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/SwaggerTagConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/SwaggerTagConst.java new file mode 100644 index 00000000..8fe20ed2 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/SwaggerTagConst.java @@ -0,0 +1,55 @@ +package net.lab1024.smartadmin.service.common.constant; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/1/9 11:45 + */ +public class SwaggerTagConst { + + public static class Support { + + public static final String FILE = "基础-文件服务"; + + public static final String CACHE = "基础-缓存"; + + public static final String SYSTEM_CONFIG = "基础-系统参数"; + + public static final String ID_GENERATOR = "基础-ID生成器"; + + public static final String SMART_RELOAD = "基础-Reload"; + + public static final String TASK_SCHEDULER = "基础-任务调度"; + + public static final String USER_OPERATE_LOG = "基础-用户操作日志"; + + public static final String HEART_BEAT = "基础-心跳日志"; + + public static final String CAPTCHA = "基础-图形验证码"; + + } + + public static class Admin { + + public static final String MANAGER_EMPLOYEE = "管理端-员工"; + + public static final String MANAGER_EMPLOYEE_LOGIN = "管理端-员工登录"; + + public static final String MANAGER_DEPARTMENT = "管理端-部门"; + + public static final String MANAGER_ROLE = "管理端-角色"; + + public static final String MANAGER_NOTICE = "管理端-系统通知"; + + public static final String MANAGER_MENU = "管理端-菜单"; + + public static final String MANAGER_ROLE_MENU = "管理端-角色-菜单"; + + public static final String MANAGER_DATA_TRACER = "管理端-数据变动跟踪"; + + public static final String MANAGER_CATEGORY = "管理端-分类"; + + public static final String MANAGER_GOODS = "管理端-商品业务"; + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/SystemEnvironmentEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/SystemEnvironmentEnum.java similarity index 80% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/SystemEnvironmentEnum.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/SystemEnvironmentEnum.java index e8d0fd75..7e994fec 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/SystemEnvironmentEnum.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/constant/SystemEnvironmentEnum.java @@ -1,6 +1,4 @@ -package net.lab1024.smartadmin.constant; - -import net.lab1024.smartadmin.common.domain.BaseEnum; +package net.lab1024.smartadmin.service.common.constant; /** * 系统环境枚举类 @@ -10,7 +8,6 @@ import net.lab1024.smartadmin.common.domain.BaseEnum; */ public enum SystemEnvironmentEnum implements BaseEnum { - /** * dev */ @@ -31,19 +28,14 @@ public enum SystemEnvironmentEnum implements BaseEnum { */ PROD("prod", "生产环境"); + private final String value; - public static final String DEV_ENV = "dev"; - - - private String value; - - private String desc; + private final String desc; SystemEnvironmentEnum(String value, String desc) { this.value = value; this.desc = desc; } - /** * 获取定义枚举value值 * diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/controller/AdminBaseController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/controller/AdminBaseController.java new file mode 100644 index 00000000..91b4cf5f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/controller/AdminBaseController.java @@ -0,0 +1,15 @@ +package net.lab1024.smartadmin.service.common.controller; + +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * @author: 卓大 + * @create: 2020-03-31 08:54 PM from win10 + */ +@Slf4j +@RequestMapping(CommonConst.ApiUrl.API_PREFIX_ADMIN) +public class AdminBaseController { + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/controller/SupportBaseController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/controller/SupportBaseController.java new file mode 100644 index 00000000..c76d0db1 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/controller/SupportBaseController.java @@ -0,0 +1,14 @@ +package net.lab1024.smartadmin.service.common.controller; + +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * 通用业务路由基类 + * + * @author 胡克 + * @date 2019/10/18 11:51 + */ +@RequestMapping(CommonConst.ApiUrl.API_PREFIX_SUPPORT) +public class SupportBaseController { +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/domain/PageBaseDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/domain/PageBaseDTO.java new file mode 100644 index 00000000..9fa622aa --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/domain/PageBaseDTO.java @@ -0,0 +1,52 @@ +package net.lab1024.smartadmin.service.common.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.Valid; +import javax.validation.constraints.Max; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * 分页基础参数 + * + * @author 善逸 + * @Date Created in 2017/10/28 16:19 + */ +@Data +public class PageBaseDTO { + + @ApiModelProperty(value = "页码(不能为空)", required = true, example = "1") + @NotNull(message = "分页参数不能为空") + private Integer pageNum; + + @ApiModelProperty(value = "每页数量(不能为空)", required = true, example = "10") + @NotNull(message = "每页数量不能为空") + @Max(value = 200, message = "每页最大为200") + private Integer pageSize; + + @ApiModelProperty("排序字段集合") + @Size(max = 10, message = "排序字段最多10") + @Valid + private List sortItemList; + + /** + * 排序DTO类 + */ + @Data + public static class SortItemDTO { + + @ApiModelProperty("true正序|false倒序") + @NotNull(message = "排序规则不能为空") + private Boolean isAsc; + + @ApiModelProperty(value = "排序字段") + @NotBlank(message = "排序字段不能为空") + @Length(max = 30, message = "排序字段最多30") + private String column; + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/PageResultDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/domain/PageResultDTO.java similarity index 83% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/PageResultDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/domain/PageResultDTO.java index 23995832..fee6c0d8 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/PageResultDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/domain/PageResultDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.common.domain; +package net.lab1024.smartadmin.service.common.domain; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -8,7 +8,7 @@ import java.util.List; /** * Page返回对象 * - * @Author lihaifan + * @Author 善逸 * @Date Created in 2017/10/31 15:05 */ @Data @@ -44,4 +44,7 @@ public class PageResultDTO { @ApiModelProperty(value = "结果集") private List list; + @ApiModelProperty("是否为空") + private Boolean emptyFlag; + } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/ResponseDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/domain/ResponseDTO.java similarity index 67% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/ResponseDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/domain/ResponseDTO.java index 92ec781e..b5bafdf8 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/ResponseDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/domain/ResponseDTO.java @@ -1,13 +1,13 @@ -package net.lab1024.smartadmin.common.domain; +package net.lab1024.smartadmin.service.common.domain; -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; /** * 返回类 * * @param - * @author zhuoda + * @author 1024lab */ public class ResponseDTO { @@ -25,7 +25,7 @@ public class ResponseDTO { public ResponseDTO(ResponseCodeConst responseCodeConst, String msg) { this.code = responseCodeConst.getCode(); this.msg = msg; - this.success = responseCodeConst.isSuccess(); + this.success = responseCodeConst.issucc(); } public ResponseDTO(ResponseCodeConst responseCodeConst, T data) { @@ -33,7 +33,7 @@ public class ResponseDTO { this.code = responseCodeConst.getCode(); this.msg = responseCodeConst.getMsg(); this.data = data; - this.success = responseCodeConst.isSuccess(); + this.success = responseCodeConst.issucc(); } public ResponseDTO(ResponseCodeConst responseCodeConst, T data, String msg) { @@ -41,13 +41,13 @@ public class ResponseDTO { this.code = responseCodeConst.getCode(); this.msg = msg; this.data = data; - this.success = responseCodeConst.isSuccess(); + this.success = responseCodeConst.issucc(); } private ResponseDTO(ResponseCodeConst responseCodeConst) { this.code = responseCodeConst.getCode(); this.msg = responseCodeConst.getMsg(); - this.success = responseCodeConst.isSuccess(); + this.success = responseCodeConst.issucc(); } public ResponseDTO(ResponseDTO responseDTO) { @@ -56,6 +56,18 @@ public class ResponseDTO { this.success = responseDTO.isSuccess(); } + public ResponseDTO(ResponseCodeConst codeConst, boolean isSuccess) { + this.code = codeConst.getCode(); + this.msg = codeConst.getMsg(); + this.success = isSuccess; + } + + public ResponseDTO(int code, String msg, boolean isSuccess) { + this.code = code; + this.msg = msg; + this.success = isSuccess; + } + public static ResponseDTO succ() { return new ResponseDTO(ResponseCodeConst.SUCCESS); } @@ -68,27 +80,34 @@ public class ResponseDTO { return new ResponseDTO(ResponseCodeConst.SUCCESS, data); } - public static ResponseDTO succMsg(String msg) { + public static ResponseDTO succMsg(String msg) { return new ResponseDTO(ResponseCodeConst.SUCCESS, msg); } - public static ResponseDTO wrap(ResponseCodeConst codeConst) { return new ResponseDTO<>(codeConst); } - public static ResponseDTO wrap(ResponseCodeConst codeConst, T t) { - return new ResponseDTO(codeConst, t); + public static ResponseDTO wrap(ResponseCodeConst codeConst, boolean isSuccess) { + return new ResponseDTO<>(codeConst, isSuccess); } - public static ResponseDTO wrap(ResponseCodeConst codeConst, String msg) { - return new ResponseDTO(codeConst, msg); + public static ResponseDTO wrap(ResponseDTO responseDTO) { + return new ResponseDTO<>(responseDTO.getCode(), responseDTO.getMsg(), responseDTO.isSuccess()); + } + + public static ResponseDTO wrapData(ResponseCodeConst codeConst, T t) { + return new ResponseDTO(codeConst, t); } public static ResponseDTO wrapMsg(ResponseCodeConst codeConst, String msg) { return new ResponseDTO(codeConst, msg); } + public static ResponseDTO wrapDataMsg(ResponseCodeConst codeConst, T t, String msg) { + return new ResponseDTO(codeConst, t, msg); + } + public String getMsg() { return msg; } @@ -126,7 +145,6 @@ public class ResponseDTO { @Override public String toString() { - return "ResponseDTO{" + "code=" + code + ", msg='" + msg + '\'' + ", success=" + success + ", data=" + data + - '}'; + return "ResponseDTO{" + "code=" + code + ", msg='" + msg + '\'' + ", success=" + success + ", data=" + data + '}'; } } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/excel/ExcelStyle.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/excel/ExcelStyle.java new file mode 100644 index 00000000..41bdd3d9 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/excel/ExcelStyle.java @@ -0,0 +1,183 @@ +package net.lab1024.smartadmin.service.common.excel; + +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.afterturn.easypoi.excel.entity.params.ExcelForEachParams; +import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler; +import org.apache.poi.ss.usermodel.*; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/9/25 19:52 + */ +public class ExcelStyle implements IExcelExportStyler { + private static final short STRING_FORMAT = (short) BuiltinFormats.getBuiltinFormat("TEXT"); + private static final short FONT_SIZE_TEN = 10; + private static final short FONT_SIZE_ELEVEN = 11; + private static final short FONT_SIZE_TWELVE = 12; + /** + * 大标题样式 + */ + private CellStyle headerStyle; + /** + * 每列标题样式 + */ + private CellStyle titleStyle; + /** + * 数据行样式 + */ + private CellStyle styles; + + public ExcelStyle(Workbook workbook) { + this.init(workbook); + } + + /** + * 初始化样式 + * + * @param workbook + */ + private void init(Workbook workbook) { + this.headerStyle = initHeaderStyle(workbook); + this.titleStyle = initTitleStyle(workbook); + this.styles = initStyles(workbook); + } + + /** + * 大标题样式 + * + * @param color + * @return + */ + @Override + public CellStyle getHeaderStyle(short color) { + return headerStyle; + } + + /** + * 每列标题样式 + * + * @param color + * @return + */ + @Override + public CellStyle getTitleStyle(short color) { + return titleStyle; + } + + /** + * 数据行样式 + * + * @param parity 可以用来表示奇偶行 + * @param entity 数据内容 + * @return 样式 + */ + @Override + public CellStyle getStyles(boolean parity, ExcelExportEntity entity) { + return styles; + } + + /** + * 获取样式方法 + * + * @param dataRow 数据行 + * @param obj 对象 + * @param data 数据 + */ + @Override + public CellStyle getStyles(Cell cell, int dataRow, ExcelExportEntity entity, Object obj, Object data) { + return getStyles(true, entity); + } + + /** + * 模板使用的样式设置 + */ + @Override + public CellStyle getTemplateStyles(boolean isSingle, ExcelForEachParams excelForEachParams) { + return null; + } + + /** + * 初始化--大标题样式 + * + * @param workbook + * @return + */ + private CellStyle initHeaderStyle(Workbook workbook) { + CellStyle style = getBaseCellStyle(workbook); + style.setFont(getFont(workbook, FONT_SIZE_TWELVE, true)); + return style; + } + + /** + * 初始化--每列标题样式 + * + * @param workbook + * @return + */ + private CellStyle initTitleStyle(Workbook workbook) { + CellStyle style = getBaseCellStyle(workbook); + style.setFont(getFont(workbook, FONT_SIZE_ELEVEN, false)); + //背景色 + style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + return style; + } + + /** + * 初始化--数据行样式 + * + * @param workbook + * @return + */ + private CellStyle initStyles(Workbook workbook) { + CellStyle style = getBaseCellStyle(workbook); + style.setFont(getFont(workbook, FONT_SIZE_TEN, false)); + style.setDataFormat(STRING_FORMAT); + style.setAlignment(HorizontalAlignment.LEFT); + return style; + } + + /** + * 基础样式 + * + * @return + */ + private CellStyle getBaseCellStyle(Workbook workbook) { + CellStyle style = workbook.createCellStyle(); + //下边框 + style.setBorderBottom(BorderStyle.THIN); + //左边框 + style.setBorderLeft(BorderStyle.THIN); + //上边框 + style.setBorderTop(BorderStyle.THIN); + //右边框 + style.setBorderRight(BorderStyle.THIN); + //水平居中 + style.setAlignment(HorizontalAlignment.CENTER); + //上下居中 + style.setVerticalAlignment(VerticalAlignment.CENTER); + //设置自动换行 + style.setWrapText(true); + return style; + } + + /** + * 字体样式 + * + * @param size 字体大小 + * @param isBold 是否加粗 + * @return + */ + private Font getFont(Workbook workbook, short size, boolean isBold) { + Font font = workbook.createFont(); + //字体样式 + font.setFontName("宋体"); + //是否加粗 + font.setBold(isBold); + //字体大小 + font.setFontHeightInPoints(size); + return font; + } +} \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/exception/SmartBusinessException.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/exception/SmartBusinessException.java similarity index 69% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/exception/SmartBusinessException.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/exception/SmartBusinessException.java index 904f3a7b..e167df92 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/exception/SmartBusinessException.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/exception/SmartBusinessException.java @@ -1,20 +1,22 @@ -package net.lab1024.smartadmin.common.exception; +package net.lab1024.smartadmin.service.common.exception; + +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; + /** - * * [ 业务逻辑异常,全局异常拦截后统一返回ResponseCodeConst.SYSTEM_ERROR ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date + * + * @author 罗伊 + * @date 2020/8/25 11:57 */ public class SmartBusinessException extends RuntimeException { public SmartBusinessException() { } + public SmartBusinessException(ResponseCodeConst responseCodeConst) { + super(responseCodeConst.getMsg()); + } + public SmartBusinessException(String message) { super(message); } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/BigDecimalNullZeroSerializer.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/BigDecimalNullZeroSerializer.java new file mode 100644 index 00000000..532c45b5 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/BigDecimalNullZeroSerializer.java @@ -0,0 +1,26 @@ +package net.lab1024.smartadmin.service.common.json; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.math.BigDecimal; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/20 16:04 + */ +public class BigDecimalNullZeroSerializer extends JsonSerializer { + + @Override + public void serialize(BigDecimal value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (value == null) { + jsonGenerator.writeNumber(BigDecimal.ZERO); + return; + } + jsonGenerator.writeNumber(value); + } +} \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/FileKeySerializer.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/FileKeySerializer.java new file mode 100644 index 00000000..557d2487 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/FileKeySerializer.java @@ -0,0 +1,42 @@ +package net.lab1024.smartadmin.service.common.json; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.file.service.FileService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/15 15:06 + */ +public class FileKeySerializer extends JsonSerializer { + + @Autowired + private FileService fileService; + + + @Override + public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (StringUtils.isEmpty(value)) { + jsonGenerator.writeString(value); + return; + } + if(fileService == null){ + jsonGenerator.writeString(value); + return; + } + ResponseDTO responseDTO = fileService.getFileUrl(value); + if(responseDTO.isSuccess()){ + jsonGenerator.writeString(responseDTO.getData()); + return; + } + jsonGenerator.writeString(value); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/FileKeyVoSerializer.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/FileKeyVoSerializer.java new file mode 100644 index 00000000..a0af56bf --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/json/FileKeyVoSerializer.java @@ -0,0 +1,43 @@ +package net.lab1024.smartadmin.service.common.json; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.google.common.collect.Lists; +import net.lab1024.smartadmin.service.module.support.file.domain.vo.FileVO; +import net.lab1024.smartadmin.service.module.support.file.service.FileService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/15 15:06 + */ +public class FileKeyVoSerializer extends JsonSerializer { + + @Autowired + private FileService fileService; + + + @Override + public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (StringUtils.isEmpty(value)) { + jsonGenerator.writeObject(Lists.newArrayList()); + return; + } + if(fileService == null){ + jsonGenerator.writeString(value); + return; + } + String[] fileKeyArray = value.split(","); + List fileKeyList = Arrays.asList(fileKeyArray); + List fileKeyVOList = fileService.getFileList(fileKeyList); + jsonGenerator.writeObject(fileKeyVOList); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/security/SmartSecurityMetadataSource.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/security/SmartSecurityMetadataSource.java new file mode 100644 index 00000000..11300478 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/security/SmartSecurityMetadataSource.java @@ -0,0 +1,114 @@ +package net.lab1024.smartadmin.service.common.security; + +import net.lab1024.smartadmin.service.common.anno.NoValidPrivilege; +import net.lab1024.smartadmin.service.util.SmartSecurityUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.access.ConfigAttribute; +import org.springframework.security.access.prepost.*; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * 此类用于默认给所有接口添加权限 @privilegeCheck.checkPermission('%s') + * %s 为类名.方法名 + * 和使用@PreAuthorize("@privilegeCheck.checkPermission('%s')") 效果一致 + * 避免所有接口都添加一遍 减轻工作量 + * + * @author 罗伊 + * @date 2021-08-30 23:08 + */ +public class SmartSecurityMetadataSource extends PrePostAnnotationSecurityMetadataSource { + + public static final String PRIVILEGE_CHECK_NAME = "privilegeCheck"; + + private static String EXPRESSION_FORMAT = "@privilegeCheck.checkPermission('%s')"; + + private final PrePostInvocationAttributeFactory attributeFactory; + + private String projectModule; + + private List ignoreUrlList; + + public SmartSecurityMetadataSource(PrePostInvocationAttributeFactory attributeFactory, List ignoreUrlList, String projectModule) { + super(attributeFactory); + this.attributeFactory = attributeFactory; + this.projectModule = projectModule; + this.ignoreUrlList = ignoreUrlList; + } + + + @Override + public Collection getAttributes(Method method, Class targetClass) { + //只对固定的包的所有接口进行控制 + if (!targetClass.getName().startsWith(projectModule)) { + return super.getAttributes(method, targetClass); + } + //是否需要权限 + NoValidPrivilege methodNoValidPrivilege = method.getAnnotation(NoValidPrivilege.class); + if (methodNoValidPrivilege != null) { + return Collections.emptyList(); + } + NoValidPrivilege classNoValidPrivilege = targetClass.getAnnotation(NoValidPrivilege.class); + if (classNoValidPrivilege != null) { + return Collections.emptyList(); + } + //是否添加security原有注解 + PreAuthorize preAuthorize = method.getAnnotation(PreAuthorize.class); + if (preAuthorize != null) { + return super.getAttributes(method, targetClass); + } + PostAuthorize postAuthorize = method.getAnnotation(PostAuthorize.class); + if (postAuthorize != null) { + return super.getAttributes(method, targetClass); + } + //自己的控制 + GetMapping getMapping = method.getAnnotation(GetMapping.class); + PostMapping postMapping = method.getAnnotation(PostMapping.class); + RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); + if (getMapping == null && postMapping == null && requestMapping == null) { + return super.getAttributes(method, targetClass); + } + //获取注解值 + String uriPrefix = SmartSecurityUtil.getUriPrefix(method); + List annotationValueList = SmartSecurityUtil.getAnnotationValueList(method, uriPrefix); + //判断是否被忽略 + if (this.contain(ignoreUrlList, annotationValueList)) { + return super.getAttributes(method, targetClass); + } + ArrayList configAttributes = new ArrayList(1); + String classFullName = targetClass.getName(); + String methodName = method.getName(); + String[] classNameArray = StringUtils.split(classFullName, "\\."); + String controllerName = classNameArray[classNameArray.length - 1]; + String privilegeName = controllerName + "." + methodName; + String preAuthorizeAttribute = String.format(EXPRESSION_FORMAT, privilegeName); + PreInvocationAttribute pre = this.attributeFactory.createPreInvocationAttribute(null, null, preAuthorizeAttribute); + if (pre != null) { + configAttributes.add(pre); + } + return configAttributes; + } + + public Boolean contain(List ignores, List valueList) { + if (CollectionUtils.isEmpty(ignores)) { + return false; + } + for (String ignoreUrl : ignores) { + for (String uri : valueList) { + if (uri.contains(ignoreUrl)) { + return true; + } + } + } + return false; + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/security/SmartSecurityNoLoginUrl.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/security/SmartSecurityNoLoginUrl.java new file mode 100644 index 00000000..4fd8e11c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/security/SmartSecurityNoLoginUrl.java @@ -0,0 +1,72 @@ +package net.lab1024.smartadmin.service.common.security; + +import com.google.common.collect.Lists; +import net.lab1024.smartadmin.service.common.anno.NoNeedLogin; +import net.lab1024.smartadmin.service.util.SmartSecurityUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.reflections.Reflections; +import org.reflections.scanners.MethodAnnotationsScanner; +import org.reflections.scanners.TypeAnnotationsScanner; +import org.reflections.util.ConfigurationBuilder; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Set; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/8/31 10:20 + */ +public class SmartSecurityNoLoginUrl { + + private List noLoginUrlList; + + public SmartSecurityNoLoginUrl(String scanPath){ + this.noLoginUrlList = this.initNoLoginUrlList(scanPath); + } + + + public List getNoLoginUrlList(){ + return noLoginUrlList; + } + + /** + * 获取无需登录的url信息 + * + * @return + */ + private List initNoLoginUrlList(String scanPath) { + List noLoginUrlList = Lists.newArrayList(); + //一些常量uri + noLoginUrlList.add("/swagger-ui.html"); + noLoginUrlList.add("/swagger-resources/**"); + noLoginUrlList.add("/webjars/**"); + noLoginUrlList.add("/*/api-docs"); + //添加无需登录注解的uri + Reflections reflections = new Reflections(new ConfigurationBuilder().forPackages(scanPath).addScanners(new MethodAnnotationsScanner(), new TypeAnnotationsScanner())); + Set methodSet = reflections.getMethodsAnnotatedWith(NoNeedLogin.class); + Set> classSet = reflections.getTypesAnnotatedWith(NoNeedLogin.class); + //方法级别无需登录 + for (Method method : methodSet) { + String uriPrefix = SmartSecurityUtil.getUriPrefix(method); + List valueList = SmartSecurityUtil.getAnnotationValueList(method, uriPrefix); + noLoginUrlList.addAll(valueList); + } + //类级别无需登录 + for (Class clazz : classSet) { + Method[] methods = clazz.getMethods(); + for (Method method : methods) { + String uriPrefix = SmartSecurityUtil.getUriPrefix(method); + List valueList = SmartSecurityUtil.getAnnotationValueList(method, uriPrefix); + noLoginUrlList.addAll(valueList); + } + } + return noLoginUrlList; + } + + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/ApiModelPropertyEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/swagger/ApiModelPropertyEnum.java similarity index 67% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/ApiModelPropertyEnum.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/swagger/ApiModelPropertyEnum.java index c9babff3..616c3abc 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/ApiModelPropertyEnum.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/swagger/ApiModelPropertyEnum.java @@ -1,6 +1,6 @@ -package net.lab1024.smartadmin.common.anno; +package net.lab1024.smartadmin.service.common.swagger; -import net.lab1024.smartadmin.common.domain.BaseEnum; +import net.lab1024.smartadmin.service.common.constant.BaseEnum; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -8,7 +8,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** - * 枚举类字段属性的注解 + * 枚举类字段属性的 自定义 swagger 注解 * * @author listen * @date 2019/05/16 15:18 @@ -26,22 +26,12 @@ public @interface ApiModelPropertyEnum { String example() default ""; - /** - * 是否隐藏 - * - * @return - */ boolean hidden() default false; - /** - * 是否必须 - * - * @return - */ boolean required() default true; String dataType() default ""; - String enumDesc() default ""; + String desc() default ""; } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/swagger/SmartSwaggerApiModelEnumPlugin.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/swagger/ApiModelPropertyEnumPlugin.java similarity index 55% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/swagger/SmartSwaggerApiModelEnumPlugin.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/swagger/ApiModelPropertyEnumPlugin.java index dbc2d586..f4a8af4b 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/swagger/SmartSwaggerApiModelEnumPlugin.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/swagger/ApiModelPropertyEnumPlugin.java @@ -1,30 +1,12 @@ -/* - * - * Copyright 2015 the original author or authors. - * - * 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. - * - * - */ +package net.lab1024.smartadmin.service.common.swagger; -package net.lab1024.smartadmin.common.swagger; - -import net.lab1024.smartadmin.common.anno.ApiModelPropertyEnum; -import net.lab1024.smartadmin.common.domain.BaseEnum; import com.google.common.base.Function; import com.google.common.base.Optional; +import net.lab1024.smartadmin.service.common.constant.BaseEnum; import org.apache.commons.lang3.StringUtils; import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.schema.ModelPropertyBuilderPlugin; import springfox.documentation.spi.schema.contexts.ModelPropertyContext; @@ -41,26 +23,28 @@ import static springfox.documentation.schema.Annotations.findPropertyAnnotation; * @author listen * @date 2019年5月16日 15:36:56 */ -public class SmartSwaggerApiModelEnumPlugin implements ModelPropertyBuilderPlugin { +@Component +@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER + 1) +public class ApiModelPropertyEnumPlugin implements ModelPropertyBuilderPlugin { @Override public void apply(ModelPropertyContext context) { - Optional enumOptional = Optional.absent(); + Optional annotation = Optional.absent(); if (context.getAnnotatedElement().isPresent()) { - enumOptional = enumOptional.or(findApiModePropertyAnnotation(context.getAnnotatedElement().get())); + annotation = annotation.or(findApiModePropertyAnnotation(context.getAnnotatedElement().get())); } if (context.getBeanPropertyDefinition().isPresent()) { - enumOptional = enumOptional.or(findPropertyAnnotation(context.getBeanPropertyDefinition().get(), ApiModelPropertyEnum.class)); + annotation = annotation.or(findPropertyAnnotation(context.getBeanPropertyDefinition().get(), ApiModelPropertyEnum.class)); } - if (enumOptional.isPresent()) { - ApiModelPropertyEnum anEnum = enumOptional.get(); + if (annotation.isPresent()) { + ApiModelPropertyEnum anEnum = annotation.get(); String enumInfo = BaseEnum.getInfo(anEnum.value()); context.getBuilder() - .required(enumOptional.transform(toIsRequired()).or(false)) - .description(anEnum.enumDesc() + ":" + enumInfo) - .example(enumOptional.transform(toExample()).orNull()) + .required(annotation.transform(toIsRequired()).or(false)) + .description(anEnum.desc() + ":" + enumInfo) + .example(annotation.transform(toExample()).orNull()) .isHidden(anEnum.hidden()); } } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/validator/bigdecimal/ComparisonSymbolEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator/BigDecimalSymbolEnum.java similarity index 80% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/validator/bigdecimal/ComparisonSymbolEnum.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator/BigDecimalSymbolEnum.java index e59d0bf3..2adcb648 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/validator/bigdecimal/ComparisonSymbolEnum.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator/BigDecimalSymbolEnum.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.common.validator.bigdecimal; +package net.lab1024.smartadmin.service.common.validator; /** * 比较符枚举类 @@ -6,7 +6,7 @@ package net.lab1024.smartadmin.common.validator.bigdecimal; * @author listen * @date 2018/03/20 14:01 */ -public enum ComparisonSymbolEnum { +public enum BigDecimalSymbolEnum { /** * 等于 diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/validator/bigdecimal/BigDecimalValidator.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator/BigDecimalValidator.java similarity index 92% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/validator/bigdecimal/BigDecimalValidator.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator/BigDecimalValidator.java index 5ba85bf7..507c7436 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/validator/bigdecimal/BigDecimalValidator.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator/BigDecimalValidator.java @@ -1,6 +1,6 @@ -package net.lab1024.smartadmin.common.validator.bigdecimal; +package net.lab1024.smartadmin.service.common.validator; -import net.lab1024.smartadmin.util.SmartBigDecimalUtil; +import net.lab1024.smartadmin.service.util.SmartBigDecimalUtil; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; @@ -22,7 +22,7 @@ public class BigDecimalValidator implements ConstraintValidator { +public class CheckEnumValidator implements ConstraintValidator { /** * 枚举类实例集合 diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/ValidateList.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator/ValidateList.java similarity index 97% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/ValidateList.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator/ValidateList.java index c3907e63..c4b82873 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/ValidateList.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/common/validator/ValidateList.java @@ -1,11 +1,11 @@ -package net.lab1024.smartadmin.common.domain; +package net.lab1024.smartadmin.service.common.validator; import javax.validation.Valid; import javax.validation.constraints.NotEmpty; import java.util.*; /** - * @author: zhuoda + * @author: 卓大 * @create: 2020-02-03 17:37 PM from win10 */ public class ValidateList implements List { diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityConfig.java new file mode 100644 index 00000000..40c1538f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityConfig.java @@ -0,0 +1,113 @@ +package net.lab1024.smartadmin.service.config; + +import net.lab1024.smartadmin.service.common.security.SmartSecurityNoLoginUrl; +import net.lab1024.smartadmin.service.filters.SmartTokenFilter; +import net.lab1024.smartadmin.service.handler.AuthenticationFailHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +import java.util.List; + +/** + * Spring Security + * + * @author 善逸 + * @date 2021/8/3 17:50 + */ +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Value("${access-control-allow-origin}") + private String accessControlAllowOrigin; + + /** + * 认证失败处理类 + */ + @Autowired + private AuthenticationFailHandler authenticationFailHandler; + + /** + * 无需登录的url + */ + @Autowired + private SmartSecurityNoLoginUrl smartSecurityNoLoginUrl; + + /** + * token过滤器 + */ + @Autowired + private SmartTokenFilter smartTokenFilter; + + /** + * 跨域配置 + * + * @return + */ + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + // 设置访问源地址 + config.addAllowedOriginPattern(accessControlAllowOrigin); + // 设置访问源请求头 + config.addAllowedHeader("*"); + // 设置访问源请求方法 + config.addAllowedMethod("*"); + // 对接口配置跨域设置 + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } + + /** + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception { + httpSecurity + // CSRF禁用,因为不使用session + .csrf().disable() + // 认证失败处理类 + .exceptionHandling().authenticationEntryPoint(authenticationFailHandler).and() + // 基于token,所以不需要session + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + // 过滤请求 + .authorizeRequests() + .antMatchers("/admin/**").authenticated(); + + httpSecurity.addFilterBefore(smartTokenFilter, UsernamePasswordAuthenticationFilter.class); + httpSecurity.addFilterBefore(corsFilter(), SmartTokenFilter.class); + } + + @Override + public void configure(WebSecurity web) { + // 忽略url + WebSecurity.IgnoredRequestConfigurer ignoring = web.ignoring(); + List noLoginUrlList = smartSecurityNoLoginUrl.getNoLoginUrlList(); + for (String url : noLoginUrlList) { + ignoring.antMatchers(url); + } + } + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityMethodConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityMethodConfig.java new file mode 100644 index 00000000..97796c0e --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityMethodConfig.java @@ -0,0 +1,35 @@ +package net.lab1024.smartadmin.service.config; + +import net.lab1024.smartadmin.service.common.security.SmartSecurityMetadataSource; +import net.lab1024.smartadmin.service.common.security.SmartSecurityNoLoginUrl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.access.expression.method.ExpressionBasedAnnotationAttributeFactory; +import org.springframework.security.access.method.MethodSecurityMetadataSource; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration; + +/** + * 此类用于注入自己的 method校验 + * SmartSecurityMetadataSource + * @author 罗伊 + * @date 2021-08-31 0:01 + */ +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class SecurityMethodConfig extends GlobalMethodSecurityConfiguration { + + @Value("${project.module}") + private String projectModule; + + /** + * 无需登录的url + */ + @Autowired + private SmartSecurityNoLoginUrl smartSecurityNoLoginUrl; + + @Override + public MethodSecurityMetadataSource customMethodSecurityMetadataSource(){ + ExpressionBasedAnnotationAttributeFactory attributeFactory = new ExpressionBasedAnnotationAttributeFactory(this.getExpressionHandler()); + return new SmartSecurityMetadataSource(attributeFactory, smartSecurityNoLoginUrl.getNoLoginUrlList(),projectModule); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityNoLoginUrlConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityNoLoginUrlConfig.java new file mode 100644 index 00000000..d9687c42 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SecurityNoLoginUrlConfig.java @@ -0,0 +1,24 @@ +package net.lab1024.smartadmin.service.config; + +import net.lab1024.smartadmin.service.common.security.SmartSecurityNoLoginUrl; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/9/1 21:40 + */ +@Configuration +public class SecurityNoLoginUrlConfig { + + @Value("${project.module}") + private String projectModule; + + @Bean + public SmartSecurityNoLoginUrl securityNoLoginUrl(){ + return new SmartSecurityNoLoginUrl(projectModule); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartAsyncConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartAsyncConfig.java new file mode 100644 index 00000000..3c52c056 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartAsyncConfig.java @@ -0,0 +1,66 @@ +package net.lab1024.smartadmin.service.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.lang.reflect.Method; +import java.util.Arrays; + +/** + * 异步调用线程配置 + * + * @author 胡克 + * @date 2019/12/26 11:54 + */ +@Slf4j +@Configuration +public class SmartAsyncConfig { + + /** + * 线程池 配置bean名称 + */ + public static final String ASYNC_EXECUTOR = "asyncExecutor"; + + /** + * 配置线程池 + * + * @return + */ + @Bean(name = ASYNC_EXECUTOR) + public AsyncTaskExecutor executor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + // 核心线程数量 + taskExecutor.setCorePoolSize(Runtime.getRuntime().availableProcessors()); + // 最大线程数量 + taskExecutor.setMaxPoolSize(Runtime.getRuntime().availableProcessors()); + taskExecutor.setThreadNamePrefix(ASYNC_EXECUTOR); + taskExecutor.initialize(); + return taskExecutor; + } + + /** + * spring 异步任务 异常配置 + */ + @Configuration + public static class AsyncExceptionConfig implements AsyncConfigurer { + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return new AsyncExceptionHandler(); + } + } + + /** + * 自定义异常处理 + */ + public static class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler { + @Override + public void handleUncaughtException(Throwable throwable, Method method, Object... objects) { + log.error("异步任务发生异常:{}, 参数:{}, ", method.getDeclaringClass().getSimpleName() + "." + method.getName(), Arrays.toString(objects), throwable); + } + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartCacheConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartCacheConfig.java new file mode 100644 index 00000000..0a63ced3 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartCacheConfig.java @@ -0,0 +1,63 @@ +package net.lab1024.smartadmin.service.config; + +import com.github.benmanes.caffeine.cache.LoadingCache; +import com.google.common.collect.Maps; +import net.lab1024.smartadmin.service.module.support.beancache.cache.AbstractCaffeineCache; +import net.lab1024.smartadmin.service.module.support.beancache.cache.AbstractDisableCache; +import net.lab1024.smartadmin.service.module.support.beancache.cache.IBeanCache; +import net.lab1024.smartadmin.service.module.support.beancache.domain.CacheData; +import net.lab1024.smartadmin.service.module.support.beancache.load.CacheLoad; +import net.lab1024.smartadmin.service.module.support.beancache.load.CacheLoadMethod; +import org.reflections.Reflections; +import org.reflections.scanners.MethodAnnotationsScanner; +import org.reflections.util.ConfigurationBuilder; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; + +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Set; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/9/6 16:01 + */ +@Configuration +public class SmartCacheConfig { + + @Value("${cache.maximumSize:5000}") + private Integer cacheMaximumSize; + + @Value("${cache.expireDays:5}") + private Integer expireDays; + + @Value("${cache.scanPath}") + private String scanPath; + + @Bean + @Primary + public IBeanCache beanCache() { + return new AbstractCaffeineCache() { + LoadingCache cache = this.initCache(cacheMaximumSize,expireDays, scanPath); + @Override + public LoadingCache getCache() { + return cache; + } + }; + } + + @Bean + @ConditionalOnMissingBean(IBeanCache.class) + public IBeanCache beanDisableCache() { + return new AbstractDisableCache(scanPath); + } + + + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartKaptchaConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartCaptchaConfig.java similarity index 51% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartKaptchaConfig.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartCaptchaConfig.java index 06dd1c95..2415bd32 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartKaptchaConfig.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartCaptchaConfig.java @@ -1,9 +1,9 @@ -package net.lab1024.smartadmin.config; +package net.lab1024.smartadmin.service.config; -import net.lab1024.smartadmin.common.kaptcha.KaptchaNoise; -import net.lab1024.smartadmin.common.kaptcha.KaptchaWordRenderer; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; +import net.lab1024.smartadmin.service.module.support.captcha.render.CaptchaNoise; +import net.lab1024.smartadmin.service.module.support.captcha.render.CaptchaWordRenderer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -12,36 +12,38 @@ import java.util.Properties; /** * [ 验证码配置 ] * - * @author yandanyang + * @author 罗伊 * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/4 0004 上午 9:40 * @since JDK1.8 */ @Configuration -public class SmartKaptchaConfig { +public class SmartCaptchaConfig { + /** + * 图形验证码配置 + * + * @return + */ @Bean - public DefaultKaptcha getDefaultKaptcha(){ - DefaultKaptcha defaultKaptcha=new DefaultKaptcha(); - Properties properties=new Properties(); - properties.setProperty("kaptcha.border", "no"); - properties.setProperty("kaptcha.border.color", "34,114,200"); - properties.setProperty("kaptcha.image.width", "125"); - properties.setProperty("kaptcha.image.height", "45"); - properties.setProperty("kaptcha.textproducer.char.string", "0123456789"); - properties.setProperty("kaptcha.textproducer.char.length", "4"); - properties.setProperty("kaptcha.textproducer.font.names", "Arial,Arial Narrow,Serif,Helvetica,Tahoma,Times New Roman,Verdana"); - properties.setProperty("kaptcha.textproducer.font.size", "38"); + public DefaultKaptcha getDefaultCaptcha() { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + properties.setProperty("kaptcha.border", "no" ); + properties.setProperty("kaptcha.border.color", "34,114,200" ); + properties.setProperty("kaptcha.image.width", "125" ); + properties.setProperty("kaptcha.image.height", "45" ); + properties.setProperty("kaptcha.textproducer.char.string", "123456789" ); + properties.setProperty("kaptcha.textproducer.char.length", "4" ); + properties.setProperty("kaptcha.textproducer.font.names", "Arial,Arial Narrow,Serif,Helvetica,Tahoma,Times New Roman,Verdana" ); + properties.setProperty("kaptcha.textproducer.font.size", "38" ); - properties.setProperty("kaptcha.background.clear.from", "white"); - properties.setProperty("kaptcha.background.clear.to", "white"); + properties.setProperty("kaptcha.background.clear.from", "white" ); + properties.setProperty("kaptcha.background.clear.to", "white" ); - properties.setProperty("kaptcha.word.impl", KaptchaWordRenderer.class.getName()); - properties.setProperty("kaptcha.noise.impl", KaptchaNoise.class.getName()); + properties.setProperty("kaptcha.word.impl", CaptchaWordRenderer.class.getName()); + properties.setProperty("kaptcha.noise.impl", CaptchaNoise.class.getName()); - Config config=new Config(properties); + Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartConverterStringToLocalDate.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartConverterStringToLocalDate.java new file mode 100644 index 00000000..1eb1a1f1 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartConverterStringToLocalDate.java @@ -0,0 +1,34 @@ +package net.lab1024.smartadmin.service.config; + +import net.lab1024.smartadmin.service.util.date.SmartDateFormatterEnum; +import net.lab1024.smartadmin.service.util.date.SmartLocalDateUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.converter.Converter; + +import java.time.LocalDate; +import java.time.format.DateTimeParseException; + +/** + * string 转为 LocalDate 配置类 + * + * @author 胡克 + * @date 2020/3/6 14:34 + */ +@Configuration +public class SmartConverterStringToLocalDate implements Converter { + + @Override + public LocalDate convert(String str) { + if (StringUtils.isBlank(str)) { + return null; + } + LocalDate localDate; + try { + localDate = SmartLocalDateUtil.parseDate(str, SmartDateFormatterEnum.YMD); + } catch (DateTimeParseException e) { + throw new RuntimeException("请输入正确的日期格式:yyyy-MM-dd"); + } + return localDate; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartConverterStringToLocalDateTime.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartConverterStringToLocalDateTime.java new file mode 100644 index 00000000..4bdbf494 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartConverterStringToLocalDateTime.java @@ -0,0 +1,37 @@ +package net.lab1024.smartadmin.service.config; + +import net.lab1024.smartadmin.service.util.date.SmartDateFormatterEnum; +import net.lab1024.smartadmin.service.util.date.SmartLocalDateUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.converter.Converter; + +import java.time.LocalDateTime; +import java.time.format.DateTimeParseException; + +/** + * string 转为 LocalDate 配置类 + * + * @author 胡克 + * @date 2020/3/6 14:34 + */ +@Configuration +public class SmartConverterStringToLocalDateTime implements Converter { + + + @Override + public LocalDateTime convert(String str) { + if (StringUtils.isBlank(str)) { + return null; + } + LocalDateTime localDateTime; + try { + localDateTime = SmartLocalDateUtil.parse(str, SmartDateFormatterEnum.YMD_HMS); + } catch (DateTimeParseException e) { + throw new RuntimeException("请输入正确的日期格式:yyyy-MM-dd HH:mm:ss"); + } + return localDateTime; + } + + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartDruidDataSourceConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartDruidDataSourceConfig.java similarity index 62% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartDruidDataSourceConfig.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartDruidDataSourceConfig.java index 560bda2a..c476a87b 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartDruidDataSourceConfig.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartDruidDataSourceConfig.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.config; +package net.lab1024.smartadmin.service.config; import com.alibaba.druid.filter.Filter; import com.alibaba.druid.filter.stat.StatFilter; @@ -6,17 +6,25 @@ import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import com.alibaba.druid.support.spring.stat.DruidStatInterceptor; -import com.alibaba.druid.util.JdbcConstants; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.plugin.Interceptor; +import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.support.JdkRegexpMethodPointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import javax.sql.DataSource; import java.sql.SQLException; @@ -25,60 +33,59 @@ import java.util.HashMap; import java.util.Map; /** - * [ 数据源配置 ] + * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 + * @author 罗伊 + * @date 2020/8/25 11:57 */ @Slf4j @Configuration public class SmartDruidDataSourceConfig { @Value("${spring.datasource.driver-class-name}") - String driver; + private String driver; @Value("${spring.datasource.url}") - String url; + private String url; @Value("${spring.datasource.username}") - String username; + private String username; @Value("${spring.datasource.password}") - String password; + private String password; @Value("${spring.datasource.initial-size}") - int initialSize; + private int initialSize; @Value("${spring.datasource.min-idle}") - int minIdle; + private int minIdle; @Value("${spring.datasource.max-active}") - int maxActive; + private int maxActive; @Value("${spring.datasource.max-wait}") - long maxWait; + private long maxWait; @Value("${spring.datasource.time-between-eviction-runs-millis}") - long timeBetweenEvictionRunsMillis; + private long timeBetweenEvictionRunsMillis; @Value("${spring.datasource.min-evictable-idle-time-millis}") - long minEvictableIdleTimeMillis; + private long minEvictableIdleTimeMillis; @Value("${spring.datasource.filters}") - String filters; + private String filters; @Value("${spring.datasource.druid.username}") - String druidUserName; + private String druidUserName; @Value("${spring.datasource.druid.password}") - String druidPassword; + private String druidPassword; @Value("${spring.datasource.druid.login.enabled}") - boolean druidLoginEnable; + private boolean druidLoginEnable; + + @Value("${spring.datasource.druid.service.scanner}") + private String serviceScanner; @Autowired private StatFilter logSlowSql; @@ -86,11 +93,14 @@ public class SmartDruidDataSourceConfig { @Autowired private DruidStatInterceptor druidStatInterceptor; + @Autowired + private MybatisPlusInterceptor mybatisPlusInterceptor; + @Bean @Primary public DataSource druidDataSource() { DruidDataSource druidDataSource = new DruidDataSource(); - druidDataSource.setDbType(JdbcConstants.MYSQL); + druidDataSource.setDbType(DbType.MYSQL.getDb()); druidDataSource.setDriverClassName(driver); druidDataSource.setUrl(url); druidDataSource.setUsername(username); @@ -101,6 +111,7 @@ public class SmartDruidDataSourceConfig { druidDataSource.setMaxWait(maxWait); druidDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); druidDataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + druidDataSource.setValidationQuery("SELECT 1"); try { druidDataSource.setFilters(filters); ArrayList arrayList = new ArrayList<>(); @@ -115,12 +126,33 @@ public class SmartDruidDataSourceConfig { } @Bean - public ServletRegistrationBean druidServlet() { - ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); + public SqlSessionFactory sqlSessionFactory() throws Exception { + MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); + factoryBean.setDataSource(druidDataSource()); + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + Resource[] resources = resolver.getResources("classpath*:/mapper/**/*.xml"); + factoryBean.setMapperLocations(resources); + + // 设置 MyBatis-Plus 分页插件 + Interceptor[] plugins = {mybatisPlusInterceptor}; + factoryBean.setPlugins(plugins); + + return factoryBean.getObject(); + } + + /** + * 非正式环境 加载 + * + * @return + */ + @Bean + @Conditional(SmartSystemEnvNotProdCondition.class) + public ServletRegistrationBean druidServlet() { + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); servletRegistrationBean.setServlet(new StatViewServlet()); servletRegistrationBean.addUrlMappings("/druid/*"); Map initParameters = new HashMap(); - //不设置用户名密码可以直接通过druid/index.html访问 + // 不设置用户名密码可以直接通过druid/index.html访问 if (druidLoginEnable) { initParameters.put("loginUsername", druidUserName); initParameters.put("loginPassword", druidPassword); @@ -131,11 +163,11 @@ public class SmartDruidDataSourceConfig { } @Bean - public FilterRegistrationBean filterRegistrationBean() { - FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); - filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); + filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/*"); return filterRegistrationBean; } @@ -143,21 +175,20 @@ public class SmartDruidDataSourceConfig { public StatFilter logSlowSql() { StatFilter statFilter = new StatFilter(); statFilter.setMergeSql(true); - statFilter.setSlowSqlMillis(300); + statFilter.setSlowSqlMillis(500); statFilter.setLogSlowSql(true); return statFilter; } @Bean(name = "druid-stat-interceptor") public DruidStatInterceptor druidStatInterceptor() { - DruidStatInterceptor dsInterceptor = new DruidStatInterceptor(); - return dsInterceptor; + return new DruidStatInterceptor(); } @Bean public JdkRegexpMethodPointcut jdkRegexpMethodPointcut() { JdkRegexpMethodPointcut jdkRegexpMethodPointcut = new JdkRegexpMethodPointcut(); - jdkRegexpMethodPointcut.setPatterns("net.lab1024.smartadmin.module..*Service.*"); + jdkRegexpMethodPointcut.setPatterns(serviceScanner); return jdkRegexpMethodPointcut; } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartHeartBeatConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartHeartBeatConfig.java new file mode 100644 index 00000000..27b21521 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartHeartBeatConfig.java @@ -0,0 +1,40 @@ +package net.lab1024.smartadmin.service.config; + +import net.lab1024.smartadmin.service.module.support.heartbeat.HeartBeatRecordHandler; +import net.lab1024.smartadmin.service.module.support.heartbeat.core.HeartBeatManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * [ 服务心跳配置 ] + * + * @author 罗伊 + * @date 2021/1/9 14:13 + */ +@Configuration +public class SmartHeartBeatConfig { + + /** + * 延迟执行时间 + */ + @Value("${heart-beat.delayHandlerTime}") + private Long delayHandlerTime; + + /** + * 间隔执行时间 + */ + @Value("${heart-beat.intervalTime}") + private Long intervalTime; + + @Autowired + private HeartBeatRecordHandler heartBeatRecordHandler; + + + @Bean + public HeartBeatManager heartBeatManager(){ + return new HeartBeatManager(delayHandlerTime,intervalTime,heartBeatRecordHandler); + } +} \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartMybatisPlusConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartMybatisPlusConfig.java new file mode 100644 index 00000000..a9454bc5 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartMybatisPlusConfig.java @@ -0,0 +1,30 @@ +package net.lab1024.smartadmin.service.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * MybatisPlus 配置 + * + * @author listen + * @date 2021/06/06 19:30 + */ +@Configuration +@EnableTransactionManagement +public class SmartMybatisPlusConfig { + + /** + * 分页插件 + */ + @Bean + public MybatisPlusInterceptor paginationInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartRedisConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRedisConfig.java similarity index 93% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartRedisConfig.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRedisConfig.java index 829ca01f..1d57b412 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartRedisConfig.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRedisConfig.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.config; +package net.lab1024.smartadmin.service.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; @@ -14,12 +14,8 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; /** * [ redis配置 ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 + * @author 罗伊 + * @date 2020/8/25 11:57 */ @Configuration public class SmartRedisConfig { @@ -70,5 +66,4 @@ public class SmartRedisConfig { return redisTemplate.opsForZSet(); } - } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRedisMqConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRedisMqConfig.java new file mode 100644 index 00000000..f0f8f919 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRedisMqConfig.java @@ -0,0 +1,68 @@ +package net.lab1024.smartadmin.service.config; + +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.module.support.redismq.RedisMqTopicEnum; +import net.lab1024.smartadmin.service.module.support.redismq.RedisMsgHandler; +import net.lab1024.smartadmin.service.util.SmartBaseEnumUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.listener.PatternTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; + +/** + * [ ] + * + * @author 罗伊 + * @date + */ +@Slf4j +@Configuration +public class SmartRedisMqConfig { + + @Value("${redis.mq.topic:SmartAdmin}") + private String topic; + @Value("${redis.mq.scanPath:net.lab1024.smartadmin.service}") + private String scanPath; + + /** + * redis topic + * @param connectionFactory + * @param listenerAdapter + * @return + */ + @Bean + public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(connectionFactory); + boolean checkEnum = SmartBaseEnumUtil.checkEnum(topic, RedisMqTopicEnum.class); + if (!checkEnum) { + log.error("topic:{},系统暂未定义", topic); + throw new RuntimeException("无效的redis topic"); + } + container.addMessageListener(listenerAdapter, new PatternTopic(topic)); + return container; + } + + /** + * redis消息处理类 + * @return + */ + @Bean + public RedisMsgHandler redisMsgHandler() { + return new RedisMsgHandler(scanPath); + } + + /** + * redis消息处理方法 + * @param receiver + * @return + */ + @Bean + public MessageListenerAdapter listenerAdapter(RedisMsgHandler receiver) { + return new MessageListenerAdapter(receiver, RedisMsgHandler.METHOD_NAME); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRepeatSubmitAspectConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRepeatSubmitAspectConfig.java new file mode 100644 index 00000000..f8d81b85 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRepeatSubmitAspectConfig.java @@ -0,0 +1,43 @@ +package net.lab1024.smartadmin.service.config; + +import com.alibaba.fastjson.JSON; +import net.lab1024.smartadmin.service.module.support.repeatsubmit.SmartRepeatSubmitAspect; +import net.lab1024.smartadmin.service.module.support.repeatsubmit.SmartRepeatSubmitUserDTO; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginInfoDTO; +import net.lab1024.smartadmin.service.util.SmartEmployeeTokenUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.servlet.http.HttpServletRequest; + +/** + * [ 接口重复提交配置 ] + * + * @author 罗伊 + * @date 2021/1/27 11:22 + */ +@Configuration +public class SmartRepeatSubmitAspectConfig { + + @Bean + public SmartRepeatSubmitAspect repeatSubmitAspect() { + return new SmartRepeatSubmitAspect(this::userFunction); + } + + /** + * 请求用户信息 + * + * @return + */ + private SmartRepeatSubmitUserDTO userFunction(HttpServletRequest request) { + EmployeeLoginInfoDTO requestEmployee = SmartEmployeeTokenUtil.getRequestEmployee(); + if(requestEmployee == null){ + return null; + } + SmartRepeatSubmitUserDTO repeatSubmitUserDTO = new SmartRepeatSubmitUserDTO(); + repeatSubmitUserDTO.setUserId(requestEmployee.getEmployeeId()); + repeatSubmitUserDTO.setUserName(requestEmployee.getActualName()); + repeatSubmitUserDTO.setExtData(JSON.toJSONString(requestEmployee)); + return repeatSubmitUserDTO; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartResponseEncryptAspectConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartResponseEncryptAspectConfig.java new file mode 100644 index 00000000..e203bbdf --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartResponseEncryptAspectConfig.java @@ -0,0 +1,45 @@ +package net.lab1024.smartadmin.service.config; + +import com.alibaba.fastjson.JSON; +import net.lab1024.smartadmin.service.module.support.responseencrypt.ResponseEncryptDecryptAspect; +import net.lab1024.smartadmin.service.module.support.responseencrypt.ResponseEncryptDecryptUserDTO; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginInfoDTO; +import net.lab1024.smartadmin.service.util.SmartEmployeeTokenUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.servlet.http.HttpServletRequest; + +/** + * [ 接口加解密配置 ] + * + * @author 罗伊 + * @date 2021/1/27 11:22 + */ +@Configuration +public class SmartResponseEncryptAspectConfig { + + + @Bean + public ResponseEncryptDecryptAspect responseEncryptAspect() { + return new ResponseEncryptDecryptAspect(this::employeeFunction); + } + + /** + * 请求用户信息 + * @param request + * @return + */ + private ResponseEncryptDecryptUserDTO employeeFunction(HttpServletRequest request){ + EmployeeLoginInfoDTO employeeLoginInfoDTO = SmartEmployeeTokenUtil.getRequestEmployee(); + if(employeeLoginInfoDTO == null){ + return null; + } + ResponseEncryptDecryptUserDTO responseEncryptDecryptUserDTO = new ResponseEncryptDecryptUserDTO(); + responseEncryptDecryptUserDTO.setUserId(employeeLoginInfoDTO.getEmployeeId()); + responseEncryptDecryptUserDTO.setUserName(employeeLoginInfoDTO.getActualName()); + responseEncryptDecryptUserDTO.setExtData(JSON.toJSONString(employeeLoginInfoDTO)); + return responseEncryptDecryptUserDTO; + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRestTemplateConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRestTemplateConfig.java new file mode 100644 index 00000000..bc671e69 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartRestTemplateConfig.java @@ -0,0 +1,126 @@ +package net.lab1024.smartadmin.service.config; + +import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; +import okhttp3.ConnectionPool; +import okhttp3.OkHttpClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.client.OkHttp3ClientHttpRequestFactory; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.nio.charset.StandardCharsets; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:57 + */ +@Configuration +public class SmartRestTemplateConfig { + + @Value("${http.pool.max-total}") + private Integer maxTotal; + + @Value("${http.pool.connect-timeout}") + private Integer connectTimeout; + + @Value("${http.pool.read-timeout}") + private Integer readTimeout; + + @Value("${http.pool.write-timeout}") + private Integer writeTimeout; + + @Value("${http.pool.keep-alive}") + private Integer keepAlive; + + @Bean + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setRequestFactory(this.clientHttpRequestFactory()); + List> messageConverterList = restTemplate.getMessageConverters(); + messageConverterList.add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8)); + messageConverterList.addAll(converters()); + return restTemplate; + } + + public List> converters() { + List> converters = new ArrayList<>(); + HttpMessageConverter converter = new StringHttpMessageConverter(StandardCharsets.UTF_8); + FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); + List fastMediaTypes = new ArrayList<>(); + fastMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED); + fastMediaTypes.add(MediaType.APPLICATION_JSON); + fastConverter.setSupportedMediaTypes(fastMediaTypes); + converters.add(converter); + converters.add(fastConverter); + return converters; + } + + + public OkHttp3ClientHttpRequestFactory clientHttpRequestFactory() { + return new OkHttp3ClientHttpRequestFactory(httpClientBuilder()); + } + + public OkHttpClient httpClientBuilder() { + return new OkHttpClient.Builder() + .retryOnConnectionFailure(false) + .connectionPool(this.pool()) + .connectTimeout(connectTimeout, TimeUnit.MILLISECONDS) + .readTimeout(readTimeout,TimeUnit.MILLISECONDS) + .writeTimeout(writeTimeout,TimeUnit.MILLISECONDS) + .build(); + } + + public ConnectionPool pool() { + return new ConnectionPool(maxTotal, keepAlive, TimeUnit.MILLISECONDS); + } + + + @Bean + public X509TrustManager x509TrustManager() { + return new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + } + @Override + public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + } + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + }; + } + + @Bean + public SSLSocketFactory sslSocketFactory() { + try { + //信任任何链接 + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, new TrustManager[]{x509TrustManager()}, new SecureRandom()); + return sslContext.getSocketFactory(); + } catch (NoSuchAlgorithmException | KeyManagementException e) { + e.printStackTrace(); + } + return null; + } + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSchedulingConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSchedulingConfig.java new file mode 100644 index 00000000..dd7e20c2 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSchedulingConfig.java @@ -0,0 +1,51 @@ +package net.lab1024.smartadmin.service.config; + +import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.util.Strings; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; +import org.springframework.scheduling.config.Task; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author 卓大 + * @Date 2020/5/22 + */ +@Slf4j +@Configuration +public class SmartSchedulingConfig implements SchedulingConfigurer { + + private ScheduledTaskRegistrar taskRegistrar; + + public ScheduledTaskRegistrar getTaskRegistrar() { + return taskRegistrar; + } + + /** + * 结束定时任务 + */ + public void destroy() { + List taskList = new ArrayList<>(); + taskList.addAll(taskRegistrar.getCronTaskList()); + taskList.addAll(taskRegistrar.getTriggerTaskList()); + taskList.addAll(taskRegistrar.getFixedDelayTaskList()); + taskList.addAll(taskRegistrar.getFixedRateTaskList()); + + List taskName = taskList.stream().map(Task::toString).collect(Collectors.toList()); + + taskRegistrar.destroy(); + + log.warn("已结束定时任务:\n{}", Strings.join(taskName, '\n')); + } + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + this.taskRegistrar = taskRegistrar; + } + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSerializerLocalDateTimeConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSerializerLocalDateTimeConfig.java new file mode 100644 index 00000000..3891eaad --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSerializerLocalDateTimeConfig.java @@ -0,0 +1,31 @@ +package net.lab1024.smartadmin.service.config; + +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import net.lab1024.smartadmin.service.util.date.SmartDateFormatterEnum; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * java8 localDate 时间类格式化配置 + * + * @author listen + * @date 2021年8月31日 21:19 + */ +@Configuration +public class SmartSerializerLocalDateTimeConfig { + + @Bean + public Jackson2ObjectMapperBuilderCustomizer customizer() { + return builder -> { + builder.deserializers(new LocalDateDeserializer(SmartDateFormatterEnum.YMD.getFormatter())); + builder.deserializers(new LocalDateTimeDeserializer(SmartDateFormatterEnum.YMD_HMS.getFormatter())); + builder.serializers(new LocalDateSerializer(SmartDateFormatterEnum.YMD.getFormatter())); + builder.serializers(new LocalDateTimeSerializer(SmartDateFormatterEnum.YMD_HMS.getFormatter())); + }; + } + +} \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartStorageCloudConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartStorageCloudConfig.java new file mode 100644 index 00000000..e76f5e96 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartStorageCloudConfig.java @@ -0,0 +1,64 @@ +package net.lab1024.smartadmin.service.config; + +import com.amazonaws.ClientConfiguration; +import com.amazonaws.Protocol; +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +/** + * @author Administrator + */ +@Data +@Configuration +@ConditionalOnProperty(prefix = "file.storage", name = {"mode"}, havingValue = "cloud") +public class SmartStorageCloudConfig { + + @Value("${file.storage.cloud.region}") + private String region; + + @Value("${file.storage.cloud.endpoint}") + private String endpoint; + + @Value("${file.storage.cloud.bucket-name}") + private String bucketName; + + @Value("${file.storage.cloud.access-key}") + private String accessKey; + + @Value("${file.storage.cloud.secret-key}") + private String secretKey; + + @Value("${file.storage.cloud.url.expire}") + private Long urlExpire; + + @Value("${file.storage.cloud.url.public}") + private String publicUrl; + + /** + * 初始化 云oss client 配置 + * + * @return + */ + @Bean + public AmazonS3 initAmazonS3() { + ClientConfiguration clientConfig = new ClientConfiguration(); + clientConfig.setProtocol(Protocol.HTTPS); + AmazonS3 s3Client = AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))) + .withClientConfiguration(clientConfig) + .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint, region)) + .withPathStyleAccessEnabled(false) + .build(); + return s3Client; + } + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartSwaggerDynamicGroupConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSwaggerDynamicGroupConfig.java similarity index 56% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartSwaggerDynamicGroupConfig.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSwaggerDynamicGroupConfig.java index aad7b175..21bc6c1d 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartSwaggerDynamicGroupConfig.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSwaggerDynamicGroupConfig.java @@ -1,6 +1,5 @@ -package net.lab1024.smartadmin.config; +package net.lab1024.smartadmin.service.config; -import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.base.Predicates; @@ -8,8 +7,8 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.interceptor.SmartAuthenticationInterceptor; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @@ -17,10 +16,10 @@ import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.core.env.Environment; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.RequestHandler; import springfox.documentation.builders.ApiInfoBuilder; @@ -28,41 +27,29 @@ 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.service.ApiInfo; 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.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; /** - * [ 根据SwaggerTagConst内部类动态生成Swagger group ] + * [ 根据SwaggerTagConst内部类动态生成Swagger ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/7 0007 下午 19:20 - * @since JDK1.8 + * @author 罗伊 + * @date 2020/8/25 11:57 */ @Slf4j @EnableSwagger2 -@EnableKnife4j @Configuration -@Profile({"dev", "sit", "pre", "prod"}) +@Conditional(SmartSystemEnvNotProdCondition.class) public class SmartSwaggerDynamicGroupConfig implements EnvironmentAware, BeanDefinitionRegistryPostProcessor { - /** - * 分组名称 - */ - private String apiGroupName; - /** * 文档标题 */ @@ -88,6 +75,16 @@ public class SmartSwaggerDynamicGroupConfig implements EnvironmentAware, BeanDef */ private String packAge; + /** + * host + */ + private String host; + + /** + * 接口Tag类 + */ + private String swaggerTagClass; + private int groupIndex = 0; private String groupName = "default"; @@ -98,12 +95,13 @@ public class SmartSwaggerDynamicGroupConfig implements EnvironmentAware, BeanDef @Override public void setEnvironment(Environment environment) { - this.apiGroupName = environment.getProperty("swagger.apiGroupName"); - this.title = environment.getProperty("swagger.title"); - this.description = environment.getProperty("swagger.description"); - this.version = environment.getProperty("swagger.version"); - this.serviceUrl = environment.getProperty("swagger.serviceUrl"); - this.packAge = environment.getProperty("swagger.packAge"); + this.title = environment.getProperty("swagger.title" ); + this.description = environment.getProperty("swagger.description" ); + this.version = environment.getProperty("swagger.version" ); + this.serviceUrl = environment.getProperty("swagger.serviceUrl" ); + this.packAge = environment.getProperty("swagger.packAge" ); + this.host = environment.getProperty("swagger.host" ); + this.swaggerTagClass = environment.getProperty("swagger.tagClass" ); } @Override @@ -118,8 +116,15 @@ public class SmartSwaggerDynamicGroupConfig implements EnvironmentAware, BeanDef } private void groupBuild() { - Class clazz = SwaggerTagConst.class; - Class[] innerClazz = clazz.getDeclaredClasses(); + Class clazz = null; + try { + clazz = Class.forName(swaggerTagClass); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + log.error("swaggerTagClass unfounded :{}", swaggerTagClass); + return; + } + Class[] innerClazz = clazz.getClasses(); for (Class cls : innerClazz) { String group = cls.getSimpleName(); List apiTags = Lists.newArrayList(); @@ -140,57 +145,33 @@ public class SmartSwaggerDynamicGroupConfig implements EnvironmentAware, BeanDef } private Docket baseDocket() { - // 配置全局参数 token + // 配置全局参数 token header ParameterBuilder tokenPar = new ParameterBuilder(); - Parameter parameter = tokenPar.name(SmartAuthenticationInterceptor.TOKEN_NAME) - .description("token") - .modelRef(new ModelRef("string")) - .parameterType("header") - .defaultValue("") + tokenPar.name(CommonConst.Token.OUTER_TOKEN_NAME) + .description("token" ) + .modelRef(new ModelRef("string" )) + .parameterType("header" ).defaultValue("1" ) .required(false) .build(); - // 请求类型过滤规则 - Predicate controllerPredicate = getControllerPredicate(); - // controller 包路径 - Predicate controllerPackage = RequestHandlerSelectors.basePackage(packAge); - return new Docket(DocumentationType.SWAGGER_2) + // 此行必须放在配置前面执行 因为要初始化groupName + Predicate controllerPredicate = this.getControllerPredicate(); + // swagger配置 + Docket docket = new Docket(DocumentationType.SWAGGER_2) .groupName(groupName) .forCodeGeneration(true) .select() - .apis(controllerPackage) + .apis(RequestHandlerSelectors.basePackage(packAge)) .apis(controllerPredicate) .paths(PathSelectors.any()) - .build() - .apiInfo(this.serviceApiInfo()) - .securitySchemes(securitySchemes()) - .securityContexts(securityContexts()) - .globalOperationParameters(Lists.newArrayList(parameter)); - } + .build().apiInfo(this.serviceApiInfo()) + .globalOperationParameters(Lists.newArrayList(tokenPar.build())); - private List securitySchemes() { - List apiKeyList = new ArrayList<>(); - apiKeyList.add(new ApiKey("x-access-token", "x-access-token", "header")); - return apiKeyList; - } + if (StringUtils.isNotBlank(host)) { + docket = docket.host(host); + } - private List securityContexts() { - List securityContexts = new ArrayList<>(); - securityContexts.add( - SecurityContext.builder() - .securityReferences(defaultAuth()) - .forPaths(PathSelectors.any()) - .build()); - return securityContexts; - } - - List defaultAuth() { - AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); - AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; - authorizationScopes[0] = authorizationScope; - List securityReferences = new ArrayList<>(); - securityReferences.add(new SecurityReference("x-access-token", authorizationScopes)); - return securityReferences; + return docket; } private Predicate getControllerPredicate() { @@ -203,34 +184,18 @@ public class SmartSwaggerDynamicGroupConfig implements EnvironmentAware, BeanDef api = apiOptional.get(); } List tags = Arrays.asList(api.tags()); - if (api != null && apiTags.containsAll(tags)) { - return true; - } - return false; + return apiTags.containsAll(tags); }; groupIndex++; - return Predicates.or( - Predicates.and(RequestHandlerSelectors.withClassAnnotation(RestController.class), methodPredicate), - Predicates.and( - RequestHandlerSelectors.withMethodAnnotation(ResponseBody.class), methodPredicate) - ); + return Predicates.and(RequestHandlerSelectors.withClassAnnotation(RestController.class), methodPredicate); } private ApiInfo serviceApiInfo() { - return new ApiInfoBuilder() - .title(title) - .description(description) - .version(version) - .license("Apache License Version 2.0") - .contact(new Contact("1024创新实验室", "http://www.1024lab.net", "")) - .termsOfServiceUrl(serviceUrl) - .build(); + return new ApiInfoBuilder().title(title).description(description).version(version).termsOfServiceUrl(serviceUrl).build(); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { } - - } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSystemEnvNotProdCondition.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSystemEnvNotProdCondition.java new file mode 100644 index 00000000..46ab0be6 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartSystemEnvNotProdCondition.java @@ -0,0 +1,35 @@ +package net.lab1024.smartadmin.service.config; + +import net.lab1024.smartadmin.service.common.constant.SystemEnvironmentEnum; +import net.lab1024.smartadmin.service.util.SmartBaseEnumUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.type.AnnotatedTypeMetadata; + +/** + * 当前系统环境 + * + * @author listen + * @date 2019/08/27 08:56 + */ +@Configuration +public class SmartSystemEnvNotProdCondition implements Condition { + + @Value("${spring.profiles.active}") + private String systemEnvironment; + + @Override + public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { + String property = conditionContext.getEnvironment().getProperty("spring.profiles.active"); + return StringUtils.isNotBlank(property) && !SystemEnvironmentEnum.PROD.equalsValue(property); + } + + @Bean + public SystemEnvironmentEnum initEnvironment() { + return SmartBaseEnumUtil.getEnumByValue(systemEnvironment, SystemEnvironmentEnum.class); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartWebAppConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartWebAppConfig.java new file mode 100644 index 00000000..358f434e --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/config/SmartWebAppConfig.java @@ -0,0 +1,48 @@ +package net.lab1024.smartadmin.service.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +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.Map; +import java.util.Map.Entry; + +/** + * @Description + * @Author 善逸 + * @Date Created in 2017/10/24 13:48 + */ +@Configuration +public class SmartWebAppConfig implements WebMvcConfigurer { + + @Autowired + private Map interceptorMp; + + @Value("${file.storage.local.path}") + private String localPath; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + for(Entry entry : interceptorMp.entrySet()){ + registry.addInterceptor(entry.getValue()).addPathPatterns(entry.getKey() + "/**"); + } + + } + + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/druidMonitor").setViewName("redirect:druid/index.html"); + registry.addViewController("/swaggerApi").setViewName("redirect:swagger-ui.html"); + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/**") + .addResourceLocations("classpath:/META-INF/resources/","classpath:/resources/","classpath:/static/","file:" + localPath); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/filters/SmartTokenFilter.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/filters/SmartTokenFilter.java new file mode 100644 index 00000000..07155043 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/filters/SmartTokenFilter.java @@ -0,0 +1,66 @@ +package net.lab1024.smartadmin.service.filters; + +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.module.system.login.EmployeeLoginTokenService; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginBO; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginInfoDTO; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import net.lab1024.smartadmin.service.util.SmartEmployeeTokenUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * token过滤器 + */ +@Component +public class SmartTokenFilter extends OncePerRequestFilter { + private static final String TOKEN_NAME = "x-access-token"; + + @Autowired + private EmployeeLoginTokenService loginTokenService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + //需要做token校验, 消息头的token优先于请求query参数的token + String xHeaderToken = request.getHeader(TOKEN_NAME); + String xRequestToken = request.getParameter(TOKEN_NAME); + String xAccessToken = null != xHeaderToken ? xHeaderToken : xRequestToken; + if (StringUtils.isBlank(xAccessToken)) { + // 若未给予spring security上下文用户授权 则会授权失败 进入AuthenticationEntryPointImpl + chain.doFilter(request, response); + return; + } + + // 先清理spring security上下文 + SecurityContextHolder.clearContext(); + + // 判断请求分组 + String requestURI = request.getRequestURI(); + if (StringUtils.startsWithIgnoreCase(requestURI, CommonConst.ApiUrl.API_PREFIX_ADMIN)) { + // 后管 获取用户信息 + EmployeeLoginBO loginBO = loginTokenService.getEmployeeLoginBO(xAccessToken); + // 若获取到了登陆信息 则把用户信息设置到上下文中 + if (null != loginBO) { + SmartEmployeeTokenUtil.setUser(SmartBeanUtil.copy(loginBO, EmployeeLoginInfoDTO.class)); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginBO, null, loginBO.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + } + + // 若未给予spring security上下文用户授权 则会授权失败 进入AuthenticationEntryPointImpl + chain.doFilter(request, response); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/handler/AuthenticationFailHandler.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/handler/AuthenticationFailHandler.java new file mode 100644 index 00000000..6ca6e7c1 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/handler/AuthenticationFailHandler.java @@ -0,0 +1,39 @@ +package net.lab1024.smartadmin.service.handler; + +import com.alibaba.fastjson.JSONObject; +import net.lab1024.smartadmin.service.common.codeconst.LoginResponseCodeConst; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 认证失败处理 + */ +@Component +public class AuthenticationFailHandler implements AuthenticationEntryPoint { + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException { + this.outputResult(response, LoginResponseCodeConst.LOGIN_ERROR); + } + + /** + * 输出 + * + * @param response + * @param respCode + * @throws IOException + */ + private void outputResult(HttpServletResponse response, ResponseCodeConst respCode) throws IOException { + String msg = JSONObject.toJSONString(ResponseDTO.wrap(respCode)); + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write(msg); + response.flushBuffer(); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/handler/SmartGlobalExceptionHandler.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/handler/SmartGlobalExceptionHandler.java new file mode 100644 index 00000000..37a80a9b --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/handler/SmartGlobalExceptionHandler.java @@ -0,0 +1,104 @@ +package net.lab1024.smartadmin.service.handler; + +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.SystemEnvironmentEnum; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.common.exception.SmartBusinessException; +import org.springframework.beans.TypeMismatchException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.validation.BindException; +import org.springframework.validation.FieldError; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * [ 全局异常拦截 ] + * + * @author 罗伊 + * @date 2020/8/25 11:57 + */ +@Slf4j +@ControllerAdvice +public class SmartGlobalExceptionHandler { + + @Autowired + private SystemEnvironmentEnum systemEnvironmentEnum; + + /** + * 添加全局异常处理流程 + * + * @param e + * @return + * @throws Exception + */ + @ResponseBody + @ExceptionHandler(Exception.class) + public ResponseDTO exceptionHandler(Exception e) { + + // json 格式错误 + if (e instanceof HttpMessageNotReadableException) { + return ResponseDTO.wrap(ResponseCodeConst.JSON_FORMAT_ERROR); + } + + String uri = null; + RequestAttributes request = RequestContextHolder.getRequestAttributes(); + if (null != request) { + ServletRequestAttributes servletRequest = (ServletRequestAttributes) request; + uri = servletRequest.getRequest().getRequestURI(); + } + + // http 请求方式错误 + if (e instanceof HttpRequestMethodNotSupportedException) { + return ResponseDTO.wrap(ResponseCodeConst.REQUEST_METHOD_ERROR); + } + + // 参数类型错误 + if (e instanceof TypeMismatchException) { + return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM); + } + + // 参数校验未通过 + if (e instanceof MethodArgumentNotValidException) { + List fieldErrors = ((MethodArgumentNotValidException) e).getBindingResult().getFieldErrors(); + List msgList = fieldErrors.stream().map(FieldError::getDefaultMessage).collect(Collectors.toList()); + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, String.join(",", msgList)); + } + + // 参数绑定错误 + if (e instanceof BindException) { + List fieldErrors = ((BindException) e).getFieldErrors(); + List error = fieldErrors.stream().map(field -> field.getField() + ":" + field.getRejectedValue()).collect(Collectors.toList()); + String errorMsg = ResponseCodeConst.ERROR_PARAM.getMsg() + ":" + error.toString(); + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, errorMsg); + } + + if (e instanceof SmartBusinessException) { + return ResponseDTO.wrapMsg(ResponseCodeConst.SYSTEM_ERROR, e.getMessage()); + } + + if (e instanceof AccessDeniedException) { + return ResponseDTO.wrapMsg(ResponseCodeConst.SYSTEM_ERROR, "您暂无权限"); + } + + log.error("捕获全局异常,URL:{}", uri, e); + + // 正式环境 不返回错误信息 + if (SystemEnvironmentEnum.PROD == systemEnvironmentEnum) { + return ResponseDTO.wrap(ResponseCodeConst.SYSTEM_ERROR); + } + + return ResponseDTO.wrapMsg(ResponseCodeConst.SYSTEM_ERROR, e.toString()); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/interceptor/BusinessAuthorityInterceptor.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/interceptor/BusinessAuthorityInterceptor.java new file mode 100644 index 00000000..390939f5 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/interceptor/BusinessAuthorityInterceptor.java @@ -0,0 +1,60 @@ +package net.lab1024.smartadmin.service.interceptor; + +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.util.SmartEmployeeTokenUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * [ 登录拦截器 ] + * + * @author 罗伊 + */ +@Component(CommonConst.ApiUrl.API_PREFIX_ADMIN) +public class BusinessAuthorityInterceptor implements HandlerInterceptor { + + @Value("${access-control-allow-origin}") + private String accessControlAllowOrigin; + + /** + * 拦截服务器端响应处理ajax请求返回结果 + * + * @param request + * @param response + * @param handler + * @return + * @throws Exception + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + //跨域设置 + this.crossDomainConfig(response); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + SmartEmployeeTokenUtil.remove(); + } + + /** + * 配置跨域 + * + * @param response + */ + private void crossDomainConfig(HttpServletResponse response) { + response.setHeader("Access-Control-Allow-Origin", accessControlAllowOrigin); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH"); + response.setHeader("Access-Control-Expose-Headers", "*"); + response.setHeader("Access-Control-Allow-Headers", "Authentication,Origin, X-Requested-With, Content-Type, " + "Accept, x-access-token"); + response.setHeader("Cache-Control", "no-cache"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Expires ", "-1"); + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/interceptor/SupportAuthorityInterceptor.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/interceptor/SupportAuthorityInterceptor.java new file mode 100644 index 00000000..a8056c9d --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/interceptor/SupportAuthorityInterceptor.java @@ -0,0 +1,54 @@ +package net.lab1024.smartadmin.service.interceptor; + +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 公用api 拦截器 + * + * @author Administrator + */ +@Component(CommonConst.ApiUrl.API_PREFIX_SUPPORT) +public class SupportAuthorityInterceptor implements HandlerInterceptor { + + @Value("${access-control-allow-origin}") + private String accessControlAllowOrigin; + + /** + * 拦截服务器端响应处理ajax请求返回结果 + * + * @param request + * @param response + * @param handler + * @return + * @throws Exception + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + //跨域设置 + this.crossDomainConfig(response); + return true; + } + + /** + * 配置跨域 + * + * @param response + */ + private void crossDomainConfig(HttpServletResponse response) { + response.setHeader("Access-Control-Allow-Origin", accessControlAllowOrigin); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH"); + response.setHeader("Access-Control-Expose-Headers", "*"); + response.setHeader("Access-Control-Allow-Headers", "Authentication,Origin, X-Requested-With, Content-Type, " + "Accept, x-access-token"); + response.setHeader("Cache-Control", "no-cache"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Expires ", "-1"); + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/listener/SmartAdminStartupRunner.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/listener/SmartAdminStartupRunner.java new file mode 100644 index 00000000..0a8ddd25 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/listener/SmartAdminStartupRunner.java @@ -0,0 +1,29 @@ +package net.lab1024.smartadmin.service.listener; + +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeRegister; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +/** + * 应用启动加载 + * + * @author zhuo + * @version 1.0 + * @since JDK1.8 + */ +@Slf4j +@Component +public class SmartAdminStartupRunner implements CommandLineRunner { + + @Override + public void run(String... args) { + + log.info("###################### init start ######################"); + + // 初始化状态码 + ResponseCodeRegister.init(); + + log.info("###################### init complete ######################"); + } +} \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryController.java new file mode 100644 index 00000000..c2317d23 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryController.java @@ -0,0 +1,57 @@ +package net.lab1024.smartadmin.service.module.business.category; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.business.category.domain.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 类目 路由 + * + * @author 胡克 + * @date 2021/1/21 9:10 + */ +@Api(tags = SwaggerTagConst.Admin.MANAGER_CATEGORY) +@RestController +public class CategoryController extends AdminBaseController { + + @Autowired + private CategoryService categoryService; + + @ApiOperation("添加类目 by listen") + @PostMapping("/category/add") + public ResponseDTO add(@RequestBody @Valid CategoryAddDTO addDTO) { + return categoryService.add(addDTO); + } + + @ApiOperation("更新类目 by listen") + @PostMapping("/category/update") + public ResponseDTO update(@RequestBody @Valid CategoryUpdateDTO updateDTO) { + return categoryService.update(updateDTO); + } + + @ApiOperation("查询类目详情 by listen") + @GetMapping("/category/{categoryId}") + public ResponseDTO queryDetail(@PathVariable Long categoryId) { + return categoryService.queryDetail(categoryId); + } + + @ApiOperation("查询类目层级树 by listen") + @PostMapping("/category/tree") + public ResponseDTO> queryTree(@RequestBody @Valid CategoryTreeQueryDTO queryDTO) { + return categoryService.queryTree(queryDTO); + } + + @ApiOperation("删除类目 by listen") + @GetMapping("/category/del/{categoryId}") + public ResponseDTO delete(@PathVariable Long categoryId) { + return categoryService.delete(categoryId); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryDao.java new file mode 100644 index 00000000..9fdd7464 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryDao.java @@ -0,0 +1,50 @@ +package net.lab1024.smartadmin.service.module.business.category; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lab1024.smartadmin.service.module.business.category.constant.CategoryTypeEnum; +import net.lab1024.smartadmin.service.module.business.category.domain.CategoryEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 类目 dao + * + * @author 胡克 + * @date 2021/1/20 16:29 + */ +@Component +@Mapper +public interface CategoryDao extends BaseMapper { + + /** + * 根据父级id 类型 查询子类 + * + * @param parentIdList + * @param categoryType {@link CategoryTypeEnum} + * @param deletedFlag + * @return + */ + List queryByParentId(@Param("parentIdList") List parentIdList, + @Param("categoryType") Integer categoryType, + @Param("deletedFlag") Boolean deletedFlag); + + /** + * 根据类型和id查询 + * @param categoryType + * @param categoryId + * @return + */ + CategoryEntity selectByTypeAndId(@Param("categoryType") Integer categoryType, @Param("categoryId") Long categoryId); + + /** + * 查看类目 具体条件 看sql + * + * @param entity + * @return + */ + CategoryEntity selectOne(CategoryEntity entity); + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryQueryService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryQueryService.java new file mode 100644 index 00000000..5240c8b7 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryQueryService.java @@ -0,0 +1,333 @@ +package net.lab1024.smartadmin.service.module.business.category; + +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.constant.CacheModuleBaseConst; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.module.business.category.domain.CategoryEntity; +import net.lab1024.smartadmin.service.module.business.category.domain.CategorySimpleDTO; +import net.lab1024.smartadmin.service.module.business.category.domain.CategoryTreeQueryDTO; +import net.lab1024.smartadmin.service.module.business.category.domain.CategoryTreeVO; +import net.lab1024.smartadmin.service.module.support.beancache.cache.IBeanCache; +import net.lab1024.smartadmin.service.module.support.beancache.key.CacheKey; +import net.lab1024.smartadmin.service.module.support.beancache.load.CacheLoad; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import net.lab1024.smartadmin.service.util.SmartStringUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 类目 查询 业务类 + * + * @author 胡克 + * @date 2021/1/20 16:26 + */ +@Service +@Slf4j +public class CategoryQueryService { + + @Autowired + private CategoryDao categoryDao; + + @Autowired + private IBeanCache cache; + + /** + * 查詢类目 + * + * @param cacheKey + * @return + */ + @CacheLoad(CacheModuleBaseConst.Category.CATEGORY) + public CategoryEntity queryCategory(String cacheKey) { + String businessId = CacheKey.getBusinessIdByCacheKey(cacheKey); + return categoryDao.selectById(businessId); + } + + /** + * 查询类目 子级 + * + * @param cacheKey + * @return + */ + @CacheLoad(CacheModuleBaseConst.Category.CATEGORY_SUB) + public List querySubCategory(String cacheKey) { + /** + * 下划线 分隔 key + * 左边 categoryId 右边 type + */ + String businessId = CacheKey.getBusinessIdByCacheKey(cacheKey); + String[] split = businessId.split(CommonConst.UNDERLINE); + Integer categoryType = split.length > 1 ? Integer.valueOf(split[1]) : null; + return categoryDao.queryByParentId(Lists.newArrayList(Long.valueOf(split[0])), categoryType, false); + } + + /** + * 以 类目id+下划线+类型 作为缓存key + * + * @param categoryId + * @param categoryType + * @return + */ + private static String getCacheId(Long categoryId, Integer categoryType) { + return categoryId + CommonConst.UNDERLINE + categoryType; + } + + /** + * 批量查询类目 子级 + * + * @param categoryIdList + * @return + */ + public Map> querySubCategoryFromCache(List categoryIdList) { + return categoryIdList.stream().collect(Collectors.toMap(Function.identity(), e -> { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Category.CATEGORY_SUB, e.toString()); + return cache.get(cacheKey); + })); + } + + /** + * 根据 id 查询未删除的类目 + * + * @param categoryId + * @return 可能 null + */ + public Optional queryCategory(Long categoryId) { + if (null == categoryId) { + return Optional.empty(); + } + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Category.CATEGORY, categoryId.toString()); + CategoryEntity entity = cache.get(cacheKey); + if (null == entity || entity.getDeletedFlag()) { + return Optional.empty(); + } + return Optional.of(entity); + } + + /** + * 根据 类目id 查询未删除的子类 + * + * @param categoryId + * @return 没有返回空集合 + */ + public List queryCategoryByParent(Long categoryId, Integer categoryType) { + if (null == categoryId) { + return CommonConst.EMPTY_LIST; + } + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Category.CATEGORY_SUB, getCacheId(categoryId, categoryType)); + return cache.get(cacheKey); + } + + /** + * 根据 类目id集合 查询未删除的类目集合 + * + * @param categoryIdList + * @return + */ + public Map queryCategoryList(List categoryIdList) { + if (CollectionUtils.isEmpty(categoryIdList)) { + return CommonConst.EMPTY_MAP; + } + categoryIdList = categoryIdList.stream().distinct().collect(Collectors.toList()); + + return categoryIdList.stream().collect(Collectors.toMap(Function.identity(), e -> { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Category.CATEGORY, e.toString()); + return cache.get(cacheKey); + })); + } + + /** + * 根据类目id 移除缓存 + */ + public void removeCache() { + cache.removeByModule(CacheModuleBaseConst.Category.CATEGORY); + cache.removeByModule(CacheModuleBaseConst.Category.CATEGORY_SUB); + // 移除整个类目树缓存 + cache.removeByModule(CacheModuleBaseConst.Category.CATEGORY_TREE); + } + + /** + * 根据类目id 递归查询该id的所有子类id 递归查询 + * 同时存入缓存 + * 注意:查询出来的集合 不包含传递的父类参数 + * + * @param categoryIdList + */ + public List queryCategorySubId(List categoryIdList) { + if (CollectionUtils.isEmpty(categoryIdList)) { + return CommonConst.EMPTY_LIST; + } + // 查询所有子类 + Map> subTypeMap = this.querySubCategoryFromCache(categoryIdList); + if (MapUtils.isEmpty(subTypeMap)) { + return Lists.newArrayList(); + } + // 递归查询子类 + categoryIdList = subTypeMap.values().stream().flatMap(Collection::stream).map(CategoryEntity::getCategoryId).distinct().collect(Collectors.toList()); + if (CollectionUtils.isEmpty(categoryIdList)) { + return Lists.newArrayList(); + } + categoryIdList.addAll(this.queryCategorySubId(categoryIdList)); + return categoryIdList; + } + + /** + * 查询自身以及所有子节点 + * @param categoryIdList + * @return + */ + public List queryCategorySelfAndSubId(List categoryIdList) { + List subIdList = this.queryCategorySubId(categoryIdList); + subIdList.addAll(categoryIdList); + return subIdList; + } + + /** + * 查询类目 层级树 + * 优先查询缓存 + * + * @return + */ + public List queryCategoryTree(CategoryTreeQueryDTO queryDTO) { + // 查询缓存 + Long parentId = queryDTO.getParentId(); + Integer categoryType = queryDTO.getCategoryType(); + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Category.CATEGORY_TREE, getCacheId(parentId, categoryType)); + List treeList = cache.get(cacheKey); + if (null != treeList) { + return treeList; + } + // 查询一级类目 + List categoryEntityList = this.queryCategoryByParent(parentId, categoryType); + treeList = SmartBeanUtil.copyList(categoryEntityList, CategoryTreeVO.class); + treeList.forEach(e -> { + e.setLabel(e.getCategoryName()); + e.setValue(e.getCategoryId()); + e.setCategoryFullName(e.getCategoryName()); + }); + // 递归设置子类 + this.queryAndSetSubCategory(treeList); + // 放入缓存 + cache.put(cacheKey, treeList); + return treeList; + } + + /** + * 递归查询设置类目子类 + * 从缓存查询子类 + * + * @param treeList + */ + private void queryAndSetSubCategory(List treeList) { + if (CollectionUtils.isEmpty(treeList)) { + return; + } + List parentIdList = treeList.stream().map(CategoryTreeVO::getValue).collect(Collectors.toList()); + Map> categorySubMap = this.querySubCategoryFromCache(parentIdList); + treeList.forEach(e -> { + List childrenEntityList = categorySubMap.getOrDefault(e.getValue(), Lists.newArrayList()); + List childrenVOList = SmartBeanUtil.copyList(childrenEntityList, CategoryTreeVO.class); + childrenVOList.forEach(item -> { + item.setLabel(item.getCategoryName()); + item.setValue(item.getCategoryId()); + item.setCategoryFullName(e.getCategoryFullName() + CommonConst.SEPARATOR_SLASH + item.getCategoryName()); + }); + // 递归查询 + this.queryAndSetSubCategory(childrenVOList); + e.setChildren(childrenVOList); + }); + } + + /** + * 根据类目id 查询类目详情 包含类目全称 如:医考/医师资格/临床执业 + * + * @param categoryId + * @return + */ + public CategorySimpleDTO queryCategoryInfo(Long categoryId) { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Category.CATEGORY, categoryId.toString()); + CategoryEntity categoryEntity = cache.get(cacheKey); + if (null == categoryEntity || categoryEntity.getDeletedFlag()) { + return null; + } + + // 递归查询分类和所有父级类目 + List parentCategoryList = this.queryCategoryAndParent(categoryId); + // 拼接父级类目名称 斜杠分隔返回 + List nameList = parentCategoryList.stream().map(CategoryEntity::getCategoryName).collect(Collectors.toList()); + + // 返回DTO + CategorySimpleDTO categoryDTO = new CategorySimpleDTO(); + categoryDTO.setCategoryId(categoryId); + categoryDTO.setCategoryName(categoryEntity.getCategoryName()); + categoryDTO.setCategoryFullName(SmartStringUtil.join(nameList, CommonConst.SEPARATOR_SLASH)); + categoryDTO.setParentId(categoryEntity.getParentId()); + return categoryDTO; + } + + /** + * 递归查询分类和所有父级类目 ps:特别注意返回的集合中 包含自己 + * + * @param categoryId + * @return + */ + public List queryCategoryAndParent(Long categoryId) { + List parentCategoryList = Lists.newArrayList(); + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Category.CATEGORY, categoryId.toString()); + CategoryEntity categoryEntity = cache.get(cacheKey); + if (null == categoryEntity || categoryEntity.getDeletedFlag()) { + return parentCategoryList; + } + + // 父级始终放在第一位 + parentCategoryList.add(0, categoryEntity); + Long parentId = categoryEntity.getParentId(); + if (Objects.equals(CommonConst.DEFAULT_PARENT_ID, parentId)) { + return parentCategoryList; + } + parentCategoryList.addAll(0, this.queryCategoryAndParent(parentId)); + return parentCategoryList; + } + + /** + * 处理类目名称 + * + * @param categoryIdList + */ + public List queryCategoryName(List categoryIdList) { + if (CollectionUtils.isEmpty(categoryIdList)) { + return null; + } + Map categoryMap = this.queryCategoryList(categoryIdList); + List categoryNameList = Lists.newArrayList(); + categoryIdList.forEach(e -> { + CategoryEntity categoryEntity = categoryMap.get(e); + if (categoryEntity != null) { + categoryNameList.add(categoryMap.get(e).getCategoryName()); + } + }); + return categoryNameList; + } + + /** + * 根据类目id 查询类目名称 + * + * @param categoryId + * @return + */ + public String queryCategoryName(Long categoryId) { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Category.CATEGORY, categoryId.toString()); + CategoryEntity categoryEntity = cache.get(cacheKey); + if (null == categoryEntity || categoryEntity.getDeletedFlag()) { + return null; + } + return categoryEntity.getCategoryName(); + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryService.java new file mode 100644 index 00000000..234ee049 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/CategoryService.java @@ -0,0 +1,207 @@ +package net.lab1024.smartadmin.service.module.business.category; + +import com.google.common.collect.Lists; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.business.category.domain.*; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +/** + * 类目 业务 + * + * @author 胡克 + * @date 2021/1/20 16:26 + */ +@Service +public class CategoryService { + + @Autowired + private CategoryDao categoryDao; + + @Autowired + private CategoryQueryService categoryQueryService; + + /** + * 添加类目 + * + * @author 胡克 + * @date 2021/1/20 17:17 + */ + public ResponseDTO add(CategoryAddDTO addDTO) { + // 校验类目 + CategoryEntity categoryEntity = SmartBeanUtil.copy(addDTO, CategoryEntity.class); + ResponseDTO res = this.checkCategory(categoryEntity, false); + if (!res.isSuccess()) { + return res; + } + // 没有父类则使用默认父类 + Long parentId = null == addDTO.getParentId() ? CommonConst.DEFAULT_PARENT_ID : addDTO.getParentId(); + categoryEntity.setParentId(parentId); + categoryEntity.setSort(null == addDTO.getSort() ? CommonConst.ZERO : addDTO.getSort()); + categoryEntity.setDeletedFlag(false); + + // 保存数据 + categoryDao.insert(categoryEntity); + + // 更新缓存 + categoryQueryService.removeCache(); + return ResponseDTO.succ(); + } + + /** + * 更新类目 + * 不能更新父级类目 + * + * @author 胡克 + * @date 2021/1/20 17:17 + */ + public ResponseDTO update(CategoryUpdateDTO updateDTO) { + // 校验类目 + Long categoryId = updateDTO.getCategoryId(); + Optional optional = categoryQueryService.queryCategory(categoryId); + if (!optional.isPresent()) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + CategoryEntity categoryEntity = SmartBeanUtil.copy(updateDTO, CategoryEntity.class); + + /** + * 不更新类目类型 + * 不更新父类id + */ + Integer categoryType = optional.get().getCategoryType(); + categoryEntity.setCategoryType(categoryType); + categoryEntity.setParentId(optional.get().getParentId()); + + ResponseDTO responseDTO = this.checkCategory(categoryEntity, true); + if (!responseDTO.isSuccess()) { + return responseDTO; + } + categoryDao.updateById(categoryEntity); + + // 更新缓存 + categoryQueryService.removeCache(); + return ResponseDTO.succ(); + } + + /** + * 新增/更新 类目时的 校验 + * + * @param categoryEntity + * @param isUpdate + * @return + */ + private ResponseDTO checkCategory(CategoryEntity categoryEntity, boolean isUpdate) { + // 校验父级是否存在 + Long parentId = categoryEntity.getParentId(); + Integer categoryType = categoryEntity.getCategoryType(); + if (null != parentId) { + if (Objects.equals(categoryEntity.getCategoryId(), parentId)) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "父级类目怎么和自己相同了"); + } + if (!Objects.equals(parentId, CommonConst.DEFAULT_PARENT_ID)) { + Optional optional = categoryQueryService.queryCategory(parentId); + if (!optional.isPresent()) { + return ResponseDTO.wrapMsg(ResponseCodeConst.NOT_EXISTS, "父级类目不存在~"); + } + + CategoryEntity parent = optional.get(); + if (!Objects.equals(categoryType, parent.getCategoryType())) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "与父级类目类型不一致"); + } + } + + } else { + // 如果没有父类 使用默认父类 + parentId = CommonConst.DEFAULT_PARENT_ID; + } + + // 校验同父类下 名称是否重复 + CategoryEntity queryEntity = new CategoryEntity(); + queryEntity.setParentId(parentId); + queryEntity.setCategoryType(categoryType); + queryEntity.setCategoryName(categoryEntity.getCategoryName()); + queryEntity.setDeletedFlag(false); + queryEntity = categoryDao.selectOne(queryEntity); + if (null != queryEntity) { + if (isUpdate) { + if (!Objects.equals(queryEntity.getCategoryId(), categoryEntity.getCategoryId())) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "同级下已存在相同类目~"); + } + } else { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "同级下已存在相同类目~"); + } + } + return ResponseDTO.succ(); + } + + /** + * 查询 类目详情 + * + * @param categoryId + * @return + */ + public ResponseDTO queryDetail(Long categoryId) { + Optional optional = categoryQueryService.queryCategory(categoryId); + if (!optional.isPresent()) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + CategoryVO adminVO = SmartBeanUtil.copy(optional.get(), CategoryVO.class); + return ResponseDTO.succData(adminVO); + } + + /** + * 根据父级id 查询所有子类 返回层级树 + * 如果父类id 为空 返回所有类目层级 + * + * @param queryDTO + * @return + */ + public ResponseDTO> queryTree(CategoryTreeQueryDTO queryDTO) { + if (null == queryDTO.getParentId()) { + if (null == queryDTO.getCategoryType()) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "类目类型不能为空"); + } + queryDTO.setParentId(CommonConst.DEFAULT_PARENT_ID); + } + List treeList = categoryQueryService.queryCategoryTree(queryDTO); + return ResponseDTO.succData(treeList); + } + + /** + * 删除类目 + * 如果有未删除的子类 则无法删除 + * + * @param categoryId + * @return + */ + public ResponseDTO delete(Long categoryId) { + Optional optional = categoryQueryService.queryCategory(categoryId); + if (!optional.isPresent()) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + + List categorySubId = categoryQueryService.queryCategorySubId(Lists.newArrayList(categoryId)); + if (CollectionUtils.isNotEmpty(categorySubId)) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "请先删除子级类目"); + } + + // 更新数据 + CategoryEntity categoryEntity = new CategoryEntity(); + categoryEntity.setCategoryId(categoryId); + categoryEntity.setDeletedFlag(true); + categoryDao.updateById(categoryEntity); + + // 更新缓存 + categoryQueryService.removeCache(); + return ResponseDTO.succ(); + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/constant/CategoryTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/constant/CategoryTypeEnum.java new file mode 100644 index 00000000..b0225030 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/constant/CategoryTypeEnum.java @@ -0,0 +1,54 @@ +package net.lab1024.smartadmin.service.module.business.category.constant; + + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +/** + * 分类类型 枚举 + * + * @author listen + * @date 2021/08/05 15:26 + */ +public enum CategoryTypeEnum implements BaseEnum { + + /** + * 1 商品 + */ + GOODS(1, "商品"), + + /** + * 2 测试分类 + */ + DEMO(2, "测试分类"), + + ; + + private final Integer type; + + private final String desc; + + CategoryTypeEnum(Integer type, String desc) { + this.type = type; + this.desc = desc; + } + + /** + * 获取枚举类的值 + * + * @return Integer + */ + @Override + public Integer getValue() { + return type; + } + + /** + * 获取枚举类的说明 + * + * @return String + */ + @Override + public String getDesc() { + return desc; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryAddDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryAddDTO.java new file mode 100644 index 00000000..54b2569c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryAddDTO.java @@ -0,0 +1,14 @@ +package net.lab1024.smartadmin.service.module.business.category.domain; + +import lombok.Data; + +/** + * 类目 添加 DTO 类 + * + * @author 胡克 + * @date 2021/1/20 16:24 + */ +@Data +public class CategoryAddDTO extends CategoryBaseDTO { + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryBaseDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryBaseDTO.java new file mode 100644 index 00000000..45094438 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryBaseDTO.java @@ -0,0 +1,44 @@ +package net.lab1024.smartadmin.service.module.business.category.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; +import net.lab1024.smartadmin.service.common.validator.CheckEnum; +import net.lab1024.smartadmin.service.module.business.category.constant.CategoryTypeEnum; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 类目 基础属性 DTO 类 + * + * @author 胡克 + * @date 2021/1/20 16:17 + */ +@Data +public class CategoryBaseDTO { + + @ApiModelProperty(value = "类目名称", required = true) + @NotBlank(message = "类目名称不能为空") + @Length(max = 20, message = "类目名称最多20字符") + private String categoryName; + + @ApiModelPropertyEnum(desc = "分类类型", value = CategoryTypeEnum.class) + @CheckEnum(enumClazz = CategoryTypeEnum.class, required = true, message = "分类类型错误") + private Integer categoryType; + + @ApiModelProperty("父级类目id|可选") + private Long parentId; + + @ApiModelProperty("排序|可选") + private Integer sort; + + @ApiModelProperty("备注|可选") + @Length(max = 200, message = "备注最多200字符") + private String remark; + + @ApiModelProperty("禁用状态") + @NotNull(message = "禁用状态不能为空") + private Boolean disabledFlag; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryEntity.java new file mode 100644 index 00000000..29f10aa2 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryEntity.java @@ -0,0 +1,63 @@ +package net.lab1024.smartadmin.service.module.business.category.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 类目 实体类 + * + * @author 胡克 + * @date 2021/8/6 9:45 + */ +@Data +@TableName("t_category") +public class CategoryEntity { + + @TableId(type = IdType.AUTO) + private Long categoryId; + + /** + * 类目名称 + */ + private String categoryName; + + /** + * 类目 类型 + * + * @see CategoryTypeEnum + */ + private Integer categoryType; + + /** + * 父级类目id + */ + private Long parentId; + + /** + * 是否禁用 + */ + private Boolean disabledFlag; + + /** + * 排序 + */ + private Integer sort; + + /** + * 删除状态 + */ + private Boolean deletedFlag; + + /** + * 备注 + */ + private String remark; + + private LocalDateTime updateTime; + + private LocalDateTime createTime; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategorySimpleDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategorySimpleDTO.java new file mode 100644 index 00000000..997efece --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategorySimpleDTO.java @@ -0,0 +1,26 @@ +package net.lab1024.smartadmin.service.module.business.category.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 类目 基础属性 DTO 类 + * + * @author 胡克 + * @date 2021/1/20 16:17 + */ +@Data +public class CategorySimpleDTO { + + @ApiModelProperty("类目id") + private Long categoryId; + + @ApiModelProperty("类目名称") + private String categoryName; + + @ApiModelProperty("类目层级全称") + private String categoryFullName; + + @ApiModelProperty("父级id") + private Long parentId; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryTreeQueryDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryTreeQueryDTO.java new file mode 100644 index 00000000..096079ce --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryTreeQueryDTO.java @@ -0,0 +1,24 @@ +package net.lab1024.smartadmin.service.module.business.category.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; +import net.lab1024.smartadmin.service.common.validator.CheckEnum; +import net.lab1024.smartadmin.service.module.business.category.constant.CategoryTypeEnum; + +/** + * 类目 层级树查询 DTO 类 + * + * @author 胡克 + * @date 2021/1/20 16:17 + */ +@Data +public class CategoryTreeQueryDTO { + + @ApiModelPropertyEnum(desc = "分类类型|可选", value = CategoryTypeEnum.class) + @CheckEnum(enumClazz = CategoryTypeEnum.class, message = "分类类型错误") + private Integer categoryType; + + @ApiModelProperty("父级类目id|可选") + private Long parentId; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryTreeVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryTreeVO.java new file mode 100644 index 00000000..88171db6 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryTreeVO.java @@ -0,0 +1,25 @@ +package net.lab1024.smartadmin.service.module.business.category.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 类目 层级树 vo + * + * @author listen + * @date 2021/01/21 17:03 + */ +@Data +public class CategoryTreeVO extends CategorySimpleDTO { + + @ApiModelProperty("类目id") + private Long value; + + @ApiModelProperty("类目名称") + private String label; + + @ApiModelProperty("子类") + private List children; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryUpdateDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryUpdateDTO.java new file mode 100644 index 00000000..fc4cb54c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryUpdateDTO.java @@ -0,0 +1,20 @@ +package net.lab1024.smartadmin.service.module.business.category.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 类目 更新 DTO 类 + * + * @author 胡克 + * @date 2021/1/20 16:24 + */ +@Data +public class CategoryUpdateDTO extends CategoryBaseDTO { + + @ApiModelProperty("类目id") + @NotNull(message = "类目id不能为空") + private Long categoryId; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryVO.java new file mode 100644 index 00000000..56c13a5e --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/domain/CategoryVO.java @@ -0,0 +1,23 @@ +package net.lab1024.smartadmin.service.module.business.category.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 类目 VO 类 + * + * @author 胡克 + * @date 2021/1/20 16:24 + */ +@Data +public class CategoryVO extends CategoryBaseDTO { + + @ApiModelProperty("类目id") + private Long categoryId; + + private LocalDateTime updateTime; + + private LocalDateTime createTime; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/package-info.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/package-info.java new file mode 100644 index 00000000..3d3252b2 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/category/package-info.java @@ -0,0 +1,5 @@ +/** + * 类目 业务 + * 包含 商品 等类型 + */ +package net.lab1024.smartadmin.service.module.business.category; \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsController.java new file mode 100644 index 00000000..b87fda56 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsController.java @@ -0,0 +1,64 @@ +package net.lab1024.smartadmin.service.module.business.goods; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.business.goods.domain.*; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginInfoDTO; +import net.lab1024.smartadmin.service.util.SmartEmployeeTokenUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +/** + * 商品业务 路由 + * + * @author 胡克 + * @date 2021/08/21 19:10 + */ +@Api(tags = SwaggerTagConst.Admin.MANAGER_GOODS) +@RestController +public class GoodsController extends AdminBaseController { + + @Autowired + private GoodsService goodsService; + + @ApiOperation("添加商品 by listen") + @PostMapping("/goods/add") + public ResponseDTO add(@RequestBody @Valid GoodsAddDTO addDTO) { + EmployeeLoginInfoDTO employee = SmartEmployeeTokenUtil.getRequestEmployee(); + addDTO.setUpdateId(employee.getEmployeeId()); + addDTO.setUpdateName(employee.getActualName()); + return goodsService.add(addDTO); + } + + @ApiOperation("更新商品 by listen") + @PostMapping("/goods/update") + public ResponseDTO update(@RequestBody @Valid GoodsUpdateDTO updateDTO) { + EmployeeLoginInfoDTO employee = SmartEmployeeTokenUtil.getRequestEmployee(); + updateDTO.setUpdateId(employee.getEmployeeId()); + updateDTO.setUpdateName(employee.getActualName()); + return goodsService.update(updateDTO); + } + + @ApiOperation("删除 by listen") + @PostMapping("/goods/del") + public ResponseDTO del(@RequestBody @Valid GoodsDelDTO delDTO) { + EmployeeLoginInfoDTO employee = SmartEmployeeTokenUtil.getRequestEmployee(); + delDTO.setUpdateId(employee.getEmployeeId()); + delDTO.setUpdateName(employee.getActualName()); + return goodsService.del(delDTO); + } + + @ApiOperation("分页查询 by listen") + @PostMapping("/goods/query") + public ResponseDTO> query(@RequestBody @Valid GoodsQueryDTO queryDTO) { + return goodsService.query(queryDTO); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsDao.java new file mode 100644 index 00000000..3207255d --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsDao.java @@ -0,0 +1,39 @@ +package net.lab1024.smartadmin.service.module.business.goods; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.lab1024.smartadmin.service.module.business.goods.domain.GoodsAdminVO; +import net.lab1024.smartadmin.service.module.business.goods.domain.GoodsBO; +import net.lab1024.smartadmin.service.module.business.goods.domain.GoodsEntity; +import net.lab1024.smartadmin.service.module.business.goods.domain.GoodsQueryDTO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 商品 dao + * + * @author 胡克 + * @date 2021/8/6 15:26 + */ +@Component +public interface GoodsDao extends BaseMapper { + + /** + * 查询1个商品 具体条件看sql + * + * @param goodsBO + * @return + */ + GoodsEntity selectOne(GoodsBO goodsBO); + + /** + * 分页 查询商品 + * + * @param page + * @param queryDTO + * @return + */ + List query(Page page, @Param("query") GoodsQueryDTO queryDTO); +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsManager.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsManager.java new file mode 100644 index 00000000..da3844ef --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsManager.java @@ -0,0 +1,16 @@ +package net.lab1024.smartadmin.service.module.business.goods; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.lab1024.smartadmin.service.module.business.goods.domain.GoodsEntity; +import org.springframework.stereotype.Service; + +/** + * 商品 manager + * + * @author 胡克 + * @date 2021/8/6 15:26 + */ +@Service +public class GoodsManager extends ServiceImpl { + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsService.java new file mode 100644 index 00000000..98d15a21 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/GoodsService.java @@ -0,0 +1,146 @@ +package net.lab1024.smartadmin.service.module.business.goods; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.business.category.CategoryQueryService; +import net.lab1024.smartadmin.service.module.business.category.constant.CategoryTypeEnum; +import net.lab1024.smartadmin.service.module.business.category.domain.CategoryEntity; +import net.lab1024.smartadmin.service.module.business.goods.domain.*; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import net.lab1024.smartadmin.service.util.SmartPageUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * 商品 业务 + * + * @author 胡克 + * @date 2021/8/6 15:27 + */ +@Service +public class GoodsService { + + @Autowired + private GoodsDao goodsDao; + + @Autowired + private GoodsManager goodsManager; + + @Autowired + private CategoryQueryService categoryQueryService; + + /** + * 添加商品 + * + * @param addDTO + * @return + */ + public ResponseDTO add(GoodsAddDTO addDTO) { + // 商品校验 + ResponseDTO res = this.checkGoods(addDTO, null); + if (!res.isSuccess()) { + return res; + } + + GoodsEntity goodsEntity = SmartBeanUtil.copy(addDTO, GoodsEntity.class); + goodsDao.insert(goodsEntity); + return ResponseDTO.succ(); + } + + /** + * 更新商品 + * + * @param updateDTO + * @return + */ + public ResponseDTO update(GoodsUpdateDTO updateDTO) { + // 商品校验 + ResponseDTO res = this.checkGoods(updateDTO, updateDTO.getGoodsId()); + if (!res.isSuccess()) { + return res; + } + + GoodsEntity goodsEntity = SmartBeanUtil.copy(updateDTO, GoodsEntity.class); + goodsDao.updateById(goodsEntity); + return ResponseDTO.succ(); + } + + /** + * 添加/更新 商品校验 + * + * @param addDTO + * @param goodsId 不为空 代表更新商品 + * @return + */ + private ResponseDTO checkGoods(GoodsAddDTO addDTO, Long goodsId) { + // 校验商品名称重复 + Long categoryId = addDTO.getCategoryId(); + + GoodsBO goodsBO = new GoodsBO(); + goodsBO.setGoodsName(addDTO.getGoodsName()); + goodsBO.setGoodsType(addDTO.getGoodsType()); + goodsBO.setCategoryId(categoryId); + goodsBO.setDeletedFlag(false); + GoodsEntity goodsEntity = goodsDao.selectOne(goodsBO); + if (null != goodsEntity) { + if (null == goodsId || !Objects.equals(goodsEntity.getGoodsId(), goodsId)) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ALREADY_EXIST, "商品名称不能重复~"); + } + } + + // 校验类目id + Optional optional = categoryQueryService.queryCategory(categoryId); + if (!optional.isPresent() || !CategoryTypeEnum.GOODS.equalsValue(optional.get().getCategoryType())) { + return ResponseDTO.wrapMsg(ResponseCodeConst.NOT_EXISTS, "商品类目不存在~"); + } + + return ResponseDTO.succ(); + } + + /** + * 批量删除 + * + * @param delDTO + * @return + */ + public ResponseDTO del(GoodsDelDTO delDTO) { + // 批量更新删除状态 + List goodsList = delDTO.getGoodsIdList().stream().map(id -> { + GoodsEntity goodsEntity = new GoodsEntity(); + goodsEntity.setGoodsId(id); + goodsEntity.setDeletedFlag(true); + return goodsEntity; + }).collect(Collectors.toList()); + goodsManager.updateBatchById(goodsList); + return ResponseDTO.succ(); + } + + /** + * 分页查询 + * + * @param queryDTO + * @return + */ + public ResponseDTO> query(GoodsQueryDTO queryDTO) { + queryDTO.setDeletedFlag(false); + Page page = SmartPageUtil.convert2PageQuery(queryDTO); + List list = goodsDao.query(page, queryDTO); + PageResultDTO pageResult = SmartPageUtil.convert2PageResult(page, list); + if (pageResult.getEmptyFlag()) { + return ResponseDTO.succData(pageResult); + } + // 查询分类名称 + List categoryIdList = list.stream().map(GoodsAdminVO::getCategoryId).distinct().collect(Collectors.toList()); + Map categoryMap = categoryQueryService.queryCategoryList(categoryIdList); + list.forEach(e -> e.setCategoryName(categoryMap.get(e.getCategoryId()).getCategoryName())); + return ResponseDTO.succData(pageResult); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/constant/GoodsTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/constant/GoodsTypeEnum.java new file mode 100644 index 00000000..a4191753 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/constant/GoodsTypeEnum.java @@ -0,0 +1,54 @@ +package net.lab1024.smartadmin.service.module.business.goods.constant; + + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +/** + * 商品类型 枚举 + * + * @author listen + * @date 2021/08/05 15:26 + */ +public enum GoodsTypeEnum implements BaseEnum { + + /** + * 1 图书 + */ + BOOK(1, "图书"), + + /** + * 2 课程 + */ + COURSE(2, "课程"), + + ; + + private final Integer type; + + private final String desc; + + GoodsTypeEnum(Integer type, String desc) { + this.type = type; + this.desc = desc; + } + + /** + * 获取枚举类的值 + * + * @return Integer + */ + @Override + public Integer getValue() { + return type; + } + + /** + * 获取枚举类的说明 + * + * @return String + */ + @Override + public String getDesc() { + return desc; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsAddDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsAddDTO.java new file mode 100644 index 00000000..db94372e --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsAddDTO.java @@ -0,0 +1,20 @@ +package net.lab1024.smartadmin.service.module.business.goods.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 商品 添加 DTO + * + * @author 胡克 + * @date 2021/8/5 14:42 + */ +@Data +public class GoodsAddDTO extends GoodsBaseDTO { + + @ApiModelProperty(hidden = true) + private Long updateId; + + @ApiModelProperty(hidden = true) + private String updateName; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsAdminVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsAdminVO.java new file mode 100644 index 00000000..f7ff5271 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsAdminVO.java @@ -0,0 +1,26 @@ +package net.lab1024.smartadmin.service.module.business.goods.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 商品 添加 DTO + * + * @author 胡克 + * @date 2021/8/5 14:42 + */ +@Data +public class GoodsAdminVO extends GoodsBaseDTO { + + @ApiModelProperty("商品id") + private Long goodsId; + + @ApiModelProperty("商品分类") + private String categoryName; + + private LocalDateTime updateTime; + + private LocalDateTime createTime; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsBO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsBO.java new file mode 100644 index 00000000..625ddf81 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsBO.java @@ -0,0 +1,36 @@ +package net.lab1024.smartadmin.service.module.business.goods.domain; + +import lombok.Data; +import net.lab1024.smartadmin.service.module.business.goods.constant.GoodsTypeEnum; + +/** + * 商品 + * + * @author 胡克 + * @date 2021/8/5 14:42 + */ +@Data +public class GoodsBO { + + /** + * 商品类型 + * + * @see GoodsTypeEnum + */ + private Integer goodsType; + + /** + * 商品分类 + */ + private Long categoryId; + + /** + * 商品名称 + */ + private String goodsName; + + /** + * 删除状态 + */ + private Boolean deletedFlag; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsBaseDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsBaseDTO.java new file mode 100644 index 00000000..a6d1b657 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsBaseDTO.java @@ -0,0 +1,60 @@ +package net.lab1024.smartadmin.service.module.business.goods.domain; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.json.FileKeySerializer; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; +import net.lab1024.smartadmin.service.common.validator.CheckEnum; +import net.lab1024.smartadmin.service.module.business.goods.constant.GoodsTypeEnum; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 商品 基础属性 DTO + * + * @author 胡克 + * @date 2021/8/5 14:42 + */ +@Data +public class GoodsBaseDTO { + + @ApiModelPropertyEnum(desc = "商品类型", value = GoodsTypeEnum.class) + @CheckEnum(enumClazz = GoodsTypeEnum.class, message = "商品类型错误") + private Integer goodsType; + + @ApiModelProperty("商品分类") + @NotNull(message = "商品分类不能为空") + private Long categoryId; + + @ApiModelProperty("商品名称") + @NotBlank(message = "商品名称不能为空") + @Length(max = 200, message = "商品名称最多50字符") + private String goodsName; + + @ApiModelProperty("商品简介") + @Length(max = 200, message = "商品简介最多200字符") + private String goodsIntro; + + @ApiModelProperty("商品价格") + @NotNull(message = "商品价格不能为空") + @DecimalMin(value = "0", message = "商品价格最低0") + private BigDecimal price; + + @ApiModelProperty("商品封面") + @Length(max = 250, message = "商品封面最多250字符") + @JsonSerialize(using = FileKeySerializer.class) + private String coverPic; + + @ApiModelProperty("上架状态") + @NotNull(message = "上架状态不能为空") + private Boolean shelvesFlag; + + @ApiModelProperty("备注|可选") + @Length(max = 200, message = "备注最多200字符") + private String remark; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsDelDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsDelDTO.java new file mode 100644 index 00000000..c1d86cad --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsDelDTO.java @@ -0,0 +1,29 @@ +package net.lab1024.smartadmin.service.module.business.goods.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * 商品 删除 DTO + * + * @author 胡克 + * @date 2021/8/5 14:42 + */ +@Data +public class GoodsDelDTO { + + @ApiModelProperty("商品id集合") + @NotEmpty(message = "商品id不能为空") + @Size(max = 99, message = "一次最多删除99") + private List goodsIdList; + + @ApiModelProperty(hidden = true) + private Long updateId; + + @ApiModelProperty(hidden = true) + private String updateName; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsEntity.java new file mode 100644 index 00000000..319d077c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsEntity.java @@ -0,0 +1,77 @@ +package net.lab1024.smartadmin.service.module.business.goods.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import net.lab1024.smartadmin.service.module.business.goods.constant.GoodsTypeEnum; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 商品 实体类 + * + * @author 胡克 + * @date 2021/8/5 14:42 + */ +@Data +@TableName("t_goods") +public class GoodsEntity { + + @TableId(type = IdType.AUTO) + private Long goodsId; + + /** + * 商品类型 + * + * @see GoodsTypeEnum + */ + private Integer goodsType; + + /** + * 第三方商品id + */ + private Long thirdGoodsId; + + /** + * 商品分类 + */ + private Long categoryId; + + /** + * 商品名称 + */ + private String goodsName; + + /** + * 商品简介 + */ + private String goodsIntro; + + /** + * 商品价格 + */ + private BigDecimal price; + + /** + * 商品封面 + */ + private String coverPic; + + /** + * 上架状态 + */ + private Boolean shelvesFlag; + + /** + * 删除状态 + */ + private Boolean deletedFlag; + + private String remark; + + private LocalDateTime updateTime; + + private LocalDateTime createTime; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsQueryDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsQueryDTO.java new file mode 100644 index 00000000..6f035229 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsQueryDTO.java @@ -0,0 +1,36 @@ +package net.lab1024.smartadmin.service.module.business.goods.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; +import net.lab1024.smartadmin.service.common.validator.CheckEnum; +import net.lab1024.smartadmin.service.module.business.goods.constant.GoodsTypeEnum; +import org.hibernate.validator.constraints.Length; + +/** + * 商品 添加 DTO + * + * @author 胡克 + * @date 2021/8/5 14:42 + */ +@Data +public class GoodsQueryDTO extends PageBaseDTO { + + @ApiModelPropertyEnum(desc = "商品类型|可选", value = GoodsTypeEnum.class) + @CheckEnum(enumClazz = GoodsTypeEnum.class, message = "商品类型错误") + private Integer goodsType; + + @ApiModelProperty("商品分类") + private Integer categoryId; + + @ApiModelProperty("搜索词") + @Length(max = 30, message = "搜索词最多30字符") + private String searchWord; + + @ApiModelProperty("上架状态") + private Boolean shelvesFlag; + + @ApiModelProperty(hidden = true) + private Boolean deletedFlag; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsUpdateDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsUpdateDTO.java new file mode 100644 index 00000000..e768fdee --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/goods/domain/GoodsUpdateDTO.java @@ -0,0 +1,20 @@ +package net.lab1024.smartadmin.service.module.business.goods.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 商品 更新 DTO + * + * @author 胡克 + * @date 2021/8/5 14:42 + */ +@Data +public class GoodsUpdateDTO extends GoodsAddDTO { + + @ApiModelProperty("商品id") + @NotNull(message = "商品id不能为空") + private Long goodsId; +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/NoticeController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/NoticeController.java similarity index 50% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/NoticeController.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/NoticeController.java index 5d42d5d9..e62fbb6a 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/NoticeController.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/NoticeController.java @@ -1,96 +1,87 @@ -package net.lab1024.smartadmin.module.business.notice; +package net.lab1024.smartadmin.service.module.business.notice; -import net.lab1024.smartadmin.common.anno.NoValidPrivilege; -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.business.notice.domain.dto.*; -import net.lab1024.smartadmin.util.SmartRequestTokenUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.business.notice.domain.dto.*; +import net.lab1024.smartadmin.service.module.business.notice.domain.vo.NoticeDetailVO; +import net.lab1024.smartadmin.service.module.business.notice.domain.vo.NoticeVO; +import net.lab1024.smartadmin.service.util.SmartEmployeeTokenUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; /** - * [ ] + * [ 通知公告 ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-07-11 16:19:48 - * @since JDK1.8 + * @author 罗伊 + * @date */ @RestController @Api(tags = {SwaggerTagConst.Admin.MANAGER_NOTICE}) -public class NoticeController { +public class NoticeController extends AdminBaseController { @Autowired private NoticeService noticeService; - @ApiOperation(value = "分页查询全部消息", notes = "@author yandanyang") + @ApiOperation(value = "分页查询全部消息", notes = "@author 罗伊") @PostMapping("/notice/page/query") - @NoValidPrivilege public ResponseDTO> queryByPage(@RequestBody NoticeQueryDTO queryDTO) { return noticeService.queryByPage(queryDTO); } - @ApiOperation(value = "获取已收取的所有消息", notes = "@author yandanyang") + @ApiOperation(value = "获取已收取的所有消息", notes = "@author 罗伊") @PostMapping("/notice/receive/page/query") - @NoValidPrivilege public ResponseDTO> queryReceiveByPage(@RequestBody NoticeReceiveQueryDTO queryDTO) { - return noticeService.queryReceiveByPage(queryDTO, SmartRequestTokenUtil.getRequestUser()); + queryDTO.setEmployeeId(SmartEmployeeTokenUtil.getRequestEmployeeId()); + return noticeService.queryReceiveByPage(queryDTO); } - @ApiOperation(value = "分页查询未读消息", notes = "@author yandanyang") + @ApiOperation(value = "分页查询未读消息", notes = "@author 罗伊") @PostMapping("/notice/unread/page/query") - @NoValidPrivilege - public ResponseDTO> queryUnreadByPage(@RequestBody PageParamDTO queryDTO) { - return noticeService.queryUnreadByPage(queryDTO, SmartRequestTokenUtil.getRequestUser()); + public ResponseDTO> queryUnreadByPage(@RequestBody PageBaseDTO queryDTO) { + return noticeService.queryUnreadByPage(queryDTO, SmartEmployeeTokenUtil.getRequestEmployeeId()); } - @ApiOperation(value = "添加", notes = "@author yandanyang") + @ApiOperation(value = "添加", notes = "@author 罗伊") @PostMapping("/notice/add") - @NoValidPrivilege - public ResponseDTO add(@RequestBody @Valid NoticeAddDTO addTO) { - return noticeService.add(addTO, SmartRequestTokenUtil.getRequestUser()); + public ResponseDTO add(@RequestBody @Valid NoticeAddDTO addDTO) { + addDTO.setCreateId(SmartEmployeeTokenUtil.getRequestEmployeeId()); + return noticeService.add(addDTO); } - @ApiOperation(value = "修改", notes = "@author yandanyang") + @ApiOperation(value = "修改", notes = "@author 罗伊") @PostMapping("/notice/update") - @NoValidPrivilege public ResponseDTO update(@RequestBody @Valid NoticeUpdateDTO updateDTO) { return noticeService.update(updateDTO); } - @ApiOperation(value = "删除", notes = "@author yandanyang") + @ApiOperation(value = "删除", notes = "@author 罗伊") @GetMapping("/notice/delete/{id}") - @NoValidPrivilege public ResponseDTO delete(@PathVariable("id") Long id) { return noticeService.delete(id); } - @ApiOperation(value = "详情", notes = "@author yandanyang") + @ApiOperation(value = "详情", notes = "@author 罗伊") @GetMapping("/notice/detail/{id}") - @NoValidPrivilege public ResponseDTO detail(@PathVariable("id") Long id) { return noticeService.detail(id); } - @ApiOperation(value = "发送", notes = "@author yandanyang") + @ApiOperation(value = "发送", notes = "@author 罗伊") @GetMapping("/notice/send/{id}") - @NoValidPrivilege public ResponseDTO send(@PathVariable("id") Long id) { - return noticeService.send(id, SmartRequestTokenUtil.getRequestUser()); + return noticeService.send(id, SmartEmployeeTokenUtil.getRequestEmployeeId()); } - @ApiOperation(value = "读取消息", notes = "@author yandanyang") + @ApiOperation(value = "读取消息", notes = "@author 罗伊") @GetMapping("/notice/read/{id}") - @NoValidPrivilege public ResponseDTO read(@PathVariable("id") Long id) { - return noticeService.read(id, SmartRequestTokenUtil.getRequestUser()); + return noticeService.read(id, SmartEmployeeTokenUtil.getRequestEmployeeId()); } } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/NoticeManage.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/NoticeManage.java new file mode 100644 index 00000000..b47991bd --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/NoticeManage.java @@ -0,0 +1,86 @@ +package net.lab1024.smartadmin.service.module.business.notice; + +import net.lab1024.smartadmin.service.module.business.notice.dao.NoticeDao; +import net.lab1024.smartadmin.service.module.business.notice.dao.NoticeReceiveRecordDao; +import net.lab1024.smartadmin.service.module.business.notice.domain.dto.NoticeUpdateDTO; +import net.lab1024.smartadmin.service.module.business.notice.domain.entity.NoticeEntity; +import net.lab1024.smartadmin.service.module.business.notice.domain.entity.NoticeReceiveRecordEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + * [ ] + * + * @author 罗伊 + */ +@Service +public class NoticeManage { + + @Autowired + private NoticeDao noticeDao; + + @Autowired + private NoticeReceiveRecordDao noticeReceiveRecordDao; + + /** + * 发送消息 + * + * @param entity + * @param employeeId + */ + @Transactional(rollbackFor = Exception.class) + public void send(NoticeEntity entity, Long employeeId) { + entity.setSendStatus(true); + noticeDao.updateById(entity); + //默认发件人 已读此消息 + NoticeReceiveRecordEntity recordEntity = new NoticeReceiveRecordEntity(); + recordEntity.setEmployeeId(employeeId); + recordEntity.setNoticeId(entity.getId()); + noticeReceiveRecordDao.insert(recordEntity); + } + + + /** + * 保存读取记录 + * + * @param noticeId + * @param employeeId + */ + public void saveReadRecord(Long noticeId, Long employeeId) { + NoticeReceiveRecordEntity recordEntity = new NoticeReceiveRecordEntity(); + recordEntity.setEmployeeId(employeeId); + recordEntity.setNoticeId(noticeId); + noticeReceiveRecordDao.insert(recordEntity); + } + + + /** + * 消息删除 + * + * @param entity + */ + @Transactional(rollbackFor = Exception.class) + public void delete(NoticeEntity entity) { + if (entity.getSendStatus()) { + //消息已发送 执行逻辑删除 + noticeDao.logicDeleteById(entity.getId(), true); + } else { + //消息未发送 执行真实删除 + noticeDao.deleteById(entity.getId()); + } + } + + /** + * 更新消息 + * + * @param updateDTO + */ + public void update(NoticeUpdateDTO updateDTO) { + NoticeEntity updateEntity = new NoticeEntity(); + updateEntity.setId(updateDTO.getId()); + updateEntity.setTitle(updateDTO.getTitle()); + updateEntity.setContent(updateDTO.getContent()); + noticeDao.updateById(updateEntity); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/NoticeService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/NoticeService.java new file mode 100644 index 00000000..68a0660a --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/NoticeService.java @@ -0,0 +1,215 @@ +package net.lab1024.smartadmin.service.module.business.notice; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.business.notice.dao.NoticeDao; +import net.lab1024.smartadmin.service.module.business.notice.dao.NoticeReceiveRecordDao; +import net.lab1024.smartadmin.service.module.business.notice.domain.dto.*; +import net.lab1024.smartadmin.service.module.business.notice.domain.entity.NoticeEntity; +import net.lab1024.smartadmin.service.module.business.notice.domain.entity.NoticeReceiveRecordEntity; +import net.lab1024.smartadmin.service.module.business.notice.domain.vo.NoticeDetailVO; +import net.lab1024.smartadmin.service.module.business.notice.domain.vo.NoticeVO; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import net.lab1024.smartadmin.service.util.SmartPageUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * [ ] + * + * @author 罗伊 + */ +@Service +public class NoticeService { + + @Autowired + private NoticeDao noticeDao; + + @Autowired + private NoticeReceiveRecordDao noticeReceiveRecordDao; + + @Autowired + private NoticeManage noticeManage; + + /** + * @author 罗伊 + * @description 分页查询 + * @date 2019-07-11 16:19:48 + */ + public ResponseDTO> queryByPage(NoticeQueryDTO queryDTO) { + queryDTO.setDeletedFlag(false); + Page page = SmartPageUtil.convert2PageQuery(queryDTO); + List dtoList = noticeDao.queryByPage(page, queryDTO); + PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page, dtoList); + return ResponseDTO.succData(pageResultDTO); + } + + /** + * 获取当前登录人的消息列表 + * + * @param queryDTO + * @return + */ + public ResponseDTO> queryReceiveByPage(NoticeReceiveQueryDTO queryDTO) { + queryDTO.setSendStatus(true); + Page page = SmartPageUtil.convert2PageQuery(queryDTO); + List dtoList = noticeDao.queryReceiveByPage(page, queryDTO); + //根据用户的接收时间设置读取状态,以便前端对其设置 + dtoList.forEach(e -> { + e.setReadStatus(e.getReceiveTime() != null); + }); + PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page, dtoList); + return ResponseDTO.succData(pageResultDTO); + } + + /** + * 获取我的未读消息 + * + * @param queryDTO + * @return + */ + public ResponseDTO> queryUnreadByPage(PageBaseDTO queryDTO, Long employeeId) { + Page page = SmartPageUtil.convert2PageQuery(queryDTO); + List dtoList = noticeDao.queryUnreadByPage(page, employeeId, true); + PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page, dtoList); + return ResponseDTO.succData(pageResultDTO); + } + + /** + * @author 罗伊 + * @description 添加 + * @date 2019-07-11 16:19:48 + */ + public ResponseDTO add(NoticeAddDTO addDTO) { + NoticeEntity entity = SmartBeanUtil.copy(addDTO, NoticeEntity.class); + entity.setCreateUser(addDTO.getCreateId()); + entity.setSendStatus(false); + entity.setDeletedFlag(true); + noticeDao.insert(entity); + return ResponseDTO.succ(); + } + + /** + * @author 罗伊 + * @description 编辑 + * @date 2019-07-11 16:19:48 + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO update(NoticeUpdateDTO updateDTO) { + NoticeEntity entity = noticeDao.selectById(updateDTO.getId()); + if (entity == null) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "此系统通知不存在"); + } + if (entity.getDeletedFlag()) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "此系统通知已删除"); + } + if (entity.getSendStatus()) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "此系统通知已发送无法修改"); + } + noticeManage.update(updateDTO); + return ResponseDTO.succ(); + } + + /** + * @author 罗伊 + * @description 删除 + * @date 2019-07-11 16:19:48 + */ + public ResponseDTO delete(Long id) { + NoticeEntity entity = noticeDao.selectById(id); + if (entity == null) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "此系统通知不存在"); + } + noticeManage.delete(entity); + return ResponseDTO.succ(); + } + + /** + * @author 罗伊 + * @description 根据ID查询 + * @date 2019-07-11 16:19:48 + */ + public ResponseDTO detail(Long id) { + NoticeDetailVO noticeDTO = noticeDao.detail(id); + return ResponseDTO.succData(noticeDTO); + } + + /** + * 获取某人的未读消息数 + * + * @param employeeId + * @return + */ + private Integer getUnreadCount(Long employeeId) { + return noticeDao.noticeUnreadCount(employeeId, true); + } + + /** + * 发送给所有在线用户未读消息数 + * + * @param id + * @param employeeId + * @return + */ + public ResponseDTO send(Long id, Long employeeId) { + NoticeEntity entity = noticeDao.selectById(id); + if (entity == null) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "此系统通知不存在"); + } + noticeManage.send(entity, employeeId); + this.sendMessage(employeeId); + return ResponseDTO.succ(); + } + + /** + * 发送系统通知 ,发送人不进行接收,需再事务外调用 以防止数据隔离级别不同造成未读消息数异常 + * + * @param sendEmployeeId + */ + private void sendMessage(Long sendEmployeeId) { +/* List onLineEmployeeIds = WebSocketServer.getOnLineUserList(); + if (CollectionUtils.isEmpty(onLineEmployeeIds)) { + return; + } + //在线用户已读消息数 + Map readCountMap = new HashMap<>(); + List readCountList = noticeDao.readCount(onLineEmployeeIds); + if (CollectionUtils.isNotEmpty(readCountList)) { + readCountMap = readCountList.stream().collect(Collectors.toMap(NoticeReadCountDTO::getEmployeeId, NoticeReadCountDTO::getReadCount)); + } + //已发送消息数 + Integer noticeCount = noticeDao.noticeCount(true); + for (Long employeeId : onLineEmployeeIds) { + if (Objects.equals(employeeId, sendEmployeeId)) { + continue; + } + int readCount = readCountMap.get(employeeId) == null ? 0 : readCountMap.get(employeeId); + WebSocketServer.sendOneOnLineUser(String.valueOf(noticeCount - readCount), employeeId); + }*/ + } + + /** + * 读取消息 + * + * @param id + * @param employeeId + * @return + */ + public ResponseDTO read(Long id, Long employeeId) { + NoticeDetailVO noticeDTO = noticeDao.detail(id); + + NoticeReceiveRecordEntity recordEntity = noticeReceiveRecordDao.selectByEmployeeAndNotice(employeeId, id); + if (recordEntity != null) { + return ResponseDTO.succData(noticeDTO); + } + noticeManage.saveReadRecord(id, employeeId); + this.sendMessage(employeeId); + return ResponseDTO.succData(noticeDTO); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/dao/NoticeDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/dao/NoticeDao.java new file mode 100644 index 00000000..b7f2edba --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/dao/NoticeDao.java @@ -0,0 +1,112 @@ +package net.lab1024.smartadmin.service.module.business.notice.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.lab1024.smartadmin.service.module.business.notice.domain.dto.NoticeQueryDTO; +import net.lab1024.smartadmin.service.module.business.notice.domain.dto.NoticeReadCountDTO; +import net.lab1024.smartadmin.service.module.business.notice.domain.dto.NoticeReceiveDTO; +import net.lab1024.smartadmin.service.module.business.notice.domain.dto.NoticeReceiveQueryDTO; +import net.lab1024.smartadmin.service.module.business.notice.domain.entity.NoticeEntity; +import net.lab1024.smartadmin.service.module.business.notice.domain.vo.NoticeDetailVO; +import net.lab1024.smartadmin.service.module.business.notice.domain.vo.NoticeVO; +import net.lab1024.smartadmin.service.module.system.datascope.DataScope; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeWhereInTypeEnum; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * [ ] + * + * @author 罗伊 + */ +@Mapper +@Component +public interface NoticeDao extends BaseMapper { + + /** + * 分页查询 + * + * @param queryDTO + * @return NoticeEntity + */ + @DataScope(dataScopeType = DataScopeTypeEnum.NOTICE, joinSql = "n.create_user in (#employeeIds)", whereInType = DataScopeWhereInTypeEnum.EMPLOYEE) + List queryByPage(Page page, @Param("queryDTO") NoticeQueryDTO queryDTO); + + + /** + * 获取某人的未读消息 + * + * @param page + * @param employeeId + * @return + */ + @DataScope(dataScopeType = DataScopeTypeEnum.NOTICE, joinSql = "e.department_id in (#departmentIds)", whereInType = DataScopeWhereInTypeEnum.DEPARTMENT) + List queryUnreadByPage(Page page, @Param("employeeId") Long employeeId, @Param("sendStatus") Boolean sendStatus); + + + /** + * 获取 + * + * @param page + * @param queryDTO + * @return + */ + List queryReceiveByPage(Page page, @Param("queryDTO") NoticeReceiveQueryDTO queryDTO); + + /** + * 详情 + * + * @param id + * @return + */ + NoticeDetailVO detail(@Param("id") Long id); + + /** + * 根据id删除 逻辑删除 + * + * @param id + * @param deletedFlag + */ + void logicDeleteById(@Param("id") Long id, @Param("deletedFlag") Boolean deletedFlag); + + + /** + * 批量逻辑删除 + * + * @param idList + * @param deletedFlag + * @return + */ + void logicDeleteByIds(@Param("idList") List idList, @Param("deletedFlag") Boolean deletedFlag); + + /** + * 获取消息总数 + * + * @return + */ + Integer noticeCount(@Param("sendStatus") Boolean sendStatus); + + + /** + * 获取已读消息数 + * + * @param employeeIds + * @return + */ + List readCount(@Param("employeeIds") List employeeIds); + + + /** + * 获取某人的未读消息数 + * + * @param employeeId + * @param sendStatus + * @return + */ + Integer noticeUnreadCount(@Param("employeeId") Long employeeId, @Param("sendStatus") Boolean sendStatus); + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/dao/NoticeReceiveRecordDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/dao/NoticeReceiveRecordDao.java similarity index 73% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/dao/NoticeReceiveRecordDao.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/dao/NoticeReceiveRecordDao.java index 682e0d74..274b51a2 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/dao/NoticeReceiveRecordDao.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/dao/NoticeReceiveRecordDao.java @@ -1,7 +1,7 @@ -package net.lab1024.smartadmin.module.business.notice.dao; +package net.lab1024.smartadmin.service.module.business.notice.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import net.lab1024.smartadmin.module.business.notice.domain.entity.NoticeReceiveRecordEntity; +import net.lab1024.smartadmin.service.module.business.notice.domain.entity.NoticeReceiveRecordEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; @@ -11,12 +11,7 @@ import java.util.List; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019-07-11 16:19:48 - * @since JDK1.8 + * @author 罗伊 */ @Mapper @Component diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeAddDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeAddDTO.java similarity index 59% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeAddDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeAddDTO.java index 572817d1..5d5759b2 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeAddDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeAddDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.business.notice.domain.dto; +package net.lab1024.smartadmin.service.module.business.notice.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,12 +7,7 @@ import org.hibernate.validator.constraints.Length; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 12:27 - * @since JDK1.8 + * @author 罗伊 */ @Data public class NoticeAddDTO { @@ -25,4 +20,7 @@ public class NoticeAddDTO { @Length(max = 5000) private String content; + @ApiModelProperty(hidden = true) + private Long createId; + } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeQueryDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeQueryDTO.java new file mode 100644 index 00000000..ceb96edc --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeQueryDTO.java @@ -0,0 +1,29 @@ +package net.lab1024.smartadmin.service.module.business.notice.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +public class NoticeQueryDTO extends PageBaseDTO { + + + @ApiModelProperty("开始日期") + private String startDate; + + @ApiModelProperty("结束日期") + private String endDate; + + + @ApiModelProperty("消息标题") + private String title; + + @ApiModelProperty(value = "是否删除", hidden = true) + private Boolean deletedFlag; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReadCountDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReadCountDTO.java new file mode 100644 index 00000000..3d7f33d4 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReadCountDTO.java @@ -0,0 +1,21 @@ +package net.lab1024.smartadmin.service.module.business.notice.domain.dto; + +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +public class NoticeReadCountDTO { + /** + * 员工id + */ + private Long employeeId; + /** + * 已读消息数 + */ + private Integer readCount; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReceiveDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReceiveDTO.java new file mode 100644 index 00000000..c4ba2f84 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReceiveDTO.java @@ -0,0 +1,33 @@ +package net.lab1024.smartadmin.service.module.business.notice.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +public class NoticeReceiveDTO{ + + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("消息标题") + private String title; + + + @ApiModelProperty("消息创建人") + private Long createUser; + + @ApiModelProperty("消息创建人名称") + private String createUserName; + + @ApiModelProperty("结束时间") + private LocalDateTime receiveTime; + + private Boolean readStatus; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReceiveQueryDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReceiveQueryDTO.java new file mode 100644 index 00000000..cf07cefe --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeReceiveQueryDTO.java @@ -0,0 +1,20 @@ +package net.lab1024.smartadmin.service.module.business.notice.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +public class NoticeReceiveQueryDTO extends NoticeQueryDTO { + + @ApiModelProperty(hidden = true) + private Long employeeId; + + @ApiModelProperty(hidden = true) + private Boolean sendStatus; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeUpdateDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeUpdateDTO.java new file mode 100644 index 00000000..4c44c2d2 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/dto/NoticeUpdateDTO.java @@ -0,0 +1,16 @@ +package net.lab1024.smartadmin.service.module.business.notice.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +public class NoticeUpdateDTO extends NoticeAddDTO { + + @ApiModelProperty("id") + private Long id; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/entity/NoticeEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/entity/NoticeEntity.java new file mode 100644 index 00000000..027767dc --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/entity/NoticeEntity.java @@ -0,0 +1,58 @@ +package net.lab1024.smartadmin.service.module.business.notice.domain.entity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +@TableName("t_notice") +public class NoticeEntity { + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 消息标题 + */ + private String title; + + /** + * 消息内容 + */ + private String content; + + /** + * 消息创建人 + */ + private Long createUser; + + /** + * 发送状态 + */ + private Boolean sendStatus; + + /** + * 删除状态 + */ + private Boolean deletedFlag; + + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/entity/NoticeReceiveRecordEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/entity/NoticeReceiveRecordEntity.java new file mode 100644 index 00000000..eac5fdf8 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/entity/NoticeReceiveRecordEntity.java @@ -0,0 +1,45 @@ +package net.lab1024.smartadmin.service.module.business.notice.domain.entity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +@TableName("t_notice_receive_record") +public class NoticeReceiveRecordEntity{ + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + /** + * 消息id + */ + private Long noticeId; + + /** + * 消息接收人 + */ + private Long employeeId; + + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/vo/NoticeDetailVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/vo/NoticeDetailVO.java new file mode 100644 index 00000000..8fb3d90f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/vo/NoticeDetailVO.java @@ -0,0 +1,23 @@ +package net.lab1024.smartadmin.service.module.business.notice.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +public class NoticeDetailVO extends NoticeVO { + + + @ApiModelProperty("消息内容") + private String content; + + @ApiModelProperty("更新时间") + private LocalDateTime updateTime; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/vo/NoticeVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/vo/NoticeVO.java new file mode 100644 index 00000000..e64d3e19 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/business/notice/domain/vo/NoticeVO.java @@ -0,0 +1,34 @@ +package net.lab1024.smartadmin.service.module.business.notice.domain.vo; +import lombok.Data; + +import java.time.LocalDateTime; + +import io.swagger.annotations.ApiModelProperty; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +public class NoticeVO { + + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("消息标题") + private String title; + + + @ApiModelProperty("消息创建人") + private Long createUser; + + private Integer sendStatus; + + @ApiModelProperty("消息创建人名称") + private String createUserName; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/AbstractCaffeineCache.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/AbstractCaffeineCache.java new file mode 100644 index 00000000..383cf5a6 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/AbstractCaffeineCache.java @@ -0,0 +1,220 @@ +package net.lab1024.smartadmin.service.module.support.beancache.cache; + +import com.alibaba.fastjson.JSON; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; +import net.lab1024.smartadmin.service.module.support.beancache.domain.CacheData; +import net.lab1024.smartadmin.service.module.support.beancache.key.CacheKey; +import net.lab1024.smartadmin.service.module.support.beancache.key.CacheKeyBuilder; +import net.lab1024.smartadmin.service.module.support.beancache.load.CacheLoadMethod; +import net.lab1024.smartadmin.service.third.SmartApplicationContext; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.compress.utils.Lists; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.TimeUnit; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/4/14 15:12 + */ +public abstract class AbstractCaffeineCache implements IBeanCache { + + /** + * 获取缓存 + * @return + */ + @Override + public abstract LoadingCache getCache(); + + /** + * 移除某个缓存 + * @param key + */ + @Override + public void remove(String key) { + getCache().invalidate(key); + } + + /** + * 清除所有 + */ + @Override + public void clear() { + getCache().invalidateAll(); + } + + /** + * 获取某个缓存对象 + * @param key + * @return + */ + @Override + public T get(String key) { + LoadingCache cache = getCache(); + CacheData cacheData = cache.get(key); + if(cacheData == null){ + return null; + } + if(cacheData.getExpireTime() == null){ + return (T)cacheData.getData(); + } + long expireTime = cacheData.getExpireTime(); + long current = System.currentTimeMillis(); + if(expireTime > current){ + return (T)cacheData.getData(); + } + //缓存过期 移除key 重新获取 + cache.invalidate(key); + return (T)cache.get(key).getData(); + } + + /** + * 刷新某个缓存key-异步刷新 + * @param key + */ + @Override + public void refresh(String key){ + LoadingCache cache = getCache(); + cache.refresh(key); + } + + /** + * 设置key->value + * @param key + * @param obj + */ + @Override + public void put(String key, Object obj) { + CacheData cacheData = new CacheData(); + cacheData.setData(obj); + getCache().put(key, cacheData); + } + + + @Override + public void put(String key, Object obj, long expireSecond) { + CacheData cacheData = new CacheData(); + long expireTime = System.currentTimeMillis() + expireSecond * 1000; + cacheData.setExpireTime(expireTime); + cacheData.setData(obj); + getCache().put(key, cacheData); + } + + /** + * 判断是否包含某个key + * @param key + * @return + */ + @Override + public boolean containsKey(String key) { + ConcurrentMap concurrentMap = getCache().asMap(); + return concurrentMap.containsKey(key); + } + + /** + * 所有key集合 + * @return + */ + @Override + public Set keySet() { + ConcurrentMap concurrentMap = getCache().asMap(); + return concurrentMap.keySet(); + } + + /** + * 移除某个模块的所有key + * @param module + */ + @Override + public void removeByModule(String module) { + ConcurrentMap concurrentMap = getCache().asMap(); + List removeKeys = Lists.newArrayList(); + Set keySet = concurrentMap.keySet(); + keySet.forEach(e -> { + CacheKeyBuilder cacheKeyBuilder = JSON.parseObject(e, CacheKeyBuilder.class); + if (cacheKeyBuilder.getCacheModule().equals(module)){ + removeKeys.add(e); + } + }); + if (CollectionUtils.isNotEmpty(removeKeys)) { + getCache().invalidateAll(removeKeys); + } + } + + /** + * 移除某个模块 某个分组下的缓存 + * @param module + * @param group + */ + @Override + public void removeByModuleAndGroup(String module, String group){ + ConcurrentMap concurrentMap = getCache().asMap(); + List removeKeys = Lists.newArrayList(); + Set keySet = concurrentMap.keySet(); + keySet.forEach(e -> { + CacheKeyBuilder cacheKeyBuilder = JSON.parseObject(e, CacheKeyBuilder.class); + if (cacheKeyBuilder.getCacheModule().equals(module) && group.equals(cacheKeyBuilder.getGroup())){ + removeKeys.add(e); + } + }); + if (CollectionUtils.isNotEmpty(removeKeys)) { + getCache().invalidateAll(removeKeys); + } + } + + /** + * 根据缓存个数和过期时间初始化缓存的方法 + * @param expireDays + * @param maximumSize + * @param scanPath + * @return + */ + public LoadingCache initCache(Integer expireDays, Integer maximumSize, String scanPath) { + //加载缓存方法 + Map methodMap = cacheLoadFunction(scanPath); + //构建缓存对象 + Caffeine builder = Caffeine.newBuilder(); + if(maximumSize != null){ + builder.maximumSize(maximumSize); + } + if(expireDays != null){ + builder.expireAfterAccess(expireDays, TimeUnit.DAYS); + } + return builder.recordStats() + .build(key -> { + String cacheModule = CacheKey.getCacheModeByCacheKey(key); + CacheLoadMethod loadMethod = methodMap.get(cacheModule); + if (loadMethod == null) { + return null; + } + Method method = loadMethod.getLoadMethod(); + Object object = SmartApplicationContext.getBean(method.getDeclaringClass()); + //方法返回值 + Object result = null; + if (method.getParameterCount() == 0) { + result = method.invoke(object); + }else{ + result = method.invoke(object, key); + } + if(result == null){ + return null; + } + //指定咖啡因缓存返回值 + Long expireTime = null; + if(loadMethod.getExpireSecond()>0){ + expireTime = System.currentTimeMillis() + loadMethod.getExpireSecond() * 1000; + } + CacheData cacheData = new CacheData(); + cacheData.setExpireTime(expireTime); + cacheData.setData(result); + return cacheData; + }); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/AbstractDisableCache.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/AbstractDisableCache.java new file mode 100644 index 00000000..3759a96a --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/AbstractDisableCache.java @@ -0,0 +1,119 @@ +package net.lab1024.smartadmin.service.module.support.beancache.cache; + +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.module.support.beancache.key.CacheKey; +import net.lab1024.smartadmin.service.module.support.beancache.load.CacheLoadMethod; +import net.lab1024.smartadmin.service.third.SmartApplicationContext; + +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Set; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/4/14 15:27 + */ +@Slf4j +public class AbstractDisableCache implements IBeanCache { + + private Map methodMap; + + /** + * 构造函数 + * @param scanPath + */ + public AbstractDisableCache(String scanPath) { + //加载缓存方法 + this.methodMap = cacheLoadFunction(scanPath); + } + + @Override + public Map getCache() { + log.warn("Cache is disable!"); + return Maps.newHashMap(); + } + + @Override + public void remove(String key) { + log.warn("Cache is disable!"); + return; + } + + @Override + public void clear() { + log.warn("Cache is disable!"); + return; + } + + @Override + public T get(String key) { + log.warn("Cache is disable!"); + + String cacheModule = CacheKey.getCacheModeByCacheKey(key); + CacheLoadMethod loadMethod = methodMap.get(cacheModule); + if (loadMethod == null) { + throw null; + } + Method method = loadMethod.getLoadMethod(); + Object object = SmartApplicationContext.getBean(method.getDeclaringClass()); + Object result = null; + try { + if (method.getParameterCount() == 0) { + result = method.invoke(object); + }else{ + result = method.invoke(object, key); + } + }catch (Exception e){ + log.error("Cache get exception:{}",e); + } + return (T) result; + + } + + @Override + public void refresh(String key) { + log.warn("Cache is disable!"); + return; + } + + @Override + public void put(String key, Object obj) { + log.warn("Cache is disable!"); + return; + } + + @Override + public void put(String key, Object obj, long expireSecond) { + log.warn("Cache is disable!"); + return; + } + + + @Override + public boolean containsKey(String key) { + log.warn("Cache is disable!"); + return false; + } + + @Override + public Set keySet() { + log.warn("Cache is disable!"); + return Sets.newHashSet(); + } + + @Override + public void removeByModule(String module) { + log.warn("Cache is disable!"); + return; + } + + @Override + public void removeByModuleAndGroup(String module, String group) { + log.warn("Cache is disable!"); + return; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/IBeanCache.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/IBeanCache.java new file mode 100644 index 00000000..b6157568 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/cache/IBeanCache.java @@ -0,0 +1,128 @@ +package net.lab1024.smartadmin.service.module.support.beancache.cache; + +import com.google.common.collect.Maps; +import net.lab1024.smartadmin.service.module.support.beancache.load.CacheLoad; +import net.lab1024.smartadmin.service.module.support.beancache.load.CacheLoadMethod; +import org.reflections.Reflections; +import org.reflections.scanners.MethodAnnotationsScanner; +import org.reflections.util.ConfigurationBuilder; + +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Set; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/9/6 15:55 + */ +public interface IBeanCache { + + /** + * 获取缓存 + * + * @return + */ + T getCache(); + + /** + * 移除某个缓存 + * + * @param key + */ + void remove(String key); + + /** + * 清除所有 + */ + void clear(); + + /** + * 获取某个缓存对象 + * + * @param key + * @return + */ + T get(String key); + + /** + * 刷新某个缓存key-异步刷新 + * + * @param key + */ + void refresh(String key); + + /** + * 设置key->value + * + * @param key + * @param obj + */ + void put(String key, Object obj); + + /** + * 待过期时间get + * @param key + * @param obj + * @param expireSecond + */ + void put(String key, Object obj, long expireSecond); + + /** + * 判断是否包含某个key + * + * @param key + * @return + */ + boolean containsKey(String key); + + /** + * 所有key集合 + * + * @return + */ + Set keySet(); + + /** + * 移除某个模块的所有key + * + * @param module + */ + void removeByModule(String module); + + /** + * 移除某个模块 某个分组下的缓存 + * + * @param module + * @param group + */ + void removeByModuleAndGroup(String module, String group); + + + /** + * 加载 CacheLoad注解的方法 + * @param scanPath + * @return + */ + default Map cacheLoadFunction(String scanPath) { + Reflections reflections = new Reflections(new ConfigurationBuilder() + .forPackages(scanPath) + .addScanners(new MethodAnnotationsScanner()) + ); + Map methodMap = Maps.newHashMap(); + Set methods = reflections.getMethodsAnnotatedWith(CacheLoad.class); + for (Method method : methods) { + CacheLoad cacheLoad = method.getAnnotation(CacheLoad.class); + if (cacheLoad != null) { + String cacheModule = cacheLoad.value(); + CacheLoadMethod cacheLoadMethod = new CacheLoadMethod(); + cacheLoadMethod.setCacheModule(cacheModule); + cacheLoadMethod.setExpireSecond(cacheLoad.expireSecond()); + cacheLoadMethod.setLoadMethod(method); + methodMap.put(cacheModule, cacheLoadMethod); + } + } + return methodMap; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheClear.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheClear.java new file mode 100644 index 00000000..e4d4d249 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheClear.java @@ -0,0 +1,18 @@ +package net.lab1024.smartadmin.service.module.support.beancache.domain; + +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/5/10 10:45 + */ +@Data +public class CacheClear { + + private String module; + + private String group; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheData.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheData.java new file mode 100644 index 00000000..205fcc5a --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheData.java @@ -0,0 +1,23 @@ +package net.lab1024.smartadmin.service.module.support.beancache.domain; + +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/4/22 17:21 + */ +@Data +public class CacheData { + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 缓存数据 + */ + private T data; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheStatsVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheStatsVO.java new file mode 100644 index 00000000..8731f739 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/domain/CacheStatsVO.java @@ -0,0 +1,56 @@ +package net.lab1024.smartadmin.service.module.support.beancache.domain; + +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/9/8 11:14 + */ +@Data +public class CacheStatsVO { + /** + * 记录缓存请求数量 + */ + private long requestCount; + /** + * 记录缓存命中 + */ + private long hitCount; + /** + * 记录缓存未命中 + */ + private long missCount; + /** + * CacheLoader加载成功 + */ + private long loadSuccessCount; + /** + * CacheLoader加载成功加载失败 + */ + private long loadFailureCount; + /** + * 总加载时间 + */ + private long totalLoadTime; + /** + * 缓存失效的数量 + */ + private long evictionCount; + + /** + * 返回缓存命中率 + */ + private double hitRate; + + /** + * 返回缓存命中率 + */ + private double missRate; + + /** + * 加载新值的平均时间 + */ + private double averageLoadPenalty; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/key/CacheKey.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/key/CacheKey.java new file mode 100644 index 00000000..93dd05e0 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/key/CacheKey.java @@ -0,0 +1,94 @@ +package net.lab1024.smartadmin.service.module.support.beancache.key; + +import com.alibaba.fastjson.JSON; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/9/6 17:20 + */ +public class CacheKey { + + /** + * 构建缓存key信息 + * + * @param cacheModule + * @param group + * @param businessId + * @return + */ + public static String cacheKey(String cacheModule, String group, String businessId) { + CacheKeyBuilder cacheKeyBuilder = CacheKeyBuilder.builder() + .cacheModule(cacheModule) + .group(group) + .businessId(businessId).build(); + return cacheKey(cacheKeyBuilder); + } + + public static String cacheKeyGroup(String cacheModule, String group) { + CacheKeyBuilder cacheKeyBuilder = CacheKeyBuilder.builder() + .cacheModule(cacheModule) + .group(group).build(); + return cacheKey(cacheKeyBuilder); + } + + /** + * 构建缓存key信息 + * + * @param cacheModule + * @param businessId + * @return + */ + public static String cacheKey(String cacheModule, String businessId) { + CacheKeyBuilder cacheKeyBuilder = CacheKeyBuilder.builder() + .cacheModule(cacheModule) + .businessId(businessId).build(); + return cacheKey(cacheKeyBuilder); + } + + + public static String cacheKey(String cacheModule) { + CacheKeyBuilder cacheKeyBuilder = CacheKeyBuilder.builder() + .cacheModule(cacheModule).build(); + return cacheKey(cacheKeyBuilder); + } + + /** + * 构建缓存key信息 + * + * @param cacheKeyBuilder + * @return + */ + public static String cacheKey(CacheKeyBuilder cacheKeyBuilder) { + return JSON.toJSONString(cacheKeyBuilder); + } + + /** + * 通过缓存key获取对应的method key + * + * @param cacheKey + * @return + */ + public static String getCacheModeByCacheKey(String cacheKey) { + CacheKeyBuilder cacheKeyBuilder = JSON.parseObject(cacheKey, CacheKeyBuilder.class); + return cacheKeyBuilder.getCacheModule(); + } + + /** + * 通过缓存key获取对应的businessId + * + * @param cacheKey + * @return + */ + public static String getBusinessIdByCacheKey(String cacheKey) { + CacheKeyBuilder cacheKeyBuilder = JSON.parseObject(cacheKey, CacheKeyBuilder.class); + return cacheKeyBuilder.getBusinessId(); + } + + public static String getGroupIdByCacheKey(String cacheKey) { + CacheKeyBuilder cacheKeyBuilder = JSON.parseObject(cacheKey, CacheKeyBuilder.class); + return cacheKeyBuilder.getGroup(); + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/key/CacheKeyBuilder.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/key/CacheKeyBuilder.java new file mode 100644 index 00000000..c186af4b --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/key/CacheKeyBuilder.java @@ -0,0 +1,25 @@ +package net.lab1024.smartadmin.service.module.support.beancache.key; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/1/23 17:41 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CacheKeyBuilder { + + private String cacheModule; + + private String group; + + private String businessId; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/load/CacheLoad.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/load/CacheLoad.java new file mode 100644 index 00000000..e213561d --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/load/CacheLoad.java @@ -0,0 +1,26 @@ +package net.lab1024.smartadmin.service.module.support.beancache.load; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/9/6 15:53 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface CacheLoad { + + String value(); + + /** + * 过期时间 默认不过期依据总体过期时间定义 + * @return + */ + long expireSecond() default 0L; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/load/CacheLoadMethod.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/load/CacheLoadMethod.java new file mode 100644 index 00000000..977952b3 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beancache/load/CacheLoadMethod.java @@ -0,0 +1,29 @@ +package net.lab1024.smartadmin.service.module.support.beancache.load; + +import lombok.Data; + +import java.lang.reflect.Method; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/4/22 17:28 + */ +@Data +public class CacheLoadMethod { + + /** + * 缓存模块 + */ + private String cacheModule; + /** + * 缓存过期时间 + */ + private long expireSecond; + + /** + * 缓存加载方法 + */ + private Method loadMethod; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/BeanRecordService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/BeanRecordService.java new file mode 100644 index 00000000..bc90a6d9 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/BeanRecordService.java @@ -0,0 +1,460 @@ +package net.lab1024.smartadmin.service.module.support.beanrecord; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.google.common.collect.Lists; +import io.swagger.annotations.ApiModelProperty; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.module.support.beanrecord.annotation.FieldBigDecimalValue; +import net.lab1024.smartadmin.service.module.support.beanrecord.annotation.FieldDoc; +import net.lab1024.smartadmin.service.module.support.beanrecord.annotation.FieldEnumValue; +import net.lab1024.smartadmin.service.module.support.beanrecord.annotation.FieldSqlValue; +import net.lab1024.smartadmin.service.third.SmartApplicationContext; +import net.lab1024.smartadmin.service.util.SmartBaseEnumUtil; +import net.lab1024.smartadmin.service.util.SmartBigDecimalUtil; +import net.lab1024.smartadmin.service.util.date.SmartDateFormatterEnum; +import net.lab1024.smartadmin.service.util.date.SmartLocalDateUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.*; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; + +/** + * [ ] + * + * @author 罗伊 + */ +@Slf4j +@Service +public class BeanRecordService { + + /** + * 字段描述缓存 + */ + private ConcurrentHashMap fieldDescCacheMap = new ConcurrentHashMap<>(); + + /** + * 类 加注解字段缓存 + */ + private ConcurrentHashMap> fieldMap = new ConcurrentHashMap<>(); + + /** + * 数据批量对比 + * @param oldObjectList + * @param newObjectList + * @param + * @return + */ + public String beanListParse(List oldObjectList, List newObjectList) { + boolean valid = this.valid(oldObjectList, newObjectList); + if (!valid) { + return ""; + } + OperateTypeEnum operateType = this.getOperateType(oldObjectList, newObjectList); + String operateContent = ""; + if (OperateTypeEnum.ADD.equals(operateType) || OperateTypeEnum.DELETE.equals(operateType)) { + operateContent = this.getObjectListContent(newObjectList); + if (StringUtils.isEmpty(operateContent)) { + return ""; + } + return operateType.getDesc() + ":" + operateContent; + } + if (OperateTypeEnum.UPDATE.equals(operateType)) { + return this.getUpdateContentList(oldObjectList, newObjectList); + } + return operateContent; + } + + /** + * 单个对象变动内容 + * @param oldObjectList + * @param newObjectList + * @param + * @return + */ + private String getUpdateContentList(List oldObjectList, List newObjectList) { + String oldContent = this.getObjectListContent(oldObjectList); + String newContent = this.getObjectListContent(newObjectList); + if (oldContent.equals(newContent)) { + return ""; + } + if (StringUtils.isEmpty(oldContent) && StringUtils.isEmpty(newContent)) { + return ""; + } + return "【原数据】:
" + oldContent + "
" + "【新数据】:
" + newContent; + } + + /** + * 获取一个对象的内容信息 + * @param objectList + * @param + * @return + */ + private String getObjectListContent(List objectList) { + if (CollectionUtils.isEmpty(objectList)) { + return ""; + } + List fields = this.getField(objectList.get(0)); + List contentList = Lists.newArrayList(); + for (Object objItem : objectList) { + Map beanParseMap = this.fieldParse(objItem, fields); + contentList.add(this.getAddDeleteContent(beanParseMap)); + } + return StringUtils.join(contentList, "
"); + } + + + /** + * 解析多个对象的变更,删除,新增 + * oldObject 为空 ,newObject 不为空 为新增 + * oldObject 不为空 ,newObject 不空 为删除 + * 都不为空为编辑 + * + * @param oldObject + * @param newObject + * @return + */ + public String beanParse(Object oldObject, Object newObject) { + boolean valid = this.valid(oldObject, newObject); + if (!valid) { + return null; + } + OperateTypeEnum operateType = this.getOperateType(oldObject, newObject); + String operateContent = ""; + if (OperateTypeEnum.ADD.equals(operateType) || OperateTypeEnum.DELETE.equals(operateType)) { + operateContent = this.getAddDeleteContent(newObject); + } + if (OperateTypeEnum.UPDATE.equals(operateType)) { + operateContent = this.getUpdateContent(oldObject, newObject); + } + if (StringUtils.isEmpty(operateContent)) { + return ""; + } + return operateType.getDesc() + ":" + operateContent; + } + + /** + * 解析单个bean的内容 + * + * @param operateDesc + * @param object + * @return + */ + public String beanParse(String operateDesc, Object object) { + String content = this.getAddDeleteContent(object); + if (StringUtils.isEmpty(operateDesc)) { + return content; + } + return operateDesc + ":" + content; + } + + /** + * 获取新增或删除操作内容 + * + * @param object 新增或删除的对象 + * @return + */ + private String getAddDeleteContent(Object object) { + List fields = this.getField(object); + Map beanParseMap = this.fieldParse(object, fields); + return this.getAddDeleteContent(beanParseMap); + } + + private String getAddDeleteContent(Map beanParseMap) { + List contentList = new ArrayList<>(); + for (Entry entry : beanParseMap.entrySet()) { + contentList.add(entry.getKey() + ":" + entry.getValue()); + } + String operateContent = StringUtils.join(contentList, ";"); + if (StringUtils.isEmpty(operateContent)) { + return ""; + } + return operateContent; + } + + + /** + * 获取更新操作内容 + * + * @param oldObject + * @param newObject + * @return + */ + private String getUpdateContent(T oldObject, T newObject) { + List fields = this.getField(oldObject); + List contentList = new ArrayList<>(); + Map oldBeanParseMap = this.fieldParse(oldObject, fields); + Map newBeanParseMap = this.fieldParse(newObject, fields); + //oldBeanParseMap与newBeanParseMap size一定相同 + for (Entry entry : oldBeanParseMap.entrySet()) { + String desc = entry.getKey(); + String oldValue = entry.getValue(); + String newValue = newBeanParseMap.get(desc); + if (oldValue.equals(newValue)) { + continue; + } + String content = desc + ":" + "由【" + oldValue + "】变更为【" + newValue + "】"; + contentList.add(content); + } + if (CollectionUtils.isEmpty(contentList)) { + return ""; + } + String operateContent = StringUtils.join(contentList, ";"); + if (StringUtils.isEmpty(operateContent)) { + return ""; + } + return operateContent; + } + + + /** + * 接bean对象 + * + * @param object + * @param fields + * @return + */ + private Map fieldParse(Object object, List fields) { + if (fields == null || fields.size() == 0) { + return null; + } + //对象解析结果 + Map objectParse = new HashMap<>(16); + for (Field field : fields) { + field.setAccessible(true); + String desc = this.getFieldDesc(field); + if (StringUtils.isEmpty(desc)) { + continue; + } + String fieldValue = this.getFieldValue(field, object); + objectParse.put(desc, fieldValue); + } + return objectParse; + } + + /** + * 获取字段值 + * @param field + * @param object + * @return + */ + private String getFieldValue(Field field, Object object) { + Object fieldValue = ""; + Class clazz = object.getClass(); + try { + PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz); + Method get = pd.getReadMethod(); + fieldValue = get.invoke(object); + } catch (Exception e) { + log.error("bean operate log: reflect field value error " + field.getName()); + return ""; + } + if (fieldValue == null) { + return ""; + } + FieldEnumValue fieldEnumValue = field.getAnnotation(FieldEnumValue.class); + FieldSqlValue fieldSqlValue = field.getAnnotation(FieldSqlValue.class); + if (fieldEnumValue != null) { + return SmartBaseEnumUtil.getEnumDescByValue(fieldValue, fieldEnumValue.enumClass()); + } + if (fieldSqlValue != null) { + return this.getRelateDisplayValue(fieldValue, fieldSqlValue); + } + if (fieldValue instanceof Date) { + LocalDateTime localDateTime = SmartLocalDateUtil.toLocalDateTime((Date) fieldValue); + return SmartLocalDateUtil.format(localDateTime, SmartDateFormatterEnum.YMD_HMS); + } + if (fieldValue instanceof LocalDateTime) { + return SmartLocalDateUtil.format((LocalDateTime) fieldValue, SmartDateFormatterEnum.YMD_HMS); + } + if (fieldValue instanceof LocalDate) { + return SmartLocalDateUtil.format((LocalDate) fieldValue, SmartDateFormatterEnum.YMD); + } + if (fieldValue instanceof BigDecimal) { + FieldBigDecimalValue fieldBigDecimalValue = field.getAnnotation(FieldBigDecimalValue.class); + if (fieldBigDecimalValue != null) { + BigDecimal value = SmartBigDecimalUtil.setScale((BigDecimal) fieldValue, fieldBigDecimalValue.scale()); + return value.toString(); + } + } + return fieldValue.toString(); + } + + /** + * 获取关联字段的显示值 + * + * @param fieldValue + * @return + */ + private String getRelateDisplayValue(Object fieldValue, FieldSqlValue fieldSqlValue) { + Class relateMapper = fieldSqlValue.relateMapper(); + BaseMapper mapper = SmartApplicationContext.getBean(relateMapper); + if (mapper == null) { + return ""; + } + String relateFieldValue = fieldValue.toString(); + QueryWrapper qw = new QueryWrapper(); + qw.select(fieldSqlValue.relateDisplayColumn()); + qw.eq(fieldSqlValue.relateColumn(), relateFieldValue); + List displayValue = mapper.selectObjs(qw); + if (CollectionUtils.isEmpty(displayValue)) { + return ""; + } + return displayValue.get(0).toString(); + } + + /** + * 获取字段描述信息 优先 OperateField 没得话swagger判断 + * + * @param field + * @return + */ + private String getFieldDesc(Field field) { + // 根据字段名称 从缓存中查询 + String fieldName = field.toGenericString(); + String desc = fieldDescCacheMap.get(fieldName); + if (null != desc) { + return desc; + } + FieldDoc operateField = field.getAnnotation(FieldDoc.class); + if (operateField != null) { + desc = operateField.value(); + } else { + ApiModelProperty apiModelProperty = field.getAnnotation(ApiModelProperty.class); + desc = null == apiModelProperty ? "" : apiModelProperty.value(); + } + fieldDescCacheMap.put(fieldName, desc); + return desc; + } + + /** + * 获取操作类型 + * + * @param oldObject + * @param newObject + * @return + */ + private OperateTypeEnum getOperateType(Object oldObject, Object newObject) { + if (oldObject == null && newObject != null) { + return OperateTypeEnum.ADD; + } + if (oldObject != null && newObject == null) { + return OperateTypeEnum.DELETE; + } + return OperateTypeEnum.UPDATE; + } + + /** + * 校验是否进行比对 + * + * @param oldObject + * @param newObject + * @return + */ + private boolean valid(Object oldObject, Object newObject) { + if (oldObject == null && newObject == null) { + log.error("bean operate log: oldObject and newObject is null"); + return false; + } + if (oldObject == null && newObject != null) { + log.info("bean operate log: oldObject is null,new:" + newObject.getClass().getName() + " " + OperateTypeEnum.ADD.getDesc()); + return true; + } + if (oldObject != null && newObject == null) { + log.info("bean operate log: newObject is null,old:" + oldObject.getClass().getName() + " " + OperateTypeEnum.DELETE.getDesc()); + return true; + } + if (oldObject != null && newObject != null) { + String oldClass = oldObject.getClass().getName(); + String newClass = newObject.getClass().getName(); + if (oldClass.equals(newClass)) { + log.info("bean operate log: " + oldObject.getClass().getName() + " " + OperateTypeEnum.UPDATE.getDesc()); + return true; + } + log.error("bean operate log: is different class:old:" + oldClass + " new:" + newClass); + return false; + } + return true; + } + + + /** + * 校验 + * @param oldObjectList + * @param newObjectList + * @param + * @return + */ + private boolean valid(List oldObjectList, List newObjectList) { + if (CollectionUtils.isEmpty(oldObjectList) && CollectionUtils.isEmpty(newObjectList)) { + log.error("bean operate log: oldObjectList and newObject is null"); + return false; + } + if (CollectionUtils.isEmpty(oldObjectList) && CollectionUtils.isNotEmpty(newObjectList)) { + log.info("bean operate log: oldObjectList is null,new:" + newObjectList.getClass().getName() + " " + OperateTypeEnum.ADD.getDesc()); + return true; + } + if (CollectionUtils.isNotEmpty(oldObjectList) && CollectionUtils.isEmpty(newObjectList)) { + log.info("bean operate log: newObject is null,old:" + oldObjectList.getClass().getName() + " " + OperateTypeEnum.DELETE.getDesc()); + return true; + } + if (CollectionUtils.isNotEmpty(oldObjectList) && CollectionUtils.isNotEmpty(newObjectList)) { + T oldObject = oldObjectList.get(0); + T newObject = newObjectList.get(0); + String oldClass = oldObject.getClass().getName(); + String newClass = newObject.getClass().getName(); + if (oldClass.equals(newClass)) { + log.info("bean operate log: " + oldObject.getClass().getName() + " " + OperateTypeEnum.UPDATE.getDesc()); + return true; + } + log.error("bean operate log: is different class:old:" + oldClass + " new:" + newClass); + return false; + } + return true; + } + + /** + * 查询 包含 file key 注解的字段 + * 使用缓存 + * + * @param obj + * @return + */ + private List getField(Object obj) { + // 从缓存中查询 + Class tClass = obj.getClass(); + List fieldList = fieldMap.get(tClass); + if (null != fieldList) { + return fieldList; + } + + // 这一段递归代码 是为了 从父类中获取属性 + Class tempClass = tClass; + fieldList = new ArrayList<>(); + while (tempClass != null) { + Field[] declaredFields = tempClass.getDeclaredFields(); + for (Field field : declaredFields) { + // 过虑出有注解字段 + if (!field.isAnnotationPresent(FieldDoc.class)) { + continue; + } + field.setAccessible(true); + fieldList.add(field); + } + tempClass = tempClass.getSuperclass(); + } + fieldMap.put(tClass, fieldList); + return fieldList; + } + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/OperateTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/OperateTypeEnum.java new file mode 100644 index 00000000..c3fa5aee --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/OperateTypeEnum.java @@ -0,0 +1,32 @@ +package net.lab1024.smartadmin.service.module.support.beanrecord; + +/** + * [ ] + * + * @author 罗伊 + */ +public enum OperateTypeEnum { + + ADD(1, "新增"), + + UPDATE(2, "修改"), + + DELETE(3, "删除"); + + private Integer value; + + private String desc; + + OperateTypeEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + public Integer getValue() { + return value; + } + + public String getDesc() { + return desc; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldBigDecimalValue.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldBigDecimalValue.java new file mode 100644 index 00000000..f1966d91 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldBigDecimalValue.java @@ -0,0 +1,17 @@ +package net.lab1024.smartadmin.service.module.support.beanrecord.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * [ ] + * + * @author 罗伊 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface FieldBigDecimalValue { + int scale() default 2; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldDoc.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldDoc.java new file mode 100644 index 00000000..5c0bfde3 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldDoc.java @@ -0,0 +1,22 @@ +package net.lab1024.smartadmin.service.module.support.beanrecord.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * [ ] + * + * @author 罗伊 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface FieldDoc { + /** + * 本属性的注释信息 + * @return + */ + String value() default ""; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldEnumValue.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldEnumValue.java new file mode 100644 index 00000000..6a72a594 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldEnumValue.java @@ -0,0 +1,21 @@ +package net.lab1024.smartadmin.service.module.support.beanrecord.annotation; + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * [ ] + * + * @author 罗伊 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface FieldEnumValue { + + Class enumClass() default BaseEnum.class; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldSqlValue.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldSqlValue.java new file mode 100644 index 00000000..71c0f27f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/beanrecord/annotation/FieldSqlValue.java @@ -0,0 +1,36 @@ +package net.lab1024.smartadmin.service.module.support.beanrecord.annotation; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * [ ] + * + * @author 罗伊 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface FieldSqlValue { + + /** + * 关联字段名称 + * @return + */ + String relateColumn() default "id"; + + /** + * 关联显示的字段 + * @return + */ + String relateDisplayColumn() default ""; + /** + * 是否关联字段查询Mapper + * @return + */ + Class relateMapper() default BaseMapper.class; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/CaptchaController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/CaptchaController.java new file mode 100644 index 00000000..fed88483 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/CaptchaController.java @@ -0,0 +1,35 @@ +package net.lab1024.smartadmin.service.module.support.captcha; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.anno.NoNeedLogin; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.SupportBaseController; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.captcha.domain.CaptchaVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 图形验证码业务 路由 + * + * @author listen + * @date 2021/08/31 20:00 + */ +@Api(tags = SwaggerTagConst.Support.CAPTCHA) +@RestController +public class CaptchaController extends SupportBaseController { + + @Autowired + private CaptchaService captchaService; + + @NoNeedLogin + @ApiOperation("获取图形验证码 by listen") + @GetMapping("/captcha") + public ResponseDTO generateCaptcha() { + return captchaService.generateCaptcha(); + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/CaptchaService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/CaptchaService.java new file mode 100644 index 00000000..d2208632 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/CaptchaService.java @@ -0,0 +1,98 @@ +package net.lab1024.smartadmin.service.module.support.captcha; + +import com.google.code.kaptcha.impl.DefaultKaptcha; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.codeconst.EmployeeResponseCodeConst; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.common.constant.RedisKeyConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.captcha.domain.CaptchaVO; +import net.lab1024.smartadmin.service.third.SmartRedisService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.Base64Utils; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.util.Objects; +import java.util.UUID; + +/** + * 图形验证码 服务 + * + * @author 胡克 + * @date 2021/8/31 20:52 + */ +@Slf4j +@Service +public class CaptchaService { + + @Autowired + private DefaultKaptcha defaultKaptcha; + + @Autowired + private SmartRedisService redisService; + + /** + * 获取生成图形验证码 + * 默认 1 分钟有效期 + * + * @return + */ + public ResponseDTO generateCaptcha() { + String base64Code; + String captchaText = defaultKaptcha.createText(); + BufferedImage image = defaultKaptcha.createImage(captchaText); + try (ByteArrayOutputStream os = new ByteArrayOutputStream()) { + ImageIO.write(image, "jpg", os); + base64Code = Base64Utils.encodeToString(os.toByteArray()); + } catch (Exception e) { + log.error("verificationCode exception:", e); + return ResponseDTO.wrapMsg(ResponseCodeConst.SYSTEM_ERROR, "generate captcha error" ); + } + // uuid 唯一标识 + String uuid = UUID.randomUUID().toString().replace("-", CommonConst.EMPTY_STR); + + /** + * 返回验证码对象 + * 图片 base64格式 + * 默认有效时长 80s + */ + CaptchaVO captchaVO = new CaptchaVO(); + captchaVO.setCaptchaId(uuid); + captchaVO.setCaptchaImg("data:image/png;base64," + base64Code); + redisService.set(buildCaptchaRedisKey(uuid), captchaText, 80L); + return ResponseDTO.succData(captchaVO); + } + + /** + * 校验图形验证码 + * + * @param captchaId + * @param captcha + * @return + */ + public ResponseDTO checkCaptcha(String captchaId, String captcha) { + if (StringUtils.isBlank(captchaId) || StringUtils.isBlank(captcha)) { + return ResponseDTO.wrapMsg(EmployeeResponseCodeConst.ERROR_PARAM, "请输入正确验证码" ); + } + String redisKey = buildCaptchaRedisKey(captchaId); + String redisCode = redisService.get(redisKey); + if (StringUtils.isBlank(redisCode)) { + return ResponseDTO.wrapMsg(EmployeeResponseCodeConst.VERIFICATION_CODE_INVALID, "验证码错误或已过期,请刷新重试" ); + } + if (!Objects.equals(redisCode, captcha)) { + return ResponseDTO.wrapMsg(EmployeeResponseCodeConst.VERIFICATION_CODE_INVALID, "验证码错误或已过期,请刷新重试" ); + } + // 校验通过 移除 + redisService.del(redisKey); + return ResponseDTO.succ(); + } + + private String buildCaptchaRedisKey(String codeId) { + return RedisKeyConst.Base.CAPTCHA + codeId; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/domain/CaptchaDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/domain/CaptchaDTO.java new file mode 100644 index 00000000..927126b6 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/domain/CaptchaDTO.java @@ -0,0 +1,24 @@ +package net.lab1024.smartadmin.service.module.support.captcha.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * 图形验证码 VO + * + * @author 胡克 + * @date 2021/8/31 20:52 + */ +@Data +public class CaptchaDTO { + + @ApiModelProperty + @NotBlank(message = "验证码标识不能为空" ) + private String captchaId; + + @ApiModelProperty + @NotBlank(message = "验证码不能为空" ) + private String captcha; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/domain/CaptchaVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/domain/CaptchaVO.java new file mode 100644 index 00000000..8d66edc9 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/domain/CaptchaVO.java @@ -0,0 +1,20 @@ +package net.lab1024.smartadmin.service.module.support.captcha.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 图形验证码 VO + * + * @author 胡克 + * @date 2021/8/31 20:52 + */ +@Data +public class CaptchaVO { + + @ApiModelProperty("验证码标识" ) + private String captchaId; + + @ApiModelProperty("验证码图片" ) + private String captchaImg; +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaColor.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaColor.java similarity index 80% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaColor.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaColor.java index 4baeb2a2..5cc05edb 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaColor.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaColor.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.common.kaptcha; +package net.lab1024.smartadmin.service.module.support.captcha.render; import com.google.common.collect.Lists; @@ -9,14 +9,12 @@ import java.util.Random; /** * [ 验证码颜色 ] * - * @author yandanyang + * @author 罗伊 * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/6 0006 上午 10:51 + * * @since JDK1.8 */ -public class KaptchaColor { +public class CaptchaColor { public static Color getColor() { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaNoise.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaNoise.java similarity index 67% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaNoise.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaNoise.java index 22238a6c..eb429b81 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaNoise.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaNoise.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.common.kaptcha; +package net.lab1024.smartadmin.service.module.support.captcha.render; import com.google.code.kaptcha.NoiseProducer; import com.google.code.kaptcha.util.Configurable; @@ -10,15 +10,14 @@ import java.util.Random; /** * [ 验证码加噪处理 ] * - * @author yandanyang + * @author 罗伊 * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/6 0006 上午 10:47 + * * @since JDK1.8 */ -public class KaptchaNoise extends Configurable implements NoiseProducer { - public KaptchaNoise() { +public class CaptchaNoise extends Configurable implements NoiseProducer { + + public CaptchaNoise() { } @Override @@ -26,16 +25,16 @@ public class KaptchaNoise extends Configurable implements NoiseProducer { int width = image.getWidth(); int height = image.getHeight(); - Graphics2D graph = (Graphics2D)image.getGraphics(); + Graphics2D graph = (Graphics2D) image.getGraphics(); graph.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)); graph.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); Random random = new Random(); int noiseLineNum = random.nextInt(3); - if(noiseLineNum == 0){ + if (noiseLineNum == 0) { noiseLineNum = 1; } - for (int i = 0; i < noiseLineNum; i++){ - graph.setColor(KaptchaColor.getColor()); + for (int i = 0; i < noiseLineNum; i++) { + graph.setColor(CaptchaColor.getColor()); graph.drawLine(random.nextInt(width), random.nextInt(height), 10 + random.nextInt(20), 10 + random.nextInt(20)); } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaWordRenderer.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaWordRenderer.java similarity index 79% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaWordRenderer.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaWordRenderer.java index 38ff1b4c..6ec1b43c 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/kaptcha/KaptchaWordRenderer.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/captcha/render/CaptchaWordRenderer.java @@ -1,5 +1,6 @@ -package net.lab1024.smartadmin.common.kaptcha; +package net.lab1024.smartadmin.service.module.support.captcha.render; +import com.google.code.kaptcha.text.WordRenderer; import com.google.code.kaptcha.util.Configurable; import java.awt.*; @@ -11,16 +12,14 @@ import java.util.Random; /** * [ 验证码字体生成 ] * - * @author yandanyang + * @author 罗伊 * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/6 0006 上午 9:43 + * * @since JDK1.8 */ -public class KaptchaWordRenderer extends Configurable implements com.google.code.kaptcha.text.WordRenderer { +public class CaptchaWordRenderer extends Configurable implements WordRenderer { - public KaptchaWordRenderer() { + public CaptchaWordRenderer() { } @Override @@ -46,11 +45,11 @@ public class KaptchaWordRenderer extends Configurable implements com.google.code int widthNeeded = 0; int startPosX; - for(startPosX = 0; startPosX < wordChars.length; ++startPosX) { + for (startPosX = 0; startPosX < wordChars.length; ++ startPosX) { chosenFonts[startPosX] = fonts[random.nextInt(fonts.length)]; char[] charToDraw = new char[]{wordChars[startPosX]}; GlyphVector gv = chosenFonts[startPosX].createGlyphVector(frc, charToDraw); - charWidths[startPosX] = (int)gv.getVisualBounds().getWidth(); + charWidths[startPosX] = (int) gv.getVisualBounds().getWidth(); if (startPosX > 0) { widthNeeded += 2; } @@ -60,8 +59,8 @@ public class KaptchaWordRenderer extends Configurable implements com.google.code startPosX = (width - widthNeeded) / 2; - for(int i = 0; i < wordChars.length; ++i) { - g2D.setColor(KaptchaColor.getColor()); + for (int i = 0; i < wordChars.length; ++ i) { + g2D.setColor(CaptchaColor.getColor()); g2D.setFont(chosenFonts[i].deriveFont(Font.PLAIN)); char[] charToDraw = new char[]{wordChars[i]}; g2D.drawChars(charToDraw, 0, charToDraw.length, startPosX, startPosY); @@ -71,5 +70,4 @@ public class KaptchaWordRenderer extends Configurable implements com.google.code return image; } - } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerController.java new file mode 100644 index 00000000..e2f35514 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerController.java @@ -0,0 +1,37 @@ +package net.lab1024.smartadmin.service.module.support.datatracer; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerQueryForm; +import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:00 + */ + +@Api(tags = {SwaggerTagConst.Admin.MANAGER_DATA_TRACER}) +@RestController +public class DataTracerController extends AdminBaseController { + + @Autowired + private DataTracerService dataTracerService; + + @ApiOperation("分页查询业务操作日志 - by listen") + @PostMapping("/data/tracer/log/query") + public ResponseDTO> query(@Valid @RequestBody DataTracerQueryForm queryForm) { + return dataTracerService.query(queryForm); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerDao.java new file mode 100644 index 00000000..d376d1f5 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerDao.java @@ -0,0 +1,37 @@ +package net.lab1024.smartadmin.service.module.support.datatracer; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerEntity; +import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerQueryForm; +import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; +import java.util.List; +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:57 + */ +@Mapper +@Component +public interface DataTracerDao extends BaseMapper { + + /** + * 操作记录查询 + * @param businessId + * @param businessType + * @return + */ + List selectRecord(@Param("businessId") Long businessId, @Param("businessType") Integer businessType); + + /** + * 分页查询 + * @param page + * @param queryForm + * @return + */ + List query(Page page, @Param("query") DataTracerQueryForm queryForm); +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerManger.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerManger.java new file mode 100644 index 00000000..c33e3b8c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerManger.java @@ -0,0 +1,15 @@ +package net.lab1024.smartadmin.service.module.support.datatracer; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerEntity; +import org.springframework.stereotype.Service; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/8/23 11:04 + */ +@Service +public class DataTracerManger extends ServiceImpl { +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerService.java new file mode 100644 index 00000000..c44e1b37 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/DataTracerService.java @@ -0,0 +1,116 @@ +package net.lab1024.smartadmin.service.module.support.datatracer; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.datatracer.constant.DataTracerBusinessTypeEnum; +import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerDTO; +import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerEntity; +import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerQueryForm; +import net.lab1024.smartadmin.service.module.support.datatracer.domain.DataTracerVO; +import net.lab1024.smartadmin.service.util.SmartPageUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:00 + */ +@Slf4j +@Service +public class DataTracerService { + + @Autowired + private DataTracerDao dataTracerDao; + @Autowired + private DataTracerManger dataTracerManger; + + /** + * 保存操作日志 + * + * @param dataTracerDTO + * @param operatorId 操作人id + * @param operatorName 操作人名称 + */ + public void saveOperateRecord(DataTracerDTO dataTracerDTO, Long operatorId, String operatorName) { + DataTracerEntity dataTracerEntity = this.convertEntity(dataTracerDTO, operatorId, operatorName); + dataTracerDao.insert(dataTracerEntity); + } + + /** + * 批量保存 + * + * @param dataTracerList + * @param operatorId + * @param operatorName + */ + public void saveBatchOperateRecord(List dataTracerList, Long operatorId, String operatorName) { + if (CollectionUtils.isEmpty(dataTracerList)) { + return; + } + List recordEntityList = Lists.newArrayList(); + for (DataTracerDTO dataTracerDTO : dataTracerList) { + DataTracerEntity dataTracerEntity = this.convertEntity(dataTracerDTO, operatorId, operatorName); + recordEntityList.add(dataTracerEntity); + } + dataTracerManger.saveBatch(recordEntityList); + } + + /** + * dto 转实体对象 + * + * @param dataTracerDTO + * @param operatorId + * @param operatorName + * @return + */ + private DataTracerEntity convertEntity(DataTracerDTO dataTracerDTO, Long operatorId, String operatorName) { + DataTracerEntity recordEntity = new DataTracerEntity(); + recordEntity.setBusinessId(dataTracerDTO.getBusinessId()); + recordEntity.setBusinessType(dataTracerDTO.getBusinessType().getValue()); + recordEntity.setBusinessTypeDesc(dataTracerDTO.getBusinessType().getDesc()); + recordEntity.setOperateType((Integer) dataTracerDTO.getOperateType().getValue()); + recordEntity.setOperateTypeDesc(dataTracerDTO.getOperateType().getDesc()); + recordEntity.setOperateContent(dataTracerDTO.getOperateContent()); + recordEntity.setOperatorId(operatorId); + recordEntity.setOperatorName(operatorName); + if (dataTracerDTO.getExtraData() != null) { + recordEntity.setExtraData(JSON.toJSONString(dataTracerDTO.getExtraData())); + } + recordEntity.setCreateTime(dataTracerDTO.getOperateTime()); + return recordEntity; + } + + + /** + * 查询某个业务的所有的日志信息 + * + * @param businessId + * @param orderType + * @return + */ + public List selectRecord(Long businessId, DataTracerBusinessTypeEnum orderType) { + return dataTracerDao.selectRecord(businessId, orderType.getValue()); + } + + /** + * 分页查询 + * + * @param queryForm + * @return + */ + public ResponseDTO> query(DataTracerQueryForm queryForm) { + Page page = SmartPageUtil.convert2PageQuery(queryForm); + List list = dataTracerDao.query(page, queryForm); + PageResultDTO pageResult = SmartPageUtil.convert2PageResult(page, list); + return ResponseDTO.succData(pageResult); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/constant/DataTracerBusinessTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/constant/DataTracerBusinessTypeEnum.java new file mode 100644 index 00000000..319e7e32 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/constant/DataTracerBusinessTypeEnum.java @@ -0,0 +1,37 @@ +package net.lab1024.smartadmin.service.module.support.datatracer.constant; + + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +/** + * [ 数据业务类型 ] + * + * @author 罗伊 + * @date 2020/8/11 15:56 + */ +public enum DataTracerBusinessTypeEnum implements BaseEnum { + + NOTICE(1, "系统通知"), + + ; + + private Integer value; + + private String desc; + + DataTracerBusinessTypeEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDesc() { + return desc; + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/constant/DataTracerOperateTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/constant/DataTracerOperateTypeEnum.java new file mode 100644 index 00000000..0a6de70f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/constant/DataTracerOperateTypeEnum.java @@ -0,0 +1,42 @@ +package net.lab1024.smartadmin.service.module.support.datatracer.constant; + + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 17:04 + */ +public interface DataTracerOperateTypeEnum extends BaseEnum { + + Integer INIT_CODE = 4; + + enum Common implements BaseEnum { + SAVE(0, "保存"), + SAVE_SUBMIT(1, "保存并提交"), + UPDATE(2, "更新"), + UPDATE_SUBMIT(3, "更新并提交"), + DELETE(4, "删除"); + + private Integer value; + private String desc; + + Common(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDesc() { + return desc; + } + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerDTO.java new file mode 100644 index 00000000..920fdb19 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerDTO.java @@ -0,0 +1,48 @@ +package net.lab1024.smartadmin.service.module.support.datatracer.domain; + +import lombok.Data; +import net.lab1024.smartadmin.service.common.constant.BaseEnum; +import net.lab1024.smartadmin.service.module.support.datatracer.constant.DataTracerBusinessTypeEnum; + +import java.time.LocalDateTime; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 16:03 + */ +@Data +public class DataTracerDTO { + + /** + * 业务id + */ + private Long businessId; + + /** + * 业务类型 + */ + private DataTracerBusinessTypeEnum businessType; + + /** + * 操作类型 + */ + private BaseEnum operateType; + + /** + * 操作内容 + */ + private String operateContent; + + /** + * 操作时间 + */ + private LocalDateTime operateTime; + + /** + * 扩展信息 + */ + private DataTracerExtraDataDTO extraData; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerEntity.java new file mode 100644 index 00000000..2b2c5609 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerEntity.java @@ -0,0 +1,74 @@ +package net.lab1024.smartadmin.service.module.support.datatracer.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import net.lab1024.smartadmin.service.module.support.datatracer.constant.DataTracerBusinessTypeEnum; +import net.lab1024.smartadmin.service.module.support.datatracer.constant.DataTracerOperateTypeEnum; + +import java.time.LocalDateTime; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:01 + */ +@Data +@TableName("t_data_tracer") +public class DataTracerEntity { + + @TableId(type = IdType.AUTO) + private Long id; + /** + * 业务id + */ + private Long businessId; + /** + * 业务类型 + * {@link DataTracerBusinessTypeEnum} + */ + private Integer businessType; + + /** + * 业务类型描述 + * 因是死数据,只做展示使用故直接存类型描述信息 + */ + private String businessTypeDesc; + + /** + * 操作类型 + * {@link DataTracerOperateTypeEnum} + */ + private Integer operateType; + + private String operateTypeDesc; + + /** + * 操作内容 + */ + private String operateContent; + + /** + * 操作人 + */ + private Long operatorId; + + private String operatorName; + + /** + * 扩展数据 + */ + private String extraData; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerExtraDataDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerExtraDataDTO.java new file mode 100644 index 00000000..9f9e9dbe --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerExtraDataDTO.java @@ -0,0 +1,34 @@ +package net.lab1024.smartadmin.service.module.support.datatracer.domain; + +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 17:23 + */ +@Data +public class DataTracerExtraDataDTO { + + /** + * 对象所属类 + */ + private Class clazz; + + /** + * 原对象 + */ + private Object originObj; + + /** + * 新对象 + */ + private Object newObj; + + public DataTracerExtraDataDTO(Class clazz, Object originObj, Object newObj) { + this.clazz = clazz; + this.originObj = originObj; + this.newObj = newObj; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerQueryForm.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerQueryForm.java new file mode 100644 index 00000000..c61f5b4c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerQueryForm.java @@ -0,0 +1,28 @@ +package net.lab1024.smartadmin.service.module.support.datatracer.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; +import net.lab1024.smartadmin.service.common.validator.CheckEnum; +import net.lab1024.smartadmin.service.module.support.datatracer.constant.DataTracerBusinessTypeEnum; + +import javax.validation.constraints.NotNull; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/8/17 8:47 + */ +@Data +public class DataTracerQueryForm extends PageBaseDTO { + + @ApiModelPropertyEnum(DataTracerBusinessTypeEnum.class) + @CheckEnum(enumClazz = DataTracerBusinessTypeEnum.class, required = true, message = "业务类型错误") + private Integer businessType; + + @ApiModelProperty("业务id") + @NotNull(message = "业务id不能为空") + private Long businessId; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerVO.java new file mode 100644 index 00000000..443e8e0a --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/domain/DataTracerVO.java @@ -0,0 +1,46 @@ +package net.lab1024.smartadmin.service.module.support.datatracer.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; +import net.lab1024.smartadmin.service.module.support.datatracer.constant.DataTracerBusinessTypeEnum; + +import java.time.LocalDateTime; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 16:03 + */ +@Data +public class DataTracerVO { + + @ApiModelProperty("单据id") + private Long businessId; + + @ApiModelPropertyEnum(value = DataTracerBusinessTypeEnum.class, desc = "业务类型") + private Integer businessType; + + @ApiModelProperty("单据类型描述") + private String businessTypeDesc; + + @ApiModelProperty("操作类型") + private Integer operateType; + + @ApiModelProperty("操作类型描述") + private String operateTypeDesc; + + @ApiModelProperty("操作内容") + private String operateContent; + + @ApiModelProperty("操作人") + private Long operatorId; + + @ApiModelProperty("操作人名称") + private String operatorName; + + @ApiModelProperty("操作时间") + private LocalDateTime createTime; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/package-info.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/package-info.java new file mode 100644 index 00000000..23a9a288 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/datatracer/package-info.java @@ -0,0 +1,6 @@ +/** + * 数据跟踪(数据变更留痕) + * @author 卓大 + * @Date 2021/8/13 + */ +package net.lab1024.smartadmin.service.module.support.datatracer; \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/FileController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/FileController.java new file mode 100644 index 00000000..4f7fcc5f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/FileController.java @@ -0,0 +1,90 @@ +package net.lab1024.smartadmin.service.module.support.file; + +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.common.controller.SupportBaseController; +import net.lab1024.smartadmin.service.module.support.file.domain.FileFolderTypeEnum; +import net.lab1024.smartadmin.service.module.support.file.domain.dto.*; +import net.lab1024.smartadmin.service.module.support.file.domain.vo.FileUploadVO; +import net.lab1024.smartadmin.service.module.support.file.domain.vo.FileVO; +import net.lab1024.smartadmin.service.module.support.file.service.FileService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +/** + * @Description: 文件服务 + * @Author: 1024lab + */ +@RestController +@Api(tags = {SwaggerTagConst.Support.FILE}) +public class FileController extends SupportBaseController { + + @Autowired + private FileService fileService; + + @ApiOperation(value = "文件上传 by listen", notes = FileFolderTypeEnum.INFO) + @PostMapping("/file/upload/{folder}") + public ResponseDTO upload(MultipartFile file, @PathVariable Integer folder) { + return fileService.fileUpload(file, folder, 0L, null); + } + + @ApiOperation(value = "文件上传,通过url上传 by listen", notes = FileFolderTypeEnum.INFO) + @PostMapping("/file/upload/url") + public ResponseDTO uploadByUrl(@RequestBody @Valid FileUrlUploadDTO urlUploadDTO) { + return fileService.fileUpload(urlUploadDTO); + } + + @ApiOperation("获取文件URL:根据fileKey by listen") + @GetMapping("/file/url") + public ResponseDTO getUrl(@RequestParam String fileKey) { + return fileService.getFileUrl(fileKey); + } + + @ApiOperation("批量获取文件url:根据fileKey by listen") + @PostMapping("/file/url/query") + public ResponseDTO> getBatchFileUrl(@RequestBody @Valid FileUrlQueryDTO queryDTO) { + return fileService.getBatchFileUrl(queryDTO); + } + + @ApiOperation(value = "系统文件查询 by listen") + @PostMapping("/file/query") + public ResponseDTO> queryListByPage(@RequestBody @Valid FileQueryDTO queryDTO) { + return fileService.queryListByPage(queryDTO); + } + + @ApiOperation(value = "下载文件流(根据fileId) by listen") + @GetMapping("/file/downLoad/{id}") + public ResponseEntity downLoadById(@PathVariable Long id, HttpServletRequest request) throws IOException { + String ua = request.getHeader("User-Agent"); + return fileService.downLoadById(id, ua); + } + + @ApiOperation(value = "下载文件流(根据fileKey) by listen") + @GetMapping("/file/downLoad") + public ResponseEntity downLoad(String fileKey, HttpServletRequest request) { + String ua = request.getHeader("User-Agent"); + return fileService.downloadByFileKey(fileKey, ua); + } + + @ApiOperation("删除文件(根据fileKey) by listen") + @GetMapping("/file/delete") + public ResponseDTO deleteByFileKey(@RequestParam String fileKey) { + return fileService.deleteByFileKey(fileKey); + } + + @ApiOperation("根据文件服务和key 查询文件元数据 by listen") + @GetMapping("/file/query/metadata") + public ResponseDTO queryFileMetadata(@RequestParam String fileKey) { + return fileService.queryFileMetadata(fileKey); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/FileDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/FileDao.java new file mode 100644 index 00000000..54d74051 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/FileDao.java @@ -0,0 +1,44 @@ +package net.lab1024.smartadmin.service.module.support.file; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.lab1024.smartadmin.service.module.support.file.domain.FileEntity; +import net.lab1024.smartadmin.service.module.support.file.domain.dto.FileQueryDTO; +import net.lab1024.smartadmin.service.module.support.file.domain.vo.FileVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author listen + * @date 2018-01-05 上午 9:49 + */ +@Mapper +@Component +public interface FileDao extends BaseMapper { + + /** + * 文件key批量查询 + * @param fileKeyList + * @return + */ + List listByFileKeyList(@Param("fileKeyList") List fileKeyList); + + /** + * 文件key单个查询 + * @param fileKey + * @return + */ + FileVO getByFileKey(@Param("fileKey") String fileKey); + + /** + * 分页查询 + * @param page + * @param queryDTO + * @return + */ + List queryListByPage(Page page, @Param("query") FileQueryDTO queryDTO); + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/FileEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/FileEntity.java new file mode 100644 index 00000000..b993782f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/FileEntity.java @@ -0,0 +1,65 @@ +package net.lab1024.smartadmin.service.module.support.file.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:57 + */ +@Data +@TableName(value = "t_file") +public class FileEntity { + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 文件夹类型 + */ + private Integer folderType; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件大小 + */ + private Long fileSize; + + /** + * 文件key,用于文件下载 + */ + private String fileKey; + + /** + * 文件类型 + */ + private String fileType; + + /** + * 创建人,即上传人 + */ + private Long creatorId; + + /** + * 创建人 姓名 + */ + private String creatorName; + + private LocalDateTime updateTime; + + private LocalDateTime createTime; +} + diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/FileFolderTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/FileFolderTypeEnum.java new file mode 100644 index 00000000..1e2caa51 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/FileFolderTypeEnum.java @@ -0,0 +1,53 @@ +package net.lab1024.smartadmin.service.module.support.file.domain; + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; +import net.lab1024.smartadmin.service.common.constant.CommonConst; + +/** + * 文件服务 文件夹位置类型枚举类 + * + * @author listen + * @date 2019年10月11日 15:34:47 + */ +public enum FileFolderTypeEnum implements BaseEnum { + + COMMON(1, CommonConst.FileFolderConst.FOLDER_PUBLIC + "/common/", "通用"), + + /** + * folder 后续添加斜杠 + */ + ERP_STOCK(301, CommonConst.FileFolderConst.FOLDER_PUBLIC + "/help/", "erp货物"), + + ERP_CUSTOMER(302, CommonConst.FileFolderConst.FOLDER_PUBLIC + "/news/", "erp客商"), + + ; + + public static final String INFO = "201:erp货物"; + + private Integer value; + + private String folder; + + private String desc; + + FileFolderTypeEnum(Integer value, String folder, String desc) { + this.value = value; + this.folder = folder; + this.desc = desc; + } + + public String getFolder() { + return folder; + } + + @Override + public Integer getValue() { + return this.value; + } + + @Override + public String getDesc() { + return this.desc; + } +} + diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/FileDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileDTO.java similarity index 68% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/FileDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileDTO.java index 16491d85..69b6074c 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/FileDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileDTO.java @@ -1,7 +1,5 @@ -package net.lab1024.smartadmin.module.support.file.domain.dto; +package net.lab1024.smartadmin.service.module.support.file.domain.dto; -import net.lab1024.smartadmin.common.anno.ApiModelPropertyEnum; -import net.lab1024.smartadmin.module.support.file.constant.FileServiceTypeEnum; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,12 +8,8 @@ import java.sql.Date; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 + * @author 罗伊 + * @date 2020/8/25 11:57 */ @Data public class FileDTO { @@ -29,9 +23,6 @@ public class FileDTO { @ApiModelProperty("相关业务类型") private String moduleType; - @ApiModelPropertyEnum(FileServiceTypeEnum.class) - private Integer fileLocationType; - @ApiModelProperty("文件名称") private String fileName; diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileDownloadDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileDownloadDTO.java new file mode 100644 index 00000000..4930603c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileDownloadDTO.java @@ -0,0 +1,25 @@ +package net.lab1024.smartadmin.service.module.support.file.domain.dto; + +import lombok.Data; + +/** + * 文件下载DTO类 + * + * @author 胡克 + * @date 2020/2/4 15:30 + */ +@Data +public class FileDownloadDTO { + + /** + * 文件字节数据 + */ + private byte[] data; + + /** + * 文件元数据 + */ + private FileMetadataDTO metadata; + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileMetadataDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileMetadataDTO.java new file mode 100644 index 00000000..82cdcb73 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileMetadataDTO.java @@ -0,0 +1,28 @@ +package net.lab1024.smartadmin.service.module.support.file.domain.dto; + +import lombok.Data; + +/** + * 文件元数据 DTO 类 + * + * @author 胡克 + * @date 2020/1/16 17:35 + */ +@Data +public class FileMetadataDTO { + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件大小/字节 + */ + private Long fileSize; + + /** + * 文件格式 + */ + private String fileFormat; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileQueryDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileQueryDTO.java new file mode 100644 index 00000000..dbe227dc --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileQueryDTO.java @@ -0,0 +1,27 @@ +package net.lab1024.smartadmin.service.module.support.file.domain.dto; + +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; +import net.lab1024.smartadmin.service.common.validator.CheckEnum; +import net.lab1024.smartadmin.service.module.support.file.domain.FileFolderTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Description: 文件信息查询dto + * @Author: sbq + * @CreateDate: 2019/7/3 17:38 + * @Version: 1.0 + */ +@Data +public class FileQueryDTO extends PageBaseDTO { + + @ApiModelProperty(value = "文件名称") + private String fileName; + + @ApiModelProperty(value = "业务类型") + @ApiModelPropertyEnum(FileFolderTypeEnum.class) + @CheckEnum(enumClazz = FileFolderTypeEnum.class, message = "文件业务类型错误") + private Integer folderType; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlQueryDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlQueryDTO.java new file mode 100644 index 00000000..07b464ef --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlQueryDTO.java @@ -0,0 +1,25 @@ +package net.lab1024.smartadmin.service.module.support.file.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 文件 url 查询DTO + * + * @author 胡克 + * @date 2020/5/12 14:51 + */ +@AllArgsConstructor +@NoArgsConstructor +@Data +public class FileUrlQueryDTO { + + @ApiModelProperty("file key") + @NotEmpty(message = "file key not empty") + private List fileKeyList; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlResultDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlResultDTO.java new file mode 100644 index 00000000..c72c052c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlResultDTO.java @@ -0,0 +1,21 @@ +package net.lab1024.smartadmin.service.module.support.file.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 文件 url 查询DTO + * + * @author 胡克 + * @date 2020/5/12 14:51 + */ +@NoArgsConstructor +@AllArgsConstructor +@Data +public class FileUrlResultDTO { + + private String fileKey; + + private String fileUrl; +} \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlUploadDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlUploadDTO.java new file mode 100644 index 00000000..be5394ed --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/dto/FileUrlUploadDTO.java @@ -0,0 +1,39 @@ +package net.lab1024.smartadmin.service.module.support.file.domain.dto; + +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; +import net.lab1024.smartadmin.service.common.validator.CheckEnum; +import net.lab1024.smartadmin.service.module.support.file.domain.FileFolderTypeEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * url上传文件 DTO 类 + * + * @author listen + * @date 2020年3月16日 10:14:54 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class FileUrlUploadDTO { + + @ApiModelPropertyEnum(FileFolderTypeEnum.class) + @CheckEnum(enumClazz = FileFolderTypeEnum.class, required = true, message = "文件夹类型错误") + private Integer folder; + + @ApiModelProperty("文件url") + @NotBlank(message = "文件url不能为空") + private String fileUrl; + + @NotNull(message = "userId不能为空") + private Long userId; + + @NotBlank(message = "上传姓名不能为空") + private String userName; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileSimpleVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileSimpleVO.java new file mode 100644 index 00000000..7bfa4c79 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileSimpleVO.java @@ -0,0 +1,21 @@ +package net.lab1024.smartadmin.service.module.support.file.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 文件简单VO + * + * @author 善逸 + * @date 2019/10/23 11:15 + */ +@Data +public class FileSimpleVO { + + @ApiModelProperty("文件Key") + private String fileKey; + + @ApiModelProperty("文件Url") + private String fileUrl; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileUploadVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileUploadVO.java new file mode 100644 index 00000000..f0822832 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileUploadVO.java @@ -0,0 +1,32 @@ +package net.lab1024.smartadmin.service.module.support.file.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:57 + */ +@Data +public class FileUploadVO { + + @ApiModelProperty(value = "文件id") + private Long fileId; + + @ApiModelProperty(value = "文件名称") + private String fileName; + + @ApiModelProperty(value = "fileUrl") + private String fileUrl; + + @ApiModelProperty(value = "fileKey") + private String fileKey; + + @ApiModelProperty(value = "文件大小") + private Long fileSize; + + @ApiModelProperty(value = "文件类型") + private String fileType; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileVO.java new file mode 100644 index 00000000..e7c64cc9 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/domain/vo/FileVO.java @@ -0,0 +1,45 @@ +package net.lab1024.smartadmin.service.module.support.file.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; +import net.lab1024.smartadmin.service.module.support.file.domain.FileFolderTypeEnum; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:57 + */ +@Data +public class FileVO { + + @ApiModelProperty("主键") + private Long id; + + + @ApiModelProperty("存储文件夹类型") + @ApiModelPropertyEnum(FileFolderTypeEnum.class) + private Integer folderType; + + @ApiModelProperty("文件名称") + private String fileName; + + @ApiModelProperty("文件大小") + private Integer fileSize; + + @ApiModelProperty("文件类型") + private String fileType; + + @ApiModelProperty("文件路径") + private String fileKey; + + @ApiModelProperty("上传人") + private Long creatorId; + + @ApiModelProperty("上传人") + private String creatorName; + + @ApiModelProperty("文件展示url") + private String fileUrl; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileService.java new file mode 100644 index 00000000..420107ee --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileService.java @@ -0,0 +1,334 @@ +package net.lab1024.smartadmin.service.module.support.file.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.Lists; +import net.lab1024.smartadmin.service.common.codeconst.FileResponseCodeConst; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.common.constant.RedisKeyConst; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.file.FileDao; +import net.lab1024.smartadmin.service.module.support.file.domain.FileEntity; +import net.lab1024.smartadmin.service.module.support.file.domain.FileFolderTypeEnum; +import net.lab1024.smartadmin.service.module.support.file.domain.dto.*; +import net.lab1024.smartadmin.service.module.support.file.domain.vo.FileUploadVO; +import net.lab1024.smartadmin.service.module.support.file.domain.vo.FileVO; +import net.lab1024.smartadmin.service.third.SmartRedisService; +import net.lab1024.smartadmin.service.util.SmartBaseEnumUtil; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import net.lab1024.smartadmin.service.util.SmartPageUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.IOException; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:57 + */ +@Service +public class FileService { + + @Resource + private IFileStorageService fileStorageService; + + @Autowired + private FileDao fileDao; + + @Autowired + private SmartRedisService redisService; + + @Value("${spring.servlet.multipart.max-file-size}") + private String maxFileSize; + + /** + * 文件上传服务:通过 url 上传 + * + * @param urlUploadDTO + * @return + */ + public ResponseDTO fileUpload(FileUrlUploadDTO urlUploadDTO) { + try { + URL url = new URL(urlUploadDTO.getFileUrl()); + URLConnection urlConnection = url.openConnection(); + // 获取文件格式 + String contentType = urlConnection.getContentType(); + String fileType = fileStorageService.getFileTypeByContentType(contentType); + // 生成文件key + String fileKey = fileStorageService.generateFileNameByType(fileType); + MockMultipartFile file = new MockMultipartFile(fileKey, fileKey, contentType, urlConnection.getInputStream()); + return this.fileUpload(file, urlUploadDTO.getFolder(), urlUploadDTO.getUserId(), urlUploadDTO.getUserName()); + } catch (IOException e) { + return ResponseDTO.wrap(FileResponseCodeConst.UPLOAD_ERROR); + } + } + + /** + * 文件上传服务 + * + * @param file + * @param folderType 文件夹类型 + * @return + */ + public ResponseDTO fileUpload(MultipartFile file, Integer folderType, Long userId, String userName) { + FileFolderTypeEnum folderTypeEnum = SmartBaseEnumUtil.getEnumByValue(folderType, FileFolderTypeEnum.class); + if (null == folderTypeEnum) { + return ResponseDTO.wrap(FileResponseCodeConst.FILE_MODULE_ERROR); + } + if (null == file || file.getSize() == 0) { + return ResponseDTO.wrap(FileResponseCodeConst.FILE_EMPTY); + } + // 校验文件名称 + String originalFilename = file.getOriginalFilename(); + if (StringUtils.isBlank(originalFilename) || originalFilename.length() > CommonConst.NumberLimit.FILE_NAME) { + return ResponseDTO.wrap(FileResponseCodeConst.FILE_NAME_ERROR); + } + // 校验文件大小 + String maxSizeStr = maxFileSize.toLowerCase().replace("mb", ""); + long maxSize = Integer.parseInt(maxSizeStr) * 1024 * 1024L; + if (file.getSize() > maxSize) { + return ResponseDTO.wrapMsg(FileResponseCodeConst.FILE_SIZE_ERROR, String.format(FileResponseCodeConst.FILE_SIZE_ERROR.getMsg(), maxSize)); + } + // 获取文件服务 + ResponseDTO response = fileStorageService.fileUpload(file, folderTypeEnum.getFolder()); + + if (response.isSuccess()) { + // 上传成功 保存记录数据库 + FileUploadVO uploadVO = response.getData(); + + FileEntity fileEntity = new FileEntity(); + fileEntity.setFolderType(folderTypeEnum.getValue()); + fileEntity.setFileName(originalFilename); + fileEntity.setFileSize(file.getSize()); + fileEntity.setFileKey(uploadVO.getFileKey()); + fileEntity.setFileType(uploadVO.getFileType()); + fileEntity.setCreatorId(userId); + fileEntity.setCreatorName(userName); + fileDao.insert(fileEntity); + uploadVO.setFileId(fileEntity.getId()); + //添加缓存 + String redisKey = RedisKeyConst.Base.FILE_URL + uploadVO.getFileKey(); + redisService.set(redisKey, uploadVO.getFileUrl(), CommonConst.System.FILE_URL_EXPIRE_SECOND); + + String fileRedisKey = RedisKeyConst.Base.FILE_VO + uploadVO.getFileKey(); + FileVO fileVO = SmartBeanUtil.copy(fileEntity, FileVO.class); + redisService.set(fileRedisKey, fileVO, CommonConst.System.FILE_VO_EXPIRE_SECOND); + } + + return response; + } + + public List getFileList(List fileKeyList) { + if (CollectionUtils.isEmpty(fileKeyList)) { + return Lists.newArrayList(); + } + List fileVOList = Lists.newArrayList(); + fileKeyList.forEach(e -> { + FileVO fileVO = this.getCacheFileVO(e); + if (fileVO != null) { + fileVOList.add(fileVO); + } + }); + return fileVOList; + } + + private FileVO getCacheFileVO(String fileKey) { + String redisKey = RedisKeyConst.Base.FILE_VO + fileKey; + FileVO fileVO = redisService.getObject(redisKey, FileVO.class); + if (fileVO == null) { + fileVO = fileDao.getByFileKey(fileKey); + if (fileVO != null) { + redisService.set(redisKey, fileVO, CommonConst.System.FILE_VO_EXPIRE_SECOND); + } + } + + fileVO.setFileUrl(this.getCacheUrl(fileKey)); + return fileVO; + } + + /** + * 根据文件绝对路径 获取文件URL + * 支持单个 key 逗号分隔的形式 + * + * @param fileKey + * @return + */ + public ResponseDTO getFileUrl(String fileKey) { + if (StringUtils.isBlank(fileKey)) { + return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM); + } + // 处理逗号分隔的字符串 + List stringList = Arrays.asList(fileKey.split(CommonConst.SEPARATOR)); + stringList = stringList.stream().map(e -> this.getCacheUrl(e)).collect(Collectors.toList()); + String result = StringUtils.join(stringList, CommonConst.SEPARATOR_CHAR); + return ResponseDTO.succData(result); + } + + + private String getCacheUrl(String fileKey) { + String redisKey = RedisKeyConst.Base.FILE_URL + fileKey; + String fileUrl = redisService.get(redisKey); + if (null != fileUrl) { + return fileUrl; + } + ResponseDTO responseDTO = fileStorageService.getFileUrl(fileKey); + if (!responseDTO.isSuccess()) { + return null; + } + fileUrl = responseDTO.getData(); + redisService.set(redisKey, fileUrl, CommonConst.System.FILE_URL_EXPIRE_SECOND); + return fileUrl; + } + + + /** + * 批量获取文件url + * 支持单个 key 逗号分隔的形式 + * + * @param queryDTO + * @return + */ + public ResponseDTO> getBatchFileUrl(FileUrlQueryDTO queryDTO) { + // 获取文件服务 + List fileKeyList = queryDTO.getFileKeyList(); + List resultDTOList = fileKeyList.stream().map(fileKey -> { + // 处理逗号分隔的字符串 + List stringList = Arrays.asList(fileKey.split(CommonConst.SEPARATOR)); + stringList = stringList.stream().map(e -> fileStorageService.getFileUrl(e).getData()).collect(Collectors.toList()); + String result = StringUtils.join(stringList, CommonConst.SEPARATOR_CHAR); + return new FileUrlResultDTO(fileKey, result); + }).collect(Collectors.toList()); + + return ResponseDTO.succData(resultDTOList); + } + + /** + * 分页查询文件列表 + * + * @param queryDTO + * @return + */ + public ResponseDTO> queryListByPage(FileQueryDTO queryDTO) { + Page page = SmartPageUtil.convert2PageQuery(queryDTO); + List fileList = fileDao.queryListByPage(page, queryDTO); + if (CollectionUtils.isNotEmpty(fileList)) { + fileList.forEach(e -> { + // 根据文件服务类 获取对应文件服务 查询 url + e.setFileUrl(fileStorageService.getFileUrl(e.getFileKey()).getData()); + }); + } + PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page, fileList); + return ResponseDTO.succData(pageResultDTO); + } + + /** + * 根据文件服务类型 和 FileKey 下载文件 + * + * @param fileKey + * @return + * @throws IOException + */ + public ResponseEntity downloadByFileKey(String fileKey, String userAgent) { + // 根据文件服务类 获取对应文件服务 查询 url + ResponseDTO responseDTO = fileStorageService.fileDownload(fileKey); + if (!responseDTO.isSuccess()) { + HttpHeaders heads = new HttpHeaders(); + heads.add(HttpHeaders.CONTENT_TYPE, "text/html;charset=UTF-8"); + return new ResponseEntity<>(responseDTO.getMsg() + ":" + fileKey, heads, HttpStatus.OK); + } + // 设置下载头 + HttpHeaders heads = new HttpHeaders(); + heads.add(HttpHeaders.CONTENT_TYPE, "application/octet-stream; charset=utf-8"); + // 设置对应浏览器的文件名称编码 + FileDownloadDTO fileDownloadDTO = responseDTO.getData(); + FileMetadataDTO metadata = fileDownloadDTO.getMetadata(); + String fileName = null != metadata ? metadata.getFileName() : fileKey.substring(fileKey.lastIndexOf("/")); + fileName = fileStorageService.getDownloadFileNameByUA(fileName, userAgent); + heads.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + fileName); + ResponseEntity responseEntity = new ResponseEntity<>(fileDownloadDTO.getData(), heads, HttpStatus.OK); + return responseEntity; + } + + /** + * 根据id 下载文件 + * + * @param id + * @return + */ + public ResponseEntity downLoadById(Long id, String userAgent) throws IOException { + FileEntity entity = fileDao.selectById(id); + if (null == entity) { + HttpHeaders heads = new HttpHeaders(); + heads.add(HttpHeaders.CONTENT_TYPE, "text/html;charset=UTF-8"); + return new ResponseEntity<>("文件不存在", heads, HttpStatus.OK); + } + + // 根据文件服务类 获取对应文件服务 查询 url + ResponseEntity responseEntity = this.downloadByFileKey(entity.getFileKey(), userAgent); + return responseEntity; + } + + /** + * 根据文件服务和key 删除 + * + * @param fileKey + * @return + */ + public ResponseDTO deleteByFileKey(String fileKey) { + if (StringUtils.isBlank(fileKey)) { + return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM); + } + FileEntity fileEntity = new FileEntity(); + fileEntity.setFileKey(fileKey); + fileEntity = fileDao.selectOne(new QueryWrapper<>(fileEntity)); + if (null == fileEntity) { + return ResponseDTO.wrap(FileResponseCodeConst.FILE_NOT_EXIST); + } + // 根据文件服务类 获取对应文件服务 删除文件 + return fileStorageService.delete(fileKey); + } + + /** + * 根据文件服务和key 查询文件元数据 + * + * @param fileKey + * @return + */ + public ResponseDTO queryFileMetadata(String fileKey) { + if (StringUtils.isBlank(fileKey)) { + return ResponseDTO.wrap(FileResponseCodeConst.FILE_NOT_EXIST); + } + // 查询数据库文件记录 + FileEntity fileEntity = new FileEntity(); + fileEntity.setFileKey(fileKey); + fileEntity = fileDao.selectOne(new QueryWrapper<>(fileEntity)); + if (null == fileEntity) { + return ResponseDTO.wrap(FileResponseCodeConst.FILE_NOT_EXIST); + } + + // 返回 meta + FileMetadataDTO metadataDTO = new FileMetadataDTO(); + metadataDTO.setFileSize(fileEntity.getFileSize()); + metadataDTO.setFileName(fileEntity.getFileName()); + metadataDTO.setFileFormat(fileEntity.getFileType()); + return ResponseDTO.succData(metadataDTO); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileStorageCloudServiceImpl.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileStorageCloudServiceImpl.java new file mode 100644 index 00000000..52901b91 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileStorageCloudServiceImpl.java @@ -0,0 +1,208 @@ +package net.lab1024.smartadmin.service.module.support.file.service; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.S3Object; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.codeconst.FileResponseCodeConst; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.config.SmartStorageCloudConfig; +import net.lab1024.smartadmin.service.module.support.file.domain.dto.FileDownloadDTO; +import net.lab1024.smartadmin.service.module.support.file.domain.dto.FileMetadataDTO; +import net.lab1024.smartadmin.service.module.support.file.domain.vo.FileUploadVO; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:57 + */ +@Slf4j +@ConditionalOnProperty(prefix = "file.storage", name = {"mode"}, havingValue = "cloud") +public class FileStorageCloudServiceImpl implements IFileStorageService { + + @Autowired + private AmazonS3 amazonS3; + + @Autowired + private SmartStorageCloudConfig cloudConfig; + + /** + * 自定义元数据 文件名称 + */ + private static final String USER_METADATA_FILE_NAME = "file-name"; + + /** + * 自定义元数据 文件格式 + */ + private static final String USER_METADATA_FILE_FORMAT = "file-format"; + + /** + * 自定义元数据 文件大小 + */ + private static final String USER_METADATA_FILE_SIZE = "file-size"; + + @Override + public ResponseDTO fileUpload(MultipartFile file, String path) { + // 设置文件 key + String originalFilename = file.getOriginalFilename(); + String fileType = this.getFileType(originalFilename); + String fileKey = path + this.generateFileName(originalFilename); + // 文件名称 URL 编码 + String urlEncoderFilename; + try { + urlEncoderFilename = URLEncoder.encode(originalFilename, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + log.error("阿里云文件上传服务URL ENCODE-发生异常:", e); + return ResponseDTO.wrap(FileResponseCodeConst.UPLOAD_ERROR); + } + ObjectMetadata meta = new ObjectMetadata(); + meta.setContentEncoding(StandardCharsets.UTF_8.name()); + meta.setContentDisposition("attachment;filename=" + urlEncoderFilename); + Map userMetadata = new HashMap(10); + userMetadata.put(USER_METADATA_FILE_NAME, urlEncoderFilename); + userMetadata.put(USER_METADATA_FILE_FORMAT, fileType); + userMetadata.put(USER_METADATA_FILE_SIZE, String.valueOf(file.getSize())); + meta.setUserMetadata(userMetadata); + meta.setContentLength(file.getSize()); + meta.setContentType(this.getContentType(fileType)); + try { + amazonS3.putObject(cloudConfig.getBucketName(), fileKey, file.getInputStream(), meta); + } catch (IOException e) { + log.error("文件上传-发生异常:", e); + return ResponseDTO.wrap(FileResponseCodeConst.UPLOAD_ERROR); + } + // 根据文件路径获取并设置访问权限 + CannedAccessControlList acl = this.getACL(path); + amazonS3.setObjectAcl(cloudConfig.getBucketName(), fileKey, acl); + // 返回上传结果 + FileUploadVO uploadVO = new FileUploadVO(); + uploadVO.setFileName(originalFilename); + uploadVO.setFileType(fileType); + // 根据 访问权限 返回不同的 URL + String url = cloudConfig.getPublicUrl() + fileKey; + if (CannedAccessControlList.Private.equals(acl)) { + // 获取临时访问的URL + url = this.getFileUrl(fileKey).getData(); + } + uploadVO.setFileUrl(url); + uploadVO.setFileKey(fileKey); + uploadVO.setFileSize(file.getSize()); + return ResponseDTO.succData(uploadVO); + } + + /** + * 获取文件url + * + * @param fileKey + * @return + */ + @Override + public ResponseDTO getFileUrl(String fileKey) { + if (StringUtils.isBlank(fileKey)) { + return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM); + } + if (!fileKey.startsWith(CommonConst.FileFolderConst.FOLDER_PRIVATE)) { + // 不是私有的 都公共读 + return ResponseDTO.succData(cloudConfig.getPublicUrl() + fileKey); + } + Date expiration = new Date(System.currentTimeMillis() + cloudConfig.getUrlExpire()); + URL url = amazonS3.generatePresignedUrl(cloudConfig.getBucketName(), fileKey, expiration); + String urlStr = url.toString().replace("http://", "https://"); + return ResponseDTO.succData(urlStr); + } + + /** + * 流式下载(名称为原文件) + */ + @Override + public ResponseDTO fileDownload(String key) { + //获取oss对象 + S3Object s3Object = amazonS3.getObject(cloudConfig.getBucketName(), key); + // 获取文件 meta + ObjectMetadata metadata = s3Object.getObjectMetadata(); + Map userMetadata = metadata.getUserMetadata(); + FileMetadataDTO metadataDTO = null; + if (MapUtils.isNotEmpty(userMetadata)) { + metadataDTO = new FileMetadataDTO(); + metadataDTO.setFileFormat(userMetadata.get(USER_METADATA_FILE_FORMAT)); + metadataDTO.setFileName(userMetadata.get(USER_METADATA_FILE_NAME)); + String fileSizeStr = userMetadata.get(USER_METADATA_FILE_SIZE); + Long fileSize = StringUtils.isBlank(fileSizeStr) ? null : Long.valueOf(fileSizeStr); + metadataDTO.setFileSize(fileSize); + } + + // 获得输入流 + InputStream objectContent = s3Object.getObjectContent(); + try { + // 输入流转换为字节流 + byte[] buffer = FileCopyUtils.copyToByteArray(objectContent); + + FileDownloadDTO fileDownloadDTO = new FileDownloadDTO(); + fileDownloadDTO.setData(buffer); + fileDownloadDTO.setMetadata(metadataDTO); + return ResponseDTO.succData(fileDownloadDTO); + } catch (IOException e) { + log.error("文件下载-发生异常:", e); + return ResponseDTO.wrap(FileResponseCodeConst.DOWNLOAD_ERROR); + } finally { + try { + // 关闭输入流 + objectContent.close(); + s3Object.close(); + } catch (IOException e) { + log.error("文件下载-发生异常:", e); + } + } + } + + /** + * 根据文件夹路径 返回对应的访问权限 + * + * @param fileKey + * @return + */ + private CannedAccessControlList getACL(String fileKey) { + // 公用读 + if (fileKey.contains(CommonConst.FileFolderConst.FOLDER_PUBLIC)) { + return CannedAccessControlList.PublicRead; + } + // 其他默认私有读写 + return CannedAccessControlList.Private; + } + + /** + * 单个删除文件 + * 根据 file key 删除文件 + * ps:不能删除fileKey不为空的文件夹 + * + * @param fileKey 文件or文件夹 + * @return + */ + @Override + public ResponseDTO delete(String fileKey) { + amazonS3.deleteObject(cloudConfig.getBucketName(), fileKey); + return ResponseDTO.succ(); + } + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileStorageLocalServiceImpl.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileStorageLocalServiceImpl.java new file mode 100644 index 00000000..cf9d620c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/FileStorageLocalServiceImpl.java @@ -0,0 +1,144 @@ +package net.lab1024.smartadmin.service.module.support.file.service; + +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.codeconst.FileResponseCodeConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.file.domain.dto.FileDownloadDTO; +import net.lab1024.smartadmin.service.module.support.file.domain.vo.FileUploadVO; +import net.lab1024.smartadmin.service.module.support.systemconfig.SystemConfigConst; +import net.lab1024.smartadmin.service.module.support.systemconfig.SystemConfigService; +import org.apache.commons.io.FileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:57 + */ + +@Slf4j +@ConditionalOnProperty(prefix = "file.storage", name = {"mode"}, havingValue = "local") +public class FileStorageLocalServiceImpl implements IFileStorageService { + + @Value("${file.storage.local.path}") + private String localPath; + @Autowired + private SystemConfigService systemConfigService; + + @Override + public ResponseDTO fileUpload(MultipartFile multipartFile, String path) { + if (null == multipartFile) { + return ResponseDTO.wrap(FileResponseCodeConst.FILE_EMPTY); + } + String filePath = localPath + path; + File directory = new File(filePath); + if (!directory.exists()) { + // 目录不存在,新建 + directory.mkdirs(); + } + if (!path.endsWith("/")) { + path = path + "/"; + } + FileUploadVO fileUploadVO = new FileUploadVO(); + //原文件名 + String originalFileName = multipartFile.getOriginalFilename(); + //新文件名 + String newFileName = this.generateFileName(originalFileName); + //生成文件key + String fileKey = path + newFileName; + //创建文件 + File fileTemp = new File(new File(filePath + newFileName).getAbsolutePath()); + try { + multipartFile.transferTo(fileTemp); + fileUploadVO.setFileUrl(this.generateFileUrl(fileKey)); + fileUploadVO.setFileName(newFileName); + fileUploadVO.setFileKey(fileKey); + fileUploadVO.setFileSize(multipartFile.getSize()); + fileUploadVO.setFileType(FileUtils.getExtension(originalFileName)); + } catch (IOException e) { + if (fileTemp.exists() && fileTemp.isFile()) { + fileTemp.delete(); + } + log.error("", e); + return ResponseDTO.wrap(FileResponseCodeConst.UPLOAD_ERROR); + } + return ResponseDTO.succData(fileUploadVO); + } + + /** + * 生成fileUrl地址 + * + * @param fileKey + * @return + */ + public String generateFileUrl(String fileKey) { + String configValue = systemConfigService.getConfigValue(SystemConfigConst.Key.LOCAL_UPLOAD_URL_PREFIX); + String fileUrl = configValue + fileKey; + return fileUrl; + } + + /** + * 获取文件Url + * @param fileKey + * @return + */ + @Override + public ResponseDTO getFileUrl(String fileKey) { + String fileUrl = this.generateFileUrl(fileKey); + return ResponseDTO.succData(fileUrl); + } + + /** + * 文件下载 + * @param fileKey + * @return + */ + @Override + public ResponseDTO fileDownload(String fileKey) { + String filePath = localPath + fileKey; + File localFile = new File(filePath); + InputStream in = null; + try { + in = new FileInputStream(localFile); + // 输入流转换为字节流 + byte[] buffer = FileCopyUtils.copyToByteArray(in); + FileDownloadDTO fileDownloadDTO = new FileDownloadDTO(); + fileDownloadDTO.setData(buffer); + return ResponseDTO.succData(fileDownloadDTO); + } catch (IOException e) { + log.error("文件下载-发生异常:", e); + return ResponseDTO.wrap(FileResponseCodeConst.DOWNLOAD_ERROR); + } finally { + try { + // 关闭输入流 + if (in != null) { + in.close(); + } + } catch (IOException e) { + log.error("文件下载-发生异常:", e); + } + } + } + + @Override + public ResponseDTO delete(String fileKey) { + String filePath = localPath + fileKey; + File localFile = new File(filePath); + try { + FileUtils.forceDelete(localFile); + } catch (IOException e) { + log.error("删除本地文件失败:{}", e); + } + return ResponseDTO.succ(); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/IFileStorageService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/IFileStorageService.java new file mode 100644 index 00000000..683e4e64 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/file/service/IFileStorageService.java @@ -0,0 +1,310 @@ +package net.lab1024.smartadmin.service.module.support.file.service; + +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.file.domain.dto.FileDownloadDTO; +import net.lab1024.smartadmin.service.module.support.file.domain.vo.FileUploadVO; +import net.lab1024.smartadmin.service.util.date.SmartDateFormatterEnum; +import net.lab1024.smartadmin.service.util.date.SmartLocalDateUtil; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.net.URLEncoder; +import java.nio.charset.Charset; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.UUID; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/8/25 11:57 + */ +public interface IFileStorageService { + + /** + * 文件上传 + * @param file + * @param path + * @return + */ + ResponseDTO fileUpload(MultipartFile file, String path); + + /** + * 获取文件url + * + * @param fileKey + * @return + */ + ResponseDTO getFileUrl(String fileKey); + + /** + * 流式下载(名称为原文件) + * @param key + * @return + */ + ResponseDTO fileDownload(String key); + + + /** + * 单个删除文件 + * @param fileKey + * @return + */ + ResponseDTO delete(String fileKey); + + + /** + * 不带后缀名的文件名 + * + * @param file + * @return + */ + default String getNameWithoutExtension(String file) { + String fileName = new File(file).getName(); + int dotIndex = fileName.lastIndexOf('.'); + return (dotIndex == -1) ? fileName : fileName.substring(0, dotIndex); + } + + /** + * 判断指定目录的文件是否存在 + * @param filePath + * @return + */ + default boolean isFileExist(String filePath) { + File file = new File(filePath); + return file.exists(); + } + + /** + * 验证文件是否存在,如果不存在则抛出异常 + * + * @param filePath + * @throws IOException + */ + default void isFileExistThrowException(String filePath) throws IOException { + File file = new File(filePath); + if (!file.exists()) { + throw new FileNotFoundException(filePath); + } + } + + /** + * 文件流读取 + * @param file + * @param charset + * @return + * @throws FileNotFoundException + */ + default BufferedReader newBufferedReader(File file, Charset charset) throws FileNotFoundException { + return new BufferedReader(new InputStreamReader(new FileInputStream(file), charset)); + } + + /** + * 文件写 + * @param file + * @param charset + * @return + * @throws FileNotFoundException + */ + default BufferedWriter newBufferedWriter(File file, Charset charset) throws FileNotFoundException { + return new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), charset)); + } + + /** + * 创建文件所在目录 + * @param file + * @return + * @throws IOException + */ + default boolean createParentDirs(File file) throws IOException { + File parent = file.getCanonicalFile().getParentFile(); + if (parent == null) { + return false; + } + return parent.mkdirs(); + } + + default boolean createNotExistParentDirFile(File file) throws IOException { + boolean createParentDirsRes = createParentDirs(file); + if (!createParentDirsRes) { + throw new IOException("cannot create parent Directory of " + file.getName()); + } + return file.createNewFile(); + } + + /** + * 生成文件名字 + * 当前年月日时分秒 +32位 uuid + 文件格式后缀 + * + * @param originalFileName + * @return String + */ + default String generateFileName(String originalFileName) { + String time = SmartLocalDateUtil.format(LocalDateTime.now(), SmartDateFormatterEnum.YMDHMS); + String uuid = UUID.randomUUID().toString().replaceAll("-", ""); + String fileType = FileUtils.getExtension(originalFileName); + return time + uuid + "." + fileType; + } + + /** + * 根据文件类型 生成文件名 + * @param fileType + * @return + */ + default String generateFileNameByType(String fileType) { + String uuid = UUID.randomUUID().toString().replaceAll("-", ""); + String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHH")); + return uuid + time + "." + fileType; + } + + /** + * 获取文件类型 + * + * @param originalFileName + * @return + */ + default String getFileType(String originalFileName) { + return originalFileName.substring(originalFileName.lastIndexOf(".") + 1); + } + + /** + * 获取文件格式 + * + * @param fileName + * @return 返回内容:png、mp4 等 + */ + default String getFormat(String fileName) { + if (StringUtils.isBlank(fileName)) { + return null; + } + int index = fileName.lastIndexOf("."); + if (index == -1) { + return null; + } + return fileName.substring(index + 1); + } + + /** + * 获取文件类型 + * + * @param fileExt + * @return + */ + default String getContentType(String fileExt) { + // 文件的后缀名 + if ("bmp".equalsIgnoreCase(fileExt)) { + return "image/bmp"; + } + if ("gif".equalsIgnoreCase(fileExt)) { + return "image/gif"; + } + if ("jpeg".equalsIgnoreCase(fileExt) || "jpg".equalsIgnoreCase(fileExt)) { + return "image/jpeg"; + } + if ("png".equalsIgnoreCase(fileExt)) { + return "image/png"; + } + if ("html".equalsIgnoreCase(fileExt)) { + return "text/html"; + } + if ("txt".equalsIgnoreCase(fileExt)) { + return "text/plain"; + } + if ("vsd".equalsIgnoreCase(fileExt)) { + return "application/vnd.visio"; + } + if ("ppt".equalsIgnoreCase(fileExt) || "pptx".equalsIgnoreCase(fileExt)) { + return "application/vnd.ms-powerpoint"; + } + if ("doc".equalsIgnoreCase(fileExt) || "docx".equalsIgnoreCase(fileExt)) { + return "application/msword"; + } + if ("pdf".equalsIgnoreCase(fileExt)) { + return "application/pdf"; + } + if ("xml".equalsIgnoreCase(fileExt)) { + return "text/xml"; + } + return ""; + } + + /** + * 获取文件格式 根据 content-type + * + * @param contentType + * @return + */ + default String getFileTypeByContentType(String contentType) { + // 文件的后缀名 + if ("image/bmp".equalsIgnoreCase(contentType)) { + return "bmp"; + } + if ("image/gif".equalsIgnoreCase(contentType)) { + return "gif"; + } + if ("image/jpeg".equalsIgnoreCase(contentType) || "image/jpg".equalsIgnoreCase(contentType)) { + return "jpg"; + } + if ("image/png".equalsIgnoreCase(contentType)) { + return "png"; + } + if ("text/html".equalsIgnoreCase(contentType)) { + return "html"; + } + if ("text/plain".equalsIgnoreCase(contentType)) { + return "txt"; + } + if ("application/vnd.visio".equalsIgnoreCase(contentType)) { + return "vsd"; + } + if ("application/vnd.ms-powerpoint".equalsIgnoreCase(contentType)) { + return "pptx"; + } + if ("application/msword".equalsIgnoreCase(contentType)) { + return "docx"; + } + if ("application/pdf".equalsIgnoreCase(contentType)) { + return "pdf"; + } + if ("text/xml".equalsIgnoreCase(contentType)) { + return "xml"; + } + return ""; + } + + /** + * 根据不同的浏览器 返回对应编码的文件名称 + * + * @param fileName + * @param userAgent + * @return + */ + default String getDownloadFileNameByUA(String fileName, String userAgent) { + try { + if (userAgent.toLowerCase().indexOf("firefox") > 0) { + // firefox浏览器 + fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); + } else if (userAgent.toUpperCase().indexOf("MSIE") > 0) { + // IE浏览器 + fileName = URLEncoder.encode(fileName, "UTF-8"); + } else if (userAgent.toUpperCase().indexOf("EDGE") > 0) { + // WIN10浏览器 + fileName = URLEncoder.encode(fileName, "UTF-8"); + } else if (userAgent.toUpperCase().indexOf("CHROME") > 0) { + // 谷歌 + fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); + } else { + //万能乱码问题解决 + fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); + } + } catch (UnsupportedEncodingException e) { + return null; + } + return fileName; + } + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatController.java new file mode 100644 index 00000000..83f53d06 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatController.java @@ -0,0 +1,31 @@ +package net.lab1024.smartadmin.service.module.support.heartbeat; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.common.controller.SupportBaseController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + + +@Api(tags = {SwaggerTagConst.Support.HEART_BEAT}) +@RestController +public class HeartBeatController extends SupportBaseController { + + @Autowired + private HeartBeatService heartBeatService; + + @PostMapping("/heartBeat/query") + @ApiOperation("查询心跳记录 @author 卓大") + public ResponseDTO> query(@RequestBody @Valid PageBaseDTO pageBaseDTO) { + return heartBeatService.pageQuery(pageBaseDTO); + } + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatRecordDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordDao.java similarity index 80% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatRecordDao.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordDao.java index e10c8e8c..5d6ef4b3 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatRecordDao.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordDao.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.support.heartbeat; +package net.lab1024.smartadmin.service.module.support.heartbeat; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -10,11 +10,11 @@ import java.util.Date; import java.util.List; /** - * 心跳日志数据库操作 - * - * @author : simajinqiang - * Date: 2018/7/9 - * Time: 17:37 + * + * [ ] + * + * @author 罗伊 + * @date */ @Component @Mapper @@ -43,10 +43,10 @@ public interface HeartBeatRecordDao extends BaseMapper { */ HeartBeatRecordEntity query(HeartBeatRecordEntity heartBeatRecordEntity); - /** - * 分页查询心跳记录 + * 分页查询 + * @param pageQueryInfo * @return */ - List pageQuery(Page page); + List pageQuery(Page pageQueryInfo); } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatRecordEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordEntity.java similarity index 52% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatRecordEntity.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordEntity.java index 694eb936..b8b70afc 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatRecordEntity.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordEntity.java @@ -1,21 +1,39 @@ -package net.lab1024.smartadmin.module.support.heartbeat; +package net.lab1024.smartadmin.service.module.support.heartbeat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; import lombok.Data; import java.io.Serializable; import java.util.Date; /** - * 心跳记录日志 - * User: simajinqiang - * Date: 2018/7/9 - * Time: 11:11 + * + * [ ] + * + * @author 罗伊 + * @date */ @Data @TableName(value = "t_heart_beat_record") -public class HeartBeatRecordEntity extends BaseEntity implements Serializable { +public class HeartBeatRecordEntity implements Serializable { + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 创建时间 + */ + private Date createTime; /** * 项目名字 diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordHandler.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordHandler.java new file mode 100644 index 00000000..47ccbac5 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordHandler.java @@ -0,0 +1,37 @@ +package net.lab1024.smartadmin.service.module.support.heartbeat; + +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.module.support.heartbeat.core.HeartBeatRecordDTO; +import net.lab1024.smartadmin.service.module.support.heartbeat.core.IHeartBeatRecordHandler; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * [ ] + * + * @author 罗伊 + */ +@Slf4j +@Service +public class HeartBeatRecordHandler implements IHeartBeatRecordHandler { + + @Autowired + private HeartBeatRecordDao heartBeatRecordDao; + + /** + * 心跳日志处理方法 + * @param heartBeatRecordDTO + */ + @Override + public void handler(HeartBeatRecordDTO heartBeatRecordDTO) { + HeartBeatRecordEntity heartBeatRecordEntity = SmartBeanUtil.copy(heartBeatRecordDTO, HeartBeatRecordEntity.class); + HeartBeatRecordEntity heartBeatRecordOld = heartBeatRecordDao.query(heartBeatRecordEntity); + if (heartBeatRecordOld == null) { + heartBeatRecordDao.insertHeartBeat(heartBeatRecordEntity); + } else { + heartBeatRecordDao.updateHeartBeatTimeById(heartBeatRecordOld.getId(), heartBeatRecordEntity.getHeartBeatTime()); + } + } + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatRecordVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordVO.java similarity index 81% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatRecordVO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordVO.java index 34e98932..85ed58c6 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatRecordVO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatRecordVO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.support.heartbeat; +package net.lab1024.smartadmin.service.module.support.heartbeat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -7,10 +7,11 @@ import java.io.Serializable; import java.util.Date; /** - * 心跳记录日志 - * User: simajinqiang - * Date: 2018/7/9 - * Time: 11:11 + * + * [ ] + * + * @author 罗伊 + * @date */ @Data public class HeartBeatRecordVO implements Serializable { diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatService.java new file mode 100644 index 00000000..657a24ec --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/HeartBeatService.java @@ -0,0 +1,33 @@ +package net.lab1024.smartadmin.service.module.support.heartbeat; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.util.SmartPageUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * [ ] + * + * @author 罗伊 + */ +@Slf4j +@Service +public class HeartBeatService { + + @Autowired + private HeartBeatRecordDao heartBeatRecordDao; + + + public ResponseDTO> pageQuery(PageBaseDTO pageBaseDTO) { + Page pageQueryInfo = SmartPageUtil.convert2PageQuery(pageBaseDTO); + List recordVOList = heartBeatRecordDao.pageQuery(pageQueryInfo); + PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(pageQueryInfo, recordVOList); + return ResponseDTO.succData(pageResultDTO); + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/AbstractHeartBeatCommand.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/AbstractHeartBeatManager.java similarity index 78% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/AbstractHeartBeatCommand.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/AbstractHeartBeatManager.java index c62fbc3d..77b6aee6 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/AbstractHeartBeatCommand.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/AbstractHeartBeatManager.java @@ -1,17 +1,23 @@ -package net.lab1024.smartadmin.common.heartbeat; +package net.lab1024.smartadmin.service.module.support.heartbeat.core; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import net.lab1024.smartadmin.service.util.SmartIPUtil; +import org.apache.commons.lang3.StringUtils; + import java.util.Date; import java.util.List; -import java.util.concurrent.*; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; /** * @Description: 心跳服务 -* @Author: simajinqiang +* @Author: 1024lab * @Date: 2018/7/9 16:26 */ -public abstract class AbstractHeartBeatCommand implements HeartBeatRecordCommendInterface { +public abstract class AbstractHeartBeatManager { ScheduledExecutorService executorService; @@ -50,7 +56,7 @@ public abstract class AbstractHeartBeatCommand implements HeartBeatRecordCommend public void handlerHeartBeat(){ try { projectPath = HeatBeatRecordHelper.getProjectPath(); - serverIps = IpUtil.getLocalIPS(); + serverIps = SmartIPUtil.getLocalHostIPList(); processNo = HeatBeatRecordHelper.getProcessID(); processStartTime = HeatBeatRecordHelper.getStartTime(); }catch (Throwable e){ @@ -75,7 +81,7 @@ public abstract class AbstractHeartBeatCommand implements HeartBeatRecordCommend try { HeartBeatRecordDTO heartBeatRecord = new HeartBeatRecordDTO(); heartBeatRecord.setProjectPath(projectPath); - heartBeatRecord.setServerIp(StringUtil.join(serverIps,";")); + heartBeatRecord.setServerIp(StringUtils.join(serverIps,";")); heartBeatRecord.setProcessNo(processNo); heartBeatRecord.setProcessStartTime(processStartTime); heartBeatRecord.setHeartBeatTime(new Date()); @@ -87,4 +93,6 @@ public abstract class AbstractHeartBeatCommand implements HeartBeatRecordCommend } } + abstract void handler(HeartBeatRecordDTO heartBeatRecord); + } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatConfig.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatConfig.java similarity index 54% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatConfig.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatConfig.java index 3fa1ed84..6667449c 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatConfig.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatConfig.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.common.heartbeat; +package net.lab1024.smartadmin.service.module.support.heartbeat.core; import lombok.Builder; import lombok.Data; @@ -6,12 +6,8 @@ import lombok.Data; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/8 0008 下午 16:22 - * @since JDK1.8 + * @author 罗伊 + * */ @Data @Builder diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatLogger.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatLogger.java new file mode 100644 index 00000000..b9ba2291 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatLogger.java @@ -0,0 +1,15 @@ +package net.lab1024.smartadmin.service.module.support.heartbeat.core; + +/** + * [ ] + * + * @author 罗伊 + */ +public interface HeartBeatLogger { + + void error(String string); + + void error(String string, Throwable e); + + void info(String string); +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatManager.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatManager.java new file mode 100644 index 00000000..6919ea93 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatManager.java @@ -0,0 +1,54 @@ +package net.lab1024.smartadmin.service.module.support.heartbeat.core; + +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.PreDestroy; + +/** + * [ ] + * + * @author 罗伊 + */ +@Slf4j +public class HeartBeatManager extends AbstractHeartBeatManager { + + private IHeartBeatRecordHandler heartBeatRecordHandler; + + /** + * @param delayHandlerTime 延迟执行时间 + * @param intervalTime 间隔执行时间 + */ + public HeartBeatManager(Long delayHandlerTime, Long intervalTime, IHeartBeatRecordHandler heartBeatRecordHandler) { + HeartBeatConfig config = HeartBeatConfig.builder().delayHandlerTime(delayHandlerTime).intervalTime(intervalTime).build(); + super.init(config, new HeartBeatLogger() { + @Override + public void error(String string) { + log.error(string); + } + + @Override + public void error(String string, Throwable e) { + log.error(string, e); + } + + @Override + public void info(String string) { + log.info(string); + } + }); + this.heartBeatRecordHandler = heartBeatRecordHandler; + } + + + @PreDestroy + @Override + public void destroy() { + super.destroy(); + } + + @Override + public void handler(HeartBeatRecordDTO heartBeatRecordDTO) { + heartBeatRecordHandler.handler(heartBeatRecordDTO); + } + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatRecordDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatRecordDTO.java similarity index 84% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatRecordDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatRecordDTO.java index b5f4e499..ac72c174 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatRecordDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeartBeatRecordDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.common.heartbeat; +package net.lab1024.smartadmin.service.module.support.heartbeat.core; import lombok.Data; @@ -6,7 +6,7 @@ import java.util.Date; /** * @Description: 心跳记录日志 -* @Author: simajinqiang +* @Author: 1024lab * @Date: 2018/7/9 11:11 */ @Data diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeatBeatRecordHelper.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeatBeatRecordHelper.java similarity index 73% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeatBeatRecordHelper.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeatBeatRecordHelper.java index ce3b04f7..60def1c7 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeatBeatRecordHelper.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/HeatBeatRecordHelper.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.common.heartbeat; +package net.lab1024.smartadmin.service.module.support.heartbeat.core; import java.lang.management.ManagementFactory; @@ -6,14 +6,15 @@ import java.lang.management.RuntimeMXBean; import java.util.Date; /** -* @Description: 心跳工具类 -* @Author: simajinqiang -* @Date: 2018/7/9 11:48 -*/ + * @Description: 心跳工具类 + * @Author: 1024lab + * @Date: 2018/7/9 11:48 + */ public class HeatBeatRecordHelper { /** * 获取进程号 + * * @return */ public static final Integer getProcessID() { @@ -24,22 +25,22 @@ public class HeatBeatRecordHelper { /** * 获取项目名称 + * * @return */ - public static final String getProjectPath(){ + public static final String getProjectPath() { return System.getProperty("user.dir"); } /** * 获取进程启动时间 + * * @return */ - public static final Date getStartTime(){ + public static final Date getStartTime() { RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); return new Date(runtimeMXBean.getStartTime()); } - - } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/IHeartBeatRecordHandler.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/IHeartBeatRecordHandler.java new file mode 100644 index 00000000..e7a4342e --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/heartbeat/core/IHeartBeatRecordHandler.java @@ -0,0 +1,16 @@ +package net.lab1024.smartadmin.service.module.support.heartbeat.core; + +/** + * [ ] + * + * @author 罗伊 + */ +public interface IHeartBeatRecordHandler { + + /** + * 心跳日志处理方法 + * + * @param recordDTO + */ + void handler(HeartBeatRecordDTO recordDTO); +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorController.java new file mode 100644 index 00000000..196ce638 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorController.java @@ -0,0 +1,39 @@ +package net.lab1024.smartadmin.service.module.support.idgenerator; + +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.common.controller.SupportBaseController; +import net.lab1024.smartadmin.service.module.support.idgenerator.constant.IdGeneratorEnum; +import net.lab1024.smartadmin.service.util.SmartBaseEnumUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +/** + * id生成器路由 + * + * @author listen + * @date 2019/09/26 21:13 + */ +@Api(tags = SwaggerTagConst.Support.ID_GENERATOR) +@RestController +public class IdGeneratorController extends SupportBaseController { + + @Autowired + private IdGeneratorService idGeneratorService; + + @ApiOperation("生成id") + @GetMapping("/id/generator/{generatorId}") + public ResponseDTO generate(@PathVariable Integer generatorId) { + IdGeneratorEnum idGeneratorEnum = SmartBaseEnumUtil.getEnumByValue(generatorId, IdGeneratorEnum.class); + if (null == idGeneratorEnum) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "IdGenerator,不存在" + generatorId); + } + return idGeneratorService.generate(idGeneratorEnum); + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorDao.java new file mode 100644 index 00000000..32a35ef9 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorDao.java @@ -0,0 +1,32 @@ +package net.lab1024.smartadmin.service.module.support.idgenerator; + +import net.lab1024.smartadmin.service.module.support.idgenerator.domain.IdGeneratorEntity; +import net.lab1024.smartadmin.service.module.support.idgenerator.domain.IdGeneratorRecordDTO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * zhuo + */ +@Mapper +@Component +public interface IdGeneratorDao { + + List selectAll(); + + int replaceIdGeneratorRecord(@Param("generatorId") Integer generatorId, + @Param("year") int year, + @Param("month") int month, + @Param("day") int day, + @Param("lastNumber") Long lastNumber, + @Param("count") long count); + + IdGeneratorRecordDTO selectHistoryLastNumber(@Param("generatorId") Integer generatorId, + @Param("year") int year, + @Param("month") int month, + @Param("day") int day); + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorService.java new file mode 100644 index 00000000..a987f49a --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/IdGeneratorService.java @@ -0,0 +1,147 @@ +package net.lab1024.smartadmin.service.module.support.idgenerator; + +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.RedisKeyConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.idgenerator.constant.IdGeneratorEnum; +import net.lab1024.smartadmin.service.module.support.idgenerator.constant.IdGeneratorRuleTypeEnum; +import net.lab1024.smartadmin.service.module.support.idgenerator.domain.IdGeneratorEntity; +import net.lab1024.smartadmin.service.module.support.idgenerator.domain.IdGeneratorRecordDTO; +import net.lab1024.smartadmin.service.third.SmartRedisService; +import net.lab1024.smartadmin.service.util.SmartRandomUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 全局id生成器 + * zhuo + */ +@Slf4j +@Service +public class IdGeneratorService { + + private static final int MAX_GET_LOCK_COUNT = 5; + + private static final long SLEEP_MILLISECONDS = 500L; + + private static volatile long lastSleepMilliSeconds = SLEEP_MILLISECONDS; + + private ConcurrentHashMap idGeneratorMap; + + @Autowired + private IdGeneratorDao idGeneratorDao; + + @Autowired + private SmartRedisService redisService; + + @PostConstruct + void init() { + List idGeneratorEntityList = idGeneratorDao.selectAll(); + idGeneratorMap = idGeneratorEntityList.stream().collect(Collectors.toMap(IdGeneratorEntity::getId, Function.identity(), (x, y) -> y, ConcurrentHashMap::new)); + } + + /** + * id 生成器 + * + * @param idGeneratorEnum + * @return + */ + public ResponseDTO generate(IdGeneratorEnum idGeneratorEnum) { + int generatorId = idGeneratorEnum.getId(); + IdGeneratorEntity idGeneratorEntity = this.idGeneratorMap.get(generatorId); + if (null == idGeneratorEntity) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "IdGenerator, 生成器 不存在" + generatorId); + } + + LocalDateTime now = LocalDateTime.now(); + int year = now.getYear(); + int monthValue = now.getMonthValue(); + int dayOfMonth = now.getDayOfMonth(); + + String lockKey = RedisKeyConst.Base.ID_GENERATOR + idGeneratorEnum.getKeyName(); + + try { + boolean lock = false; + + for (int i = 0; i < MAX_GET_LOCK_COUNT; i++) { + try { + //60秒 + lock = redisService.getLock(lockKey, 60 * 1000L); + if (lock) { + break; + } + Thread.sleep(Math.max(SLEEP_MILLISECONDS, lastSleepMilliSeconds)); + } catch (Throwable e) { + log.error(e.getMessage(), e); + } + } + + if (!lock) { + return ResponseDTO.wrap(ResponseCodeConst.BUSINESS_HANDING); + } + + long beginTime = System.currentTimeMillis(); + + IdGeneratorRecordDTO generatorRecordDTO = idGeneratorDao.selectHistoryLastNumber(generatorId, year, monthValue, dayOfMonth); + if (generatorRecordDTO == null) { + generatorRecordDTO = new IdGeneratorRecordDTO(); + generatorRecordDTO.setGeneratorId(generatorId); + generatorRecordDTO.setYear(year); + generatorRecordDTO.setMonth(monthValue); + generatorRecordDTO.setDay(dayOfMonth); + generatorRecordDTO.setLastNumber(idGeneratorEntity.getInitNumber()); + generatorRecordDTO.setCount(0L); + generatorRecordDTO.setUpdateTime(now); + } + + Long lastNumber = generatorRecordDTO.getLastNumber(); + IdGeneratorRuleTypeEnum ruleTypeEnum = this.getIdGeneratorRuleTypeEnum(idGeneratorEntity.getRuleType()); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(ruleTypeEnum.getExt()); + String nowFormat = now.format(formatter); + if (IdGeneratorRuleTypeEnum.YEAR_CYCLE == ruleTypeEnum || IdGeneratorRuleTypeEnum.MONTH_CYCLE == ruleTypeEnum || IdGeneratorRuleTypeEnum.DAY_CYCLE == ruleTypeEnum) { + if (!Objects.equals(generatorRecordDTO.getUpdateTime().format(formatter), nowFormat)) { + lastNumber = idGeneratorEntity.getInitNumber(); + } + } + + lastNumber += SmartRandomUtil.nextInt(1, idGeneratorEntity.getStepRandomRange()); + long count = generatorRecordDTO.getCount() + 1; + idGeneratorDao.replaceIdGeneratorRecord(generatorId, year, monthValue, dayOfMonth, lastNumber, count); + + // 格式化num 不足位数则补零 + int minLength = idGeneratorEntity.getMinLength(); + minLength = minLength <= 0 ? 1 : minLength; + // 补位 + String finalId = String.format("%0" + minLength + "d", lastNumber); + String prefix = StringUtils.isBlank(idGeneratorEntity.getPrefix()) ? StringUtils.EMPTY : idGeneratorEntity.getPrefix(); + + lastSleepMilliSeconds = System.currentTimeMillis() - beginTime + 100; + return ResponseDTO.succData(prefix + nowFormat + finalId); + } catch (Throwable e) { + log.error(e.getMessage(), e); + throw e; + } finally { + redisService.unLock(lockKey); + } + } + + private IdGeneratorRuleTypeEnum getIdGeneratorRuleTypeEnum(String ruleType) { + for (IdGeneratorRuleTypeEnum en : IdGeneratorRuleTypeEnum.values()) { + if (en.name().equalsIgnoreCase(ruleType)) { + return en; + } + } + return null; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/constant/IdGeneratorEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/constant/IdGeneratorEnum.java new file mode 100644 index 00000000..0b3c1b5b --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/constant/IdGeneratorEnum.java @@ -0,0 +1,45 @@ +package net.lab1024.smartadmin.service.module.support.idgenerator.constant; + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +/** + * @author Administrator + */ + +public enum IdGeneratorEnum implements BaseEnum { + + + ; + + private Integer id; + + private String keyName; + + IdGeneratorEnum(int id, String keyName) { + this.id = id; + this.keyName = keyName; + } + + @Override + public String toString() { + return "IdGeneratorEnum{" + "id=" + id + ", keyName='" + keyName + '\'' + '}'; + } + + public int getId() { + return id; + } + + public String getKeyName() { + return keyName; + } + + @Override + public Integer getValue() { + return id; + } + + @Override + public String getDesc() { + return null; + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/constant/IdGeneratorRuleTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/constant/IdGeneratorRuleTypeEnum.java similarity index 64% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/constant/IdGeneratorRuleTypeEnum.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/constant/IdGeneratorRuleTypeEnum.java index c2dad2da..7e6217e9 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/constant/IdGeneratorRuleTypeEnum.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/constant/IdGeneratorRuleTypeEnum.java @@ -1,14 +1,9 @@ -package net.lab1024.smartadmin.module.support.idgenerator.constant; +package net.lab1024.smartadmin.service.module.support.idgenerator.constant; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/8 0008 下午 13:43 - * @since JDK1.8 + * @author 罗伊 */ public enum IdGeneratorRuleTypeEnum { /** diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorEntity.java new file mode 100644 index 00000000..8c95d9ce --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorEntity.java @@ -0,0 +1,68 @@ +package net.lab1024.smartadmin.service.module.support.idgenerator.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @Auther: 卓大 + * @Date: 2018/8/7 0007 13:33 + * @Description: + */ +@Data +@TableName("t_id_generator") +public class IdGeneratorEntity implements Serializable { + + private static final long serialVersionUID = 5582354131134766548L; + + /** + * 主键id + * + * @see net.lab1024.smartadmin.service.module.support.idgenerator.constant.IdGeneratorEnum + */ + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 英文key + */ + private String keyName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 最低补位长度 + */ + private Integer minLength; + + /** + * 类型 + */ + private String ruleType; + + /** + * 初始值 + */ + private Long initNumber; + + /** + * 步长随机数范围 + */ + private Integer stepRandomRange; + + /** + * 备注 + */ + private String remark; + + private LocalDateTime updateTime; + + private LocalDateTime createTime; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorLastNumberDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorLastNumberDTO.java new file mode 100644 index 00000000..c7466658 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorLastNumberDTO.java @@ -0,0 +1,17 @@ +package net.lab1024.smartadmin.service.module.support.idgenerator.domain; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @Auther: 罗伊 + * @Date: 2018/8/7 0007 13:33 + * @Description: + */ +@Data +public class IdGeneratorLastNumberDTO { + private LocalDateTime updateTime; + private Long lastNumber; + private LocalDateTime databaseTime; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorRecordDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorRecordDTO.java new file mode 100644 index 00000000..9ed744fb --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/idgenerator/domain/IdGeneratorRecordDTO.java @@ -0,0 +1,31 @@ +package net.lab1024.smartadmin.service.module.support.idgenerator.domain; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @Auther: 罗伊 + * @Date: 2018/8/7 0007 13:33 + * @Description: + */ +@Data +public class IdGeneratorRecordDTO { + + private Integer generatorId; + + private Integer year; + + private Integer month; + + private Integer day; + + private Long lastNumber; + + private Long count; + + private LocalDateTime updateTime; + + private LocalDateTime createTime; + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/OperateLog.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLog.java similarity index 50% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/OperateLog.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLog.java index 31dd3683..6d2c1b70 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/OperateLog.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLog.java @@ -1,16 +1,13 @@ -package net.lab1024.smartadmin.common.anno; +package net.lab1024.smartadmin.service.module.support.operatelog; import java.lang.annotation.*; /** + * * [ 用户操作日志 ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. + * @author 罗伊 * @date - * @since JDK1.8 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogController.java new file mode 100644 index 00000000..c3f0c487 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogController.java @@ -0,0 +1,44 @@ +package net.lab1024.smartadmin.service.module.support.operatelog; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.SupportBaseController; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.operatelog.domain.dto.OperateLogDTO; +import net.lab1024.smartadmin.service.module.support.operatelog.domain.dto.OperateLogQueryDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * [ ] + * + * @author 罗伊 + */ +@RestController +@Api(tags = {SwaggerTagConst.Support.USER_OPERATE_LOG}) +public class OperateLogController extends SupportBaseController { + + @Autowired + private OperateLogService operateLogService; + + @ApiOperation(value = "分页查询 @author 罗伊") + @PostMapping("/userOperateLog/page/query") + public ResponseDTO> queryByPage(@RequestBody OperateLogQueryDTO queryDTO) { + return operateLogService.queryByPage(queryDTO); + } + + @ApiOperation(value = "删除 @author 罗伊") + @GetMapping("/userOperateLog/delete/{id}") + public ResponseDTO delete(@PathVariable("id") Long id) { + return operateLogService.delete(id); + } + + + @ApiOperation(value = "详情 @author 罗伊") + @GetMapping("/userOperateLog/detail/{id}") + public ResponseDTO detail(@PathVariable("id") Long id) { + return operateLogService.detail(id); + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogDao.java similarity index 51% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailDao.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogDao.java index 76a7dea5..6184761b 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailDao.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogDao.java @@ -1,9 +1,9 @@ -package net.lab1024.smartadmin.module.business.email; +package net.lab1024.smartadmin.service.module.support.operatelog; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.module.business.email.domain.dto.EmailQueryDTO; -import net.lab1024.smartadmin.module.business.email.domain.entity.EmailEntity; +import net.lab1024.smartadmin.service.module.support.operatelog.domain.OperateLogEntity; +import net.lab1024.smartadmin.service.module.support.operatelog.domain.dto.OperateLogQueryDTO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; @@ -13,35 +13,33 @@ import java.util.List; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019-05-13 17:10:16 - * @since JDK1.8 + * @author 罗伊 */ @Mapper @Component -public interface EmailDao extends BaseMapper { +public interface OperateLogDao extends BaseMapper { /** * 分页查询 + * * @param queryDTO - * @return EmailEntity - */ - List queryByPage(Page page, @Param("queryDTO") EmailQueryDTO queryDTO); + * @return UserOperateLogEntity + */ + List queryByPage(Page page, @Param("queryDTO") OperateLogQueryDTO queryDTO); /** * 根据id删除 + * * @param id * @return - */ + */ void deleteById(@Param("id") Long id); /** * 批量删除 + * * @param idList * @return - */ + */ void deleteByIds(@Param("idList") List idList); } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogService.java new file mode 100644 index 00000000..aaf8c08e --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/OperateLogService.java @@ -0,0 +1,86 @@ +package net.lab1024.smartadmin.service.module.support.operatelog; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.operatelog.domain.dto.OperateLogDTO; +import net.lab1024.smartadmin.service.module.support.operatelog.domain.OperateLogEntity; +import net.lab1024.smartadmin.service.module.support.operatelog.domain.dto.OperateLogQueryDTO; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import net.lab1024.smartadmin.service.util.SmartPageUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * [ ] + * + * @author 罗伊 + */ +@Service +public class OperateLogService { + + @Autowired + private OperateLogDao operateLogDao; + + /** + * @author 罗伊 + * @description 分页查询 + * @date 2019-05-15 11:32:14 + */ + public ResponseDTO> queryByPage(OperateLogQueryDTO queryDTO) { + Page page = SmartPageUtil.convert2PageQuery(queryDTO); + List entities = operateLogDao.queryByPage(page, queryDTO); + List dtoList = SmartBeanUtil.copyList(entities, OperateLogDTO.class); + page.setRecords(dtoList); + PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page); + return ResponseDTO.succData(pageResultDTO); + } + + /** + * @author 罗伊 + * @description 添加 + * @date 2019-05-15 11:32:14 + */ + public ResponseDTO add(OperateLogDTO addDTO) { + OperateLogEntity entity = SmartBeanUtil.copy(addDTO, OperateLogEntity.class); + operateLogDao.insert(entity); + return ResponseDTO.succ(); + } + + /** + * @author 罗伊 + * @description 编辑 + * @date 2019-05-15 11:32:14 + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO update(OperateLogDTO updateDTO) { + OperateLogEntity entity = SmartBeanUtil.copy(updateDTO, OperateLogEntity.class); + operateLogDao.updateById(entity); + return ResponseDTO.succ(); + } + + /** + * @author 罗伊 + * @description 删除 + * @date 2019-05-15 11:32:14 + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO delete(Long id) { + operateLogDao.deleteById(id); + return ResponseDTO.succ(); + } + + /** + * @author 罗伊 + * @description 根据ID查询 + * @date 2019-05-15 11:32:14 + */ + public ResponseDTO detail(Long id) { + OperateLogEntity entity = operateLogDao.selectById(id); + OperateLogDTO dto = SmartBeanUtil.copy(entity, OperateLogDTO.class); + return ResponseDTO.succData(dto); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/SmartOperateLogAspect.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/SmartOperateLogAspect.java new file mode 100644 index 00000000..67e64b10 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/SmartOperateLogAspect.java @@ -0,0 +1,273 @@ +package net.lab1024.smartadmin.service.module.support.operatelog; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lab1024.smartadmin.service.module.support.operatelog.domain.dto.SmartOperateLogConfigDTO; +import net.lab1024.smartadmin.service.module.support.operatelog.domain.dto.SmartOperateLogUserDTO; +import net.lab1024.smartadmin.service.module.support.operatelog.domain.OperateLogEntity; +import net.lab1024.smartadmin.service.third.SmartApplicationContext; +import net.lab1024.smartadmin.service.util.SmartStringUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.annotation.AnnotationUtils; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.reflect.Method; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * [ 操作日志记录处理,对所有OperateLog注解的Controller进行操作日志监控 ] + * + * @author 罗伊 + */ +@Slf4j +@Aspect +public class SmartOperateLogAspect { + + private static final String pointCut = "@within(org.springframework.web.bind.annotation.RestController) || @within(org.springframework.stereotype.Controller)"; + + private SmartOperateLogConfigDTO smartLogConfig; + + /** + * 线程池 + */ + private ThreadPoolTaskExecutor taskExecutor; + + /** + * 构造方法 + */ + public SmartOperateLogAspect(SmartOperateLogConfigDTO smartOperateLogConfigDTO) { + smartLogConfig = smartOperateLogConfigDTO; + this.initThread(smartLogConfig); + } + + @Pointcut(pointCut) + public void logPointCut() { + } + + @AfterReturning(pointcut = "logPointCut()") + public void doAfterReturning(JoinPoint joinPoint) { + handleLog(joinPoint, null); + } + + @AfterThrowing(value = "logPointCut()", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Exception e) { + handleLog(joinPoint, e); + } + + /** + * 初始化线程池 + */ + private void initThread(SmartOperateLogConfigDTO configDTO) { + int corePoolSize = Runtime.getRuntime().availableProcessors(); + if (null != configDTO.getCorePoolSize()) { + corePoolSize = configDTO.getCorePoolSize(); + } + taskExecutor = new ThreadPoolTaskExecutor(); + //线程初始化 + taskExecutor.initialize(); + // 设置核心线程数 + taskExecutor.setCorePoolSize(corePoolSize); + // 设置最大线程数 + taskExecutor.setMaxPoolSize(corePoolSize * 2); + // 设置队列容量 + taskExecutor.setQueueCapacity(1000); + // 设置线程活跃时间(秒) + taskExecutor.setKeepAliveSeconds(60); + // 设置默认线程名称 + taskExecutor.setThreadNamePrefix("smart-logs"); + // 设置拒绝策略 + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 等待所有任务结束后再关闭线程池 + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + } + + protected void handleLog(final JoinPoint joinPoint, final Exception e) { + try { + OperateLog operateLog = this.getAnnotationLog(joinPoint); + if (operateLog == null) { + return; + } + this.submitLog(joinPoint, e); + } catch (Exception exp) { + log.error("保存操作日志异常:{}", exp.getMessage()); + exp.printStackTrace(); + } + } + + private OperateLog getAnnotationLog(JoinPoint joinPoint) throws Exception { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + OperateLog classAnnotation = AnnotationUtils.findAnnotation(method.getDeclaringClass(), OperateLog.class); + + if (method != null) { + return classAnnotation; + } + return null; + } + + /** + * swagger API + * + * @param joinPoint + * @return + * @throws Exception + */ + private Api getApi(JoinPoint joinPoint) { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + Api classAnnotation = AnnotationUtils.findAnnotation(method.getDeclaringClass(), Api.class); + + if (method != null) { + return classAnnotation; + } + return null; + } + + /** + * swagger ApiOperation + * + * @param joinPoint + * @return + * @throws Exception + */ + private ApiOperation getApiOperation(JoinPoint joinPoint) { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + + if (method != null) { + return method.getAnnotation(ApiOperation.class); + } + return null; + } + + /** + * 提交存储操作日志 + * + * @param joinPoint + * @param e + * @throws Exception + */ + private void submitLog(final JoinPoint joinPoint, final Throwable e) throws Exception { + Boolean isOpen = this.isOpen(); + if (!isOpen) { + return; + } + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + Boolean filter = this.filterUrl(request.getRequestURI()); + if (filter) { + return; + } + //设置用户信息 + SmartOperateLogUserDTO user = smartLogConfig.getUserFunction().apply(request); + if (user == null) { + return; + } + // 设置方法名称 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + String operateMethod = className + "." + methodName; + Object[] args = joinPoint.getArgs(); + StringBuilder sb = new StringBuilder(); + for (Object obj : args) { + sb.append(obj.getClass().getSimpleName()); + sb.append("["); + sb.append(JSON.toJSONString(obj)); + sb.append("]"); + } + String params = sb.toString(); + String failReason = null; + Boolean successFlag = true; + if (e != null) { + successFlag = false; + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw, true); + e.printStackTrace(pw); + failReason = sw.toString(); + pw.flush(); + pw.close(); + sw.flush(); + sw.close(); + } + OperateLogEntity operateLogEntity = + OperateLogEntity.builder() + .userId(user.getUserId()) + .userName(user.getUserName()) + .url(request.getRequestURI()) + .method(operateMethod) + .param(params) + .failReason(failReason) + .successFlag(successFlag).build(); + ApiOperation apiOperation = this.getApiOperation(joinPoint); + if (apiOperation != null) { + operateLogEntity.setContent(apiOperation.value()); + } + Api api = this.getApi(joinPoint); + if (api != null) { + String[] tags = api.tags(); + operateLogEntity.setModule(SmartStringUtil.join(tags, ",")); + } + taskExecutor.execute(() -> { + this.saveLog(operateLogEntity); + }); + } + + /** + * 是否开启操作日志 + * + * @return + */ + private Boolean isOpen() { + if (smartLogConfig.getOpenSupplier() == null) { + return Boolean.TRUE; + } + return smartLogConfig.getOpenSupplier().get(); + } + + /** + * 需要过滤的url + * + * @param url + * @return + */ + private Boolean filterUrl(String url) { + if (smartLogConfig.getFilterFunction() == null) { + return Boolean.FALSE; + } + return smartLogConfig.getFilterFunction().apply(url); + } + + /** + * 保存操作日志 + * @param operateLogEntity + * @return + */ + private Boolean saveLog(OperateLogEntity operateLogEntity) { + if (smartLogConfig.getSaveFunction() == null) { + BaseMapper mapper = SmartApplicationContext.getBean(OperateLogDao.class); + if (mapper == null) { + return false; + } + mapper.insert(operateLogEntity); + return true; + } + return smartLogConfig.getSaveFunction().apply(operateLogEntity); + } + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/OperateLogEntity.java similarity index 61% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogEntity.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/OperateLogEntity.java index 467ce769..483a11f8 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogEntity.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/OperateLogEntity.java @@ -1,29 +1,32 @@ -package net.lab1024.smartadmin.module.business.log.useroperatelog.domain; +package net.lab1024.smartadmin.service.module.support.operatelog.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019-05-15 11:32:14 - * @since JDK1.8 + * @author 罗伊 */ @Data @Builder @NoArgsConstructor @AllArgsConstructor @TableName("t_user_operate_log") -public class UserOperateLogEntity extends BaseEntity { - +public class OperateLogEntity { + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long id; /** * 用户id @@ -62,7 +65,7 @@ public class UserOperateLogEntity extends BaseEntity { /** * 请求结果 0失败 1成功 */ - private Integer result; + private Boolean successFlag; /** * 失败原因 @@ -70,5 +73,15 @@ public class UserOperateLogEntity extends BaseEntity { private String failReason; + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/OperateLogDTO.java similarity index 79% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/OperateLogDTO.java index 39fd2f99..12f83d17 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/OperateLogDTO.java @@ -1,21 +1,18 @@ -package net.lab1024.smartadmin.module.business.log.useroperatelog.domain; -import lombok.Data; -import java.util.Date; +package net.lab1024.smartadmin.service.module.support.operatelog.domain.dto; + import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 12:27 - * @since JDK1.8 + * @author 罗伊 */ @Data -public class UserOperateLogDTO { +public class OperateLogDTO { @ApiModelProperty("主键") private Long id; diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogQueryDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/OperateLogQueryDTO.java similarity index 52% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogQueryDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/OperateLogQueryDTO.java index cee24b7d..bff4c851 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/domain/UserOperateLogQueryDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/OperateLogQueryDTO.java @@ -1,21 +1,16 @@ -package net.lab1024.smartadmin.module.business.log.useroperatelog.domain; +package net.lab1024.smartadmin.service.module.support.operatelog.domain.dto; -import net.lab1024.smartadmin.common.domain.PageParamDTO; +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-05-15 11:32:14 - * @since JDK1.8 + * @author 罗伊 */ @Data -public class UserOperateLogQueryDTO extends PageParamDTO { +public class OperateLogQueryDTO extends PageBaseDTO { @ApiModelProperty("开始日期") diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/SmartOperateLogConfigDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/SmartOperateLogConfigDTO.java new file mode 100644 index 00000000..805f31c8 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/SmartOperateLogConfigDTO.java @@ -0,0 +1,51 @@ +package net.lab1024.smartadmin.service.module.support.operatelog.domain.dto; + +import lombok.Builder; +import lombok.Data; +import net.lab1024.smartadmin.service.module.support.operatelog.domain.OperateLogEntity; + +import javax.servlet.http.HttpServletRequest; +import java.util.function.Function; +import java.util.function.Supplier; + +/** +* @Description: 日志配置DTO +* @Author: sbq +* @CreateDate: 2019/8/3 8:54 +* @Version: 1.0 +*/ +@Data +@Builder +public class SmartOperateLogConfigDTO { + + /** + * 用户信息 + */ + private Function userFunction; + /** + * 是否启用 + */ + private Supplier openSupplier; + + /** + * 过滤器 + */ + private Function filterFunction; + + /** + * 操作日志存储方法 + */ + private Function saveFunction; + + /** + * 核心线程数 + */ + private Integer corePoolSize; + + /** + * 队列大小 + */ + private Integer queueCapacity; + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/SmartOperateLogUserDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/SmartOperateLogUserDTO.java new file mode 100644 index 00000000..d2299109 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/operatelog/domain/dto/SmartOperateLogUserDTO.java @@ -0,0 +1,29 @@ +package net.lab1024.smartadmin.service.module.support.operatelog.domain.dto; + +import lombok.Data; + +/** +* @Description: 用户信息 +* @Author: sbq +* @CreateDate: 2019/8/2 10:41 +* @Version: 1.0 +*/ +@Data +public class SmartOperateLogUserDTO { + + /** + * 用户id + */ + private Long userId; + + /** + * 用户名 + */ + private String userName; + + /** + * 扩展信息 + */ + private String extData; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMqHandle.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMqHandle.java new file mode 100644 index 00000000..fa8ef766 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMqHandle.java @@ -0,0 +1,20 @@ +package net.lab1024.smartadmin.service.module.support.redismq; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * [ ] + * + * @author 罗伊 + * @date 2020/9/6 15:53 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface RedisMqHandle { + + RedisMsgTypeEnum value(); + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMqTopicEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMqTopicEnum.java new file mode 100644 index 00000000..7ae584ee --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMqTopicEnum.java @@ -0,0 +1,46 @@ +package net.lab1024.smartadmin.service.module.support.redismq; + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/5/10 11:44 + */ +public enum RedisMqTopicEnum implements BaseEnum { + + + SMART_ADMIN("smartAdmin","主题"), + + ; + + private String type; + + private String desc; + + RedisMqTopicEnum(String type, String desc) { + this.type = type; + this.desc = desc; + } + + /** + * 获取枚举类的值 + * + * @return Integer + */ + @Override + public String getValue() { + return type; + } + + /** + * 获取枚举类的说明 + * + * @return String + */ + @Override + public String getDesc() { + return desc; + } +} \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgDTO.java new file mode 100644 index 00000000..05443992 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgDTO.java @@ -0,0 +1,25 @@ +package net.lab1024.smartadmin.service.module.support.redismq; + +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/5/10 11:04 + */ +@Data +public class RedisMsgDTO { + + /** + * @see RedisMsgTypeEnum + */ + private Integer msgType; + + private String jsonData; + + public RedisMsgDTO(Integer msgType, String jsonData) { + this.msgType = msgType; + this.jsonData = jsonData; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgHandler.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgHandler.java new file mode 100644 index 00000000..939c0ead --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgHandler.java @@ -0,0 +1,79 @@ +package net.lab1024.smartadmin.service.module.support.redismq; + +import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.third.SmartApplicationContext; +import net.lab1024.smartadmin.service.util.SmartBaseEnumUtil; +import org.reflections.Reflections; +import org.reflections.scanners.MethodAnnotationsScanner; +import org.reflections.util.ConfigurationBuilder; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Set; + +/** + * redis 订阅消息处理类 + * + * @author 胡克 + * @date 2019/12/25 15:02 + */ +@Slf4j +public class RedisMsgHandler { + + public static final String METHOD_NAME = "receiveMessage"; + + private Map redisHandle = Maps.newConcurrentMap(); + + public RedisMsgHandler(String scanPath) { + this.redisMqHandleFunction(scanPath); + } + + public void redisMqHandleFunction(String scanPath) { + Reflections reflections = new Reflections(new ConfigurationBuilder().forPackages(scanPath).addScanners(new MethodAnnotationsScanner())); + Set methods = reflections.getMethodsAnnotatedWith(RedisMqHandle.class); + for (Method method : methods) { + RedisMqHandle redisMqHandle = method.getAnnotation(RedisMqHandle.class); + if (redisMqHandle != null) { + redisHandle.put(redisMqHandle.value(), method); + } + } + } + + public void receiveMessage(String jsonMsg) throws InvocationTargetException, IllegalAccessException { + log.info("Redis订阅消息处理:接收到消息->{}", jsonMsg); + RedisMsgDTO redisMsgDTO = JSONObject.parseObject(jsonMsg, RedisMsgDTO.class); + if (redisMsgDTO.getMsgType() == null) { + log.error("Redis消息暂未指定消息类型"); + return; + } + RedisMsgTypeEnum msgTypeEnum = SmartBaseEnumUtil.getEnumByValue(redisMsgDTO.getMsgType(), RedisMsgTypeEnum.class); + if (msgTypeEnum == null) { + log.error("Redis消息类型错误"); + return; + } + Method handleMethod = redisHandle.get(msgTypeEnum); + if (handleMethod == null) { + log.error("Redis消息类型:{},暂未找到对应的处理类", msgTypeEnum.getDesc()); + return; + } + if (handleMethod.getParameterCount() == 0) { + log.error("Redis消息类型:{},处理方法:{},无入参信息", msgTypeEnum.getDesc(), handleMethod.getName()); + return; + } + Object object = SmartApplicationContext.getBean(handleMethod.getDeclaringClass()); + if (object == null) { + log.error("Redis消息类型处理方法:{},对应的类:{},无对应的bean", msgTypeEnum.getDesc(), handleMethod.getDeclaringClass()); + return; + } + handleMethod.invoke(object, redisMsgDTO.getJsonData()); + + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgTypeEnum.java new file mode 100644 index 00000000..1feb3492 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/redismq/RedisMsgTypeEnum.java @@ -0,0 +1,47 @@ +package net.lab1024.smartadmin.service.module.support.redismq; + + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/5/10 11:03 + */ +public enum RedisMsgTypeEnum implements BaseEnum { + + CACHE_CLEAR(1,"清除缓存"), + + CACHE_KEY_CLEAR(2,"清除缓存key") + ; + + private Integer type; + + private String desc; + + RedisMsgTypeEnum(Integer type, String desc) { + this.type = type; + this.desc = desc; + } + + /** + * 获取枚举类的值 + * + * @return Integer + */ + @Override + public Integer getValue() { + return type; + } + + /** + * 获取枚举类的说明 + * + * @return String + */ + @Override + public String getDesc() { + return desc; + } +} \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/repeatsubmit/SmartRepeatSubmitAspect.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/repeatsubmit/SmartRepeatSubmitAspect.java new file mode 100644 index 00000000..a862968d --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/repeatsubmit/SmartRepeatSubmitAspect.java @@ -0,0 +1,85 @@ +package net.lab1024.smartadmin.service.module.support.repeatsubmit; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import net.lab1024.smartadmin.service.common.anno.NoRepeatSubmit; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.annotation.Order; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; + +/** + * [ ] + * + * @author 罗伊 + * @date + */ +@Aspect +@Order(1) +public class SmartRepeatSubmitAspect { + + /** + * 限制缓存最大数量 超过后先放入的会自动移除 + * 默认缓存时间 + */ + private static Cache cache = Caffeine.newBuilder() + .maximumSize(5000) + .expireAfterWrite(NoRepeatSubmit.MAX_INTERVAL, TimeUnit.MILLISECONDS).build(); + + private Function userFunction; + + /** + * 获取用户信息 + * + * @param userFunction + */ + public SmartRepeatSubmitAspect(Function userFunction) { + this.userFunction = userFunction; + } + + /** + * 定义切入点 + * + * @param point + * @return + * @throws Throwable + */ + @Around("@annotation(net.lab1024.smartadmin.service.common.anno.NoRepeatSubmit)") + public Object around(ProceedingJoinPoint point) throws Throwable { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + + SmartRepeatSubmitUserDTO user = this.userFunction.apply(request); + if (user == null) { + return point.proceed(); + } + + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + String servletPath = attributes.getRequest().getServletPath(); + String key = user.getUserId() + "_" + servletPath; + Object value = cache.getIfPresent(key); + if (value != null) { + Method method = ((MethodSignature) point.getSignature()).getMethod(); + NoRepeatSubmit annotation = method.getAnnotation(NoRepeatSubmit.class); + int interval = Math.min(annotation.value(), NoRepeatSubmit.MAX_INTERVAL); + if (System.currentTimeMillis() < (long) value + interval) { + // 提交频繁 + return ResponseDTO.wrap(ResponseCodeConst.REPEAT_SUBMIT); + } + } + cache.put(key, System.currentTimeMillis()); + Object obj = point.proceed(); + cache.put(key, System.currentTimeMillis()); + return obj; + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/repeatsubmit/SmartRepeatSubmitUserDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/repeatsubmit/SmartRepeatSubmitUserDTO.java new file mode 100644 index 00000000..232541ad --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/repeatsubmit/SmartRepeatSubmitUserDTO.java @@ -0,0 +1,30 @@ +package net.lab1024.smartadmin.service.module.support.repeatsubmit; + +import lombok.Data; + +/** + * + * [ ] + * + * @author 罗伊 + * @date + */ +@Data +public class SmartRepeatSubmitUserDTO { + + /** + * 用户id + */ + private Long userId; + + /** + * 用户名 + */ + private String userName; + + /** + * 扩展信息 + */ + private String extData; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/DecryptDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/DecryptDTO.java new file mode 100644 index 00000000..16a2ef56 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/DecryptDTO.java @@ -0,0 +1,15 @@ +package net.lab1024.smartadmin.service.module.support.responseencrypt; + +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/6/29 10:49 + */ +@Data +public class DecryptDTO { + + private String data; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseDecrypt.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseDecrypt.java new file mode 100644 index 00000000..c0bc1cac --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseDecrypt.java @@ -0,0 +1,17 @@ +package net.lab1024.smartadmin.service.module.support.responseencrypt; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/5/21 14:21 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ResponseDecrypt { +} \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncrypt.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncrypt.java new file mode 100644 index 00000000..ec706435 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncrypt.java @@ -0,0 +1,17 @@ +package net.lab1024.smartadmin.service.module.support.responseencrypt; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/5/21 14:21 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ResponseEncrypt { +} \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncryptDecryptAspect.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncryptDecryptAspect.java new file mode 100644 index 00000000..10f25b03 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncryptDecryptAspect.java @@ -0,0 +1,118 @@ +package net.lab1024.smartadmin.service.module.support.responseencrypt; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.util.SmartAesUtil; +import net.lab1024.smartadmin.service.util.SmartDigestUtil; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.annotation.Order; +import org.springframework.util.Base64Utils; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.function.Function; + +/** + * 防止重复提交的 业务切面 + * + * @author 胡克 + * @date 2020/11/25 10:46 + */ +@Slf4j +@Aspect +@Order(100) +public class ResponseEncryptDecryptAspect { + + private Function userFunction; + + + public ResponseEncryptDecryptAspect(Function userFunction) { + this.userFunction = userFunction; + } + + @Before("@annotation(ResponseDecrypt)") + public void before(JoinPoint joinPoint) { + Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); + ResponseDecrypt annotation = method.getAnnotation(ResponseDecrypt.class); + if (annotation == null) { + return; + } + Object[] params = joinPoint.getArgs(); + if (params == null) { + return; + } + if (params.length == 0) { + return; + } + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + ResponseEncryptDecryptUserDTO user = this.userFunction.apply(request); + if (user == null) { + return; + } + Boolean decryptParamFlag = params[0] instanceof DecryptDTO; + if (!decryptParamFlag) { + return; + } + DecryptDTO decryptDTO = (DecryptDTO)params[0]; + String data = decryptDTO.getData(); + log.info("解密前数据:{}", data); + String key = SmartDigestUtil.md5Hex(user.getUserId().toString()); + log.info("解密KEY数据:{}", key); + //初始化向量是16位长度 + String iv = key.substring(0, 16); + //解密 + data = SmartAesUtil.decrypt(data, key, iv); + log.info("解密后数据:{}", data); + //base64解码 + data = new String(Base64Utils.decodeFromString(data)); + log.info("base64解码后数据:{}", data); + decryptDTO.setData(data); + } + + + @AfterReturning(returning = "object", pointcut = "@annotation(ResponseEncrypt)") + public void afterReturning(JoinPoint joinPoint, Object object) { + Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); + ResponseEncrypt annotation = method.getAnnotation(ResponseEncrypt.class); + if (annotation == null) { + return; + } + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + ResponseEncryptDecryptUserDTO user = this.userFunction.apply(request); + if (user == null) { + return; + } + try { + ResponseDTO responseDTO = (ResponseDTO) object; + Object data = responseDTO.getData(); + if (data == null) { + return; + } + String jsonData = JSON.toJSONString(data, SerializerFeature.DisableCircularReferenceDetect); + log.info("JSON 原数据:{}", jsonData); + //base64编码 + jsonData = Base64Utils.encodeToString(jsonData.getBytes("utf-8")); + log.info("JSON Base64数据:{}", jsonData); + //加密秘钥 + String key = SmartDigestUtil.md5Hex(user.getUserId().toString()); + log.info("JSON MD5 KEY数据:{}", key); + //初始化向量是16位长度 + String iv = key.substring(0, 16); + //AES 加密 + jsonData = SmartAesUtil.encrypt(jsonData, key, iv); + log.info("JSON ASE 加密数据:{}", jsonData); + responseDTO.setData(jsonData); + } catch (Exception e) { + return; + } + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncryptDecryptUserDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncryptDecryptUserDTO.java new file mode 100644 index 00000000..858d176f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/responseencrypt/ResponseEncryptDecryptUserDTO.java @@ -0,0 +1,29 @@ +package net.lab1024.smartadmin.service.module.support.responseencrypt; + +import lombok.Data; + +/** +* @Description: 用户信息 +* @Author: sbq +* @CreateDate: 2019/8/2 10:41 +* @Version: 1.0 +*/ +@Data +public class ResponseEncryptDecryptUserDTO { + + /** + * 用户id + */ + private Long userId; + + /** + * 用户名 + */ + private String userName; + + /** + * 扩展信息 + */ + private String extData; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigConst.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigConst.java new file mode 100644 index 00000000..fcc49baf --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigConst.java @@ -0,0 +1,79 @@ +package net.lab1024.smartadmin.service.module.support.systemconfig; + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +/** + * [ 系统配置常量类 ] + * + * @author 罗伊 + * @version 1.0 + * @date + * @since JDK1.8 + */ +public class SystemConfigConst { + + + public enum Key implements BaseEnum { + + /** + * 超管id + */ + EMPLOYEE_SUPERMAN("employee_superman", "超管id"), + + /** + * 本地上传路径前缀 + */ + LOCAL_UPLOAD_URL_PREFIX("local_upload_url_prefix", "本地上传路径前缀"), + + ; + + private final String val; + + private final String desc; + + Key(String val, String desc) { + this.val = val; + this.desc = desc; + } + + @Override + public String getValue() { + return val; + } + + @Override + public String getDesc() { + return desc; + } + } + + public enum Group implements BaseEnum { + + /** + * system 默认系统 + */ + SYSTEM("system", "默认系统"), + + ; + + private final String val; + + private final String desc; + + Group(String val, String desc) { + this.val = val; + this.desc = desc; + } + + @Override + public String getValue() { + return val; + } + + @Override + public String getDesc() { + return desc; + } + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigController.java new file mode 100644 index 00000000..e4a66d30 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigController.java @@ -0,0 +1,57 @@ +package net.lab1024.smartadmin.service.module.support.systemconfig; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.SupportBaseController; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.systemconfig.domain.*; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +/** + * [ ] + * + * @author 罗伊 + * @version 1.0 + * @date + * @since JDK1.8 + */ +@Api(tags = {SwaggerTagConst.Support.SYSTEM_CONFIG}) +@RestController +public class SystemConfigController extends SupportBaseController { + + @Autowired + private SystemConfigService systemConfigService; + + @ApiOperation("分页查询系统配置") + @PostMapping("/system/config/query") + public ResponseDTO> querySystemConfigPage(@RequestBody @Valid SystemConfigQueryDTO queryDTO) { + return systemConfigService.queryConfigPage(queryDTO); + } + + @ApiOperation("添加配置参数") + @PostMapping("/system/config/add") + public ResponseDTO addSystemConfig(@RequestBody @Valid SystemConfigAddDTO configAddDTO) { + return systemConfigService.add(configAddDTO); + } + + @ApiOperation("修改配置参数") + @PostMapping("/system/config/update") + public ResponseDTO updateSystemConfig(@RequestBody @Valid SystemConfigUpdateDTO updateDTO) { + return systemConfigService.updateSystemConfig(updateDTO); + } + + @ApiOperation("查询配置详情") + @GetMapping("/system/config/queryByKey") + public ResponseDTO queryByKey(@RequestParam String configKey) { + SystemConfigDTO configDTO = systemConfigService.getConfig(configKey); + SystemConfigVO configVO = SmartBeanUtil.copy(configDTO, SystemConfigVO.class); + return ResponseDTO.succData(configVO); + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigDao.java new file mode 100644 index 00000000..a21f4dd7 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigDao.java @@ -0,0 +1,38 @@ +package net.lab1024.smartadmin.service.module.support.systemconfig; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.lab1024.smartadmin.service.module.support.systemconfig.domain.SystemConfigEntity; +import net.lab1024.smartadmin.service.module.support.systemconfig.domain.SystemConfigQueryDTO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 系统参数配置 t_system_config Dao层 + * + * @author 1024lab + * @date 2017-12-23 14:25 + */ +@Component +@Mapper +public interface SystemConfigDao extends BaseMapper { + + /** + * 分页查询系统配置 + * + * @param page + * @return + */ + List queryByPage(Page page, @Param("query") SystemConfigQueryDTO queryDTO); + + /** + * 根据key查询获取数据 + * + * @param key + * @return + */ + SystemConfigEntity selectByKey(String key); +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigService.java new file mode 100644 index 00000000..8dd8a9f0 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/SystemConfigService.java @@ -0,0 +1,203 @@ +package net.lab1024.smartadmin.service.module.support.systemconfig; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.systemconfig.domain.*; +import net.lab1024.smartadmin.service.util.SmartBaseEnumUtil; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import net.lab1024.smartadmin.service.util.SmartPageUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.PostConstruct; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 系统配置业务类 + * + * @author 1024lab + * @date 2017-12-23 15:09 + */ +@Slf4j +@Service +public class SystemConfigService { + + /** + * 一个简单的系统配置缓存 + */ + private final ConcurrentHashMap CONFIG_CACHE = new ConcurrentHashMap<>(); + + @Autowired + private SystemConfigDao systemConfigDao; + + /** + * 初始化系统设置缓存 + */ + @PostConstruct + private void initConfigCache() { + CONFIG_CACHE.clear(); + List entityList = systemConfigDao.selectList(null); + if (CollectionUtils.isEmpty(entityList)) { + return; + } + entityList.forEach(entity -> this.CONFIG_CACHE.put(entity.getConfigKey().toLowerCase(), entity)); + log.info("################# 系统配置缓存初始化完毕:{} ###################", CONFIG_CACHE.size()); + } + + /** + * 初始化系统设置缓存 + */ + private void refreshConfigCache(Long configId) { + Optional optional = this.CONFIG_CACHE.values().stream().filter(e -> Objects.equals(configId, e.getConfigId())).findFirst(); + // 移除缓存 + optional.ifPresent(e -> this.CONFIG_CACHE.remove(e.getConfigKey())); + + // 重新查询 加入缓存 + SystemConfigEntity configEntity = systemConfigDao.selectById(configId); + if (null == configEntity) { + return; + } + this.CONFIG_CACHE.put(configEntity.getConfigKey().toLowerCase(), configEntity); + } + + /** + * 分页查询系统配置 + * + * @param queryDTO + * @return + */ + public ResponseDTO> queryConfigPage(SystemConfigQueryDTO queryDTO) { + Page page = SmartPageUtil.convert2PageQuery(queryDTO); + List entityList = systemConfigDao.queryByPage(page, queryDTO); + PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page, entityList, SystemConfigVO.class); + return ResponseDTO.succData(pageResultDTO); + } + + /** + * 查询配置缓存 + * + * @param configKey + * @return + */ + public SystemConfigDTO getConfig(SystemConfigConst.Key configKey) { + return this.getConfig(configKey.getValue()); + } + + /** + * 查询配置缓存 + * + * @param configKey + * @return + */ + public SystemConfigDTO getConfig(String configKey) { + boolean check = SmartBaseEnumUtil.checkEnum(configKey, SystemConfigConst.Key.class); + Assert.isTrue(check, "config key error"); + + SystemConfigEntity entity = this.CONFIG_CACHE.get(configKey); + Assert.notNull(entity, "缺少系统配置[" + configKey + "]"); + return SmartBeanUtil.copy(entity, SystemConfigDTO.class); + } + + /** + * 查询配置缓存参数 + * + * @param configKey + * @return + */ + public String getConfigValue(SystemConfigConst.Key configKey) { + return this.getConfig(configKey).getConfigValue(); + } + + /** + * 根据参数key获得一条数据 并转换为 对象 + * + * @param configKey + * @param clazz + * @param + * @return + */ + public T getConfigValue2Obj(SystemConfigConst.Key configKey, Class clazz) { + String configValue = this.getConfigValue(configKey); + return JSON.parseObject(configValue, clazz); + } + + /** + * 添加系统配置 + * + * @param configAddDTO + * @return + */ + public ResponseDTO add(SystemConfigAddDTO configAddDTO) { + SystemConfigEntity entity = systemConfigDao.selectByKey(configAddDTO.getConfigKey()); + if (entity != null) { + return ResponseDTO.wrap(ResponseCodeConst.ALREADY_EXIST); + } + entity = SmartBeanUtil.copy(configAddDTO, SystemConfigEntity.class); + entity.setDisabledFlag(true); + systemConfigDao.insert(entity); + + // 刷新缓存 + this.refreshConfigCache(entity.getConfigId()); + return ResponseDTO.succ(); + } + + /** + * 更新系统配置 + * + * @param updateDTO + * @return + */ + public ResponseDTO updateSystemConfig(SystemConfigUpdateDTO updateDTO) { + Long configId = updateDTO.getConfigId(); + SystemConfigEntity entity = systemConfigDao.selectById(configId); + if (null == entity) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + SystemConfigEntity alreadyEntity = systemConfigDao.selectByKey(updateDTO.getConfigKey()); + if (null != alreadyEntity && !Objects.equals(configId, alreadyEntity.getConfigId())) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ALREADY_EXIST, "config key 已存在"); + } + + // 更新数据 + entity = SmartBeanUtil.copy(updateDTO, SystemConfigEntity.class); + systemConfigDao.updateById(entity); + + // 刷新缓存 + this.refreshConfigCache(configId); + return ResponseDTO.succ(); + } + + /** + * 更新系统配置 + * + * @param key + * @param value + * @return + */ + public ResponseDTO updateValueByKey(SystemConfigConst.Key key, String value) { + SystemConfigDTO config = this.getConfig(key); + if (null == config) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + + // 更新数据 + Long configId = config.getConfigId(); + SystemConfigEntity entity = new SystemConfigEntity(); + entity.setConfigId(configId); + entity.setConfigValue(value); + systemConfigDao.updateById(entity); + + // 刷新缓存 + this.refreshConfigCache(configId); + return ResponseDTO.succ(); + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigAddDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigAddDTO.java similarity index 81% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigAddDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigAddDTO.java index 18b8a7c9..2e15513e 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigAddDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigAddDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.systemconfig.domain.dto; +package net.lab1024.smartadmin.service.module.support.systemconfig.domain; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -9,10 +9,9 @@ import javax.validation.constraints.NotBlank; /** * [ ] * - * @author yandanyang + * @author 罗伊 * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. + * * @date * @since JDK1.8 */ @@ -26,7 +25,7 @@ public class SystemConfigAddDTO { @ApiModelProperty("参数的值") @NotBlank(message = "参数的值不能为空") - @Length(max = 65530, message = "参数的值最多65530个字符") + @Length(max = 60000, message = "参数的值最多60000个字符") private String configValue; @ApiModelProperty("参数名称") diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigDTO.java similarity index 63% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigDTO.java index 16aadef5..d33a2eee 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigDTO.java @@ -1,26 +1,24 @@ -package net.lab1024.smartadmin.module.system.systemconfig.domain.dto; +package net.lab1024.smartadmin.service.module.support.systemconfig.domain; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import java.util.Date; +import java.time.LocalDateTime; /** - * * [ ] - * + * + * @author 罗伊 * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. + * * @date + * @since JDK1.8 */ @Data public class SystemConfigDTO { @ApiModelProperty("主键") - private Long id; + private Long configId; @ApiModelProperty("参数key") private String configKey; @@ -34,17 +32,16 @@ public class SystemConfigDTO { @ApiModelProperty("参数类别") private String configGroup; - @ApiModelProperty("是否使用0 是 1否") - private Integer isUsing; + @ApiModelProperty("是否禁用") + private Boolean disabledFlag; @ApiModelProperty("备注") private String remark; @ApiModelProperty("创建时间") - private Date createTime; + private LocalDateTime createTime; @ApiModelProperty("上次修改时间") - private Date updateTime; - + private LocalDateTime updateTime; } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/entity/SystemConfigEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigEntity.java similarity index 50% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/entity/SystemConfigEntity.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigEntity.java index 18ca1f9f..bed586ae 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/entity/SystemConfigEntity.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigEntity.java @@ -1,22 +1,24 @@ -package net.lab1024.smartadmin.module.system.systemconfig.domain.entity; +package net.lab1024.smartadmin.service.module.support.systemconfig.domain; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; import lombok.Data; -import java.io.Serializable; +import java.time.LocalDateTime; /** * 系统配置参数 实体类 * - * @author GHQ + * @author 1024lab * @date 2017-12-23 13:41 */ @Data -@TableName(value = "t_system_config") -public class SystemConfigEntity extends BaseEntity implements Serializable { +@TableName("t_system_config") +public class SystemConfigEntity { - private static final long serialVersionUID = 257284726400352502L; + @TableId(type = IdType.AUTO) + private Long configId; /** * 参数key @@ -39,13 +41,16 @@ public class SystemConfigEntity extends BaseEntity implements Serializable { private String configGroup; /** - * 是否使用0 是 1否 + * 是否禁用 */ - private Integer isUsing; + private Boolean disabledFlag; /** * 备注 */ private String remark; + private LocalDateTime updateTime; + + private LocalDateTime createTime; } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigQueryDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigQueryDTO.java new file mode 100644 index 00000000..cab4ce4c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigQueryDTO.java @@ -0,0 +1,24 @@ +package net.lab1024.smartadmin.service.module.support.systemconfig.domain; + +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 分页查询 系统配置 + * + * @author 罗伊 + * @version 1.0 + * + * @date + * @since JDK1.8 + */ +@Data +public class SystemConfigQueryDTO extends PageBaseDTO { + + @ApiModelProperty("参数KEY") + private String configKey; + + @ApiModelProperty("参数类别") + private String configGroup; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigUpdateDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigUpdateDTO.java new file mode 100644 index 00000000..d5d02047 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigUpdateDTO.java @@ -0,0 +1,23 @@ +package net.lab1024.smartadmin.service.module.support.systemconfig.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * [ ] + * + * @author 罗伊 + * @version 1.0 + * + * @date + * @since JDK1.8 + */ +@Data +public class SystemConfigUpdateDTO extends SystemConfigAddDTO { + + @ApiModelProperty("configId") + @NotNull(message = "configId不能为空") + private Long configId; +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigVO.java similarity index 59% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigVO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigVO.java index 3b5de292..3f0324f9 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigVO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/support/systemconfig/domain/SystemConfigVO.java @@ -1,17 +1,16 @@ -package net.lab1024.smartadmin.module.system.systemconfig.domain.dto; +package net.lab1024.smartadmin.service.module.support.systemconfig.domain; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import java.util.Date; +import java.time.LocalDateTime; /** * [ ] * - * @author yandanyang + * @author 罗伊 * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. + * * @date * @since JDK1.8 */ @@ -19,7 +18,7 @@ import java.util.Date; public class SystemConfigVO { @ApiModelProperty("主键") - private Long id; + private Long configId; @ApiModelProperty("参数key") private String configKey; @@ -30,19 +29,18 @@ public class SystemConfigVO { @ApiModelProperty("参数名称") private String configName; - @ApiModelProperty("参数类别") + @ApiModelProperty("参数分组") private String configGroup; - @ApiModelProperty("是否使用0 是 1否") - private Integer isUsing; + @ApiModelProperty("是否禁用") + private Boolean disabledFlag; @ApiModelProperty("备注") private String remark; @ApiModelProperty("创建时间") - private Date createTime; + private LocalDateTime createTime; @ApiModelProperty("上次修改时间") - private Date updateTime; - + private LocalDateTime updateTime; } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/DataScope.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/DataScope.java similarity index 57% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/DataScope.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/DataScope.java index 1ab8061a..a754d799 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/DataScope.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/DataScope.java @@ -1,8 +1,9 @@ -package net.lab1024.smartadmin.common.anno; +package net.lab1024.smartadmin.service.module.system.datascope; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeTypeEnum; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeWhereInTypeEnum; -import net.lab1024.smartadmin.module.system.datascope.strategy.DataScopePowerStrategy; + +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeWhereInTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.strategy.DataScopePowerStrategy; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; @@ -12,18 +13,13 @@ import java.lang.annotation.Target; /** * [ 数据范围 ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 + * @author 罗伊 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface DataScope { - DataScopeTypeEnum dataScopeType() default DataScopeTypeEnum.DEFAULT; + DataScopeTypeEnum dataScopeType() ; DataScopeWhereInTypeEnum whereInType() default DataScopeWhereInTypeEnum.EMPLOYEE; @@ -33,6 +29,11 @@ public @interface DataScope { */ Class joinSqlImplClazz() default DataScopePowerStrategy.class; + /** + * 多个参数已逗号分隔,本属性主要用于joinSqlImplClazz 实现类跟进参数进行不同的范围控制,如不使用CUSTOM_STRATEGY,可不做配置 + * @return + */ + String paramName() default ""; /** * * 第几个where 条件 从0开始 diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/DataScopeController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/DataScopeController.java similarity index 54% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/DataScopeController.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/DataScopeController.java index 75a5eec4..4b47ed42 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/DataScopeController.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/DataScopeController.java @@ -1,15 +1,14 @@ -package net.lab1024.smartadmin.module.system.datascope; +package net.lab1024.smartadmin.service.module.system.datascope; -import net.lab1024.smartadmin.common.anno.NoValidPrivilege; -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.system.datascope.domain.dto.DataScopeAndViewTypeVO; -import net.lab1024.smartadmin.module.system.datascope.domain.dto.DataScopeBatchSetRoleDTO; -import net.lab1024.smartadmin.module.system.datascope.domain.dto.DataScopeSelectVO; -import net.lab1024.smartadmin.module.system.datascope.service.DataScopeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.datascope.domain.dto.DataScopeAndViewTypeVO; +import net.lab1024.smartadmin.service.module.system.datascope.domain.dto.DataScopeBatchSetRoleDTO; +import net.lab1024.smartadmin.service.module.system.datascope.domain.dto.DataScopeSelectVO; +import net.lab1024.smartadmin.service.module.system.datascope.service.DataScopeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -19,38 +18,29 @@ import java.util.List; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/27 0027 下午 15:12 - * @since JDK1.8 + * @author 罗伊 */ -@Api(tags = {SwaggerTagConst.Admin.MANAGER_DATA_SCOPE}) -@OperateLog +@Api(tags = {SwaggerTagConst.Admin.MANAGER_ROLE}) @RestController -public class DataScopeController { +public class DataScopeController extends AdminBaseController { @Autowired private DataScopeService dataScopeService; @ApiOperation(value = "获取当前系统所配置的所有数据范围") @GetMapping("/dataScope/list") - @NoValidPrivilege public ResponseDTO> dataScopeList() { return dataScopeService.dataScopeList(); } @ApiOperation(value = "获取某角色所设置的数据范围") @GetMapping("/dataScope/listByRole/{roleId}") - @NoValidPrivilege public ResponseDTO> dataScopeListByRole(@PathVariable Long roleId) { return dataScopeService.dataScopeListByRole(roleId); } @ApiOperation(value = "批量设置某角色数据范围") @PostMapping("/dataScope/batchSet") - @NoValidPrivilege public ResponseDTO dataScopeBatchSet(@RequestBody @Valid DataScopeBatchSetRoleDTO batchSetRoleDTO) { return dataScopeService.dataScopeBatchSet(batchSetRoleDTO); } diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/DataScopeRoleDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/DataScopeRoleDao.java similarity index 75% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/DataScopeRoleDao.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/DataScopeRoleDao.java index 1b926a7b..a8046e16 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/DataScopeRoleDao.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/DataScopeRoleDao.java @@ -1,22 +1,17 @@ -package net.lab1024.smartadmin.module.system.datascope; +package net.lab1024.smartadmin.service.module.system.datascope; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import net.lab1024.smartadmin.module.system.datascope.domain.entity.DataScopeRoleEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; +import net.lab1024.smartadmin.service.module.system.datascope.domain.entity.DataScopeRoleEntity; import java.util.List; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/27 0027 下午 14:41 - * @since JDK1.8 + * @author 罗伊 */ @Mapper @Component diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/MyBatisPlugin.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/MyBatisPlugin.java similarity index 77% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/MyBatisPlugin.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/MyBatisPlugin.java index f9270b62..4f68e018 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/MyBatisPlugin.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/MyBatisPlugin.java @@ -1,9 +1,10 @@ -package net.lab1024.smartadmin.module.system.datascope; +package net.lab1024.smartadmin.service.module.system.datascope; -import net.lab1024.smartadmin.module.system.datascope.domain.dto.DataScopeSqlConfigDTO; -import net.lab1024.smartadmin.module.system.datascope.service.DataScopeSqlConfigService; -import net.lab1024.smartadmin.third.SmartApplicationContext; -import net.lab1024.smartadmin.util.SmartStringUtil; +import com.google.common.collect.Maps; +import net.lab1024.smartadmin.service.module.system.datascope.domain.dto.DataScopeSqlConfigDTO; +import net.lab1024.smartadmin.service.module.system.datascope.service.DataScopeSqlConfigService; +import net.lab1024.smartadmin.service.third.SmartApplicationContext; +import net.lab1024.smartadmin.service.util.SmartStringUtil; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.mapping.*; import org.apache.ibatis.plugin.*; @@ -12,17 +13,13 @@ import org.apache.ibatis.session.RowBounds; import org.springframework.stereotype.Component; import java.util.List; +import java.util.Map; import java.util.Properties; /** * [ mybaits sql 拦截 ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 + * @author 罗伊 */ @Intercepts({@Signature(type = org.apache.ibatis.executor.Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})}) @Component @@ -30,8 +27,10 @@ public class MyBatisPlugin implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { + MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; Object parameter = invocation.getArgs()[1]; + BoundSql boundSql = mappedStatement.getBoundSql(parameter); String originalSql = boundSql.getSql().trim(); String id = mappedStatement.getId(); @@ -43,7 +42,8 @@ public class MyBatisPlugin implements Interceptor { } DataScopeSqlConfigDTO sqlConfigDTO = dataScopeSqlConfigService.getSqlConfig(path); if (sqlConfigDTO != null) { - BoundSql newBoundSql = copyFromBoundSql(mappedStatement, boundSql, this.joinSql(originalSql, sqlConfigDTO)); + Map paramMap = this.getParamList(sqlConfigDTO.getParamName(), parameter); + BoundSql newBoundSql = copyFromBoundSql(mappedStatement, boundSql, this.joinSql(originalSql, paramMap, sqlConfigDTO)); ParameterMap map = mappedStatement.getParameterMap(); MappedStatement newMs = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql), map); invocation.getArgs()[0] = newMs; @@ -53,11 +53,32 @@ public class MyBatisPlugin implements Interceptor { return obj; } - private String joinSql(String sql, DataScopeSqlConfigDTO sqlConfigDTO) { + + private Map getParamList(String paramName, Object parameter) { + Map paramMap = Maps.newHashMap(); + if (StringUtils.isEmpty(paramName)) { + return paramMap; + } + if (parameter == null) { + return paramMap; + } + if (parameter instanceof Map) { + String[] paramNameArray = paramName.split(","); + Map parameterMap = (Map) parameter; + for (String param : paramNameArray) { + if(parameterMap.containsKey(param)){ + paramMap.put(param, parameterMap.get(param)); + } + } + } + return paramMap; + } + + private String joinSql(String sql, Map paramMap, DataScopeSqlConfigDTO sqlConfigDTO) { if (null == sqlConfigDTO) { return sql; } - String appendSql = this.dataScopeSqlConfigService().getJoinSql(sqlConfigDTO); + String appendSql = this.dataScopeSqlConfigService().getJoinSql(paramMap, sqlConfigDTO); if (StringUtils.isEmpty(appendSql)) { return sql; } @@ -68,18 +89,18 @@ public class MyBatisPlugin implements Interceptor { int whereIndex = StringUtils.ordinalIndexOf(sql.toLowerCase(), where, appendSqlWhereIndex + 1); int orderIndex = sql.toLowerCase().indexOf(order); int groupIndex = sql.toLowerCase().indexOf(group); - if (whereIndex > - 1) { + if (whereIndex > -1) { String subSql = sql.substring(0, whereIndex + where.length() + 1); subSql = subSql + " " + appendSql + " AND " + sql.substring(whereIndex + where.length() + 1); return subSql; } - if (groupIndex > - 1) { + if (groupIndex > -1) { String subSql = sql.substring(0, groupIndex); subSql = subSql + " where " + appendSql + " " + sql.substring(groupIndex); return subSql; } - if (orderIndex > - 1) { + if (orderIndex > -1) { String subSql = sql.substring(0, orderIndex); subSql = subSql + " where " + appendSql + " " + sql.substring(orderIndex); return subSql; @@ -99,6 +120,7 @@ public class MyBatisPlugin implements Interceptor { public BoundSqlSqlSource(BoundSql boundSql) { this.boundSql = boundSql; } + @Override public BoundSql getBoundSql(Object parameterObject) { return boundSql; diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/constant/DataScopeTypeEnum.java similarity index 56% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeTypeEnum.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/constant/DataScopeTypeEnum.java index 66ebb8f9..2ef98b04 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeTypeEnum.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/constant/DataScopeTypeEnum.java @@ -1,28 +1,27 @@ -package net.lab1024.smartadmin.module.system.datascope.constant; +package net.lab1024.smartadmin.service.module.system.datascope.constant; -import net.lab1024.smartadmin.common.domain.BaseEnum; +import net.lab1024.smartadmin.service.common.constant.BaseEnum; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/28 0028 下午 15:37 - * @since JDK1.8 + * @author 罗伊 */ public enum DataScopeTypeEnum implements BaseEnum { - DEFAULT(0,0,"默认类型","数据范围样例"); + NOTICE(7, 7, "系统通知", "系统通知数据范围"), + ; private Integer value; + private Integer sort; + private String name; + private String desc; - DataScopeTypeEnum(Integer value,Integer sort,String name,String desc) { + DataScopeTypeEnum(Integer value, Integer sort, String name, String desc) { this.value = value; this.sort = sort; this.name = name; diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/constant/DataScopeViewTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/constant/DataScopeViewTypeEnum.java new file mode 100644 index 00000000..88a46038 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/constant/DataScopeViewTypeEnum.java @@ -0,0 +1,46 @@ +package net.lab1024.smartadmin.service.module.system.datascope.constant; + + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +/** + * [ ] + * + * @author 罗伊 + */ +public enum DataScopeViewTypeEnum implements BaseEnum { + + ME(0, 0, "本人"), + + DEPARTMENT(1, 5, "本部门"), + + DEPARTMENT_AND_SUB(2, 10, "本部门及下属子部门"), + + ALL(3, 15, "全部"); + + private Integer value; + private Integer level; + private String desc; + + DataScopeViewTypeEnum(Integer value, Integer level, String desc) { + this.value = value; + this.level = level; + this.desc = desc; + } + + @Override + public Integer getValue() { + return value; + } + + public Integer getLevel() { + return level; + } + + @Override + public String getDesc() { + return desc; + } + + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeWhereInTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/constant/DataScopeWhereInTypeEnum.java similarity index 50% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeWhereInTypeEnum.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/constant/DataScopeWhereInTypeEnum.java index e9037373..dd995b4f 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeWhereInTypeEnum.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/constant/DataScopeWhereInTypeEnum.java @@ -1,24 +1,20 @@ -package net.lab1024.smartadmin.module.system.datascope.constant; +package net.lab1024.smartadmin.service.module.system.datascope.constant; -import net.lab1024.smartadmin.common.domain.BaseEnum; + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/8 0008 下午 16:00 - * @since JDK1.8 + * @author 罗伊 */ public enum DataScopeWhereInTypeEnum implements BaseEnum { - EMPLOYEE(0,"以员工IN"), + EMPLOYEE(0, "以员工IN"), - DEPARTMENT(1,"以部门IN"), + DEPARTMENT(1, "以部门IN"), - CUSTOM_STRATEGY(2,"自定义策略"); + CUSTOM_STRATEGY(2, "自定义策略"); private Integer value; private String desc; diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeAndViewTypeVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeAndViewTypeVO.java similarity index 69% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeAndViewTypeVO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeAndViewTypeVO.java index 1412be57..7ea77d2c 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeAndViewTypeVO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeAndViewTypeVO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.datascope.domain.dto; +package net.lab1024.smartadmin.service.module.system.datascope.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -8,12 +8,7 @@ import java.util.List; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/27 0027 下午 16:37 - * @since JDK1.8 + * @author 罗伊 */ @Data public class DataScopeAndViewTypeVO { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeBatchSetDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeBatchSetDTO.java similarity index 64% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeBatchSetDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeBatchSetDTO.java index 6ff9fc92..6500d417 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeBatchSetDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeBatchSetDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.datascope.domain.dto; +package net.lab1024.smartadmin.service.module.system.datascope.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -8,12 +8,7 @@ import javax.validation.constraints.NotNull; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/27 0027 下午 16:51 - * @since JDK1.8 + * @author 罗伊 */ @Data public class DataScopeBatchSetDTO { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeBatchSetRoleDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeBatchSetRoleDTO.java similarity index 64% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeBatchSetRoleDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeBatchSetRoleDTO.java index 215ab664..3e827f1d 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeBatchSetRoleDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeBatchSetRoleDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.datascope.domain.dto; +package net.lab1024.smartadmin.service.module.system.datascope.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -10,12 +10,7 @@ import java.util.List; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/27 0027 下午 16:47 - * @since JDK1.8 + * @author 罗伊 */ @Data public class DataScopeBatchSetRoleDTO { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeDTO.java similarity index 65% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeDTO.java index 629679bf..653239d6 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.datascope.domain.dto; +package net.lab1024.smartadmin.service.module.system.datascope.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Builder; @@ -7,12 +7,7 @@ import lombok.Data; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/27 0027 下午 16:37 - * @since JDK1.8 + * @author 罗伊 */ @Data @Builder diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeSelectVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeSelectVO.java similarity index 53% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeSelectVO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeSelectVO.java index 5d0a3aa8..fd45790c 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeSelectVO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeSelectVO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.datascope.domain.dto; +package net.lab1024.smartadmin.service.module.system.datascope.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -6,12 +6,7 @@ import lombok.Data; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/27 0027 下午 16:43 - * @since JDK1.8 + * @author 罗伊 */ @Data public class DataScopeSelectVO { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeSqlConfigDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeSqlConfigDTO.java similarity index 54% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeSqlConfigDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeSqlConfigDTO.java index 422933de..ef9091bf 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeSqlConfigDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeSqlConfigDTO.java @@ -1,18 +1,13 @@ -package net.lab1024.smartadmin.module.system.datascope.domain.dto; +package net.lab1024.smartadmin.service.module.system.datascope.domain.dto; import lombok.Data; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeTypeEnum; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeWhereInTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeWhereInTypeEnum; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/28 0028 下午 17:21 - * @since JDK1.8 + * @author 罗伊 */ @Data public class DataScopeSqlConfigDTO { @@ -32,6 +27,8 @@ public class DataScopeSqlConfigDTO { private Integer whereIndex; + private String paramName; + /** * whereIn类型 * {@link DataScopeWhereInTypeEnum} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeViewTypeVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeViewTypeVO.java similarity index 62% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeViewTypeVO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeViewTypeVO.java index 853a514f..eb9744c2 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/dto/DataScopeViewTypeVO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/dto/DataScopeViewTypeVO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.datascope.domain.dto; +package net.lab1024.smartadmin.service.module.system.datascope.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Builder; @@ -7,12 +7,7 @@ import lombok.Data; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/28 0028 下午 15:41 - * @since JDK1.8 + * @author 罗伊 */ @Data @Builder diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/entity/DataScopeRoleEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/entity/DataScopeRoleEntity.java new file mode 100644 index 00000000..961f77e5 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/domain/entity/DataScopeRoleEntity.java @@ -0,0 +1,50 @@ +package net.lab1024.smartadmin.service.module.system.datascope.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * [ 数据范围与角色关系 ] + * + * @author 罗伊 + */ +@Data +@TableName("t_role_data_scope") +public class DataScopeRoleEntity { + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 数据范围id + * {@link net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeTypeEnum} + */ + private Integer dataScopeType; + + /** + * 数据范围类型 + * {@link net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeViewTypeEnum} + */ + private Integer viewType; + + /** + * 角色id + */ + private Long roleId; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 创建时间 + */ + private LocalDateTime createTime; +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/service/DataScopeService.java similarity index 73% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeService.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/service/DataScopeService.java index 46b80bd4..f4e77605 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeService.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/service/DataScopeService.java @@ -1,14 +1,14 @@ -package net.lab1024.smartadmin.module.system.datascope.service; +package net.lab1024.smartadmin.service.module.system.datascope.service; -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.system.datascope.DataScopeRoleDao; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeTypeEnum; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeViewTypeEnum; -import net.lab1024.smartadmin.module.system.datascope.domain.entity.DataScopeRoleEntity; -import net.lab1024.smartadmin.util.SmartBeanUtil; import com.google.common.collect.Lists; -import net.lab1024.smartadmin.module.system.datascope.domain.dto.*; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.datascope.DataScopeRoleDao; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeViewTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.domain.dto.*; +import net.lab1024.smartadmin.service.module.system.datascope.domain.entity.DataScopeRoleEntity; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -20,12 +20,7 @@ import java.util.List; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/27 0027 下午 14:52 - * @since JDK1.8 + * @author 罗伊 */ @Service public class DataScopeService { @@ -61,7 +56,7 @@ public class DataScopeService { dataScopeViewTypeDTO = DataScopeViewTypeVO.builder().viewType(viewTypeEnum.getValue()).viewTypeLevel(viewTypeEnum.getLevel()).viewTypeName(viewTypeEnum.getDesc()).build(); viewTypeList.add(dataScopeViewTypeDTO); } - Comparator comparator = (h1, h2) -> h1.getViewTypeLevel().compareTo(h2.getViewTypeLevel()); + Comparator comparator = Comparator.comparing(DataScopeViewTypeVO::getViewTypeLevel); viewTypeList.sort(comparator); return viewTypeList; } @@ -72,10 +67,10 @@ public class DataScopeService { DataScopeDTO dataScopeDTO; for (DataScopeTypeEnum typeEnum : enums) { dataScopeDTO = - DataScopeDTO.builder().dataScopeType(typeEnum.getValue()).dataScopeTypeDesc(typeEnum.getDesc()).dataScopeTypeName(typeEnum.getName()).dataScopeTypeSort(typeEnum.getSort()).build(); + DataScopeDTO.builder().dataScopeType(typeEnum.getValue()).dataScopeTypeDesc(typeEnum.getDesc()).dataScopeTypeName(typeEnum.getName()).dataScopeTypeSort(typeEnum.getSort()).build(); dataScopeTypeList.add(dataScopeDTO); } - Comparator comparator = (h1, h2) -> h1.getDataScopeTypeSort().compareTo(h2.getDataScopeTypeSort()); + Comparator comparator = Comparator.comparing(DataScopeDTO::getDataScopeTypeSort); dataScopeTypeList.sort(comparator); return dataScopeTypeList; } @@ -106,7 +101,7 @@ public class DataScopeService { public ResponseDTO dataScopeBatchSet(DataScopeBatchSetRoleDTO batchSetRoleDTO) { List batchSetList = batchSetRoleDTO.getBatchSetList(); if (CollectionUtils.isEmpty(batchSetList)) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "缺少配置信息"); + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "缺少配置信息"); } List dataScopeRoleEntityList = SmartBeanUtil.copyList(batchSetList, DataScopeRoleEntity.class); dataScopeRoleEntityList.forEach(e -> e.setRoleId(batchSetRoleDTO.getRoleId())); diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeSqlConfigService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/service/DataScopeSqlConfigService.java similarity index 76% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeSqlConfigService.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/service/DataScopeSqlConfigService.java index 30381384..446600a6 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeSqlConfigService.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/service/DataScopeSqlConfigService.java @@ -1,16 +1,15 @@ -package net.lab1024.smartadmin.module.system.datascope.service; +package net.lab1024.smartadmin.service.module.system.datascope.service; import lombok.extern.slf4j.Slf4j; -import net.lab1024.smartadmin.common.anno.DataScope; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeTypeEnum; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeViewTypeEnum; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeWhereInTypeEnum; -import net.lab1024.smartadmin.module.system.datascope.domain.dto.DataScopeSqlConfigDTO; -import net.lab1024.smartadmin.module.system.datascope.strategy.DataScopePowerStrategy; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.third.SmartApplicationContext; -import net.lab1024.smartadmin.util.SmartRequestTokenUtil; -import org.apache.commons.collections.CollectionUtils; +import net.lab1024.smartadmin.service.module.system.datascope.DataScope; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeViewTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeWhereInTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.domain.dto.DataScopeSqlConfigDTO; +import net.lab1024.smartadmin.service.module.system.datascope.strategy.DataScopePowerStrategy; +import net.lab1024.smartadmin.service.third.SmartApplicationContext; +import net.lab1024.smartadmin.service.util.SmartEmployeeTokenUtil; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.reflections.Reflections; import org.reflections.scanners.MethodAnnotationsScanner; @@ -30,12 +29,7 @@ import java.util.concurrent.ConcurrentHashMap; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/29 0029 上午 10:12 - * @since JDK1.8 + * @author 罗伊 */ @Slf4j @Service @@ -77,6 +71,7 @@ public class DataScopeSqlConfigService { configDTO.setJoinSql(dataScopeAnnotation.joinSql()); configDTO.setWhereIndex(dataScopeAnnotation.whereIndex()); configDTO.setDataScopeWhereInType(dataScopeAnnotation.whereInType()); + configDTO.setParamName(dataScopeAnnotation.paramName()); dataScopeMethodMap.put(method.getDeclaringClass().getSimpleName() + "." + method.getName(), configDTO); } } @@ -96,28 +91,30 @@ public class DataScopeSqlConfigService { /** * 组装需要拼接的sql - * + * @param paramMap * @param sqlConfigDTO * @return */ - public String getJoinSql(DataScopeSqlConfigDTO sqlConfigDTO) { + public String getJoinSql(Map paramMap, DataScopeSqlConfigDTO sqlConfigDTO) { DataScopeTypeEnum dataScopeTypeEnum = sqlConfigDTO.getDataScopeType(); String joinSql = sqlConfigDTO.getJoinSql(); - RequestTokenBO requestToken = SmartRequestTokenUtil.getThreadLocalUser(); - Long employeeId = requestToken.getRequestUserId(); + Long employeeId = SmartEmployeeTokenUtil.getRequestEmployeeId(); + if (employeeId == null) { + return ""; + } if (DataScopeWhereInTypeEnum.CUSTOM_STRATEGY == sqlConfigDTO.getDataScopeWhereInType()) { Class strategyClass = sqlConfigDTO.getJoinSqlImplClazz(); - if(strategyClass == null){ + if (strategyClass == null) { log.warn("data scope custom strategy class is null"); return ""; } - DataScopePowerStrategy powerStrategy = (DataScopePowerStrategy)SmartApplicationContext.getBean(sqlConfigDTO.getJoinSqlImplClazz()); + DataScopePowerStrategy powerStrategy = (DataScopePowerStrategy) SmartApplicationContext.getBean(sqlConfigDTO.getJoinSqlImplClazz()); if (powerStrategy == null) { - log.warn("data scope custom strategy class:{} ,bean is null",sqlConfigDTO.getJoinSqlImplClazz()); + log.warn("data scope custom strategy class:{} ,bean is null", sqlConfigDTO.getJoinSqlImplClazz()); return ""; } DataScopeViewTypeEnum viewTypeEnum = dataScopeViewService.getEmployeeDataScopeViewType(dataScopeTypeEnum, employeeId); - return powerStrategy.getCondition(viewTypeEnum,sqlConfigDTO); + return powerStrategy.getCondition(viewTypeEnum,paramMap, sqlConfigDTO); } if (DataScopeWhereInTypeEnum.EMPLOYEE == sqlConfigDTO.getDataScopeWhereInType()) { List canViewEmployeeIds = dataScopeViewService.getCanViewEmployeeId(dataScopeTypeEnum, employeeId); diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeViewService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/service/DataScopeViewService.java similarity index 68% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeViewService.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/service/DataScopeViewService.java index 11ec5bc7..93f052eb 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/service/DataScopeViewService.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/service/DataScopeViewService.java @@ -1,21 +1,19 @@ -package net.lab1024.smartadmin.module.system.datascope.service; +package net.lab1024.smartadmin.service.module.system.datascope.service; import com.google.common.collect.Lists; -import net.lab1024.smartadmin.module.system.datascope.DataScopeRoleDao; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeTypeEnum; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeViewTypeEnum; -import net.lab1024.smartadmin.module.system.datascope.domain.entity.DataScopeRoleEntity; -import net.lab1024.smartadmin.module.system.department.DepartmentTreeService; -import net.lab1024.smartadmin.module.system.employee.EmployeeDao; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeDTO; -import net.lab1024.smartadmin.module.system.employee.domain.entity.EmployeeEntity; -import net.lab1024.smartadmin.module.system.employee.domain.vo.EmployeeVO; -import net.lab1024.smartadmin.module.system.privilege.service.PrivilegeEmployeeService; -import net.lab1024.smartadmin.module.system.role.roleemployee.RoleEmployeeDao; -import net.lab1024.smartadmin.util.SmartBaseEnumUtil; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import net.lab1024.smartadmin.service.module.system.datascope.DataScopeRoleDao; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeViewTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.domain.entity.DataScopeRoleEntity; +import net.lab1024.smartadmin.service.module.system.department.DepartmentService; +import net.lab1024.smartadmin.service.module.system.employee.EmployeeDao; +import net.lab1024.smartadmin.service.module.system.employee.domain.entity.EmployeeEntity; +import net.lab1024.smartadmin.service.module.system.menu.MenuEmployeeService; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.RoleEmployeeDao; +import net.lab1024.smartadmin.service.util.SmartBaseEnumUtil; import java.util.Comparator; import java.util.List; @@ -25,12 +23,7 @@ import java.util.stream.Collectors; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/28 0028 下午 15:56 - * @since JDK1.8 + * @author 罗伊 */ @Service public class DataScopeViewService { @@ -41,15 +34,14 @@ public class DataScopeViewService { @Autowired private DataScopeRoleDao dataScopeRoleDao; - @Autowired - private DepartmentTreeService departmentTreeService; - @Autowired private EmployeeDao employeeDao; @Autowired - private PrivilegeEmployeeService privilegeEmployeeService; + private DepartmentService departmentService; + @Autowired + private MenuEmployeeService menuEmployeeService; /** * 获取某人可以查看的所有人员信息 * @@ -99,8 +91,7 @@ public class DataScopeViewService { private List getDepartmentAndSubIdList(Long employeeId) { EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); - List allDepartmentIds = Lists.newArrayList(); - departmentTreeService.buildIdList(employeeEntity.getDepartmentId(), allDepartmentIds); + List allDepartmentIds = departmentService.selfAndChildrenIdList(employeeEntity.getDepartmentId()); return allDepartmentIds; } @@ -115,7 +106,7 @@ public class DataScopeViewService { return DataScopeViewTypeEnum.ME; } - if (privilegeEmployeeService.isSuperman(employeeId)) { + if (menuEmployeeService.isSuperman(employeeId)) { return DataScopeViewTypeEnum.ALL; } List roleIdList = roleEmployeeDao.selectRoleIdByEmployeeId(employeeId); @@ -152,8 +143,7 @@ public class DataScopeViewService { */ private List getDepartmentEmployeeIdList(Long employeeId) { EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); - List employeeList = employeeDao.getEmployeeIdByDeptId(employeeEntity.getDepartmentId()); - List employeeIdList = employeeList.stream().map(e -> e.getId()).collect(Collectors.toList()); + List employeeIdList = employeeDao.getEmployeeIdByDepartmentId(employeeEntity.getDepartmentId(),false,false); return employeeIdList; } @@ -164,11 +154,8 @@ public class DataScopeViewService { * @return */ private List getDepartmentAndSubEmployeeIdList(Long employeeId) { - EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); - List allDepartmentIds = Lists.newArrayList(); - departmentTreeService.buildIdList(employeeEntity.getDepartmentId(), allDepartmentIds); - List employeeList = employeeDao.getEmployeeIdByDeptIds(allDepartmentIds); - List employeeIdList = employeeList.stream().map(e -> e.getId()).collect(Collectors.toList()); + List allDepartmentIds = getDepartmentAndSubIdList(employeeId); + List employeeIdList = employeeDao.getEmployeeIdByDepartmentIdList(allDepartmentIds,false,false); return employeeIdList; } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/strategy/DataScopePowerStrategy.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/strategy/DataScopePowerStrategy.java new file mode 100644 index 00000000..82ec0922 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/datascope/strategy/DataScopePowerStrategy.java @@ -0,0 +1,22 @@ +package net.lab1024.smartadmin.service.module.system.datascope.strategy; + +import net.lab1024.smartadmin.service.module.system.datascope.constant.DataScopeViewTypeEnum; +import net.lab1024.smartadmin.service.module.system.datascope.domain.dto.DataScopeSqlConfigDTO; + +import java.util.Map; + +/** + * [ 数据范围策略 ,使用DataScopeWhereInTypeEnum.CUSTOM_STRATEGY类型,DataScope注解的joinSql属性无用] + * + * @author 罗伊 + */ +public abstract class DataScopePowerStrategy { + + /** + * 获取joinsql 字符串 + * @param viewTypeEnum 查看的类型 + * @param sqlConfigDTO + * @return + */ + public abstract String getCondition(DataScopeViewTypeEnum viewTypeEnum, Map paramMap, DataScopeSqlConfigDTO sqlConfigDTO); +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentCacheService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentCacheService.java new file mode 100644 index 00000000..b4061383 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentCacheService.java @@ -0,0 +1,71 @@ +package net.lab1024.smartadmin.service.module.system.department; + +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.constant.CacheModuleBaseConst; +import net.lab1024.smartadmin.service.module.support.beancache.key.CacheKey; +import net.lab1024.smartadmin.service.module.support.beancache.load.CacheLoad; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentTreeVO; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author 罗伊 + * @date 2021-01-31 0:48 + */ +@Slf4j +@Service +public class DepartmentCacheService { + + @Autowired + private DepartmentDao departmentDao; + + @Autowired + private DepartmentTreeService departmentTreeService; + + /** + * 缓存部门结构 + * cacheKey = CacheKeyConst.DEPARTMENT_TREE_CACHE + * 无businessId + * + * @return + */ + @CacheLoad(CacheModuleBaseConst.Department.DEPARTMENT_CACHE) + public List departmentCache() { + List departmentVOList = departmentDao.listAll(); + return departmentVOList; + } + + /** + * 缓存部门树结构 + * cacheKey = CacheKeyConst.DEPARTMENT_TREE_CACHE + * 无businessId + * + * @return + */ + @CacheLoad(CacheModuleBaseConst.Department.DEPARTMENT_TREE_CACHE) + public List departmentTreeCache() { + List departmentVOList = departmentDao.listAll(); + List treeList = departmentTreeService.buildTree(departmentVOList); + return treeList; + } + + /** + * 缓存某个部门的下级id列表 + * cacheKey = CacheKeyConst.DEPARTMENT_TREE_ID_CACHE + * businessId = departmentId + * + * @param cacheKey + * @return + */ + @CacheLoad(CacheModuleBaseConst.Department.DEPARTMENT_TREE_ID_CACHE) + public List departmentTreeCache(String cacheKey) { + String businessId = CacheKey.getBusinessIdByCacheKey(cacheKey); + Long departmentId = Long.valueOf(businessId); + List departmentVOList = departmentDao.listAll(); + List idList = departmentTreeService.selfAndChildrenIdList(departmentId, departmentVOList); + return idList; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentController.java new file mode 100644 index 00000000..4a97233a --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentController.java @@ -0,0 +1,105 @@ +package net.lab1024.smartadmin.service.module.system.department; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.department.domain.dto.DepartmentCreateDTO; +import net.lab1024.smartadmin.service.module.system.department.domain.dto.DepartmentUpdateDTO; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentEmployeeTreeVO; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentTreeVO; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 部门管理路由器 + * + * @author listen + * @date 2017/12/19 14:29 + */ +@Api(tags = {SwaggerTagConst.Admin.MANAGER_DEPARTMENT}) +@RestController +public class DepartmentController extends AdminBaseController { + + @Autowired + private DepartmentService departmentService; + + @ApiOperation(value = "查询部门树形列表") + @GetMapping("/department/treeList") + public ResponseDTO> departmentTree() { + return departmentService.departmentTree(); + } + + @ApiOperation(value = "查询部门及员工树列表") + @GetMapping("/department/departmentEmployeeTree") + public ResponseDTO> departmentEmployeeTree() { + return departmentService.departmentEmployeeTree(); + } + + @ApiOperation(value = "根据部门名称查询部门树列表") + @GetMapping("/department/departmentTreeByName") + public ResponseDTO> departmentTreeByName(String departmentName) { + return departmentService.departmentTreeByName(departmentName); + } + + @ApiOperation(value = "添加部门") + @PostMapping("/department/add") + public ResponseDTO addDepartment(@Valid @RequestBody DepartmentCreateDTO createDTO) { + return departmentService.addDepartment(createDTO); + } + + @ApiOperation(value = "更新部门信息") + @PostMapping("/department/update") + public ResponseDTO updateDepartment(@Valid @RequestBody DepartmentUpdateDTO updateDTO) { + return departmentService.updateDepartment(updateDTO); + } + + @ApiOperation(value = "删除部门") + @GetMapping("/department/delete/{deptId}") + public ResponseDTO delDepartment(@PathVariable Long deptId) { + return departmentService.delDepartment(deptId); + } + + @ApiOperation(value = "获取部门信息") + @GetMapping("/department/query/{deptId}") + public ResponseDTO getDepartment(@PathVariable Long deptId) { + return departmentService.getDepartmentById(deptId); + } + + @ApiOperation(value = "查询部门列表") + @GetMapping("/department/listAll") + public ResponseDTO> listAll() { + return departmentService.listAll(); + } + + + @ApiOperation(value = "上下移动") + @GetMapping("/department/upOrDown/{deptId}/{swapId}") + public ResponseDTO upOrDown(@PathVariable Long deptId, @PathVariable Long swapId) { + return departmentService.upOrDown(deptId, swapId); + } + + @ApiOperation(value = "升级") + @GetMapping("/department/upgrade/{deptId}") + public ResponseDTO upgrade(@PathVariable Long deptId) { + return departmentService.upgrade(deptId); + } + + @ApiOperation(value = "降级") + @GetMapping("/department/downgrade/{deptId}/{preId}") + public ResponseDTO downgrade(@PathVariable Long deptId, @PathVariable Long preId) { + return departmentService.downgrade(deptId, preId); + } + + @ApiOperation("获取校区列表 by 善逸") + @GetMapping("/department/querySchoolList") + public ResponseDTO> querySchoolList() { + return departmentService.querySchoolList(); + } + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentDao.java similarity index 61% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentDao.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentDao.java index d7bc2f77..6ffd1c18 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentDao.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentDao.java @@ -1,11 +1,11 @@ -package net.lab1024.smartadmin.module.system.department; +package net.lab1024.smartadmin.service.module.system.department; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import net.lab1024.smartadmin.module.system.department.domain.dto.DepartmentVO; -import net.lab1024.smartadmin.module.system.department.domain.entity.DepartmentEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; +import net.lab1024.smartadmin.service.module.system.department.domain.entity.DepartmentEntity; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentVO; import java.util.List; @@ -30,18 +30,15 @@ public interface DepartmentDao extends BaseMapper { /** * 获取全部部门列表 * - * @return List + * @return */ List listAll(); /** - * 功能描述: 根据父部门id查询 + * 获取根据父级ID查询部门列表 * - * @param * @return - * @auther yandanyang - * @date 2018/8/25 0025 上午 9:46 */ - List selectByParentId(@Param("departmentId") Long departmentId); + List queryByParentId(@Param("parentId") Long parentId); } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentManager.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentManager.java new file mode 100644 index 00000000..7588948a --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentManager.java @@ -0,0 +1,31 @@ +package net.lab1024.smartadmin.service.module.system.department; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import net.lab1024.smartadmin.service.module.system.department.domain.entity.DepartmentEntity; + +import java.util.List; + +/** + * Description + * + * @author 善逸 + * @date 2021/8/31 17:19 + */ +@Service +public class DepartmentManager extends ServiceImpl { + + + /** + * 批量添加 编辑 + * + * @param insertDepartmentList + * @param updateDepartmentList + */ + @Transactional(rollbackFor = Exception.class) + public void batchInsertUpdate(List insertDepartmentList, List updateDepartmentList) { + saveBatch(insertDepartmentList); + updateBatchById(updateDepartmentList); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentService.java new file mode 100644 index 00000000..7c269c39 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentService.java @@ -0,0 +1,522 @@ +package net.lab1024.smartadmin.service.module.system.department; + +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.CacheModuleBaseConst; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.beancache.cache.IBeanCache; +import net.lab1024.smartadmin.service.module.support.beancache.key.CacheKey; +import net.lab1024.smartadmin.service.module.system.department.domain.dto.DepartmentCreateDTO; +import net.lab1024.smartadmin.service.module.system.department.domain.dto.DepartmentUpdateDTO; +import net.lab1024.smartadmin.service.module.system.department.domain.entity.DepartmentEntity; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentEmployeeTreeVO; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentTreeVO; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentVO; +import net.lab1024.smartadmin.service.module.system.employee.EmployeeDao; +import net.lab1024.smartadmin.service.module.system.employee.domain.dto.EmployeeDTO; +import net.lab1024.smartadmin.service.module.system.employee.domain.entity.EmployeeEntity; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 部门管理业务类 + * + * @author listen + * @date 2017/12/19 14:25 + */ +@Service +public class DepartmentService { + + @Autowired + private DepartmentDao departmentDao; + + @Autowired + private EmployeeDao employeeDao; + + @Autowired + private DepartmentTreeService departmentTreeService; + + @Autowired + protected IBeanCache beanCache; + + /** + * 获取部门树形结构 + * + * @return + */ + public ResponseDTO> departmentTree() { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Department.DEPARTMENT_TREE_CACHE); + List treeVOList = beanCache.get(cacheKey); + return ResponseDTO.succData(treeVOList); + } + + /** + * 自身以及所有下级的部门id列表 + * + * @param departmentId + * @return + */ + public List selfAndChildrenIdList(Long departmentId) { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Department.DEPARTMENT_TREE_ID_CACHE, departmentId.toString()); + return beanCache.get(cacheKey); + } + + /** + * 部门员工树 + * + * @return + */ + public ResponseDTO> departmentEmployeeTree() { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Department.DEPARTMENT_TREE_CACHE); + List treeVOList = beanCache.get(cacheKey); + if (CollectionUtils.isEmpty(treeVOList)) { + return ResponseDTO.succData(Lists.newArrayList()); + } + // 获取全部员工列表 + List employeeList = employeeDao.listAll(); + if (CollectionUtils.isEmpty(employeeList)) { + return ResponseDTO.succData(SmartBeanUtil.copyList(treeVOList, DepartmentEmployeeTreeVO.class)); + } + Map> employeeMap = employeeList.stream().collect(Collectors.groupingBy(EmployeeDTO::getDepartmentId)); + //构建各部门的员工信息 + List departmentEmployeeTreeVOList = this.buildTreeEmployee(treeVOList, employeeMap); + + return ResponseDTO.succData(departmentEmployeeTreeVOList); + } + + /** + * 递归构建每部门的员工信息 + * + * @param treeVOList + * @param employeeMap + * @return + */ + private List buildTreeEmployee(List treeVOList, Map> employeeMap) { + List departmentEmployeeTreeVOList = Lists.newArrayList(); + for (DepartmentTreeVO departmentTreeVO : treeVOList) { + DepartmentEmployeeTreeVO departmentEmployeeTreeVO = SmartBeanUtil.copy(departmentTreeVO, DepartmentEmployeeTreeVO.class); + departmentEmployeeTreeVO.setEmployees(employeeMap.getOrDefault(departmentEmployeeTreeVO.getId(), Lists.newArrayList())); + List children = departmentTreeVO.getChildren(); + if (CollectionUtils.isEmpty(children)) { + continue; + } + List childrenList = this.buildTreeEmployee(children, employeeMap); + departmentEmployeeTreeVO.setChildren(childrenList); + departmentEmployeeTreeVOList.add(departmentEmployeeTreeVO); + } + return departmentEmployeeTreeVOList; + } + + /** + * 获取所有部门和员工信息 + * + * @param departmentName + * @return + */ + public ResponseDTO> departmentTreeByName(String departmentName) { + // 获取全部部门列表 + List departmentVOList = departmentDao.listAll(); + if (StringUtils.isNotBlank(departmentName)) { + // 检索条件不为空的时候 过滤部门列表 + departmentVOList = this.filterDepartment(departmentVOList, departmentName); + } + List result = departmentTreeService.buildTree(departmentVOList); + return ResponseDTO.succData(result); + } + + /** + * 过滤部门名称,获取过滤后的结果 + * + * @author 开云 + * @date 2019/4/28 20:17 + */ + private List filterDepartment(List departmentVOList, String departmentName) { + Map departmentMap = new HashMap<>(departmentVOList.size()); + departmentVOList.forEach(item -> { + if (!item.getName().contains(departmentName)) { + return; + } + // 当前部门包含关键字 + departmentMap.put(item.getId(), item); + Long parentId = item.getParentId(); + if (null != parentId) { + List filterResult = new ArrayList<>(); + getParentDepartment(departmentVOList, parentId, filterResult); + for (DepartmentVO dto : filterResult) { + if (!departmentMap.containsKey(dto.getId())) { + departmentMap.put(dto.getId(), dto); + } + } + } + }); + return new ArrayList<>(departmentMap.values()); + } + + /** + * 递归获取部门的所有上级元素 + * + * @param departmentVOList + * @param parentId + * @param result + * @return + */ + private List getParentDepartment(List departmentVOList, Long parentId, List result) { + List deptList = departmentVOList.stream().filter(e -> e.getId().equals(parentId)).collect(Collectors.toList()); + for (DepartmentVO item : deptList) { + result.add(item); + if (item.getParentId() != CommonConst.DEFAULT_PARENT_ID && item.getParentId() != null) { + result.addAll(getParentDepartment(departmentVOList, item.getParentId(), result)); + } + } + return result; + } + + /** + * 新增添加部门 + * + * @param departmentCreateDTO + * @return AjaxResult + */ + + public ResponseDTO addDepartment(DepartmentCreateDTO departmentCreateDTO) { + DepartmentEntity departmentEntity = SmartBeanUtil.copy(departmentCreateDTO, DepartmentEntity.class); + departmentEntity.setSort(0L); + DepartmentService departmentService = (DepartmentService) AopContext.currentProxy(); + departmentService.addDepartmentHandle(departmentEntity); + this.clearTreeCache(); + this.clearSelfAndChildrenIdCache(); + return ResponseDTO.succ(); + } + + /** + * 新增部门数据处理 + * + * @param departmentEntity + */ + @Transactional(rollbackFor = Exception.class) + public void addDepartmentHandle(DepartmentEntity departmentEntity) { + departmentDao.insert(departmentEntity); + DepartmentEntity updateSortEntity = new DepartmentEntity(); + updateSortEntity.setId(departmentEntity.getId()); + updateSortEntity.setSort(departmentEntity.getId()); + departmentDao.updateById(updateSortEntity); + } + + /** + * 更新部门信息 + * + * @param updateDTO + * @return + */ + public ResponseDTO updateDepartment(DepartmentUpdateDTO updateDTO) { + if (updateDTO.getParentId() == null) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "父级部门id不能为空"); + } + DepartmentEntity entity = departmentDao.selectById(updateDTO.getId()); + if (entity == null) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + DepartmentEntity departmentEntity = SmartBeanUtil.copy(updateDTO, DepartmentEntity.class); + departmentEntity.setSort(entity.getSort()); + departmentDao.updateById(departmentEntity); + this.clearTreeCache(); + return ResponseDTO.succ(); + } + + /** + * 根据id删除部门 + * 1、需要判断当前部门是否有子部门,有子部门则不允许删除 + * 2、需要判断当前部门是否有员工,有员工则不能删除 + * + * @param deptId + * @return + */ + public ResponseDTO delDepartment(Long deptId) { + DepartmentEntity departmentEntity = departmentDao.selectById(deptId); + if (null == departmentEntity) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + // 是否有子级部门 + int subDepartmentNum = departmentDao.countSubDepartment(deptId); + if (subDepartmentNum > 0) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "请先删除子级部门"); + } + + // 是否有未删除员工 + int employeeNum = employeeDao.countByDepartmentId(deptId, false); + if (employeeNum > 0) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "请先删除部门员工"); + } + departmentDao.deleteById(deptId); + // 清除缓存 + this.clearTreeCache(); + this.clearSelfAndChildrenIdCache(); + return ResponseDTO.succ(); + } + + /** + * 根据id获取部门信息 + * + * @param departmentId + * @return + */ + public ResponseDTO getDepartmentById(Long departmentId) { + DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); + if (departmentEntity == null) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + DepartmentVO departmentVO = SmartBeanUtil.copy(departmentEntity, DepartmentVO.class); + return ResponseDTO.succData(departmentVO); + } + + /** + * 获取所有部门 + * + * @return + */ + public ResponseDTO> listAll() { + List departmentVOList = departmentDao.listAll(); + return ResponseDTO.succData(departmentVOList); + } + + /** + * 上下移动 + * + * @param departmentId + * @param swapId + * @return + */ + public ResponseDTO upOrDown(Long departmentId, Long swapId) { + DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); + if (departmentEntity == null) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + DepartmentEntity swapEntity = departmentDao.selectById(swapId); + if (swapEntity == null) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + DepartmentEntity updateEntity = new DepartmentEntity(); + updateEntity.setId(departmentId); + updateEntity.setSort(swapEntity.getSort()); + + DepartmentEntity swapUpdateEntity = new DepartmentEntity(); + swapUpdateEntity.setId(swapEntity.getId()); + swapUpdateEntity.setSort(departmentEntity.getSort()); + DepartmentService departmentService = (DepartmentService) AopContext.currentProxy(); + departmentService.upOrDownUpdate(updateEntity, swapEntity); + //清除缓存 + this.clearTreeCache(); + return ResponseDTO.succ(); + } + + /** + * 上下移动数据库处理 + * + * @param departmentEntity + * @param swapEntity + */ + @Transactional(rollbackFor = Exception.class) + public void upOrDownUpdate(DepartmentEntity departmentEntity, DepartmentEntity swapEntity) { + departmentDao.updateById(departmentEntity); + departmentDao.updateById(swapEntity); + } + + /** + * 部门升级 + * + * @param departmentId + * @return + */ + public ResponseDTO upgrade(Long departmentId) { + DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); + if (departmentEntity == null) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + if (departmentEntity.getParentId() == null || departmentEntity.getParentId().equals(CommonConst.DEFAULT_PARENT_ID)) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "此部门已经是根节点无法移动"); + } + DepartmentEntity parentEntity = departmentDao.selectById(departmentEntity.getParentId()); + + DepartmentEntity updateEntity = new DepartmentEntity(); + updateEntity.setId(departmentId); + updateEntity.setParentId(parentEntity.getParentId()); + departmentDao.updateById(updateEntity); + //清除缓存 + this.clearTreeCache(); + return ResponseDTO.succ(); + } + + /** + * 部门降级 + * + * @param departmentId + * @param preId + * @return + */ + public ResponseDTO downgrade(Long departmentId, Long preId) { + DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); + if (departmentEntity == null) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + DepartmentEntity preEntity = departmentDao.selectById(preId); + if (preEntity == null) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + DepartmentEntity updateEntity = new DepartmentEntity(); + updateEntity.setId(departmentId); + updateEntity.setParentId(preEntity.getId()); + departmentDao.updateById(updateEntity); + //清除缓存 + this.clearTreeCache(); + return ResponseDTO.succ(); + } + + + /** + * 清除自身以及下级的id列表缓存 + */ + private void clearSelfAndChildrenIdCache() { + beanCache.removeByModule(CacheModuleBaseConst.Department.DEPARTMENT_TREE_ID_CACHE); + } + + /** + * 清除树结构缓存 + */ + private void clearTreeCache() { + String treeCacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Department.DEPARTMENT_TREE_CACHE); + beanCache.remove(treeCacheKey); + } + + /** + * 获取最顶级部门id + * + * @return + */ + public Long queryTopDeptId() { + ResponseDTO> departmentTree = departmentTree(); + List data = departmentTree.getData(); + return data.get(0).getId(); + } + + /** + * 获取校区列表 即第二级部门列表 + * + * @return + */ + public ResponseDTO> querySchoolList() { + ResponseDTO> res = departmentTree(); + if (!res.isSuccess()) { + return ResponseDTO.wrap(res); + } + List data = res.getData(); + // 拿到第二级部门列表 + List resList = Lists.newArrayList(); + for (DepartmentTreeVO tree : data) { + List children = tree.getChildren(); + if (!CollectionUtils.isEmpty(children)) { + resList.addAll(SmartBeanUtil.copyList(children, DepartmentVO.class)); + } + } + return ResponseDTO.succData(resList); + } + + /** + * 根据部门ID获取父级名称 + * + * @param departmentId + * @return + */ + public String getParentNameTreeByDepartmentId(Long departmentId) { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Department.DEPARTMENT_CACHE); + List departmentList = beanCache.get(cacheKey); + //递归寻找上级直到校区(第二级) + List departmentNameList = Lists.newArrayList(); + this.recursionFindParentDepartmentName(departmentNameList, departmentList, departmentId); + return StringUtils.join(departmentNameList, "/"); + } + + /** + * 递归查询父级部门名称 到校区(第二级) + * + * @param departmentNameList + * @param departmentList + * @param departmentId + */ + private void recursionFindParentDepartmentName(List departmentNameList, List departmentList, Long departmentId) { + Optional findRes = departmentList.stream().filter(e -> e.getId().equals(departmentId)).findFirst(); + if (!findRes.isPresent() || findRes.get().getParentId() == CommonConst.DEFAULT_PARENT_ID) { + return; + } + DepartmentVO departmentVO = findRes.get(); + departmentNameList.add(0, departmentVO.getName()); + this.recursionFindParentDepartmentName(departmentNameList, departmentList, departmentVO.getParentId()); + } + + /** + * 寻找员工所属校区 + * + * @param employeeId + * @return + */ + public Long getSchoolIdByEmployeeId(Long employeeId) { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Employee.SINGLE_EMPLOYEE_CACHE, employeeId.toString()); + EmployeeEntity employeeEntity = beanCache.get(cacheKey); + Long departmentId = employeeEntity.getDepartmentId(); + DepartmentVO schoolIdByDepartment = this.getSchoolIdByDepartment(departmentId); + if (schoolIdByDepartment != null) { + return schoolIdByDepartment.getId(); + } + return null; + } + + /** + * 寻找部门所属校区 + * + * @param departmentId + * @return + */ + public DepartmentVO getSchoolIdByDepartment(Long departmentId) { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Department.DEPARTMENT_CACHE); + List departmentList = beanCache.get(cacheKey); + //递归寻找校区(第二级) + return this.recursionFindSchoolDepartmentId(departmentList, departmentId); + } + + /** + * 寻找校区ID + * + * @param departmentList + * @param departmentId + * @return + */ + private DepartmentVO recursionFindSchoolDepartmentId(List departmentList, Long departmentId) { + Optional findRes = departmentList.stream().filter(e -> e.getId().equals(departmentId)).findFirst(); + // 如果查询不到 或者自己本身为最顶级 返回null + if (!findRes.isPresent() || findRes.get().getParentId() == CommonConst.DEFAULT_PARENT_ID) { + return null; + } + DepartmentVO departmentVO = findRes.get(); + // 寻找父级 判断父级的父级是不是最顶级 + Optional parentFindRes = departmentList.stream().filter(e -> e.getId().equals(departmentVO.getParentId())).findFirst(); + // 若找不到父级则返回null + if (!parentFindRes.isPresent()) { + return null; + } + // 若父级为最顶级 则返回本级ID + if (parentFindRes.get().getParentId() == CommonConst.DEFAULT_PARENT_ID) { + return departmentVO; + } + // 若父级不为最顶级 进入递归 + return this.recursionFindSchoolDepartmentId(departmentList, departmentVO.getParentId()); + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentTreeService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentTreeService.java new file mode 100644 index 00000000..f7e59247 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/DepartmentTreeService.java @@ -0,0 +1,137 @@ +package net.lab1024.smartadmin.service.module.system.department; + +import com.google.common.collect.Lists; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentTreeVO; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentVO; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * [ ] + * + * @author 罗伊 + */ +@Service +public class DepartmentTreeService { + + /** + * 构建部门树结构 + * + * @param voList + * @return + */ + public List buildTree(List voList) { + if (CollectionUtils.isEmpty(voList)) { + return Lists.newArrayList(); + } + List rootList = voList.stream().filter(e -> e.getParentId() == null || e.getParentId() == CommonConst.DEFAULT_PARENT_ID).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(rootList)) { + return Lists.newArrayList(); + } + List treeVOList = SmartBeanUtil.copyList(rootList, DepartmentTreeVO.class); + this.buildTree(treeVOList, voList); + return treeVOList; + } + + /** + * 构建所有根节点的下级树形结构 + * + * @param nodeList + * @param voList + */ + private void buildTree(List nodeList, List voList) { + int nodeSize = nodeList.size(); + for (int i = 0; i < nodeSize; i++) { + int preIndex = i - 1; + int nextIndex = i + 1; + DepartmentTreeVO node = nodeList.get(i); + if (preIndex > -1) { + node.setPreId(nodeList.get(preIndex).getId()); + } + if (nextIndex < nodeSize) { + node.setNextId(nodeList.get(nextIndex).getId()); + } + buildTree(node, voList); + } + } + + /** + * 构建子元素的下级 + * + * @param node + * @param voList + */ + private void buildTree(DepartmentTreeVO node, List voList) { + List children = getChildren(node.getId(), voList); + if (CollectionUtils.isNotEmpty(children)) { + node.setChildren(children); + this.buildTree(children, voList); + } + } + + /** + * 获取子元素 + * + * @param departmentId + * @param voList + * @return + */ + private List getChildren(Long departmentId, List voList) { + List childrenEntityList = voList.stream().filter(e -> departmentId.equals(e.getParentId())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(childrenEntityList)) { + return Lists.newArrayList(); + } + return SmartBeanUtil.copyList(childrenEntityList, DepartmentTreeVO.class); + } + + + /** + * 通过部门id,获取当前以及下属部门 + * + * @param departmentId + * @param voList + */ + public List selfAndChildrenIdList(Long departmentId, List voList) { + List selfAndChildrenIdList = Lists.newArrayList(); + if (CollectionUtils.isEmpty(voList)) { + return selfAndChildrenIdList; + } + selfAndChildrenIdList.add(departmentId); + List children = this.getChildren(departmentId, voList); + if (CollectionUtils.isEmpty(children)) { + return selfAndChildrenIdList; + } + List childrenIdList = children.stream().map(DepartmentTreeVO::getId).collect(Collectors.toList()); + selfAndChildrenIdList.addAll(childrenIdList); + for (Long childId : childrenIdList) { + this.selfAndChildrenRecursion(selfAndChildrenIdList, childId, voList); + } + return selfAndChildrenIdList; + } + + /** + * 递归查询 + * + * @param selfAndChildrenIdList + * @param departmentId + * @param voList + */ + public void selfAndChildrenRecursion(List selfAndChildrenIdList, Long departmentId, List voList) { + List children = this.getChildren(departmentId, voList); + if (CollectionUtils.isEmpty(children)) { + return; + } + List childrenIdList = children.stream().map(DepartmentTreeVO::getId).collect(Collectors.toList()); + selfAndChildrenIdList.addAll(childrenIdList); + for (Long childId : childrenIdList) { + this.selfAndChildrenRecursion(selfAndChildrenIdList, childId, voList); + } + } + + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/dto/DepartmentCreateDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/dto/DepartmentCreateDTO.java similarity index 75% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/dto/DepartmentCreateDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/dto/DepartmentCreateDTO.java index 3e80003c..d5b422e1 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/dto/DepartmentCreateDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/dto/DepartmentCreateDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.department.domain.dto; +package net.lab1024.smartadmin.service.module.system.department.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -9,18 +9,12 @@ import javax.validation.constraints.NotNull; /** * * [ ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date + * + * @author 罗伊 */ @Data public class DepartmentCreateDTO { - - + @ApiModelProperty("部门名称") @Length(min = 1, max = 50, message = "请输入正确的部门名称(1-50个字符)") @NotNull(message = "请输入正确的部门名称(1-50个字符)") diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/dto/DepartmentUpdateDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/dto/DepartmentUpdateDTO.java similarity index 58% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/dto/DepartmentUpdateDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/dto/DepartmentUpdateDTO.java index f1b108a8..1914508a 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/dto/DepartmentUpdateDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/dto/DepartmentUpdateDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.department.domain.dto; +package net.lab1024.smartadmin.service.module.system.department.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -8,12 +8,7 @@ import javax.validation.constraints.NotNull; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 + * @author 罗伊 */ @Data public class DepartmentUpdateDTO extends DepartmentCreateDTO { diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/entity/DepartmentEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/entity/DepartmentEntity.java new file mode 100644 index 00000000..3452d2fa --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/entity/DepartmentEntity.java @@ -0,0 +1,70 @@ +package net.lab1024.smartadmin.service.module.system.department.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 部门实体类 + * t_department 数据表 + * + * @author listen + * @date 2017/12/19 10:45 + */ +@Data +@TableName(value = "t_department") +public class DepartmentEntity { + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 部门名称 + */ + private String name; + + /** + * 部门简称 + */ + private String shortName; + + /** + * 负责人员工 id + */ + private Long managerId; + + /** + * 部门父级id + */ + private Long parentId; + + /** + * 排序 + */ + private Long sort; + + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + + /** + * 导入标识 + */ + private Boolean importFlag; + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo/DepartmentEmployeeTreeVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo/DepartmentEmployeeTreeVO.java new file mode 100644 index 00000000..ee2f0bc9 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo/DepartmentEmployeeTreeVO.java @@ -0,0 +1,22 @@ +package net.lab1024.smartadmin.service.module.system.department.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.module.system.employee.domain.dto.EmployeeDTO; + +import java.util.List; + +/** + * @author 罗伊 + * @date 2021-01-30 23:57 + */ +@Data +public class DepartmentEmployeeTreeVO extends DepartmentVO { + + @ApiModelProperty("部门员工列表") + private List employees; + + @ApiModelProperty("子部门") + private List children; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo/DepartmentTreeVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo/DepartmentTreeVO.java new file mode 100644 index 00000000..c4183866 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo/DepartmentTreeVO.java @@ -0,0 +1,18 @@ +package net.lab1024.smartadmin.service.module.system.department.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author 罗伊 + * @date 2021-01-30 23:57 + */ +@Data +public class DepartmentTreeVO extends DepartmentVO { + + @ApiModelProperty("子部门") + private List children; + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/dto/DepartmentVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo/DepartmentVO.java similarity index 57% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/dto/DepartmentVO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo/DepartmentVO.java index 067e174d..84b204fe 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/dto/DepartmentVO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/department/domain/vo/DepartmentVO.java @@ -1,13 +1,12 @@ -package net.lab1024.smartadmin.module.system.department.domain.dto; +package net.lab1024.smartadmin.service.module.system.department.domain.vo; -import com.fasterxml.jackson.annotation.JsonProperty; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeDTO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import java.util.Date; -import java.util.List; - +/** + * @author 罗伊 + * @date 2021-01-30 23:57 + */ @Data public class DepartmentVO { @@ -26,10 +25,6 @@ public class DepartmentVO { @ApiModelProperty("部门负责人id") private Long managerId; - @ApiModelProperty("子部门") - @JsonProperty("children") - private List childrenDepartment; - @ApiModelProperty("父级部门id") private Long parentId; @@ -45,14 +40,4 @@ public class DepartmentVO { @ApiModelProperty("父级部门名称") private String parentName; - @ApiModelProperty("部门员工列表") - private List employees; - - @ApiModelProperty("上次更新时间") - private Date updateTime; - - @ApiModelProperty("创建时间") - private Date createTime; - - } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeCacheService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeCacheService.java new file mode 100644 index 00000000..2e233d9c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeCacheService.java @@ -0,0 +1,81 @@ +package net.lab1024.smartadmin.service.module.system.employee; + +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.constant.CacheModuleBaseConst; +import net.lab1024.smartadmin.service.module.support.beancache.key.CacheKey; +import net.lab1024.smartadmin.service.module.support.beancache.load.CacheLoad; +import net.lab1024.smartadmin.service.module.system.employee.domain.entity.EmployeeEntity; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.RoleEmployeeDao; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author 罗伊 + * @date 2021-01-30 23:57 + */ +@Slf4j +@Service +public class EmployeeCacheService { + + @Autowired + private EmployeeDao employeeDao; + @Autowired + private RoleEmployeeDao roleEmployeeDao; + + /** + * 缓存某个部门下的员工 + * cacheKey = CacheKeyConst.Employee + * businessId = departmentId + * + * @param cacheKey + * @return + */ + @CacheLoad(CacheModuleBaseConst.Employee.DEPARTMENT_EMPLOYEE_CACHE) + public List departmentEmployeeCache(String cacheKey) { + String businessId = CacheKey.getBusinessIdByCacheKey(cacheKey); + Long departmentId = Long.valueOf(businessId); + List employeeEntityList = employeeDao.selectByDepartmentId(departmentId, false, false); + return employeeEntityList; + } + + /** + * 单个员工的缓存 + * + * @param cacheKey + * @return + */ + @CacheLoad(CacheModuleBaseConst.Employee.SINGLE_EMPLOYEE_CACHE) + public EmployeeEntity singleEmployeeCache(String cacheKey) { + String businessId = CacheKey.getBusinessIdByCacheKey(cacheKey); + Long employeeId = Long.valueOf(businessId); + EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); + if (null == employeeEntity) { + return null; + } + if (employeeEntity.getDeletedFlag()) { + return null; + } + return employeeEntity; + } + + /** + * 单个员工的缓存 + * + * @param cacheKey + * @return + */ + @CacheLoad(CacheModuleBaseConst.Employee.SINGLE_EMPLOYEE_ROLE_CACHE) + public List singleEmployeeRoleCache(String cacheKey) { + String businessId = CacheKey.getBusinessIdByCacheKey(cacheKey); + Long employeeId = Long.valueOf(businessId); + List roleIdList = roleEmployeeDao.selectRoleIdByEmployeeId(employeeId); + if (CollectionUtils.isEmpty(roleIdList)) { + return Lists.newArrayList(); + } + return roleIdList; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeController.java new file mode 100644 index 00000000..d4f1c2ed --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeController.java @@ -0,0 +1,118 @@ +package net.lab1024.smartadmin.service.module.system.employee; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.employee.domain.dto.*; +import net.lab1024.smartadmin.service.module.system.employee.domain.vo.EmployeeVO; +import net.lab1024.smartadmin.service.util.SmartEmployeeTokenUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 员工管理 + * + * @author 开云 + * @date 2017年12月19日上午11:34:52 + */ +@RestController +@Api(tags = {SwaggerTagConst.Admin.MANAGER_EMPLOYEE}) +public class EmployeeController extends AdminBaseController { + + @Autowired + private EmployeeService employeeService; + + @PostMapping("/employee/query") + @ApiOperation(value = "员工管理查询", notes = "员工管理查询 @author 开云") + public ResponseDTO> query(@Valid @RequestBody EmployeeQueryDTO query) { + return employeeService.queryEmployeeList(query); + } + + @ApiOperation(value = "添加员工", notes = "@author 罗伊") + @PostMapping("/employee/add") + public ResponseDTO addEmployee(@Valid @RequestBody EmployeeAddDTO addDTO) { + addDTO.setUpdateId(SmartEmployeeTokenUtil.getRequestEmployeeId()); + return employeeService.addEmployee(addDTO); + } + + @ApiOperation(value = "更新员工禁用状态", notes = "@author 罗伊") + @GetMapping("/employee/update/disabled/{employeeId}") + public ResponseDTO updateDisableFlag(@PathVariable Long employeeId) { + return employeeService.updateDisableFlag(employeeId); + } + + @ApiOperation(value = "批量更新员工禁用状态", notes = "@author 罗伊") + @PostMapping("/employee/update/batch/disabled") + public ResponseDTO batchUpdateDisableFlag(@Valid @RequestBody EmployeeDisabledUpdateDTO updateDTO) { + return employeeService.batchUpdateDisableFlag(updateDTO); + } + + @ApiOperation(value = "更新员工信息", notes = "@author 罗伊") + @PostMapping("/employee/update") + public ResponseDTO updateEmployee(@Valid @RequestBody EmployeeUpdateDTO updateDTO) { + updateDTO.setUpdateId(SmartEmployeeTokenUtil.getRequestEmployeeId()); + return employeeService.updateEmployee(updateDTO); + } + + @ApiOperation(value = "删除员工", notes = "@author 罗伊") + @GetMapping("/employee/delete/{employeeId}") + public ResponseDTO deleteEmployeeById(@PathVariable Long employeeId) { + return employeeService.deleteEmployeeById(employeeId); + } + + @ApiOperation(value = "批量删除员工", notes = "@author 善逸") + @GetMapping("/employee/update/batch/delete") + public ResponseDTO batchUpdateDeleteFlag(@RequestParam("employeeIdList")List employeeIdList) { + return employeeService.batchUpdateDeleteFlag(employeeIdList); + } + + @ApiOperation(value = "批量调整员工部门", notes = "@author 善逸") + @PostMapping("/employee/update/batch/department") + public ResponseDTO batchUpdateDepartment(@Valid @RequestBody EmployeeDepartmentUpdateDTO updateDto) { + return employeeService.batchUpdateDepartment(updateDto); + } + + @ApiOperation(value = "单个员工角色授权", notes = "@author 罗伊") + @PostMapping("/employee/update/roles") + public ResponseDTO updateRoles(@Valid @RequestBody EmployeeRoleUpdateDTO updateRolesDTO) { + return employeeService.updateRole(updateRolesDTO); + } + + @ApiOperation(value = "修改密码", notes = "@author 罗伊") + @PostMapping("/employee/update/pwd") + public ResponseDTO updatePwd(@Valid @RequestBody EmployeeUpdatePwdDTO updatePwdDTO) { + updatePwdDTO.setEmployeeId(SmartEmployeeTokenUtil.getRequestEmployeeId()); + return employeeService.updatePwd(updatePwdDTO); + } + + @ApiOperation(value = "查询员工-根据部门id", notes = "@author 罗伊") + @GetMapping("/employee/query/dept/{deptId}") + public ResponseDTO> listByDepartmentId(@PathVariable Long deptId) { + return employeeService.getEmployeeByDeptId(deptId); + } + + @ApiOperation("查询所有员工 by 善逸") + @GetMapping("/employee/queryAll") + public ResponseDTO> queryAllEmploy(@RequestParam(value = "disabledFlag", required = false) Boolean disabledFlag) { + return employeeService.queryAllEmploy(disabledFlag); + } + + @ApiOperation(value = "重置员工密码", notes = "@author 罗伊") + @GetMapping("/employee/update/pwd/reset/{employeeId}") + public ResponseDTO resetPassword(@PathVariable Integer employeeId) { + return employeeService.resetPassword(employeeId); + } + + @ApiOperation(value = "查询员工-根据校区id", notes = "@author 善逸") + @GetMapping("/employee/query/school/{deptId}") + public ResponseDTO> listBySchoolId(@PathVariable Long deptId) { + return employeeService.getEmployeeBySchoolId(deptId); + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeDao.java new file mode 100644 index 00000000..913e2af8 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeDao.java @@ -0,0 +1,169 @@ +package net.lab1024.smartadmin.service.module.system.employee; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; +import net.lab1024.smartadmin.service.module.system.employee.domain.dto.EmployeeDTO; +import net.lab1024.smartadmin.service.module.system.employee.domain.dto.EmployeeQueryDTO; +import net.lab1024.smartadmin.service.module.system.employee.domain.entity.EmployeeEntity; +import net.lab1024.smartadmin.service.module.system.employee.domain.vo.EmployeeVO; + +import java.util.Collection; +import java.util.List; + +/** + * 员工dao接口 + * + * @author 开云 + * @date 2017年12月19日下午1:36:30 + */ +@Mapper +@Component +public interface EmployeeDao extends BaseMapper { + /** + * 查询员工列表 + * + * @param page + * @param queryDTO + * @return + */ + List queryEmployee(Page page, @Param("queryDTO") EmployeeQueryDTO queryDTO); + + /** + * 查询员工列表 + * + * @param queryDTO + * @return + */ + List queryEmployee(@Param("queryDTO") EmployeeQueryDTO queryDTO); + + /** + * 批量更新禁用状态 + * + * @param employeeIdList + * @param disabledFlag + */ + void batchUpdateDisableFlag(@Param("employeeIdList") List employeeIdList, + @Param("disabledFlag") Boolean disabledFlag); + + /** + * 更新单个 + * + * @param id + * @param disabledFlag + */ + void updateDisableFlag(@Param("id") Long id, @Param("disabledFlag") Boolean disabledFlag); + + /** + * 根据 账号 密码 查询 + * + * @param loginName + * @param loginPwd + * @param deletedFlag + * @return + */ + EmployeeEntity selectByLoginNameAndPwd(@Param("loginName") String loginName, + @Param("loginPwd") String loginPwd, + @Param("deletedFlag") Boolean deletedFlag); + + /** + * 通过登录名查询 + * + * @param loginName + * @param disabledFlag + * @return + */ + EmployeeDTO getByLoginName(@Param("loginName") String loginName, + @Param("disabledFlag") Boolean disabledFlag, + @Param("deletedFlag") Boolean deletedFlag); + + /** + * 通过手机号查询 + * + * @param phone + * @param disabledFlag + * @return + */ + EmployeeDTO getByPhone(@Param("phone") String phone, @Param("disabledFlag") Boolean disabledFlag); + + /** + * 获取所有员工 + * + * @return + */ + List listAll(); + + /** + * 获取某个部门员工数 + * + * @param departmentId + * @param deletedFlag 可以null + * @return + */ + Integer countByDepartmentId(@Param("departmentId") Long departmentId, @Param("deletedFlag") Boolean deletedFlag); + + /** + * 获取一批员工 + * + * @param employeeIds + * @return + */ + List getEmployeeByIds(@Param("ids") Collection employeeIds); + + + /** + * 查询单个员工信息 + * + * @param employeeId + * @return + */ + EmployeeDTO getEmployeeById(@Param("id") Long employeeId); + + + /** + * 获取某个部门的员工 + * + * @param departmentId + * @param disabledFlag + * @param deletedFlag + * @return + */ + List selectByDepartmentId(@Param("departmentId") Long departmentId, @Param("disabledFlag") Boolean disabledFlag, @Param("deletedFlag") Boolean deletedFlag); + + /** + * 获取某批部门的员工Id + * + * @param departmentIds + * @return + */ + List getEmployeeIdByDepartmentIdList(@Param("departmentIds") List departmentIds, @Param("disabledFlag") Boolean disabledFlag, @Param("deletedFlag") Boolean deletedFlag); + + /** + * 获取所有 + * @param disabledFlag + * @param deletedFlag + * @return + */ + List getEmployeeId( @Param("disabledFlag") Boolean disabledFlag, @Param("deletedFlag") Boolean deletedFlag); + + /** + * 获取某个部门的员工Id + * @param departmentId + * @param disabledFlag + * @param deletedFlag + * @return + */ + List getEmployeeIdByDepartmentId(@Param("departmentId") Long departmentId, @Param("disabledFlag") Boolean disabledFlag, @Param("deletedFlag") Boolean deletedFlag); + + /** + * 员工重置密码 + * + * @param employeeId + * @param password + * @return + */ + Integer updatePassword(@Param("employeeId") Integer employeeId, @Param("password") String password); + +} \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeManager.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeManager.java new file mode 100644 index 00000000..b3c060e0 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeManager.java @@ -0,0 +1,78 @@ +package net.lab1024.smartadmin.service.module.system.employee; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import net.lab1024.smartadmin.service.module.system.employee.domain.entity.EmployeeEntity; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.RoleEmployeeManager; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.domain.RoleEmployeeEntity; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 员工 manager + * + * @author 胡克 + * @date 2021/7/28 19:15 + */ +@Service +public class EmployeeManager extends ServiceImpl { + + @Autowired + private EmployeeDao employeeDao; + + @Autowired + private RoleEmployeeManager roleEmployeeManager; + + /** + * 保存员工 + * + * @param employee + */ + @Transactional(rollbackFor = Throwable.class) + public void saveEmployee(EmployeeEntity employee, List roleIdList) { + // 保存员工 获得id + employeeDao.insert(employee); + + if (CollectionUtils.isNotEmpty(roleIdList)) { + List roleEmployeeList = roleIdList.stream().map(e -> new RoleEmployeeEntity(e, employee.getId())).collect(Collectors.toList()); + roleEmployeeManager.saveBatch(roleEmployeeList); + } + } + + /** + * 更新员工 + * + * @param employee + */ + @Transactional(rollbackFor = Throwable.class) + public void updateEmployee(EmployeeEntity employee, List roleIdList) { + // 保存员工 获得id + employeeDao.updateById(employee); + + if (CollectionUtils.isNotEmpty(roleIdList)) { + List roleEmployeeList = roleIdList.stream().map(e -> new RoleEmployeeEntity(e, employee.getId())).collect(Collectors.toList()); + this.updateEmployeeRole(employee.getId(),roleEmployeeList); + } + } + + /** + * 更新员工角色 + * + * @param employeeId + * @param roleEmployeeList + */ + @Transactional(rollbackFor = Throwable.class) + public void updateEmployeeRole(Long employeeId, List roleEmployeeList) { + roleEmployeeManager.getBaseMapper().deleteByEmployeeId(employeeId); + + if (CollectionUtils.isNotEmpty(roleEmployeeList)) { + roleEmployeeManager.saveBatch(roleEmployeeList); + } + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeService.java new file mode 100644 index 00000000..9981adf3 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/EmployeeService.java @@ -0,0 +1,514 @@ +package net.lab1024.smartadmin.service.module.system.employee; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.Lists; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.CacheModuleBaseConst; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.beancache.cache.IBeanCache; +import net.lab1024.smartadmin.service.module.support.beancache.key.CacheKey; +import net.lab1024.smartadmin.service.module.system.department.DepartmentDao; +import net.lab1024.smartadmin.service.module.system.department.domain.entity.DepartmentEntity; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentVO; +import net.lab1024.smartadmin.service.module.system.employee.domain.dto.*; +import net.lab1024.smartadmin.service.module.system.employee.domain.entity.EmployeeEntity; +import net.lab1024.smartadmin.service.module.system.employee.domain.vo.EmployeeVO; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginBO; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginInfoDTO; +import net.lab1024.smartadmin.service.module.system.menu.MenuEmployeeService; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.RoleEmployeeDao; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.domain.RoleEmployeeEntity; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import net.lab1024.smartadmin.service.util.SmartPageUtil; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 员工管理 + * + * @author 罗伊 + * @date 2021年01月21日上午11:54:52 + */ +@Service +public class EmployeeService { + + @Autowired + private EmployeeDao employeeDao; + + @Autowired + private DepartmentDao departmentDao; + + @Autowired + private MenuEmployeeService menuEmployeeService; + + @Autowired + private EmployeeManager employeeManager; + + @Autowired + private RoleEmployeeDao roleEmployeeDao; + + @Autowired + protected IBeanCache beanCache; + + /** + * 获取员工登录信息 + * + * @param employeeId + * @return + */ + public EmployeeLoginInfoDTO getById(Long employeeId) { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Employee.SINGLE_EMPLOYEE_CACHE, employeeId.toString()); + EmployeeEntity employeeEntity = beanCache.get(cacheKey); + //获取员工角色缓存 + String roleCacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Employee.SINGLE_EMPLOYEE_ROLE_CACHE, employeeId.toString()); + List roleIdList = beanCache.get(roleCacheKey); + if (employeeEntity != null) { + Boolean isSuperman = menuEmployeeService.isSuperman(employeeId); + EmployeeLoginInfoDTO loginDTO = SmartBeanUtil.copy(employeeEntity, EmployeeLoginInfoDTO.class); + loginDTO.setEmployeeId(employeeId); + loginDTO.setIsSuperMan(isSuperman); + loginDTO.setRoleList(roleIdList); + return loginDTO; + } + return null; + } + + /** + * 获取员工登录信息 + * + * @param employeeId + * @return + */ + public EmployeeLoginBO getBoById(Long employeeId) { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Employee.SINGLE_EMPLOYEE_CACHE, employeeId.toString()); + EmployeeEntity employeeEntity = beanCache.get(cacheKey); + //获取员工角色缓存 + String roleCacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Employee.SINGLE_EMPLOYEE_ROLE_CACHE, employeeId.toString()); + List roleIdList = beanCache.get(roleCacheKey); + if (employeeEntity != null) { + Boolean isSuperman = menuEmployeeService.isSuperman(employeeId); + EmployeeLoginBO loginDTO = SmartBeanUtil.copy(employeeEntity, EmployeeLoginBO.class); + loginDTO.setEmployeeId(employeeId); + loginDTO.setIsSuperMan(isSuperman); + loginDTO.setRoleList(roleIdList); + return loginDTO; + } + return null; + } + + /** + * 查询员工列表 + * + * @param queryDTO + * @return + */ + public ResponseDTO> queryEmployeeList(EmployeeQueryDTO queryDTO) { + queryDTO.setDeletedFlag(false); + Page pageParam = SmartPageUtil.convert2PageQuery(queryDTO); + List employeeList = employeeDao.queryEmployee(pageParam, queryDTO); + if (CollectionUtils.isEmpty(employeeList)) { + PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(pageParam, employeeList); + return ResponseDTO.succData(pageResultDTO); + } + // 查询员工角色 + List employeeIdList = employeeList.stream().map(EmployeeVO::getId).collect(Collectors.toList()); + List roleEmployeeEntityList = roleEmployeeDao.selectRoleIdByEmployeeIdList(employeeIdList); + Map> employeeRoleIdListMap = roleEmployeeEntityList.stream().collect(Collectors.groupingBy(RoleEmployeeEntity::getEmployeeId, Collectors.mapping(RoleEmployeeEntity::getRoleId, Collectors.toList()))); + // 写入角色ID + employeeList.forEach(e -> { + e.setRoleIdList(employeeRoleIdListMap.getOrDefault(e.getId(), Lists.newArrayList())); + }); + PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(pageParam, employeeList); + return ResponseDTO.succData(pageResultDTO); + } + + /** + * 新增员工 + * + * @param addDTO + * @return + */ + public ResponseDTO addEmployee(EmployeeAddDTO addDTO) { + // 校验名称是否重复 + EmployeeDTO employeeDTO = employeeDao.getByLoginName(addDTO.getLoginName(), false, false); + if (null != employeeDTO) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "员工名称重复"); + } + // 校验电话是否存在 + employeeDTO = employeeDao.getByPhone(addDTO.getPhone(), false); + if (null != employeeDTO) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "手机号已存在"); + } + // 部门是否存在 + Long departmentId = addDTO.getDepartmentId(); + DepartmentEntity department = departmentDao.selectById(departmentId); + if (department == null) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "部门不存在"); + } + + EmployeeEntity entity = SmartBeanUtil.copy(addDTO, EmployeeEntity.class); + // 设置密码 默认密码 + entity.setLoginPwd(getEncryptPwd(null)); + + // 保存数据 + employeeManager.saveEmployee(entity, addDTO.getRoleIdList()); + + this.clearCacheByDepartmentId(departmentId); + + return ResponseDTO.succ(); + } + + /** + * 更新员工 + * + * @param updateDTO + * @return + */ + public ResponseDTO updateEmployee(EmployeeUpdateDTO updateDTO) { + Long employeeId = updateDTO.getId(); + EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); + if (null == employeeEntity) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + Long departmentId = updateDTO.getDepartmentId(); + DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); + if (departmentEntity == null) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + EmployeeDTO employeeDTO = employeeDao.getByLoginName(updateDTO.getLoginName(), false, false); + if (null != employeeDTO && !Objects.equals(employeeDTO.getId(), employeeId)) { + return ResponseDTO.wrap(ResponseCodeConst.ALREADY_EXIST); + } + employeeDTO = employeeDao.getByPhone(updateDTO.getLoginName(), false); + if (null != employeeDTO && !Objects.equals(employeeDTO.getId(), employeeId)) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + + // 不更新密码 + EmployeeEntity entity = SmartBeanUtil.copy(updateDTO, EmployeeEntity.class); + entity.setLoginPwd(null); + + // 更新数据 + employeeManager.updateEmployee(entity, updateDTO.getRoleIdList()); + + // 清除缓存 + this.clearCacheByEmployeeId(employeeId); + this.clearCacheByDepartmentId(departmentId); + + return ResponseDTO.succ(); + } + + /** + * 更新禁用状态 + * + * @param employeeId + * @return + */ + public ResponseDTO updateDisableFlag(Long employeeId) { + if (null == employeeId) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); + if (null == employeeEntity) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + + employeeDao.updateDisableFlag(employeeId, !employeeEntity.getDisabledFlag()); + + this.clearCacheByEmployeeId(employeeId); + this.clearCacheByDepartmentId(employeeEntity.getDepartmentId()); + return ResponseDTO.succ(); + } + + /** + * 批量更新员工状态 + * + * @param batchUpdateStatusDTO + * @return + */ + public ResponseDTO batchUpdateDisableFlag(EmployeeDisabledUpdateDTO batchUpdateStatusDTO) { + List employeeIdList = batchUpdateStatusDTO.getEmployeeIdList(); + List employeeEntityList = employeeDao.selectBatchIds(employeeIdList); + if (employeeIdList.size() != employeeEntityList.size()) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + + employeeDao.batchUpdateDisableFlag(employeeIdList, batchUpdateStatusDTO.getDisabledFlag()); + + // 清除缓存 + employeeEntityList.forEach(e -> { + this.clearCacheByEmployeeId(e.getId()); + this.clearCacheByDepartmentId(e.getDepartmentId()); + }); + return ResponseDTO.succ(); + } + + /** + * 批量删除员工 + * + * @param employeeIdList 员工ID列表 + * @return + */ + public ResponseDTO batchUpdateDeleteFlag(List employeeIdList) { + if (CollectionUtils.isEmpty(employeeIdList)) { + return ResponseDTO.succ(); + } + List employeeEntityList = employeeManager.listByIds(employeeIdList); + if (CollectionUtils.isEmpty(employeeEntityList)) { + return ResponseDTO.succ(); + } + List deleteList = employeeIdList.stream().map(e -> { + // 更新删除 + EmployeeEntity updateEmployee = new EmployeeEntity(); + updateEmployee.setId(e); + updateEmployee.setDeletedFlag(true); + return updateEmployee; + }).collect(Collectors.toList()); + employeeManager.updateBatchById(deleteList); + + // 清除缓存 + employeeEntityList.forEach(e -> { + this.clearCacheByEmployeeId(e.getId()); + this.clearCacheByDepartmentId(e.getDepartmentId()); + }); + return ResponseDTO.succ(); + } + + /** + * 删除员工 + * + * @param employeeId 员工ID + * @return + */ + public ResponseDTO deleteEmployeeById(Long employeeId) { + EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); + if (null == employeeEntity) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + // 更新删除 + EmployeeEntity updateEmployee = new EmployeeEntity(); + updateEmployee.setId(employeeId); + updateEmployee.setDeletedFlag(true); + employeeDao.updateById(updateEmployee); + + this.clearCacheByEmployeeId(employeeId); + this.clearCacheByDepartmentId(employeeEntity.getDepartmentId()); + return ResponseDTO.succ(); + } + + /** + * 批量更新部门 + * + * @param updateDto + * @return + */ + public ResponseDTO batchUpdateDepartment(EmployeeDepartmentUpdateDTO updateDto) { + List employeeIdList = updateDto.getEmployeeIdList(); + List employeeEntityList = employeeDao.selectBatchIds(employeeIdList); + if (employeeIdList.size() != employeeEntityList.size()) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + + List updateList = employeeIdList.stream().map(e -> { + // 更新删除 + EmployeeEntity updateEmployee = new EmployeeEntity(); + updateEmployee.setId(e); + updateEmployee.setDepartmentId(updateDto.getDepartmentId()); + return updateEmployee; + }).collect(Collectors.toList()); + employeeManager.updateBatchById(updateList); + + // 清除缓存 + employeeEntityList.forEach(e -> { + this.clearCacheByEmployeeId(e.getId()); + this.clearCacheByDepartmentId(e.getDepartmentId()); + }); + return ResponseDTO.succ(); + } + + /** + * 更新用户角色 + * + * @param updateDTO + * @return + */ + public ResponseDTO updateRole(EmployeeRoleUpdateDTO updateDTO) { + Long employeeId = updateDTO.getEmployeeId(); + List roleIdList = updateDTO.getRoleIdList(); + + // 保存新的角色信息 + List roleEmployeeList = null; + if (CollectionUtils.isNotEmpty(roleIdList)) { + roleEmployeeList = roleIdList.stream() + .map(roleId -> new RoleEmployeeEntity(roleId, employeeId)) + .collect(Collectors.toList()); + } + + // 更新数据 + employeeManager.updateEmployeeRole(employeeId, roleEmployeeList); + return ResponseDTO.succ(); + } + + /** + * 更新密码 + * + * @param updatePwdDTO + * @return + */ + public ResponseDTO updatePwd(EmployeeUpdatePwdDTO updatePwdDTO) { + Long employeeId = updatePwdDTO.getEmployeeId(); + EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); + if (employeeEntity == null) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + // 校验原始密码 + String encryptPwd = getEncryptPwd(updatePwdDTO.getOldPwd()); + if (!Objects.equals(encryptPwd, employeeEntity.getLoginPwd())) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + + // 新旧密码相同 + String newPwd = updatePwdDTO.getPwd(); + if (Objects.equals(updatePwdDTO.getOldPwd(), newPwd)) { + return ResponseDTO.succ(); + } + + // 更新密码 + EmployeeEntity updateEntity = new EmployeeEntity(); + updateEntity.setId(employeeId); + updateEntity.setLoginPwd(getEncryptPwd(newPwd)); + employeeDao.updateById(updateEntity); + + return ResponseDTO.succ(); + } + + /** + * 获取某个部门的员工信息 + * + * @param departmentId + * @return + */ + public ResponseDTO> getEmployeeByDeptId(Long departmentId) { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Employee.DEPARTMENT_EMPLOYEE_CACHE, departmentId.toString()); + List employeeEntityList = beanCache.get(cacheKey); + if (CollectionUtils.isEmpty(employeeEntityList)) { + return ResponseDTO.succData(CommonConst.EMPTY_LIST); + } + List voList = SmartBeanUtil.copyList(employeeEntityList, EmployeeVO.class); + return ResponseDTO.succData(voList); + } + + /** + * 获取某个校区的员工信息 + * + * @param departmentId + * @return + */ + public ResponseDTO> getEmployeeBySchoolId(Long departmentId) { + // 查询部门下所有部门包含子部门 + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Department.DEPARTMENT_CACHE); + List departmentList = beanCache.get(cacheKey); + // 先查询本部门的员工 + ResponseDTO> employeeByDeptId = getEmployeeByDeptId(departmentId); + List schoolEmployeeList = employeeByDeptId.getData(); + // 进入递归 + List employeeList = Lists.newArrayList(schoolEmployeeList); + recursionFindEmployee(employeeList, departmentList, departmentId); + return ResponseDTO.succData(employeeList); + } + + /** + * 递归查询员工 + * + * @param employeeList + * @param departmentList + */ + private void recursionFindEmployee(List employeeList, List departmentList, Long parentId) { + // 寻找子集部门 + List childDepartmentList = departmentList.stream().filter(e -> e.getParentId().equals(parentId)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(childDepartmentList)) { + return; + } + for (DepartmentVO departmentVO : childDepartmentList) { + // 查询本级部门下包含的员工 + ResponseDTO> employeeByDeptId = getEmployeeByDeptId(departmentVO.getId()); + employeeList.addAll(employeeByDeptId.getData()); + recursionFindEmployee(employeeList, departmentList, departmentVO.getId()); + } + } + + /** + * 重置密码 + * + * @param employeeId + * @return + */ + public ResponseDTO resetPassword(Integer employeeId) { + String md5Password = getEncryptPwd(null); + employeeDao.updatePassword(employeeId, md5Password); + return ResponseDTO.succ(); + } + + /** + * 清除businessId为员工id的缓存信息 + * + * @param employeeId + */ + public void clearCacheByEmployeeId(Long employeeId) { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Employee.SINGLE_EMPLOYEE_CACHE, employeeId.toString()); + beanCache.remove(cacheKey); + String roleCacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Employee.SINGLE_EMPLOYEE_ROLE_CACHE, employeeId.toString()); + beanCache.remove(roleCacheKey); + } + + /** + * 清除businessId为部门id的缓存信息 + * + * @param departmentId + */ + private void clearCacheByDepartmentId(Long departmentId) { + String cacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Employee.DEPARTMENT_EMPLOYEE_CACHE, departmentId.toString()); + beanCache.remove(cacheKey); + } + + /** + * 获取 加密后 的密码 + * + * @param pwd 密码为空 将使用原始密码 + * @return + */ + public static String getEncryptPwd(String pwd) { + pwd = StringUtils.isBlank(pwd) ? CommonConst.Password.DEFAULT : pwd; + return DigestUtils.md5Hex(String.format(CommonConst.Password.SALT_FORMAT, pwd)); + } + + public static void main(String[] args) { + System.out.println(getEncryptPwd("123456")); + + } + + /** + * 查询全部员工 + * + * @return + */ + public ResponseDTO> queryAllEmploy(Boolean disabledFlag) { + EmployeeQueryDTO queryDTO = new EmployeeQueryDTO(); + queryDTO.setDeletedFlag(Boolean.FALSE); + if (disabledFlag != null) { + queryDTO.setDisabledFlag(disabledFlag); + } + List employeeList = employeeDao.queryEmployee(queryDTO); + return ResponseDTO.succData(employeeList); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeAddDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeAddDTO.java new file mode 100644 index 00000000..2bf4e3e1 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeAddDTO.java @@ -0,0 +1,56 @@ +package net.lab1024.smartadmin.service.module.system.employee.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.constant.GenderEnum; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; +import net.lab1024.smartadmin.service.common.validator.CheckEnum; +import net.lab1024.smartadmin.service.util.SmartVerificationUtil; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import java.util.List; + +/** + * 添加员工 + * + * @author 开云 + * @date 2017年12月19日下午2:06:31 + */ +@Data +public class EmployeeAddDTO { + + @ApiModelProperty("姓名") + @NotNull(message = "姓名不能为空") + @Length(max = 30, message = "姓名最多30字符") + private String actualName; + + @ApiModelProperty("登录账号") + @NotNull(message = "登录账号不能为空") + @Length(max = 30, message = "登录账号最多30字符") + private String loginName; + + @ApiModelPropertyEnum(GenderEnum.class) + @CheckEnum(enumClazz = GenderEnum.class, message = "性别错误") + private Integer gender; + + @ApiModelProperty("部门id") + @NotNull(message = "部门id不能为空") + private Long departmentId; + + @ApiModelProperty("是否启用") + @NotNull(message = "是否被禁用不能为空") + private Boolean disabledFlag; + + @ApiModelProperty("手机号") + @NotNull(message = "手机号不能为空") + @Pattern(regexp = SmartVerificationUtil.PHONE_REGEXP, message = "手机号格式不正确") + private String phone; + + @ApiModelProperty(hidden = true) + private Long updateId; + + @ApiModelProperty("角色列表") + private List roleIdList; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDTO.java new file mode 100644 index 00000000..618806f4 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDTO.java @@ -0,0 +1,43 @@ +package net.lab1024.smartadmin.service.module.system.employee.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 员工列表DTO + * + * @author 开云 + * @date 2017年12月21日上午09:09:31 + */ +@Data +public class EmployeeDTO { + + @ApiModelProperty("主键id") + private Long id; + + @ApiModelProperty("登录账号") + private String loginName; + + @ApiModelProperty("员工名称") + private String actualName; + + @ApiModelProperty("手机号码") + private String phone; + + @ApiModelProperty("部门id") + private Long departmentId; + + @ApiModelProperty("是否被禁用") + private Boolean disabledFlag; + + @ApiModelProperty("是否删除") + private Boolean deletedFlag; + + @ApiModelProperty("部门名称") + private String departmentName; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDepartmentUpdateDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDepartmentUpdateDTO.java new file mode 100644 index 00000000..55741420 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDepartmentUpdateDTO.java @@ -0,0 +1,28 @@ +package net.lab1024.smartadmin.service.module.system.employee.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * 员工更新部门 DTO + * + * @author 善逸 + * @date 2021年07月29日 20:00 + */ +@Data +public class EmployeeDepartmentUpdateDTO { + + @ApiModelProperty("员工id") + @NotEmpty(message = "员工id不能为空") + @Size(max = 99, message = "一次最多调整99个员工") + private List employeeIdList; + + @ApiModelProperty("部门ID") + @NotNull(message = "部门ID不能为空") + private Long departmentId; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDisabledUpdateDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDisabledUpdateDTO.java new file mode 100644 index 00000000..290e936b --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeDisabledUpdateDTO.java @@ -0,0 +1,28 @@ +package net.lab1024.smartadmin.service.module.system.employee.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.List; + +/** + * 员工禁用状态更新 DTO + * + * @author listen + * @date 2021年07月29日 20:00 + */ +@Data +public class EmployeeDisabledUpdateDTO { + + @ApiModelProperty("员工id") + @NotEmpty(message = "员工id不能为空") + @Size(max = 99, message = "一次最多更新99次") + private List employeeIdList; + + @ApiModelProperty("禁用状态") + @NotNull(message = "禁用状态不能为空") + private Boolean disabledFlag; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeLoginDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeLoginDTO.java new file mode 100644 index 00000000..301dbdd8 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeLoginDTO.java @@ -0,0 +1,36 @@ +package net.lab1024.smartadmin.service.module.system.employee.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.module.support.captcha.domain.CaptchaDTO; +import net.lab1024.smartadmin.service.util.SmartVerificationUtil; +import org.hibernate.validator.constraints.Length; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; + +/** + * 登录 + * + * @author 开云 + * @date 2017年12月19日上午11:49:46 + */ +@Data +public class EmployeeLoginDTO { + + @ApiModelProperty(example = "sa") + @NotBlank(message = "登录名不能为空") + @Length(max = 30, message = "登录账号最多30字符") + private String loginName; + + @ApiModelProperty(example = "123456") + @NotBlank(message = "密码不能为空") + @Pattern(regexp = SmartVerificationUtil.PWD_REGEXP, message = "请输入6-15位密码(数字|大小写字母|小数点)") + private String loginPwd; + + @ApiModelProperty("图形验证码|可选") + // @NotNull(message = "图形验证码不能为空") + @Valid + private CaptchaDTO captcha; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeQueryDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeQueryDTO.java new file mode 100644 index 00000000..9214be21 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeQueryDTO.java @@ -0,0 +1,36 @@ +package net.lab1024.smartadmin.service.module.system.employee.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Size; +import java.util.List; + +/** + * 员工列表DTO + * + * @author 开云 + * @date 2017年12月21日上午09:09:31 + */ +@Data +public class EmployeeQueryDTO extends PageBaseDTO { + + @ApiModelProperty("搜索词") + @Length(max = 20, message = "搜索词最多20字符") + private String keyword; + + @ApiModelProperty("部门id") + private Long departmentId; + + @ApiModelProperty("是否禁用") + private Boolean disabledFlag; + + @ApiModelProperty("员工id集合") + @Size(max = 99, message = "最多查询99个员工") + private List employeeIdList; + + @ApiModelProperty(hidden = true) + private Boolean deletedFlag; +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeQueryExportDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeQueryExportDTO.java similarity index 63% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeQueryExportDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeQueryExportDTO.java index 645bd213..7a4e93c2 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeQueryExportDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeQueryExportDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.employee.domain.dto; +package net.lab1024.smartadmin.service.module.system.employee.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -6,7 +6,7 @@ import lombok.Data; import java.util.List; /** - * @author zzr + * @author 1024lab * 不带分页的查询条件 */ @Data @@ -25,16 +25,10 @@ public class EmployeeQueryExportDTO { private Long departmentId; @ApiModelProperty(hidden = true) - private Integer isLeave; + private Boolean disabledFlag; - @ApiModelProperty(hidden = true) - private Integer isDisabled; - - /** - * 删除状态 0否 1是 - */ - @ApiModelProperty(value = "删除状态 0否 1是 不需要传", hidden = true) - private Integer isDelete; + @ApiModelProperty(value = "删除状态", hidden = true) + private Boolean deletedFlag; @ApiModelProperty(value = "员工ID集合", hidden = true) private List employeeIds; diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdateRolesDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeRoleUpdateDTO.java similarity index 52% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdateRolesDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeRoleUpdateDTO.java index 2829ba1a..22b2e39f 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdateRolesDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeRoleUpdateDTO.java @@ -1,29 +1,26 @@ -package net.lab1024.smartadmin.module.system.employee.domain.dto; +package net.lab1024.smartadmin.service.module.system.employee.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.util.List; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 + * @author 罗伊 */ @Data -public class EmployeeUpdateRolesDTO { +public class EmployeeRoleUpdateDTO { @ApiModelProperty("员工id") @NotNull(message = "员工id不能为空") private Long employeeId; @ApiModelProperty("角色ids") - private List roleIds; + @Size(max = 99, message = "角色最多99") + private List roleIdList; } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeUpdateDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeUpdateDTO.java new file mode 100644 index 00000000..49a975e6 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeUpdateDTO.java @@ -0,0 +1,20 @@ +package net.lab1024.smartadmin.service.module.system.employee.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 更新员工 + * + * @author 开云 + * @date 2017年12月19日下午2:06:31 + */ +@Data +public class EmployeeUpdateDTO extends EmployeeAddDTO { + + @ApiModelProperty("员工id") + @NotNull(message = "员工id不能为空") + private Long id; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeUpdatePwdDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeUpdatePwdDTO.java new file mode 100644 index 00000000..9b05658f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/dto/EmployeeUpdatePwdDTO.java @@ -0,0 +1,31 @@ +package net.lab1024.smartadmin.service.module.system.employee.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.util.SmartVerificationUtil; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; + +/** + * 修改密码所需参数 + * + * @author cyj + * @date 2018-02-23 下午 4:53 + */ +@Data +public class EmployeeUpdatePwdDTO { + + @ApiModelProperty(hidden = true) + private Long employeeId; + + @ApiModelProperty("原密码") + @NotBlank(message = "原密码不能为空哦") + @Pattern(regexp = SmartVerificationUtil.PWD_REGEXP, message = "原密码请输入6-15位(数字|大小写字母|小数点)") + private String oldPwd; + + @ApiModelProperty("新密码") + @NotBlank(message = "新密码不能为空哦") + @Pattern(regexp = SmartVerificationUtil.PWD_REGEXP, message = "新密码请输入6-15位(数字|大小写字母|小数点)") + private String pwd; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/entity/EmployeeEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/entity/EmployeeEntity.java new file mode 100644 index 00000000..2b76ee78 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/entity/EmployeeEntity.java @@ -0,0 +1,74 @@ +package net.lab1024.smartadmin.service.module.system.employee.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 员工实体类 + * + * @author 开云 + * @date 2017年12月19日下午1:34:48 + */ +@Data +@TableName("t_employee") +public class EmployeeEntity { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 登录账号 + */ + private String loginName; + + /** + * 登录密码 + */ + private String loginPwd; + + /** + * 员工名称 + */ + private String actualName; + + /** + * 性别 + * + * @see net.lab1024.smartadmin.service.common.constant.GenderEnum + */ + private Integer gender; + + /** + * 手机号码 + */ + private String phone; + + /** + * 部门id + */ + private Long departmentId; + + /** + * 是否被禁用 + */ + private Boolean disabledFlag; + + /** + * 是否删除 + */ + private Boolean deletedFlag; + + /** + * 备注 + */ + private String remark; + + private LocalDateTime updateTime; + + private LocalDateTime createTime; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/vo/EmployeeVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/vo/EmployeeVO.java new file mode 100644 index 00000000..c123c0d0 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/employee/domain/vo/EmployeeVO.java @@ -0,0 +1,50 @@ +package net.lab1024.smartadmin.service.module.system.employee.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.constant.GenderEnum; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * + * [ ] + * + * @author 罗伊 + * @date + */ +@Data +public class EmployeeVO { + + @ApiModelProperty("主键id") + private Long id; + + @ApiModelProperty("登录账号") + private String loginName; + + @ApiModelPropertyEnum(GenderEnum.class) + private Integer gender; + + @ApiModelProperty("员工名称") + private String actualName; + + @ApiModelProperty("手机号码") + private String phone; + + @ApiModelProperty("部门id") + private Long departmentId; + + @ApiModelProperty("是否被禁用") + private Boolean disabledFlag; + + @ApiModelProperty("部门名称") + private String departmentName; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("角色列表") + private List roleIdList; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginController.java new file mode 100644 index 00000000..db6ffcec --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginController.java @@ -0,0 +1,53 @@ +package net.lab1024.smartadmin.service.module.system.login; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.anno.NoNeedLogin; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.employee.domain.dto.EmployeeLoginDTO; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginInfoDTO; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginVO; +import net.lab1024.smartadmin.service.util.SmartEmployeeTokenUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +/** + * 后台登录 + * + * @author 开云 + * @date 2017年12月19日上午11:46:04 + */ +@RestController +@Api(tags = {SwaggerTagConst.Admin.MANAGER_EMPLOYEE_LOGIN}) +public class EmployeeLoginController extends AdminBaseController { + + @Autowired + private EmployeeLoginService employeeLoginService; + + @NoNeedLogin + @ApiOperation("登录 by listen") + @PostMapping("/login") + public ResponseDTO login(@Valid @RequestBody EmployeeLoginDTO loginDTO) { + return employeeLoginService.login(loginDTO); + } + + @GetMapping("/login/get") + @ApiOperation("获取登录信息") + public ResponseDTO getSession() { + EmployeeLoginInfoDTO requestEmployee = SmartEmployeeTokenUtil.getRequestEmployee(); + return ResponseDTO.succData(employeeLoginService.getSession(requestEmployee)); + } + + @GetMapping("/logout") + @ApiOperation("退出登陆") + public ResponseDTO logout() { + return employeeLoginService.logoutByToken(SmartEmployeeTokenUtil.getRequestEmployeeId()); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginService.java new file mode 100644 index 00000000..2da09cb4 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginService.java @@ -0,0 +1,143 @@ +package net.lab1024.smartadmin.service.module.system.login; + +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.codeconst.EmployeeResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.captcha.CaptchaService; +import net.lab1024.smartadmin.service.module.support.captcha.domain.CaptchaDTO; +import net.lab1024.smartadmin.service.module.system.department.DepartmentDao; +import net.lab1024.smartadmin.service.module.system.department.DepartmentService; +import net.lab1024.smartadmin.service.module.system.department.domain.entity.DepartmentEntity; +import net.lab1024.smartadmin.service.module.system.department.domain.vo.DepartmentVO; +import net.lab1024.smartadmin.service.module.system.employee.EmployeeDao; +import net.lab1024.smartadmin.service.module.system.employee.EmployeeService; +import net.lab1024.smartadmin.service.module.system.employee.domain.dto.EmployeeLoginDTO; +import net.lab1024.smartadmin.service.module.system.employee.domain.entity.EmployeeEntity; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginInfoDTO; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginVO; +import net.lab1024.smartadmin.service.module.system.menu.MenuEmployeeService; +import net.lab1024.smartadmin.service.module.system.menu.domain.MenuLoginBO; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * [ ] + * + * @author 罗伊 + */ +@Slf4j +@Service +public class EmployeeLoginService { + + @Autowired + private EmployeeDao employeeDao; + + @Autowired + private DepartmentDao departmentDao; + + @Autowired + private DepartmentService departmentService; + + @Autowired + private EmployeeLoginTokenService employeeLoginTokenService; + + @Autowired + private MenuEmployeeService menuEmployeeService; + + @Autowired + private EmployeeService employeeService; + + @Autowired + private CaptchaService captchaService; + + /** + * 员工登陆 + * + * @param loginDTO + * @return 返回用户登录信息 + */ + public ResponseDTO login(EmployeeLoginDTO loginDTO) { + // 校验图形验证码 + CaptchaDTO captcha = loginDTO.getCaptcha(); + if (null != captcha) { + ResponseDTO res = captchaService.checkCaptcha(captcha.getCaptchaId(), captcha.getCaptcha()); + if (!res.isSuccess()) { + return ResponseDTO.wrap(res); + } + } + + String loginPwd = EmployeeService.getEncryptPwd(loginDTO.getLoginPwd()); + EmployeeEntity employeeEntity = employeeDao.selectByLoginNameAndPwd(loginDTO.getLoginName(), loginPwd, false); + if (null == employeeEntity) { + return ResponseDTO.wrap(EmployeeResponseCodeConst.LOGIN_FAILED); + } + + if (employeeEntity.getDisabledFlag()) { + return ResponseDTO.wrap(EmployeeResponseCodeConst.STATUS_ERROR); + } + + // 生成 登录token + Long employeeId = employeeEntity.getId(); + String token = employeeLoginTokenService.generateToken(employeeId); + + // 判断是否为超管 + Boolean isSuperman = menuEmployeeService.isSuperman(employeeId); + + // 获取前端菜单以及功能权限 + MenuLoginBO menuLoginBORespDTO = menuEmployeeService.queryMenuTreeByEmployeeId(employeeId); + + // 查询部门 + DepartmentEntity deptEntity = departmentDao.selectById(employeeEntity.getDepartmentId()); + String deptName = null == deptEntity ? CommonConst.EMPTY_STR : deptEntity.getName(); + + // 查询所在校区 + DepartmentVO schoolIdByDepartment = departmentService.getSchoolIdByDepartment(employeeEntity.getDepartmentId()); + + // 返回登录结果 + EmployeeLoginVO loginResultDTO = SmartBeanUtil.copy(employeeEntity, EmployeeLoginVO.class); + loginResultDTO.setEmployeeId(employeeEntity.getId()); + loginResultDTO.setMenuTree(menuLoginBORespDTO.getMenuTree()); + loginResultDTO.setPointsList(menuLoginBORespDTO.getPointsList()); + loginResultDTO.setDepartmentName(deptName); + loginResultDTO.setToken(token); + loginResultDTO.setIsSuperMan(isSuperman); + if (schoolIdByDepartment != null) { + loginResultDTO.setSchoolId(schoolIdByDepartment.getId()); + loginResultDTO.setSchoolName(schoolIdByDepartment.getName()); + } + return ResponseDTO.succData(loginResultDTO); + } + + /** + * 退出登陆,清除token缓存 + * + * @param employeeId + * @return + */ + public ResponseDTO logoutByToken(Long employeeId) { + employeeService.clearCacheByEmployeeId(employeeId); + return ResponseDTO.succ(); + } + + /** + * 重新获取前端localStorage信息 + * + * @param loginInfo + * @return + */ + public EmployeeLoginVO getSession(EmployeeLoginInfoDTO loginInfo) { + Long employeeId = loginInfo.getEmployeeId(); + + EmployeeLoginVO loginDTO = SmartBeanUtil.copy(loginInfo, EmployeeLoginVO.class); + // 获取前端菜单以及功能权限 + MenuLoginBO menuLoginBORespDTO = menuEmployeeService.queryMenuTreeByEmployeeId(employeeId); + loginDTO.setMenuTree(menuLoginBORespDTO.getMenuTree()); + loginDTO.setPointsList(menuLoginBORespDTO.getPointsList()); + //判断是否为超管 + Boolean isSuperman = menuEmployeeService.isSuperman(loginDTO.getEmployeeId()); + loginDTO.setIsSuperMan(isSuperman); + return loginDTO; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginTokenService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginTokenService.java new file mode 100644 index 00000000..2aa0bf7e --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/EmployeeLoginTokenService.java @@ -0,0 +1,139 @@ +package net.lab1024.smartadmin.service.module.system.login; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.common.constant.SystemEnvironmentEnum; +import net.lab1024.smartadmin.service.module.system.employee.EmployeeService; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginBO; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginInfoDTO; +import org.apache.commons.lang3.math.NumberUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + * [ ] + * + * @author 罗伊 + */ +@Slf4j +@Service +public class EmployeeLoginTokenService { + + /** + * 默认 token 过期时间 1 天 + */ + private static final int EXPIRE_SECONDS = 24 * 3600; + + /** + * 默认 jwt key + */ + private static final String JWT_KEY = "smart-admin-jwt-key"; + + /** + * jwt加密字段 + */ + private static final String CLAIM_ID_KEY = "id"; + + @Autowired + private EmployeeService employeeService; + + @Autowired + private SystemEnvironmentEnum systemEnvironment; + + /** + * 生成 JWT TOKEN + * + * @param employeeId + * @return + * @auther listen + */ + public String generateToken(Long employeeId) { + long nowTimeMilli = System.currentTimeMillis(); + Claims jwtClaims = Jwts.claims(); + jwtClaims.put(CLAIM_ID_KEY, employeeId); + return Jwts.builder() + .setClaims(jwtClaims) + .setIssuedAt(new Date(nowTimeMilli)) + .setExpiration(new Date(nowTimeMilli + EXPIRE_SECONDS * 1000)) + .signWith(SignatureAlgorithm.HS512, JWT_KEY) + .compact(); + } + + /** + * 根据登陆token 获取员工信息 + * + * @param + * @return + */ + public EmployeeLoginInfoDTO getEmployeeLoginInfo(String token) { + /** + * 非生产环境 直接使用 token 作为id + * 不需要的话 注释了吧 + */ + if (SystemEnvironmentEnum.PROD != systemEnvironment && NumberUtils.isParsable(token)) { + return employeeService.getById(Long.parseLong(token)); + } + + Long employeeId = getEmployeeIdByToken(token); + if (employeeId == null) { + return null; + } + // 查询用户信息 + EmployeeLoginInfoDTO loginInfo = employeeService.getById(employeeId); + if (loginInfo == null) { + return null; + } + if (loginInfo.getDisabledFlag()) { + return null; + } + return loginInfo; + } + + /** + * 根据登陆token 获取员工信息BO + * + * @param + * @return + */ + public EmployeeLoginBO getEmployeeLoginBO(String token) { + /** + * 非生产环境 直接使用 token 作为id + * 不需要的话 注释了吧 + */ + if (SystemEnvironmentEnum.PROD != systemEnvironment && NumberUtils.isParsable(token)) { + return employeeService.getBoById(Long.parseLong(token)); + } + + Long employeeId = getEmployeeIdByToken(token); + if(employeeId == null){ + return null; + } + // 查询用户信息 + EmployeeLoginBO loginInfo = employeeService.getBoById(employeeId); + if (loginInfo == null) { + return null; + } + if (loginInfo.getDisabledFlag()) { + return null; + } + return loginInfo; + } + + private Long getEmployeeIdByToken(String token) { + try { + Claims claims = Jwts.parser() + .setSigningKey(JWT_KEY) + .parseClaimsJws(token) + .getBody(); + return Long.parseLong(claims.get(CLAIM_ID_KEY).toString()); + } catch (Exception e) { + log.error("parse employee token error:", e); + } + return null; + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginBO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginBO.java new file mode 100644 index 00000000..95fbbe80 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginBO.java @@ -0,0 +1,75 @@ +package net.lab1024.smartadmin.service.module.system.login.domain; + +import lombok.Data; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; + +/** + * 员工登陆BO + * + * @author 善逸 + * @date 2021/8/4 11:15 + */ +@Data +public class EmployeeLoginBO extends EmployeeLoginInfoDTO implements UserDetails { + + /** + * 登录密码 + */ + private String loginPwd; + + @Override + public Collection getAuthorities() { + return null; + } + + @Override + public String getPassword() { + return this.getLoginPwd(); + } + + @Override + public String getUsername() { + return this.getLoginName(); + } + + /** + * 账户是否未过期,过期无法验证 + */ + @Override + public boolean isAccountNonExpired() { + return true; + } + + /** + * 指定用户是否解锁,锁定的用户无法进行身份验证 + * + * @return + */ + @Override + public boolean isAccountNonLocked() { + return true; + } + + /** + * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 + * + * @return + */ + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + /** + * 是否可用 ,禁用的用户不能身份验证 + * + * @return + */ + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginInfoDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginInfoDTO.java new file mode 100644 index 00000000..499f29ab --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginInfoDTO.java @@ -0,0 +1,54 @@ +package net.lab1024.smartadmin.service.module.system.login.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.constant.GenderEnum; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; + +import java.util.List; + +/** + * 员工登录信息 DTO + * + * @author listen + * @date 2021年07月21日 上午07:06:31 + */ +@Data +public class EmployeeLoginInfoDTO { + + @ApiModelProperty("员工id") + private Long employeeId; + + @ApiModelProperty("登录账号") + private String loginName; + + @ApiModelProperty("员工名称") + private String actualName; + + @ApiModelPropertyEnum(GenderEnum.class) + private Integer gender; + + @ApiModelProperty("手机号码") + private String phone; + + @ApiModelProperty("部门id") + private Long departmentId; + + @ApiModelProperty("部门名称") + private String departmentName; + + @ApiModelProperty("是否被禁用") + private Boolean disabledFlag; + + @ApiModelProperty("是否为超管") + private Boolean isSuperMan; + + @ApiModelProperty("角色列表") + private List roleList; + + @ApiModelProperty("所在校区ID") + private Long schoolId; + + @ApiModelProperty("所在校区名称") + private String schoolName; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginPrivilegeDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginPrivilegeDTO.java new file mode 100644 index 00000000..d3b3df74 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginPrivilegeDTO.java @@ -0,0 +1,25 @@ +package net.lab1024.smartadmin.service.module.system.login.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +public class EmployeeLoginPrivilegeDTO { + + @ApiModelProperty("权限key") + private String key; + + private Integer type; + + @ApiModelProperty("url") + private String url; + + @ApiModelProperty("父级key") + private String parentKey; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginVO.java new file mode 100644 index 00000000..19d2177a --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/login/domain/EmployeeLoginVO.java @@ -0,0 +1,27 @@ +package net.lab1024.smartadmin.service.module.system.login.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.module.system.menu.domain.MenuTreeVO; + +import java.util.List; + +/** + * 员工登录结果 VO + * + * @author listen + * @date 2021年07月21日 上午07:06:31 + */ +@Data +public class EmployeeLoginVO extends EmployeeLoginInfoDTO { + + @ApiModelProperty("token") + private String token; + + @ApiModelProperty("菜单树") + private List menuTree; + + @ApiModelProperty("功能点权限列表") + private List pointsList; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuController.java new file mode 100644 index 00000000..025498b8 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuController.java @@ -0,0 +1,71 @@ +package net.lab1024.smartadmin.service.module.system.menu; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.menu.domain.*; +import net.lab1024.smartadmin.service.util.SmartEmployeeTokenUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * 菜单 + * + * @author 卓大 + */ +@Api(tags = {SwaggerTagConst.Admin.MANAGER_MENU}) +@RestController +public class MenuController extends AdminBaseController { + + @Autowired + private MenuService menuService; + + @ApiOperation(value = "添加菜单") + @PostMapping("/menu/add") + public ResponseDTO addMenu(@RequestBody @Valid MenuAddForm menuAddForm) { + menuAddForm.setCreateUserId(SmartEmployeeTokenUtil.getRequestEmployeeId()); + return menuService.addMenu(menuAddForm); + } + + @ApiOperation(value = "更新菜单") + @PostMapping("/menu/update") + public ResponseDTO updateMenu(@RequestBody @Valid MenuUpdateForm menuUpdateForm) { + menuUpdateForm.setUpdateUserId(SmartEmployeeTokenUtil.getRequestEmployeeId()); + return menuService.updateMenu(menuUpdateForm); + } + + @ApiOperation(value = "批量删除菜单") + @GetMapping("/menu/batchDelete") + public ResponseDTO batchDeleteMenu(@RequestParam("menuIdList") List menuIdList) { + return menuService.batchDeleteMenu(menuIdList, SmartEmployeeTokenUtil.getRequestEmployeeId()); + } + + @ApiOperation(value = "查询菜单列表") + @GetMapping("/menu/query") + public ResponseDTO> queryMenuList() { + return ResponseDTO.succData(menuService.queryMenuList(null)); + } + + @ApiOperation(value = "查询菜单详情") + @GetMapping("/menu/detail/{menuId}") + public ResponseDTO getMenuDetail(@PathVariable Long menuId) { + return menuService.getMenuDetail(menuId); + } + + @ApiOperation(value = "查询菜单树") + @GetMapping("/menu/tree") + public ResponseDTO> queryMenuTree(@RequestParam("onlyMenu") Boolean onlyMenu) { + return menuService.queryMenuTree(onlyMenu); + } + + @ApiOperation(value = "获取所有请求路径", notes = "获取所有请求路径") + @GetMapping("/menu/getAllUrl") + public ResponseDTO> getAllUrl() { + return menuService.getPrivilegeUrlDTOList(); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuDao.java new file mode 100644 index 00000000..57525773 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuDao.java @@ -0,0 +1,85 @@ +package net.lab1024.smartadmin.service.module.system.menu; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import net.lab1024.smartadmin.service.module.system.menu.domain.MenuEntity; +import net.lab1024.smartadmin.service.module.system.menu.domain.MenuVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 菜单 + * + * @author 卓大 + * @date 2021/7/29 16:13 + */ +@Mapper +@Component +public interface MenuDao extends BaseMapper { + + /** + * 根据名称查询同一级下的菜单 + * + * @param menuName 菜单名 + * @param parentId 父级id + * @param deleteFlag 是否删除 + * @return + */ + MenuEntity getByMenuName(@Param("menuName") String menuName, @Param("parentId") Long parentId, @Param("deleteFlag") Boolean deleteFlag); + + /** + * 根据菜单ID删除菜单(逻辑删除) + * + * @param menuIdList 菜单id集合 + * @param updateUserId 操作人id + * @param deleteFlag 是否删除 + */ + void deleteByMenuIdList(@Param("menuIdList") List menuIdList, @Param("updateUserId") Long updateUserId, @Param("deleteFlag") Boolean deleteFlag); + + /** + * 查询菜单列表 + * + * @param deleteFlag 是否删除 + * @param disabledFlag 是否禁用 + * @param menuTypeList 菜单类型集合 + * @return + */ + List queryMenuList(@Param("deleteFlag") Boolean deleteFlag, @Param("disabledFlag") Boolean disabledFlag, @Param("menuTypeList") List menuTypeList); + + + /** + * 根据菜单ID 查询功能点列表 + * + * @param menuId 菜单id + * @param menuType 菜单类型 + * @param deleteFlag 删除标记 + * @return + */ + List getPointListByMenuId(@Param("menuId") Long menuId, @Param("menuType") Integer menuType, @Param("deleteFlag") Boolean deleteFlag); + + /** + * 根据员工ID查询菜单列表 + * + * @param deleteFlag 是否删除 + * @param disabledFlag 禁用标识 + * @param employeeId 员工id + * @return + */ + List queryMenuByEmployeeId(@Param("deleteFlag") Boolean deleteFlag, + @Param("disabledFlag") Boolean disabledFlag, + @Param("employeeId") Long employeeId); + + /** + * 查询有效功能点 + * + * @param menuType 菜单类型 + * @param deleteFlag 删除已 + * @param disabledFlag 禁用 + * @return + */ + List queryAllPoint(@Param("menuType") Integer menuType, + @Param("deleteFlag") Boolean deleteFlag, + @Param("disabledFlag") Boolean disabledFlag); +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuEmployeeService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuEmployeeService.java new file mode 100644 index 00000000..294f62a8 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuEmployeeService.java @@ -0,0 +1,156 @@ +package net.lab1024.smartadmin.service.module.system.menu; + +import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; +import net.lab1024.smartadmin.service.module.support.systemconfig.SystemConfigConst; +import net.lab1024.smartadmin.service.module.support.systemconfig.SystemConfigService; +import net.lab1024.smartadmin.service.module.system.employee.EmployeeService; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginInfoDTO; +import net.lab1024.smartadmin.service.module.system.menu.constant.MenuTypeEnum; +import net.lab1024.smartadmin.service.module.system.menu.domain.MenuLoginBO; +import net.lab1024.smartadmin.service.module.system.menu.domain.MenuTreeVO; +import net.lab1024.smartadmin.service.module.system.menu.domain.MenuVO; +import net.lab1024.smartadmin.service.module.system.role.rolemenu.RoleMenuDao; +import net.lab1024.smartadmin.service.module.system.role.rolemenu.domain.RoleMenuEntity; +import net.lab1024.smartadmin.service.util.SmartStringUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 员工菜单缓存 + * + * @author 卓大 + * @date 2021/8/5 11:47 + */ +@Service +public class MenuEmployeeService { + + private static final long SUPER_ROLE_ID = -1L; + + /** + * 员工菜单权限 + */ + private ConcurrentLinkedHashMap> roleMenuListMap = new ConcurrentLinkedHashMap.Builder>().maximumWeightedCapacity(1000).build(); + + @Autowired + private MenuService menuService; + @Autowired + private RoleMenuDao roleMenuDao; + @Autowired + private EmployeeService employeeService; + @Autowired + private SystemConfigService systemConfigService; + + /** + * 初始化角色-菜单权限Map + */ + @PostConstruct + public void initRoleMenuListMap(){ + roleMenuListMap.clear(); + // 查询所有可用菜单列表 + List menuVOList = menuService.queryMenuList(Boolean.FALSE); + // 查询所有角色菜单 + List roleMenuList = roleMenuDao.queryAllRoleMenu(); + Map> roleMenuIdListMap = roleMenuList.stream().collect(Collectors.groupingBy(RoleMenuEntity::getRoleId, Collectors.mapping(RoleMenuEntity::getMenuId, Collectors.toList()))); + for (Map.Entry> roleMenuId : roleMenuIdListMap.entrySet()) { + List menuIdList = roleMenuId.getValue(); + List roleMenuVOList = menuVOList.stream().filter(e -> menuIdList.contains(e.getMenuId())).collect(Collectors.toList()); + roleMenuListMap.put(roleMenuId.getKey(),roleMenuVOList); + } + // map中放入超管权限 + roleMenuListMap.put(SUPER_ROLE_ID,menuVOList); + } + + /** + * 校验用户是否有功能权限 + * @param loginInfoDTO + * @param perms + * @return + */ + public Boolean checkEmployeeHavePrivilege(EmployeeLoginInfoDTO loginInfoDTO, String perms){ + if (StringUtils.isBlank(perms)) { + return false; + } + Boolean isSuperman = loginInfoDTO.getIsSuperMan(); + if (isSuperman) { + return true; + } + List menuList = this.getMenuByRoleIdList(loginInfoDTO.getRoleList(),loginInfoDTO.getIsSuperMan()); + Optional findRes = menuList.stream().filter(e -> { + List permsList = e.getPermsList(); + if(CollectionUtils.isEmpty(permsList)){ + return false; + } + return permsList.contains(perms); + }).findFirst(); + return findRes.isPresent(); + } + + /** + * 判断是否为超级管理员 + * + * @param employeeId + * @return + */ + public Boolean isSuperman(Long employeeId) { + String systemConfigValue = systemConfigService.getConfigValue(SystemConfigConst.Key.EMPLOYEE_SUPERMAN); + List superManIdsList = SmartStringUtil.splitConverToLongList(systemConfigValue, ","); + return superManIdsList.contains(employeeId); + } + + /** + * 根据角色列表查询菜单列表 + * @param roleIdList + * @return + */ + private List getMenuByRoleIdList(List roleIdList, Boolean isSuperman){ + // 超管返回全部菜单权限 + if(isSuperman){ + return roleMenuListMap.get(SUPER_ROLE_ID); + } + + if(CollectionUtils.isEmpty(roleIdList)){ + return Lists.newArrayList(); + } + + List menuVOList = Lists.newArrayList(); + for (Long roleId : roleIdList) { + menuVOList.addAll(roleMenuListMap.getOrDefault(roleId,Lists.newArrayList())); + } + if(CollectionUtils.isEmpty(menuVOList)){ + return Lists.newArrayList(); + } + Map distinctMap = menuVOList.stream().collect(Collectors.toMap(MenuVO::getMenuId, Function.identity(), (f, s) -> f)); + return distinctMap.values().stream().collect(Collectors.toList()); + } + + + /** + * 查询用户拥有的前端菜单项 用于登陆返回 前端动态路由配置 + * @param employeeId + * @return + */ + public MenuLoginBO queryMenuTreeByEmployeeId(Long employeeId){ + // 获取用户权限 + EmployeeLoginInfoDTO employeeLoginInfoDTO = employeeService.getById(employeeId); + // 获取角色菜单权限 + List menuVOList = this.getMenuByRoleIdList(employeeLoginInfoDTO.getRoleList(),employeeLoginInfoDTO.getIsSuperMan()); + //获取菜单树 + Map> parentMap = menuVOList.stream().filter(e->!e.getMenuType().equals(MenuTypeEnum.POINTS.getValue())).collect(Collectors.groupingBy(MenuVO::getParentId, Collectors.toList())); + List menuTreeVOList = menuService.buildMenuTree(parentMap, 0L); + //获取权限列表 + List pointsList = menuVOList.stream().filter(e -> e.getMenuType().equals(MenuTypeEnum.POINTS.getValue())).map(MenuVO::getPerms).collect(Collectors.toList()); + MenuLoginBO menuLoginBO = new MenuLoginBO(menuTreeVOList, pointsList); + return menuLoginBO; + } + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuManager.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuManager.java new file mode 100644 index 00000000..1999ebf3 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuManager.java @@ -0,0 +1,65 @@ +package net.lab1024.smartadmin.service.module.system.menu; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import net.lab1024.smartadmin.service.module.system.menu.constant.MenuTypeEnum; +import net.lab1024.smartadmin.service.module.system.menu.domain.MenuEntity; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 菜单Manager层 + * + * @author 卓大 + * @date 2021/7/30 14:26 + */ +@Service +public class MenuManager extends ServiceImpl { + + /** + * 添加菜单 + * + * @param menuEntity + * @param pointEntityList + */ + @Transactional(rollbackFor = Exception.class) + public void addMenu(MenuEntity menuEntity, List pointEntityList) { + //添加菜单 + save(menuEntity); + //构建功能点 + pointEntityList.forEach(e->{ + e.setParentId(menuEntity.getMenuId()); + e.setMenuType(MenuTypeEnum.POINTS.getValue()); + e.setCreateUserId(menuEntity.getCreateUserId()); + }); + //批量添加功能点 + saveBatch(pointEntityList); + } + + /** + * 更新菜单 + * @param menuEntity + * @param savePointList + * @param deletePointList + * @param updatePointList + */ + @Transactional(rollbackFor = Exception.class) + public void updateMenu(MenuEntity menuEntity, List savePointList, List deletePointList, List updatePointList) { + //更新菜单 + updateById(menuEntity); + //构建新增功能点 + savePointList.forEach(e->{ + e.setParentId(menuEntity.getMenuId()); + e.setMenuType(MenuTypeEnum.POINTS.getValue()); + //因为更新操作人在menuEntity的UpdateUserId字段 + e.setCreateUserId(menuEntity.getUpdateUserId()); + }); + //批量添加功能点 + saveBatch(savePointList); + //批量删除功能点 + updateBatchById(deletePointList); + //批量更新功能点 + updateBatchById(updatePointList); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuPermissionService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuPermissionService.java new file mode 100644 index 00000000..d488e915 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuPermissionService.java @@ -0,0 +1,33 @@ +package net.lab1024.smartadmin.service.module.system.menu; + +import net.lab1024.smartadmin.service.common.security.SmartSecurityMetadataSource; +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginInfoDTO; +import net.lab1024.smartadmin.service.util.SmartEmployeeTokenUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 菜单权限控制 + * + * @author 卓大 + * @date 2021/8/5 17:14 + */ +@Service(SmartSecurityMetadataSource.PRIVILEGE_CHECK_NAME) +public class MenuPermissionService { + + @Autowired + private MenuEmployeeService menuEmployeeService; + + /** + * 校验是否有权限 + * @param perms + * @return + */ + public boolean checkPermission(String perms){ + EmployeeLoginInfoDTO employeeLoginInfoDTO = SmartEmployeeTokenUtil.getRequestEmployee(); + if(employeeLoginInfoDTO == null){ + return false; + } + return menuEmployeeService.checkEmployeeHavePrivilege(employeeLoginInfoDTO,perms); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuService.java new file mode 100644 index 00000000..8fe36801 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/MenuService.java @@ -0,0 +1,338 @@ +package net.lab1024.smartadmin.service.module.system.menu; + +import com.google.common.collect.Lists; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.menu.constant.MenuTypeEnum; +import net.lab1024.smartadmin.service.module.system.menu.domain.*; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * 菜单 + * + * @author 卓大 + * @date 2021/7/29 16:11 + */ +@Service +public class MenuService { + + @Autowired + private MenuDao menuDao; + + @Autowired + private MenuManager menuManager; + + @Autowired + private MenuEmployeeService menuEmployeeService; + + @Autowired + private RequestUrlService requestUrlService; + + /** + * 添加菜单 + * + * @param menuAddForm + * @return + */ + public ResponseDTO addMenu(MenuAddForm menuAddForm) { + // 校验菜单名称 + if (this.validateMenuName(menuAddForm)) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "菜单名称已存在"); + } + MenuEntity menuEntity = SmartBeanUtil.copy(menuAddForm, MenuEntity.class); + // 处理接口权限 + List permsList = menuAddForm.getPermsList(); + if(!CollectionUtils.isEmpty(permsList)){ + String perms = StringUtils.join(permsList, ","); + menuEntity.setPerms(perms); + } + // 功能点列表为空 直接添加菜单 + List pointList = menuAddForm.getPointList(); + if (CollectionUtils.isEmpty(pointList)) { + menuDao.insert(menuEntity); + // 更新角色权限缓存 + menuEmployeeService.initRoleMenuListMap(); + return ResponseDTO.succ(); + } + // 若功能点列表不为空 + ResponseDTO> responseDTO = this.validateBuildPointList(menuAddForm.getMenuType(), pointList); + if (!responseDTO.isSuccess()) { + return ResponseDTO.wrap(responseDTO); + } + menuManager.addMenu(menuEntity, responseDTO.getData()); + // 更新角色权限缓存 + menuEmployeeService.initRoleMenuListMap(); + return ResponseDTO.succ(); + } + + /** + * 更新菜单 + * + * @param menuUpdateForm + * @return + */ + public ResponseDTO updateMenu(MenuUpdateForm menuUpdateForm) { + //校验菜单是否存在 + MenuEntity selectMenu = menuDao.selectById(menuUpdateForm.getMenuId()); + if (selectMenu == null) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "菜单不存在"); + } + if (selectMenu.getDeleteFlag()) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "菜单已被删除"); + } + //校验菜单名称 + if (this.validateMenuName(menuUpdateForm)) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "菜单名称已存在"); + } + if (menuUpdateForm.getMenuId().equals(menuUpdateForm.getParentId())) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "上级菜单不能为自己"); + } + MenuEntity menuEntity = SmartBeanUtil.copy(menuUpdateForm, MenuEntity.class); + // 处理接口权限 + List permsList = menuUpdateForm.getPermsList(); + if(!CollectionUtils.isEmpty(permsList)){ + String perms = StringUtils.join(permsList, ","); + menuEntity.setPerms(perms); + } + //功能点列表为空 直接修改菜单 + List pointList = menuUpdateForm.getPointList(); + if (CollectionUtils.isEmpty(pointList)) { + menuDao.updateById(menuEntity); + // 更新角色权限缓存 + menuEmployeeService.initRoleMenuListMap(); + return ResponseDTO.succ(); + } + //若功能点列表不为空 + ResponseDTO> validateBuildPointList = this.validateBuildPointList(menuUpdateForm.getMenuType(), pointList); + if (!validateBuildPointList.isSuccess()) { + return ResponseDTO.wrap(validateBuildPointList); + } + List pointEntityList = validateBuildPointList.getData(); + //查询当前菜单下的功能点列表 + List pointListByMenuId = menuDao.getPointListByMenuId(menuEntity.getMenuId(), MenuTypeEnum.POINTS.getValue(), Boolean.FALSE); + //新增的功能点 + List savePointList = pointEntityList.stream().filter(e -> e.getMenuId() == null).collect(Collectors.toList()); + //删除的功能点 + List deletePointList = Lists.newArrayList(); + //更新的功能点 + List updatePointList = Lists.newArrayList(); + //获取修改、移除的功能点列表 + for (MenuEntity menu : pointListByMenuId) { + Optional findMenu = pointEntityList.stream().filter(e -> e.getMenuId() != null && e.getMenuId().equals(menu.getMenuId())).findFirst(); + //删除的 + if (!findMenu.isPresent()) { + menu.setDeleteFlag(Boolean.TRUE); + menu.setUpdateUserId(menuUpdateForm.getUpdateUserId()); + deletePointList.add(menu); + continue; + } + MenuEntity requestMenu = findMenu.get(); + //是否更新 + Long requestContextMenuId = requestMenu.getContextMenuId() == null ? -1L : requestMenu.getContextMenuId(); + Long menuContextMenuId = menu.getContextMenuId() == null ? -1L : menu.getContextMenuId(); + if (!requestMenu.getMenuName().equals(menu.getMenuName()) + || !requestMenu.getDisabledFlag().equals(menu.getDisabledFlag()) + || !requestMenu.getPerms().equals(menu.getPerms()) + || !requestContextMenuId.equals(menuContextMenuId)) { + requestMenu.setUpdateUserId(menuUpdateForm.getUpdateUserId()); + updatePointList.add(requestMenu); + } + } + menuManager.updateMenu(menuEntity, savePointList, deletePointList, updatePointList); + // 更新角色权限缓存 + menuEmployeeService.initRoleMenuListMap(); + return ResponseDTO.succ(); + } + + /** + * 校验构建功能点列表 + * + * @param menuType + * @param pointList + * @return + */ + private ResponseDTO> validateBuildPointList(Integer menuType, List pointList) { + //判断 目录/功能点不能添加功能点 + if (!MenuTypeEnum.MENU.equalsValue(menuType)) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "目录/功能点不能添加子功能点"); + } + //构建功能点对象 + List pointEntityList = pointList.stream().map(e -> { + MenuEntity menu = SmartBeanUtil.copy(e, MenuEntity.class); + // 处理接口权限 + List permsList = e.getPermsList(); + if(!CollectionUtils.isEmpty(permsList)){ + String perms = StringUtils.join(permsList, ","); + menu.setPerms(perms); + } + return menu; + }).collect(Collectors.toList()); + //校验功能点名称是否重复 + Map nameGroupBy = pointEntityList.stream().collect(Collectors.groupingBy(MenuEntity::getMenuName, Collectors.counting())); + List repeatName = nameGroupBy.entrySet().stream().filter(e -> e.getValue() > 1).map(e -> e.getKey()).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(repeatName)) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "功能点:" + String.join("、", repeatName) + ",名称重复"); + } + return ResponseDTO.succData(pointEntityList); + } + + /** + * 批量删除菜单 + * + * @param menuIdList + * @param employeeId + * @return + */ + public ResponseDTO batchDeleteMenu(List menuIdList, Long employeeId) { + if (CollectionUtils.isEmpty(menuIdList)) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ERROR_PARAM, "所选菜单不能为空"); + } + menuDao.deleteByMenuIdList(menuIdList, employeeId, Boolean.TRUE); + // 更新角色权限缓存 + menuEmployeeService.initRoleMenuListMap(); + return ResponseDTO.succ(); + } + + /** + * 校验菜单名称 + * + * @param menuDTO + * @param + * @return true 重复 false 未重复 + */ + public Boolean validateMenuName(T menuDTO) { + MenuEntity menu = menuDao.getByMenuName(menuDTO.getMenuName(), menuDTO.getParentId(), Boolean.FALSE); + if (menuDTO instanceof MenuAddForm) { + return menu != null; + } + if (menuDTO instanceof MenuUpdateForm) { + Long menuId = ((MenuUpdateForm) menuDTO).getMenuId(); + return menu != null && menu.getMenuId().longValue() != menuId.longValue(); + } + return true; + } + + /** + * 查询菜单列表 + * + * @return + */ + public List queryMenuList(Boolean disabledFlag) { + List menuVOList = menuDao.queryMenuList(Boolean.FALSE, disabledFlag, null); + //根据ParentId进行分组 + Map> parentMap = menuVOList.stream().collect(Collectors.groupingBy(MenuVO::getParentId, Collectors.toList())); + List filterMenuVOList = this.filterNoParentMenu(parentMap, CommonConst.DEFAULT_PARENT_ID); + return filterMenuVOList; + } + + /** + * 过滤没有上级菜单的菜单列表 + * + * @param parentMap + * @param parentId + * @return + */ + private List filterNoParentMenu(Map> parentMap, Long parentId) { + // 获取本级菜单树List + List res = parentMap.getOrDefault(parentId, Lists.newArrayList()); + List childMenu = Lists.newArrayList(); + // 循环遍历下级菜单 + res.forEach(e -> { + //处理接口权限 + String perms = e.getPerms(); + if(!StringUtils.isBlank(perms)){ + List permsList = Lists.newArrayList(StringUtils.split(perms, ",")); + e.setPermsList(permsList); + } + List menuList = this.filterNoParentMenu(parentMap, e.getMenuId()); + childMenu.addAll(menuList); + }); + res.addAll(childMenu); + return res; + } + + /** + * 查询菜单树 + * + * @param onlyMenu 不查询功能点 + * @return + */ + public ResponseDTO> queryMenuTree(Boolean onlyMenu) { + List menuTypeList = Lists.newArrayList(); + if (onlyMenu) { + menuTypeList = Lists.newArrayList(MenuTypeEnum.CATALOG.getValue(), MenuTypeEnum.MENU.getValue()); + } + List menuVOList = menuDao.queryMenuList(Boolean.FALSE, null, menuTypeList); + //根据ParentId进行分组 + Map> parentMap = menuVOList.stream().collect(Collectors.groupingBy(MenuVO::getParentId, Collectors.toList())); + List menuTreeVOList = this.buildMenuTree(parentMap, CommonConst.DEFAULT_PARENT_ID); + return ResponseDTO.succData(menuTreeVOList); + } + + /** + * 构建菜单树 + * + * @return + */ + List buildMenuTree(Map> parentMap, Long parentId) { + // 获取本级菜单树List + List res = parentMap.getOrDefault(parentId, Lists.newArrayList()).stream() + .map(e -> SmartBeanUtil.copy(e, MenuTreeVO.class)).collect(Collectors.toList()); + // 循环遍历下级菜单 + res.forEach(e -> { + //处理接口权限 + String perms = e.getPerms(); + if(!StringUtils.isBlank(perms)){ + List permsList = Lists.newArrayList(StringUtils.split(perms, ",")); + e.setPermsList(permsList); + } + e.setChildren(this.buildMenuTree(parentMap, e.getMenuId())); + }); + return res; + } + + /** + * 查询菜单详情 + * + * @param menuId + * @return + */ + public ResponseDTO getMenuDetail(Long menuId) { + //校验菜单是否存在 + MenuEntity selectMenu = menuDao.selectById(menuId); + if (selectMenu == null) { + return ResponseDTO.wrapMsg(ResponseCodeConst.SYSTEM_ERROR, "菜单不存在"); + } + if (selectMenu.getDeleteFlag()) { + return ResponseDTO.wrapMsg(ResponseCodeConst.SYSTEM_ERROR, "菜单已被删除"); + } + MenuVO menuVO = SmartBeanUtil.copy(selectMenu, MenuVO.class); + //处理接口权限 + String perms = menuVO.getPerms(); + if(!StringUtils.isBlank(perms)){ + List permsList = Lists.newArrayList(StringUtils.split(perms, ",")); + menuVO.setPermsList(permsList); + } + return ResponseDTO.succData(menuVO); + } + + /** + * 获取系统所有请求路径 + * + * @return + */ + public ResponseDTO> getPrivilegeUrlDTOList() { + List privilegeUrlList = requestUrlService.getPrivilegeList(); + return ResponseDTO.succData(privilegeUrlList); + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeRequestUrlService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/RequestUrlService.java similarity index 74% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeRequestUrlService.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/RequestUrlService.java index f9aa07aa..d19990fd 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeRequestUrlService.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/RequestUrlService.java @@ -1,13 +1,13 @@ -package net.lab1024.smartadmin.module.system.privilege.service; +package net.lab1024.smartadmin.service.module.system.menu; -import net.lab1024.smartadmin.constant.CommonConst; -import net.lab1024.smartadmin.module.system.privilege.domain.dto.PrivilegeRequestUrlVO; -import net.lab1024.smartadmin.util.SmartStringUtil; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; -import org.apache.commons.collections.CollectionUtils; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.module.system.menu.domain.RequestUrlVO; +import net.lab1024.smartadmin.service.util.SmartStringUtil; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.stereotype.Service; @@ -25,29 +25,25 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; /** - * [ 初始化 分离前后台权限URL ] + * 分离前后台权限URL * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/28 0028 上午 9:13 - * @since JDK1.8 + * @author 卓大 + * @date 2021/9/1 20:14 */ @Service -public class PrivilegeRequestUrlService { +public class RequestUrlService { /** * 系统所有requestUrl */ - private CopyOnWriteArrayList privilegeUrlDTOList = Lists.newCopyOnWriteArrayList(); + private CopyOnWriteArrayList requestUrlVOS = Lists.newCopyOnWriteArrayList(); @Autowired private WebApplicationContext applicationContext; @PostConstruct public void initAllUrl() { - this.privilegeUrlDTOList.clear(); + this.requestUrlVOS.clear(); RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class); //获取url与类和方法的对应信息 @@ -66,7 +62,7 @@ public class PrivilegeRequestUrlService { if (CollectionUtils.isEmpty(patterns)) { return; } - String className = (String) handlerMethod.getBean(); + String className = handlerMethod.getMethod().getDeclaringClass().getName(); String methodName = handlerMethod.getMethod().getName(); List list = SmartStringUtil.splitConvertToList(className, "\\."); String controllerName = list.get(list.size() - 1); @@ -86,11 +82,11 @@ public class PrivilegeRequestUrlService { } Set urlSet = this.getUrlSet(patterns); for (String url : urlSet) { - PrivilegeRequestUrlVO privilegeUrlDTO = new PrivilegeRequestUrlVO(); - privilegeUrlDTO.setUrl(url); - privilegeUrlDTO.setName(name); - privilegeUrlDTO.setComment(methodComment); - this.privilegeUrlDTOList.add(privilegeUrlDTO); + RequestUrlVO requestUrlVO = new RequestUrlVO(); + requestUrlVO.setUrl(url); + requestUrlVO.setName(name); + requestUrlVO.setComment(methodComment); + this.requestUrlVOS.add(requestUrlVO); } }); @@ -99,7 +95,7 @@ public class PrivilegeRequestUrlService { private Set getUrlSet(Set patterns) { Set urlSet = Sets.newHashSet(); for (String url : patterns) { - for (String ignoreUrl : CommonConst.CommonCollection.IGNORE_URL_MAPPING) { + for (String ignoreUrl : CommonConst.CommonCollection.IGNORE_URL) { if (url.startsWith(ignoreUrl)) { urlSet.add(url.substring(ignoreUrl.length() - 1)); } else { @@ -110,8 +106,8 @@ public class PrivilegeRequestUrlService { return urlSet; } - public List getPrivilegeList() { - return this.privilegeUrlDTOList; + public List getPrivilegeList() { + return this.requestUrlVOS; } } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/constant/MenuTypeEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/constant/MenuTypeEnum.java new file mode 100644 index 00000000..f15268c8 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/constant/MenuTypeEnum.java @@ -0,0 +1,45 @@ +package net.lab1024.smartadmin.service.module.system.menu.constant; + + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +/** + * 菜单类型枚举 + * + * @author 卓大 + * @date 2021/7/29 15:30 + */ +public enum MenuTypeEnum implements BaseEnum { + /** + * 目录 + */ + CATALOG(1, "目录"), + /** + * 菜单 + */ + MENU(2, "菜单"), + /** + * 功能点 + */ + POINTS(3, "功能点"); + + private Integer value; + + private String desc; + + + MenuTypeEnum(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDesc() { + return desc; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuAddForm.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuAddForm.java new file mode 100644 index 00000000..36fd6a3c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuAddForm.java @@ -0,0 +1,22 @@ +package net.lab1024.smartadmin.service.module.system.menu.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import java.util.List; + +/** + * @author 卓大 + * @Date 2021/7/27 + */ +@Data +public class MenuAddForm extends MenuBasicDTO { + + @ApiModelProperty(hidden = true) + private Long createUserId; + + @ApiModelProperty("功能点列表") + @Valid + private List pointList; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuBasicDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuBasicDTO.java new file mode 100644 index 00000000..921bd2f1 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuBasicDTO.java @@ -0,0 +1,72 @@ +package net.lab1024.smartadmin.service.module.system.menu.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.swagger.ApiModelPropertyEnum; +import net.lab1024.smartadmin.service.common.validator.CheckEnum; +import net.lab1024.smartadmin.service.module.system.menu.constant.MenuTypeEnum; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 菜单基础 + * + * @author 卓大 + * @date 2021/7/29 16:16 + */ +@Data +public class MenuBasicDTO { + + @ApiModelProperty("菜单名称") + @NotBlank(message = "菜单名称不能为空") + @Length(max = 30, message = "菜单名称最多30个字符") + private String menuName; + + @ApiModelPropertyEnum(value = MenuTypeEnum.class, desc = "类型") + @CheckEnum(enumClazz = MenuTypeEnum.class, message = "类型错误") + private Integer menuType; + + @ApiModelProperty("父菜单ID 无上级可传0") + @NotNull(message = "父菜单ID不能为空") + private Long parentId; + + @ApiModelProperty("显示顺序") + private Integer sort; + + @ApiModelProperty("路由地址") + private String path; + + @ApiModelProperty("组件路径") + private String component; + + @ApiModelProperty("是否为外链") + @NotNull(message = "是否为外链不能为空") + private Boolean frameFlag; + + @ApiModelProperty("是否缓存") + @NotNull(message = "是否缓存不能为空") + private Boolean cacheFlag; + + @ApiModelProperty("显示状态") + @NotNull(message = "显示状态不能为空") + private Boolean visibleFlag; + + @ApiModelProperty("禁用状态") + @NotNull(message = "禁用状态不能为空") + private Boolean disabledFlag; + + @ApiModelProperty("接口权限") + private String perms; + + @ApiModelProperty("接口权限(拆分)") + private List permsList; + + @ApiModelProperty("菜单图标") + private String icon; + + @ApiModelProperty("功能点关联菜单ID") + private Long contextMenuId; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuEntity.java new file mode 100644 index 00000000..11023a5c --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuEntity.java @@ -0,0 +1,114 @@ +package net.lab1024.smartadmin.service.module.system.menu.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 卓大 + * @Date 2021/7/27 + */ +@Data +@TableName(value = "t_menu") +public class MenuEntity { + + /** + * 菜单ID + */ + @TableId(type = IdType.AUTO) + private Long menuId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 类型 + * @see MenuTypeEnum + */ + private Integer menuType; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 显示顺序 + */ + private Integer sort; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 是否为外链 + */ + private Boolean frameFlag; + + /** + * 是否缓存 + */ + private Boolean cacheFlag; + + /** + * 显示状态 + */ + private Boolean visibleFlag; + + /** + * 禁用状态 + */ + private Boolean disabledFlag; + + /** + * 权限字符串 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 功能点关联菜单ID + */ + private Long contextMenuId; + + /** + * 删除状态 + */ + private Boolean deleteFlag; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + /** + * 创建人 + */ + private Long createUserId; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 更新人 + */ + private Long updateUserId; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuLoginBO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuLoginBO.java new file mode 100644 index 00000000..b35f67c8 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuLoginBO.java @@ -0,0 +1,33 @@ +package net.lab1024.smartadmin.service.module.system.menu.domain; + +import lombok.Data; + +import java.util.List; + +/** + * 登陆时需要的菜单BO + * + * @author 卓大 + * @date 2021/8/5 11:35 + */ +@Data +public class MenuLoginBO { + + /** + * 菜单树 + */ + private List menuTree; + + /** + * 功能点权限列表 + */ + private List pointsList; + + public MenuLoginBO() { + } + + public MenuLoginBO(List menuTree, List pointsList) { + this.menuTree = menuTree; + this.pointsList = pointsList; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuPointsOperateForm.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuPointsOperateForm.java new file mode 100644 index 00000000..bd1785ba --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuPointsOperateForm.java @@ -0,0 +1,37 @@ +package net.lab1024.smartadmin.service.module.system.menu.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 菜单功能点操作Form + * + * @author 卓大 + * @date 2021/7/30 10:56 + */ +@Data +public class MenuPointsOperateForm { + + @ApiModelProperty("菜单ID") + private Long menuId; + + @ApiModelProperty("功能点名称") + @NotBlank(message = "功能点不能为空") + @Length(max = 30, message = "功能点最多30个字符") + private String menuName; + + @ApiModelProperty("禁用状态") + @NotNull(message = "禁用状态不能为空") + private Boolean disabledFlag; + + @ApiModelProperty("接口权限") + private List permsList; + + @ApiModelProperty("功能点关联菜单ID") + private Long contextMenuId; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuSimpleTreeVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuSimpleTreeVO.java new file mode 100644 index 00000000..d09d803d --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuSimpleTreeVO.java @@ -0,0 +1,34 @@ +package net.lab1024.smartadmin.service.module.system.menu.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 简易的菜单VO + * + * @author 卓大 + * @date 2021/7/30 17:41 + */ +@Data +public class MenuSimpleTreeVO { + + @ApiModelProperty("菜单ID") + private Long menuId; + + @ApiModelProperty("菜单名称") + private String menuName; + + @ApiModelProperty("功能点关联菜单ID") + private Long contextMenuId; + + @ApiModelProperty("父级菜单ID") + private Long parentId; + + @ApiModelProperty("菜单类型") + private Integer menuType; + + @ApiModelProperty("子菜单") + private List children; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuTreeVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuTreeVO.java new file mode 100644 index 00000000..540384af --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuTreeVO.java @@ -0,0 +1,19 @@ +package net.lab1024.smartadmin.service.module.system.menu.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +/** + * 菜单功能点操作Form + * + * @author 卓大 + * @date 2021/7/30 10:56 + */ +@Data +public class MenuTreeVO extends MenuVO{ + + @ApiModelProperty("菜单子集") + private List children; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuUpdateForm.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuUpdateForm.java new file mode 100644 index 00000000..07ee34e6 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuUpdateForm.java @@ -0,0 +1,27 @@ +package net.lab1024.smartadmin.service.module.system.menu.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * @author 卓大 + * @Date 2021/7/27 + */ +@Data +public class MenuUpdateForm extends MenuBasicDTO { + + @ApiModelProperty("菜单ID") + @NotNull(message = "菜单ID不能为空") + private Long menuId; + + @ApiModelProperty(hidden = true) + private Long updateUserId; + + @ApiModelProperty("功能点列表") + @Valid + private List pointList; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuVO.java new file mode 100644 index 00000000..01ed51fa --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/MenuVO.java @@ -0,0 +1,29 @@ +package net.lab1024.smartadmin.service.module.system.menu.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 卓大 + * @Date 2021/7/27 + */ +@Data +public class MenuVO extends MenuBasicDTO{ + + @ApiModelProperty("菜单ID") + private Long menuId; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("创建人") + private Long createUserId; + + @ApiModelProperty("更新时间") + private LocalDateTime updateTime; + + @ApiModelProperty("更新人") + private Long updateUserId; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/RequestUrlVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/RequestUrlVO.java new file mode 100644 index 00000000..5b722ff5 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/menu/domain/RequestUrlVO.java @@ -0,0 +1,23 @@ +package net.lab1024.smartadmin.service.module.system.menu.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * Description + * + * @author 卓大 + * @date 2021/9/1 20:15 + */ +@Data +public class RequestUrlVO { + + @ApiModelProperty("注释说明") + private String comment; + + @ApiModelProperty("controller.method") + private String name; + + @ApiModelProperty("url") + private String url; +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/RoleController.java similarity index 73% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleController.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/RoleController.java index c95afff7..e62b26c4 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleController.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/RoleController.java @@ -1,12 +1,13 @@ -package net.lab1024.smartadmin.module.system.role.basic; -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleAddDTO; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleUpdateDTO; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleVO; +package net.lab1024.smartadmin.service.module.system.role.basic; + import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.dto.RoleAddDTO; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.dto.RoleUpdateDTO; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.vo.RoleVO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -20,9 +21,8 @@ import java.util.List; * @date 2017/12/28 10:10 */ @Api(tags = {SwaggerTagConst.Admin.MANAGER_ROLE}) -@OperateLog @RestController -public class RoleController { +public class RoleController extends AdminBaseController { @Autowired private RoleService roleService; diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/RoleDao.java similarity index 53% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleDao.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/RoleDao.java index 91b83b4f..744092e5 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleDao.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/RoleDao.java @@ -1,20 +1,15 @@ -package net.lab1024.smartadmin.module.system.role.basic; +package net.lab1024.smartadmin.service.module.system.role.basic; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import net.lab1024.smartadmin.module.system.role.basic.domain.entity.RoleEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.entity.RoleEntity; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 13:00 - * @since JDK1.8 + * @author 罗伊 */ @Mapper @Component diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/RoleService.java similarity index 60% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleService.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/RoleService.java index cd0d6444..1bbd3f14 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/RoleService.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/RoleService.java @@ -1,18 +1,20 @@ -package net.lab1024.smartadmin.module.system.role.basic; +package net.lab1024.smartadmin.service.module.system.role.basic; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleAddDTO; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleUpdateDTO; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleVO; -import net.lab1024.smartadmin.module.system.role.basic.domain.entity.RoleEntity; -import net.lab1024.smartadmin.module.system.role.roleemployee.RoleEmployeeDao; -import net.lab1024.smartadmin.module.system.role.roleprivilege.RolePrivilegeDao; -import net.lab1024.smartadmin.util.SmartBeanUtil; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.dto.RoleAddDTO; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.dto.RoleUpdateDTO; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.entity.RoleEntity; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.vo.RoleVO; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.RoleEmployeeDao; +import net.lab1024.smartadmin.service.module.system.role.rolemenu.RoleMenuDao; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Objects; /** * 角色管理业务 @@ -27,7 +29,7 @@ public class RoleService { private RoleDao roleDao; @Autowired - private RolePrivilegeDao rolePrivilegeDao; + private RoleMenuDao roleMenuDao; @Autowired private RoleEmployeeDao roleEmployeeDao; @@ -36,12 +38,12 @@ public class RoleService { * 新增添加角色 * * @param roleAddDTO - * @return ResponseDTO + * @return RespDTO */ public ResponseDTO addRole(RoleAddDTO roleAddDTO) { RoleEntity employeeRoleEntity = roleDao.getByRoleName(roleAddDTO.getRoleName()); if (null != employeeRoleEntity) { - return ResponseDTO.wrap(RoleResponseCodeConst.ROLE_NAME_EXISTS); + return ResponseDTO.wrapMsg(ResponseCodeConst.ALREADY_EXIST, "角色名称重复"); } RoleEntity roleEntity = SmartBeanUtil.copy(roleAddDTO, RoleEntity.class); roleDao.insert(roleEntity); @@ -52,16 +54,16 @@ public class RoleService { * 根据角色id 删除 * * @param roleId - * @return ResponseDTO + * @return RespDTO */ @Transactional(rollbackFor = Exception.class) public ResponseDTO deleteRole(Long roleId) { RoleEntity roleEntity = roleDao.selectById(roleId); if (null == roleEntity) { - return ResponseDTO.wrap(RoleResponseCodeConst.ROLE_NOT_EXISTS); + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); } roleDao.deleteById(roleId); - rolePrivilegeDao.deleteByRoleId(roleId); + roleMenuDao.deleteByRoleId(roleId); roleEmployeeDao.deleteByRoleId(roleId); return ResponseDTO.succ(); } @@ -70,16 +72,17 @@ public class RoleService { * 更新角色 * * @param roleUpdateDTO - * @return ResponseDTO + * @return RespDTO */ @Transactional(rollbackFor = Exception.class) public ResponseDTO updateRole(RoleUpdateDTO roleUpdateDTO) { - if (null == roleDao.selectById(roleUpdateDTO.getId())) { - return ResponseDTO.wrap(RoleResponseCodeConst.ROLE_NOT_EXISTS); + Long roleId = roleUpdateDTO.getId(); + if (null == roleDao.selectById(roleId)) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); } RoleEntity employeeRoleEntity = roleDao.getByRoleName(roleUpdateDTO.getRoleName()); - if (null != employeeRoleEntity && ! employeeRoleEntity.getId().equals(roleUpdateDTO.getId())) { - return ResponseDTO.wrap(RoleResponseCodeConst.ROLE_NAME_EXISTS); + if (null != employeeRoleEntity && !Objects.equals(employeeRoleEntity.getId(), roleId)) { + return ResponseDTO.wrapMsg(ResponseCodeConst.ALREADY_EXIST, "角色名称重复"); } RoleEntity roleEntity = SmartBeanUtil.copy(roleUpdateDTO, RoleEntity.class); roleDao.updateById(roleEntity); @@ -90,12 +93,12 @@ public class RoleService { * 根据id获取角色数据 * * @param roleId - * @return ResponseDTO + * @return RespDTO */ public ResponseDTO getRoleById(Long roleId) { RoleEntity roleEntity = roleDao.selectById(roleId); if (null == roleEntity) { - return ResponseDTO.wrap(RoleResponseCodeConst.ROLE_NOT_EXISTS); + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); } RoleVO role = SmartBeanUtil.copy(roleEntity, RoleVO.class); return ResponseDTO.succData(role); @@ -104,7 +107,7 @@ public class RoleService { /** * 获取所有角色列表 * - * @return ResponseDTO + * @return RespDTO */ public ResponseDTO> getAllRole() { List roleEntityList = roleDao.selectList(null); diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleAddDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/dto/RoleAddDTO.java similarity index 89% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleAddDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/dto/RoleAddDTO.java index ba66b68e..24b1b04e 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleAddDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/dto/RoleAddDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.role.basic.domain.dto; +package net.lab1024.smartadmin.service.module.system.role.basic.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.Length; diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/dto/RoleQueryDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/dto/RoleQueryDTO.java new file mode 100644 index 00000000..83987bf7 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/dto/RoleQueryDTO.java @@ -0,0 +1,20 @@ +package net.lab1024.smartadmin.service.module.system.role.basic.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +public class RoleQueryDTO extends PageBaseDTO { + + @ApiModelProperty("角色名称") + private String roleName; + + @ApiModelProperty("角色id") + private String roleId; +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleUpdateDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/dto/RoleUpdateDTO.java similarity index 83% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleUpdateDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/dto/RoleUpdateDTO.java index adde4749..eee16665 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleUpdateDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/dto/RoleUpdateDTO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.role.basic.domain.dto; +package net.lab1024.smartadmin.service.module.system.role.basic.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/entity/RoleEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/entity/RoleEntity.java new file mode 100644 index 00000000..44a8f306 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/entity/RoleEntity.java @@ -0,0 +1,37 @@ +package net.lab1024.smartadmin.service.module.system.role.basic.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * [ 角色 ] + * + * @author 罗伊 + */ +@Data +@TableName("t_role") +public class RoleEntity { + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long id; + + private String roleName; + + private String remark; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 创建时间 + */ + private LocalDateTime createTime; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/vo/RoleSelectedVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/vo/RoleSelectedVO.java new file mode 100644 index 00000000..ba47d33f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/vo/RoleSelectedVO.java @@ -0,0 +1,16 @@ +package net.lab1024.smartadmin.service.module.system.role.basic.domain.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +public class RoleSelectedVO extends RoleVO { + + @ApiModelProperty("角色名称") + private Boolean selected; +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/vo/RoleVO.java similarity index 55% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleVO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/vo/RoleVO.java index 9f3eed90..63d36d81 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleVO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/basic/domain/vo/RoleVO.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.module.system.role.basic.domain.dto; +package net.lab1024.smartadmin.service.module.system.role.basic.domain.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -6,12 +6,7 @@ import lombok.Data; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 15:27 - * @since JDK1.8 + * @author 罗伊 */ @Data public class RoleVO { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/RoleEmployeeController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeController.java similarity index 73% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/RoleEmployeeController.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeController.java index 72c4e507..021bea7c 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/RoleEmployeeController.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeController.java @@ -1,17 +1,17 @@ -package net.lab1024.smartadmin.module.system.role.roleemployee; +package net.lab1024.smartadmin.service.module.system.role.roleemployee; -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.system.employee.domain.vo.EmployeeVO; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleBatchDTO; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleQueryDTO; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleSelectedVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.employee.domain.vo.EmployeeVO; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.dto.RoleQueryDTO; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.vo.RoleSelectedVO; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.domain.RoleEmployeeBatchDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -24,10 +24,9 @@ import java.util.List; * @author listen * @date 2017/12/28 10:10 */ -@Api(tags = {SwaggerTagConst.Admin.MANAGER_ROLE_USER}) -@OperateLog +@Api(tags = {SwaggerTagConst.Admin.MANAGER_ROLE}) @RestController -public class RoleEmployeeController { +public class RoleEmployeeController extends AdminBaseController { @Autowired private RoleEmployeeService roleEmployeeService; @@ -46,7 +45,7 @@ public class RoleEmployeeController { @ApiOperation(value = "从角色成员列表中移除员工", notes = "从角色成员列表中移除员工") @ApiImplicitParams({@ApiImplicitParam(name = "employeeId", value = "员工id", paramType = "query", required = true), @ApiImplicitParam(name = "roleId", value = "角色id", paramType = "query", - required = true)}) + required = true)}) @GetMapping("/role/removeEmployee") public ResponseDTO removeEmployee(Long employeeId, Long roleId) { return roleEmployeeService.removeEmployeeRole(employeeId, roleId); @@ -54,14 +53,14 @@ public class RoleEmployeeController { @ApiOperation(value = "从角色成员列表中批量移除员工", notes = "从角色成员列表中批量移除员工") @PostMapping("/role/removeEmployeeList") - public ResponseDTO removeEmployeeList(@Valid @RequestBody RoleBatchDTO removeDTO) { + public ResponseDTO removeEmployeeList(@Valid @RequestBody RoleEmployeeBatchDTO removeDTO) { return roleEmployeeService.batchRemoveEmployeeRole(removeDTO); } @ApiOperation(value = "角色成员列表中批量添加员工", notes = "角色成员列表中批量添加员工") @PostMapping("/role/addEmployeeList") - public ResponseDTO addEmployeeList(@Valid @RequestBody RoleBatchDTO addDTO) { - return roleEmployeeService.batchAddEmployeeRole(addDTO); + public ResponseDTO addEmployeeList(@Valid @RequestBody RoleEmployeeBatchDTO addDTO) { + return roleEmployeeService.batchAddRoleEmployee(addDTO); } @ApiOperation(value = "通过员工id获取所有角色以及员工具有的角色", notes = "通过员工id获取所有角色以及员工具有的角色") diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/RoleEmployeeDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeDao.java similarity index 68% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/RoleEmployeeDao.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeDao.java index 08a484e7..2611c0e7 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/RoleEmployeeDao.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeDao.java @@ -1,25 +1,20 @@ -package net.lab1024.smartadmin.module.system.role.roleemployee; +package net.lab1024.smartadmin.service.module.system.role.roleemployee; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeDTO; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleQueryDTO; -import net.lab1024.smartadmin.module.system.role.roleemployee.domain.RoleEmployeeEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; +import net.lab1024.smartadmin.service.module.system.employee.domain.dto.EmployeeDTO; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.dto.RoleQueryDTO; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.domain.RoleEmployeeEntity; import java.util.List; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 13:00 - * @since JDK1.8 + * @author 罗伊 */ @Mapper @Component @@ -32,6 +27,19 @@ public interface RoleEmployeeDao extends BaseMapper { */ List selectRoleIdByEmployeeId(@Param("employeeId") Long employeeId); + /** + * 根据员工id 查询所有的角色 + * @param employeeIdList + * @return + */ + List selectRoleIdByEmployeeIdList(@Param("employeeIdList") List employeeIdList); + + /** + * 查询角色下的人员id + * @param roleIdList + * @return + */ + List selectEmployeeIdByRoleIdList(@Param("roleIdList") List roleIdList); /** * * @param page @@ -71,10 +79,4 @@ public interface RoleEmployeeDao extends BaseMapper { * @param employeeIds */ void batchDeleteEmployeeRole(@Param("roleId") Long roleId,@Param("employeeIds")List employeeIds); - - /** - * 批量新增 - * @param roleRelationList - */ - void batchInsert(List roleRelationList); } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeManager.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeManager.java new file mode 100644 index 00000000..1bd9d224 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeManager.java @@ -0,0 +1,33 @@ +package net.lab1024.smartadmin.service.module.system.role.roleemployee; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.domain.RoleEmployeeEntity; + +import java.util.List; + +/** + * 角色员工 manager + * + * @author listen + * @date 2021年7月29日 21:15:50 + */ +@Service +public class RoleEmployeeManager extends ServiceImpl { + + /** + * 保存 角色员工 + * + * @param roleId + * @param roleEmployeeList + */ + @Transactional(rollbackFor = Throwable.class) + public void saveRoleEmployee(Long roleId, List roleEmployeeList) { + this.getBaseMapper().deleteByRoleId(roleId); + if (CollectionUtils.isNotEmpty(roleEmployeeList)) { + this.saveBatch(roleEmployeeList); + } + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeService.java new file mode 100644 index 00000000..89bdfc22 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/RoleEmployeeService.java @@ -0,0 +1,155 @@ +package net.lab1024.smartadmin.service.module.system.role.roleemployee; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.CacheModuleBaseConst; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.support.beancache.cache.IBeanCache; +import net.lab1024.smartadmin.service.module.support.beancache.key.CacheKey; +import net.lab1024.smartadmin.service.module.system.department.DepartmentDao; +import net.lab1024.smartadmin.service.module.system.department.domain.entity.DepartmentEntity; +import net.lab1024.smartadmin.service.module.system.employee.domain.dto.EmployeeDTO; +import net.lab1024.smartadmin.service.module.system.employee.domain.vo.EmployeeVO; +import net.lab1024.smartadmin.service.module.system.role.basic.RoleDao; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.dto.RoleQueryDTO; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.entity.RoleEntity; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.vo.RoleSelectedVO; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.domain.RoleEmployeeBatchDTO; +import net.lab1024.smartadmin.service.module.system.role.roleemployee.domain.RoleEmployeeEntity; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import net.lab1024.smartadmin.service.util.SmartPageUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 角色管理业务 + * + * @author 1024lab + * @date 2019/4/3 + */ +@Service +public class RoleEmployeeService { + + @Autowired + private RoleEmployeeDao roleEmployeeDao; + + @Autowired + private RoleDao roleDao; + + @Autowired + private DepartmentDao departmentDao; + + @Autowired + private RoleEmployeeManager roleEmployeeManager; + + @Autowired + protected IBeanCache beanCache; + + /** + * 通过角色id,分页获取成员员工列表 + * + * @param queryDTO + * @return + */ + public ResponseDTO> listEmployeeByName(RoleQueryDTO queryDTO) { + Page page = SmartPageUtil.convert2PageQuery(queryDTO); + List employeeDTOS = roleEmployeeDao.selectEmployeeByNamePage(page, queryDTO); + employeeDTOS.stream().filter(e -> e.getDepartmentId() != null).forEach(employeeDTO -> { + DepartmentEntity departmentEntity = departmentDao.selectById(employeeDTO.getDepartmentId()); + employeeDTO.setDepartmentName(departmentEntity.getName()); + }); + PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page, employeeDTOS, EmployeeVO.class); + return ResponseDTO.succData(pageResultDTO); + } + + public ResponseDTO> getAllEmployeeByRoleId(Long roleId) { + List employeeDTOS = roleEmployeeDao.selectEmployeeByRoleId(roleId); + List list = SmartBeanUtil.copyList(employeeDTOS, EmployeeVO.class); + return ResponseDTO.succData(list); + } + + /** + * 移除员工角色 + * + * @param employeeId + * @param roleId + * @return RespDTO + */ + @Transactional(rollbackFor = Exception.class) + public ResponseDTO removeEmployeeRole(Long employeeId, Long roleId) { + if (null == employeeId || null == roleId) { + return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM); + } + roleEmployeeDao.deleteByEmployeeIdRoleId(employeeId, roleId); + this.clearCacheByEmployeeId(employeeId); + return ResponseDTO.succ(); + } + + /** + * 批量删除角色的成员员工 + * + * @param removeDTO + * @return RespDTO + */ + public ResponseDTO batchRemoveEmployeeRole(RoleEmployeeBatchDTO removeDTO) { + roleEmployeeDao.batchDeleteEmployeeRole(removeDTO.getRoleId(), removeDTO.getEmployeeIdList()); + for (Long employeeId : removeDTO.getEmployeeIdList()) { + this.clearCacheByEmployeeId(employeeId); + } + return ResponseDTO.succ(); + } + + /** + * 批量添加角色的成员员工 + * + * @param addDTO + * @return + */ + public ResponseDTO batchAddRoleEmployee(RoleEmployeeBatchDTO addDTO) { + Long roleId = addDTO.getRoleId(); + List employeeIdList = addDTO.getEmployeeIdList(); + // 保存新的角色员工 + List roleEmployeeList = null; + if (CollectionUtils.isNotEmpty(employeeIdList)) { + roleEmployeeList = employeeIdList.stream() + .map(employeeId -> new RoleEmployeeEntity(roleId, employeeId)) + .collect(Collectors.toList()); + } + // 保存数据 + roleEmployeeManager.saveRoleEmployee(roleId, roleEmployeeList); + for (Long employeeId : employeeIdList) { + this.clearCacheByEmployeeId(employeeId); + } + return ResponseDTO.succ(); + } + + /** + * 通过员工id获取员工角色 + * + * @param employeeId + * @return + */ + public ResponseDTO> getRolesByEmployeeId(Long employeeId) { + List roleIds = roleEmployeeDao.selectRoleIdByEmployeeId(employeeId); + List roleList = roleDao.selectList(null); + List result = SmartBeanUtil.copyList(roleList, RoleSelectedVO.class); + result.stream().forEach(item -> item.setSelected(roleIds.contains(item.getId()))); + return ResponseDTO.succData(result); + } + + /** + * 清除businessId为员工id的缓存信息 + * + * @param employeeId + */ + public void clearCacheByEmployeeId(Long employeeId) { + String roleCacheKey = CacheKey.cacheKey(CacheModuleBaseConst.Employee.SINGLE_EMPLOYEE_ROLE_CACHE, employeeId.toString()); + beanCache.remove(roleCacheKey); + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleBatchDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeBatchDTO.java similarity index 61% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleBatchDTO.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeBatchDTO.java index af01cf8c..63ff3e10 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleBatchDTO.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeBatchDTO.java @@ -1,30 +1,29 @@ -package net.lab1024.smartadmin.module.system.role.basic.domain.dto; +package net.lab1024.smartadmin.service.module.system.role.roleemployee.domain; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; import java.util.List; /** - * 批量添加角色员工DTO + * 角色员工 批量操作DTO * * @author listen * @date 2017/12/29 15:38 */ @Data -public class RoleBatchDTO { +public class RoleEmployeeBatchDTO { @ApiModelProperty("角色id") @NotNull(message = "角色id不能为空") protected Long roleId; - /** - * 员工id集合 - */ @ApiModelProperty(value = "员工id集合") @NotEmpty(message = "员工id不能为空") - protected List employeeIds; + @Size(max = 99, message = "一次最多99个员工") + protected List employeeIdList; } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeDTO.java new file mode 100644 index 00000000..46755f40 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeDTO.java @@ -0,0 +1,16 @@ +package net.lab1024.smartadmin.service.module.system.role.roleemployee.domain; + +import lombok.Data; + +/** + * [ ] + * + * @author 罗伊 + */ +@Data +public class RoleEmployeeDTO { + + private Long roleId; + + private Long employeeId; +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeEntity.java new file mode 100644 index 00000000..c4ced3c2 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/roleemployee/domain/RoleEmployeeEntity.java @@ -0,0 +1,37 @@ +package net.lab1024.smartadmin.service.module.system.role.roleemployee.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * [ 角色 员工关系] + * + * @author 罗伊 + */ +@Data +@TableName("t_role_employee") +public class RoleEmployeeEntity { + + @TableId(type = IdType.AUTO) + private Long id; + + private Long roleId; + + private Long employeeId; + + private LocalDateTime updateTime; + + private LocalDateTime createTime; + + public RoleEmployeeEntity() { + } + + public RoleEmployeeEntity(Long roleId, Long employeeId) { + this.roleId = roleId; + this.employeeId = employeeId; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuController.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuController.java new file mode 100644 index 00000000..ecf79663 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuController.java @@ -0,0 +1,39 @@ +package net.lab1024.smartadmin.service.module.system.role.rolemenu; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import net.lab1024.smartadmin.service.common.constant.SwaggerTagConst; +import net.lab1024.smartadmin.service.common.controller.AdminBaseController; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.role.rolemenu.domain.RoleMenuDTO; +import net.lab1024.smartadmin.service.module.system.role.rolemenu.domain.RoleMenuTreeVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +/** + * 角色-菜单 + * + * @author 善逸 + * @date 2021/7/30 17:06 + */ +@RestController +@Api(tags = {SwaggerTagConst.Admin.MANAGER_ROLE_MENU}) +public class RoleMenuController extends AdminBaseController { + + @Autowired + private RoleMenuService roleMenuService; + + @ApiOperation("更新角色权限") + @PostMapping("/role/menu/updateRoleMenu") + public ResponseDTO updateRoleMenu(@Valid @RequestBody RoleMenuDTO updateDTO) { + return roleMenuService.updateRoleMenu(updateDTO); + } + + @ApiOperation("获取角色关联菜单权限") + @GetMapping("/role/menu/getRoleSelectedMenu/{roleId}") + public ResponseDTO getRoleSelectedMenu(@PathVariable Long roleId) { + return roleMenuService.getRoleSelectedMenu(roleId); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuDao.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuDao.java new file mode 100644 index 00000000..bce6600e --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuDao.java @@ -0,0 +1,39 @@ +package net.lab1024.smartadmin.service.module.system.role.rolemenu; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Component; +import net.lab1024.smartadmin.service.module.system.role.rolemenu.domain.RoleMenuEntity; + +import java.util.List; + +/** + * 角色-菜单 + * + * @author 善逸 + * @date 2021/7/30 17:18 + */ +@Mapper +@Component +public interface RoleMenuDao extends BaseMapper { + + /** + * 根据角色ID删除菜单权限 + * @param roleId + */ + void deleteByRoleId(@Param("roleId") Long roleId); + + /** + * 根据角色ID查询选择的菜单权限 + * @param roleId + * @return + */ + List queryMenuIdByRoleId(@Param("roleId") Long roleId); + + /** + * 查询所有的菜单角色 + * @return + */ + List queryAllRoleMenu(); +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuManager.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuManager.java new file mode 100644 index 00000000..a31619c2 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuManager.java @@ -0,0 +1,35 @@ +package net.lab1024.smartadmin.service.module.system.role.rolemenu; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import net.lab1024.smartadmin.service.module.system.role.rolemenu.domain.RoleMenuEntity; + +import java.util.List; + +/** + * 角色-菜单 + * + * @author 善逸 + * @date 2021/7/30 17:13 + */ +@Service +public class RoleMenuManager extends ServiceImpl { + + @Autowired + private RoleMenuDao roleMenuDao; + + /** + * 更新角色权限 + * @param roleId + * @param roleMenuEntityList + */ + @Transactional(rollbackFor = Exception.class) + public void updateRoleMenu(Long roleId, List roleMenuEntityList) { + // 根据角色ID删除菜单权限 + roleMenuDao.deleteByRoleId(roleId); + // 批量添加菜单权限 + saveBatch(roleMenuEntityList); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuService.java new file mode 100644 index 00000000..82fb9e6f --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/RoleMenuService.java @@ -0,0 +1,106 @@ +package net.lab1024.smartadmin.service.module.system.role.rolemenu; + +import com.google.common.collect.Lists; +import net.lab1024.smartadmin.service.common.codeconst.ResponseCodeConst; +import net.lab1024.smartadmin.service.common.constant.CommonConst; +import net.lab1024.smartadmin.service.common.domain.ResponseDTO; +import net.lab1024.smartadmin.service.module.system.menu.MenuDao; +import net.lab1024.smartadmin.service.module.system.menu.MenuEmployeeService; +import net.lab1024.smartadmin.service.module.system.menu.domain.MenuSimpleTreeVO; +import net.lab1024.smartadmin.service.module.system.menu.domain.MenuVO; +import net.lab1024.smartadmin.service.module.system.role.basic.RoleDao; +import net.lab1024.smartadmin.service.module.system.role.basic.domain.entity.RoleEntity; +import net.lab1024.smartadmin.service.module.system.role.rolemenu.domain.RoleMenuDTO; +import net.lab1024.smartadmin.service.module.system.role.rolemenu.domain.RoleMenuEntity; +import net.lab1024.smartadmin.service.module.system.role.rolemenu.domain.RoleMenuTreeVO; +import net.lab1024.smartadmin.service.util.SmartBeanUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 角色-菜单 + * + * @author 善逸 + * @date 2021/7/30 17:13 + */ +@Service +public class RoleMenuService { + + @Autowired + private RoleDao roleDao; + @Autowired + private RoleMenuDao roleMenuDao; + @Autowired + private RoleMenuManager roleMenuManager; + @Autowired + private MenuDao menuDao; + @Autowired + private MenuEmployeeService menuEmployeeService; + + /** + * 更新角色权限 + * + * @param updateDTO + * @return + */ + public ResponseDTO updateRoleMenu(RoleMenuDTO updateDTO) { + //查询角色是否存在 + Long roleId = updateDTO.getRoleId(); + RoleEntity roleEntity = roleDao.selectById(roleId); + if (null == roleEntity) { + return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); + } + List roleMenuEntityList = Lists.newArrayList(); + RoleMenuEntity roleMenuEntity; + for (Long menuId : updateDTO.getMenuIdList()) { + roleMenuEntity = new RoleMenuEntity(); + roleMenuEntity.setRoleId(roleId); + roleMenuEntity.setMenuId(menuId); + roleMenuEntityList.add(roleMenuEntity); + } + roleMenuManager.updateRoleMenu(updateDTO.getRoleId(), roleMenuEntityList); + // 更新角色权限缓存 + menuEmployeeService.initRoleMenuListMap(); + return ResponseDTO.succ(); + } + + /** + * 获取角色关联菜单权限 + * + * @param roleId + * @return + */ + public ResponseDTO getRoleSelectedMenu(Long roleId) { + RoleMenuTreeVO res = new RoleMenuTreeVO(); + res.setRoleId(roleId); + //查询角色ID选择的菜单权限 + List selectedMenuId = roleMenuDao.queryMenuIdByRoleId(roleId); + res.setSelectedMenuId(selectedMenuId); + //查询菜单权限 + List menuVOList = menuDao.queryMenuList(Boolean.FALSE, Boolean.FALSE, null); + Map> parentMap = menuVOList.stream().collect(Collectors.groupingBy(MenuVO::getParentId, Collectors.toList())); + List menuTreeList = this.buildMenuTree(parentMap, CommonConst.DEFAULT_PARENT_ID); + res.setMenuTreeList(menuTreeList); + return ResponseDTO.succData(res); + } + + /** + * 构建菜单树 + * + * @return + */ + private List buildMenuTree(Map> parentMap, Long parentId) { + // 获取本级菜单树List + List res = parentMap.getOrDefault(parentId, Lists.newArrayList()).stream() + .map(e -> SmartBeanUtil.copy(e, MenuSimpleTreeVO.class)).collect(Collectors.toList()); + // 循环遍历下级菜单 + res.forEach(e -> { + e.setChildren(this.buildMenuTree(parentMap, e.getMenuId())); + }); + return res; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuDTO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuDTO.java new file mode 100644 index 00000000..409214a4 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuDTO.java @@ -0,0 +1,31 @@ +package net.lab1024.smartadmin.service.module.system.role.rolemenu.domain; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 角色-菜单 + * + * @author 善逸 + * @date 2021/7/30 17:18 + */ +@Data +public class RoleMenuDTO { + + /** + * 角色id + */ + @ApiModelProperty("角色id") + @NotNull(message = "角色id不能为空") + private Long roleId; + + /** + * 菜单ID 集合 + */ + @ApiModelProperty("菜单ID集合") + @NotNull(message = "菜单ID不能为空") + private List menuIdList; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuEntity.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuEntity.java new file mode 100644 index 00000000..e714f310 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuEntity.java @@ -0,0 +1,46 @@ +package net.lab1024.smartadmin.service.module.system.role.rolemenu.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 角色-菜单 + * + * @author 善逸 + * @date 2021/7/30 17:09 + */ +@Data +@TableName("t_role_menu") +public class RoleMenuEntity { + + /** + * 主键id + */ + @TableId(type = IdType.AUTO) + private Long roleMenuId; + + /** + * 角色 id + */ + private Long roleId; + + /** + * 菜单 id + */ + private Long menuId; + + /** + * 更新时间 + */ + private LocalDateTime updateTime; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuTreeVO.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuTreeVO.java new file mode 100644 index 00000000..e8fdba8d --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/module/system/role/rolemenu/domain/RoleMenuTreeVO.java @@ -0,0 +1,26 @@ +package net.lab1024.smartadmin.service.module.system.role.rolemenu.domain; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import net.lab1024.smartadmin.service.module.system.menu.domain.MenuSimpleTreeVO; + +import java.util.List; + +/** + * 角色菜单树 + * + * @author 善逸 + * @date 2021/7/30 17:36 + */ +@Data +public class RoleMenuTreeVO { + + @ApiModelProperty("角色ID") + private Long roleId; + + @ApiModelProperty("菜单列表") + private List menuTreeList; + + @ApiModelProperty("选中的菜单ID") + private List selectedMenuId; +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/third/SmartApplicationContext.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/third/SmartApplicationContext.java similarity index 72% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/third/SmartApplicationContext.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/third/SmartApplicationContext.java index fc366789..5d4c120a 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/third/SmartApplicationContext.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/third/SmartApplicationContext.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.third; +package net.lab1024.smartadmin.service.third; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; @@ -6,14 +6,14 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** - * [ApplicationContextHelper] + * [ ApplicationContextHelper ] * - * @author yandanyang - * @version 1.0 - * @since JDK1.8 + * @author 罗伊 + * @date 2020/8/25 11:57 */ @Component public class SmartApplicationContext implements ApplicationContextAware { + /** * 上下文对象实例 */ @@ -21,15 +21,16 @@ public class SmartApplicationContext implements ApplicationContextAware { @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - if(SmartApplicationContext.applicationContext == null){ + if (SmartApplicationContext.applicationContext == null) { - SmartApplicationContext.applicationContext = applicationContext; + SmartApplicationContext.applicationContext = applicationContext; } } /** * 获取applicationContext + * * @return */ public static ApplicationContext getApplicationContext() { @@ -38,12 +39,13 @@ public class SmartApplicationContext implements ApplicationContextAware { /** * 通过name获取 Bean. + * * @param name * @return */ - public static Object getBean(String name){ + public static Object getBean(String name) { ApplicationContext applicationContext = getApplicationContext(); - if(applicationContext == null){ + if (applicationContext == null) { return null; } return applicationContext.getBean(name); @@ -51,13 +53,14 @@ public class SmartApplicationContext implements ApplicationContextAware { /** * 通过class获取Bean. + * * @param clazz * @param * @return */ - public static T getBean(Class clazz){ + public static T getBean(Class clazz) { ApplicationContext applicationContext = getApplicationContext(); - if(applicationContext == null){ + if (applicationContext == null) { return null; } return applicationContext.getBean(clazz); @@ -65,14 +68,15 @@ public class SmartApplicationContext implements ApplicationContextAware { /** * 通过name,以及Clazz返回指定的Bean + * * @param name * @param clazz * @param * @return */ - public static T getBean(String name,Class clazz){ + public static T getBean(String name, Class clazz) { ApplicationContext applicationContext = getApplicationContext(); - if(applicationContext == null){ + if (applicationContext == null) { return null; } return applicationContext.getBean(name, clazz); diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/third/SmartRedisService.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/third/SmartRedisService.java similarity index 80% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/third/SmartRedisService.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/third/SmartRedisService.java index da36246a..a8a942cc 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/third/SmartRedisService.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/third/SmartRedisService.java @@ -1,14 +1,21 @@ -package net.lab1024.smartadmin.third; +package net.lab1024.smartadmin.service.third; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; -import lombok.extern.slf4j.Slf4j; +import net.lab1024.smartadmin.service.module.support.redismq.RedisMqTopicEnum; +import net.lab1024.smartadmin.service.module.support.redismq.RedisMsgDTO; +import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.*; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.temporal.ChronoUnit; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; @@ -17,17 +24,17 @@ import java.util.concurrent.TimeUnit; /** * [ redis 一顿操作 ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/26 0026 下午 18:12 - * @since JDK1.8 + * @author 罗伊 + * @date 2020/8/25 11:57 */ -@Slf4j @Component public class SmartRedisService { + private static final Logger log = org.slf4j.LoggerFactory.getLogger(SmartRedisService.class); + + @Autowired + private StringRedisTemplate stringRedisTemplate; + @Autowired private RedisTemplate redisTemplate; @@ -43,6 +50,15 @@ public class SmartRedisService { @Autowired private SetOperations redisSetOperations; + public boolean getLock(String key, long expire) { + return redisValueOperations.setIfAbsent(key, String.valueOf(System.currentTimeMillis()), expire, TimeUnit.MILLISECONDS); + } + + public void unLock(String key) { + redisValueOperations.getOperations().delete(key); + } + + /** * 指定缓存失效时间 * @@ -51,17 +67,27 @@ public class SmartRedisService { * @return */ public boolean expire(String key, long time) { + try { if (time > 0) { redisTemplate.expire(key, time, TimeUnit.SECONDS); } return true; } catch (Exception e) { - log.error("", e); + log.error("redis service 指定失效时间-发生异常:", e); return false; } } + /** + * 获取当天剩余的秒数 + * + * @return + */ + public static long currentDaySecond() { + return ChronoUnit.SECONDS.between(LocalDateTime.now(), LocalDateTime.of(LocalDate.now(), LocalTime.MAX)); + } + /** * 根据key 获取过期时间 * @@ -82,7 +108,7 @@ public class SmartRedisService { try { return redisTemplate.hasKey(key); } catch (Exception e) { - log.error("", e); + log.error("redis service 判断key是否存在-发生异常:", e); return false; } } @@ -98,11 +124,23 @@ public class SmartRedisService { if (key.length == 1) { redisTemplate.delete(key[0]); } else { - redisTemplate.delete(CollectionUtils.arrayToList(key)); + redisTemplate.delete((Collection) CollectionUtils.arrayToList(key)); } } } + /** + * 删除缓存 + * + * @param keyList + */ + public void del(List keyList) { + if (CollectionUtils.isEmpty(keyList)) { + return; + } + redisTemplate.delete(keyList); + } + //============================String============================= /** @@ -145,12 +183,39 @@ public class SmartRedisService { redisValueOperations.set(key, value); return true; } catch (Exception e) { - log.error("", e); + log.error("redis service set-发生异常:", e); return false; } } + /** + * 根据 key 批量获取 + * + * @param keyList + * @return + */ + public List mGet(List keyList) { + return redisValueOperations.multiGet(keyList); + } + + /** + * 普通缓存放入 + * + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + public boolean set(String key, String value, long second) { + try { + redisValueOperations.set(key, value, second, TimeUnit.SECONDS); + return true; + } catch (Exception e) { + log.error("", e); + return false; + } + } + /** * 普通缓存放入并设置时间 * @@ -159,12 +224,13 @@ public class SmartRedisService { * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 * @return true成功 false 失败 */ - public boolean set(String key, String value, long time) { + public boolean set(Object key, Object value, long time) { + String jsonString = JSON.toJSONString(value); try { if (time > 0) { - redisValueOperations.set(key, value, time, TimeUnit.SECONDS); + redisValueOperations.set(key.toString(), jsonString, time, TimeUnit.SECONDS); } else { - set(key, value); + set(key.toString(), jsonString); } return true; } catch (Exception e) { @@ -214,6 +280,27 @@ public class SmartRedisService { return redisHashOperations.get(key, item); } + /** + * HashGet + * 并强制转换为对应对象 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return 值 + */ + public T hget(String key, String item, Class clazz) { + Object obj = redisHashOperations.get(key, item); + if (null == obj) { + return null; + } + + if (obj instanceof String) { + return JSON.parseObject((String) obj, clazz); + } + + return null; + } + /** * 获取hashKey对应的所有键值 * @@ -272,7 +359,7 @@ public class SmartRedisService { */ public boolean hset(String key, String item, Object value) { try { - redisHashOperations.put(key, item, value); + redisHashOperations.put(key, item, JSON.toJSONString(value)); return true; } catch (Exception e) { log.error("", e); @@ -291,7 +378,7 @@ public class SmartRedisService { */ public boolean hset(String key, String item, Object value, long time) { try { - redisHashOperations.put(key, item, value); + redisHashOperations.put(key, item, JSON.toJSONString(value)); if (time > 0) { expire(key, time); } @@ -619,4 +706,16 @@ public class SmartRedisService { return 0; } } + + /** + * 发送redis消息 + * + * @param topicEnum + * @param msgType + * @param jsonData + */ + public void sendMsg(RedisMqTopicEnum topicEnum, Integer msgType, String jsonData) { + RedisMsgDTO redisMsgDTO = new RedisMsgDTO(msgType, jsonData); + stringRedisTemplate.convertAndSend(topicEnum.getValue(), JSONObject.toJSONString(redisMsgDTO)); + } } \ No newline at end of file diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartAesUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartAesUtil.java new file mode 100644 index 00000000..629db943 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartAesUtil.java @@ -0,0 +1,104 @@ +package net.lab1024.smartadmin.service.util; + +import lombok.extern.slf4j.Slf4j; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; + +/** + * [ ] + * + * @author 罗伊 + * @date + */ +@Slf4j +public class SmartAesUtil { + + + /** + * 加密返回的数据转换成 String 类型 + * + * @param content 明文 + * @param key 秘钥 + * @param iv 初始化向量是16位长度的字符串 + * @return + */ + public static String encrypt(String content, String key, String iv) { + return base64ToString(AES_CBC_Encrypt(content.getBytes(), key.getBytes(), iv.getBytes())); + } + + /** + * 将解密返回的数据转换成 String 类型 + * + * @param content Base64编码的密文 + * @param key 秘钥 + * @param iv 初始化向量是16位长度的字符串 + * @return + */ + public static String decrypt(String content, String key, String iv) { + return new String(AES_CBC_Decrypt(stringToBase64(content), key.getBytes(), iv.getBytes())); + } + + private static byte[] AES_CBC_Encrypt(byte[] content, byte[] keyBytes, byte[] iv) { + try { + SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv)); + byte[] result = cipher.doFinal(content); + return result; + } catch (Exception e) { + System.out.println("exception:" + e.toString()); + } + return null; + } + + private static byte[] AES_CBC_Decrypt(byte[] content, byte[] keyBytes, byte[] iv) { + try { + SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv)); + byte[] result = cipher.doFinal(content); + return result; + } catch (Exception e) { + System.out.println("exception:" + e.toString()); + } + return null; + } + + /** + * 字符串装换成 Base64 + */ + + public static byte[] stringToBase64(String key) { + return Base64.getDecoder().decode(key.getBytes()); + } + + /** + * Base64装换成字符串 + */ + public static String base64ToString(byte[] key) { + return Base64.getEncoder().encodeToString(key); + } + + public static void main(String args[]) throws Exception { + + String content = "明文 123 abc"; + String KEY = "c4ca4238a0b923820dcc509a6f75849b"; + String IV = KEY.substring(0, 16); + ; + //加密 + String encrypted = encrypt(content, KEY, IV); + //解密 + String decrypted = decrypt(encrypted, KEY, IV); + + System.out.println("加密前:" + content); + + System.out.println("加密后:" + encrypted); + + System.out.println("解密后:" + decrypted); + } + + +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartBaseEnumUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartBaseEnumUtil.java new file mode 100644 index 00000000..d67c7fd4 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartBaseEnumUtil.java @@ -0,0 +1,121 @@ +package net.lab1024.smartadmin.service.util; + +import net.lab1024.smartadmin.service.common.constant.BaseEnum; + +import java.util.List; +import java.util.Objects; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.stream.Stream; + +/** + * 枚举工具类 + * + * @author listen + * @date 2017/10/10 18:17 + */ +public class SmartBaseEnumUtil { + + /** + * 校验参数与枚举类比较是否合法 + * + * @param value 参数 + * @param enumClass 枚举类必须实现BaseEnum接口 + * @return boolean + * @Author listen + */ + public static boolean checkEnum(Object value, Class enumClass) { + if (null == value) { + return false; + } + return Stream.of(enumClass.getEnumConstants()).anyMatch(e -> e.equalsValue(value)); + } + + /** + * 获取枚举类的说明 value : info 的形式 + * + * @param enumClass + * @return String + */ + public static String getEnumDesc(Class enumClass) { + BaseEnum[] enums = enumClass.getEnumConstants(); + // value : info 的形式 + StringBuilder sb = new StringBuilder(); + for (BaseEnum baseEnum : enums) { + sb.append(baseEnum.getValue()).append(":").append(baseEnum.getDesc()).append(","); + } + return sb.toString(); + } + + /** + * 获取与参数相匹配的枚举类实例的 说明 + * + * @param value 参数 + * @param enumClass 枚举类必须实现BaseEnum接口 + * @return String 如无匹配枚举则返回null + */ + public static String getEnumDescByValue(Object value, Class enumClass) { + if (null == value) { + return null; + } + return Stream.of(enumClass.getEnumConstants()) + .filter(e -> e.equalsValue(value)) + .findFirst() + .map(BaseEnum::getDesc) + .orElse(null); + } + + /** + * 根据参数获取枚举类的实例 + * + * @param value 参数 + * @param enumClass 枚举类必须实现BaseEnum接口 + * @return BaseEnum 无匹配值返回null + * @Author listen + */ + public static T getEnumByValue(Object value, Class enumClass) { + if (null == value) { + return null; + } + return Stream.of(enumClass.getEnumConstants()) + .filter(e -> e.equalsValue(value)) + .findFirst() + .orElse(null); + } + + /** + * 根据实例描述与获取枚举类的实例 + * + * @param desc 参数描述 + * @param enumClass 枚举类必须实现BaseEnum接口 + * @return BaseEnum 无匹配值返回null + * @Author listen + */ + public static T getEnumByDesc(String desc, Class enumClass) { + return Stream.of(enumClass.getEnumConstants()) + .filter(e -> Objects.equals(e.getDesc(), desc)) + .findFirst() + .orElse(null); + } + + /** + * 根据lambda getter/setter 注入 + * + * @param list + * @param getter + * @param setter + * @param enumClass + * @param + */ + public static void inject(List list, Function getter, BiConsumer setter, Class enumClass) { + if (list == null || list.isEmpty()) { + return; + } + for (T t : list) { + Integer enumValue = getter.apply(t); + if (enumValue != null) { + setter.accept(t, getEnumDescByValue(enumValue, enumClass)); + } + } + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartBeanUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartBeanUtil.java similarity index 96% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartBeanUtil.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartBeanUtil.java index 6d36c05b..01eaa774 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartBeanUtil.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartBeanUtil.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.util; +package net.lab1024.smartadmin.service.util; import org.springframework.beans.BeanUtils; diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartBigDecimalUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartBigDecimalUtil.java similarity index 99% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartBigDecimalUtil.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartBigDecimalUtil.java index 651f3d4e..0fab9911 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartBigDecimalUtil.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartBigDecimalUtil.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.util; +package net.lab1024.smartadmin.service.util; import java.math.BigDecimal; import java.math.RoundingMode; diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartCollectionUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartCollectionUtil.java new file mode 100644 index 00000000..110b4c79 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartCollectionUtil.java @@ -0,0 +1,78 @@ +package net.lab1024.smartadmin.service.util; + +import org.apache.commons.collections4.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.Function; + +/** + * + * @author Administrator + */ +public class SmartCollectionUtil { + + public static boolean isEmptyMap(Map map) { + if (map == null || map.size() == 0) { + return true; + } + return false; + } + + /** + * 分批处理数据 + * + * @param list 集合 + * @param func 执行方法 + * @param limit 每次执行数量 + * @author listen + */ + public static void batchExecute(List list, Function, Object> func, int limit) { + if (CollectionUtils.isEmpty(list)) { + return; + } + List tempList = new ArrayList<>(limit); + for (T e : list) { + tempList.add(e); + if (tempList.size() >= limit) { + func.apply(tempList); + tempList.clear(); + } + } + if (CollectionUtils.isNotEmpty(tempList)) { + func.apply(tempList); + } + } + + /** + * 分批处理数据 支持两个参数 + * + * @param list 集合 + * @param func 执行方法 + * @param limit 每次执行数量 + * @author listen + */ + public static void batchExecute(List list, R obj, BiFunction, R, Object> func, int limit) { + if (CollectionUtils.isEmpty(list)) { + return; + } + limit = 0 >= limit ? 50 : limit; + List tempList = new ArrayList<>(limit); + for (T e : list) { + tempList.add(e); + if (tempList.size() >= limit) { + func.apply(tempList, obj); + tempList.clear(); + } + } + if (CollectionUtils.isNotEmpty(tempList)) { + func.apply(tempList, obj); + } + } + + public static boolean isNotEmptyMap(Map map) { + return !isEmptyMap(map); + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartDateUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartDateUtil.java similarity index 99% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartDateUtil.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartDateUtil.java index 1e078263..acdaaeb5 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartDateUtil.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartDateUtil.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.util; +package net.lab1024.smartadmin.service.util; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateUtils; @@ -284,7 +284,7 @@ public class SmartDateUtil extends DateUtils { * * @param dateStr yyyy-mm-dd * @return - * @auther yandanyang + * @auther 罗伊 * @date 2018/10/16 0016 下午 17:43 */ public static boolean isCurrentDayYMD(String dateStr) { @@ -303,7 +303,7 @@ public class SmartDateUtil extends DateUtils { * * @param dateStr yyyy-mm-dd * @return - * @auther yandanyang + * @auther 罗伊 * @date 2018/10/16 0016 下午 17:43 */ public static boolean isCurrentMonthYMD(String dateStr) { diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartDigestUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartDigestUtil.java new file mode 100644 index 00000000..e17a7432 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartDigestUtil.java @@ -0,0 +1,27 @@ +package net.lab1024.smartadmin.service.util; + +import org.apache.commons.codec.digest.DigestUtils; + +public class SmartDigestUtil extends DigestUtils { + + /** + * md5 加盐加密 + * + * @param salt + * @param str + * @return + */ + public static String encrypt(String salt, String str) { + return SmartDigestUtil.md5Hex(salt + str); + } + + /** + * md5 加密 + * + * @param str + * @return + */ + public static String encrypt(String str) { + return SmartDigestUtil.md5Hex(str); + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartEasyPoiExcelUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartEasyPoiExcelUtil.java similarity index 81% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartEasyPoiExcelUtil.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartEasyPoiExcelUtil.java index fb3860a6..edfda2ad 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartEasyPoiExcelUtil.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartEasyPoiExcelUtil.java @@ -1,10 +1,11 @@ -package net.lab1024.smartadmin.util; +package net.lab1024.smartadmin.service.util; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.ImportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.web.multipart.MultipartFile; @@ -12,16 +13,17 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; /** - * @author: zhuoda + * @author: 卓大 * @create: 2020-03-30 14:27 PM from win10 */ - +@Slf4j public class SmartEasyPoiExcelUtil { public static void exportExcel(List list, String title, String sheetName, Class pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) throws IOException { @@ -43,20 +45,31 @@ public class SmartEasyPoiExcelUtil { HttpServletResponse response, ExportParams exportParams) throws IOException { Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list); if (workbook != null) ; - downLoadExcel(fileName, response, workbook); + downloadExcel(fileName, workbook, response); } - private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException { - response.setHeader("content-Type", "application/vnd.ms-excel"); - response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); - response.setCharacterEncoding("UTF-8"); + + public static void downloadExcel(String fileName, Workbook workbook, HttpServletResponse response) { + try { + fileName = URLEncoder.encode(fileName, "UTF-8"); + } catch (UnsupportedEncodingException e) { + log.error("", e); + } + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-Type", "application/vnd.ms-excel"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls"); + try { workbook.write(response.getOutputStream()); + workbook.close(); + } catch (IOException e) { + log.error("", e); + } } private static void defaultExport(List> list, String fileName, HttpServletResponse response) throws IOException { Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF); if (workbook != null) ; - downLoadExcel(fileName, response, workbook); + downloadExcel(fileName, workbook, response); } public static List importExcel(String filePath, Integer titleRows, Integer headerRows, Class pojoClass) { @@ -73,7 +86,6 @@ public class SmartEasyPoiExcelUtil { //throw new NormalException("模板不能为空"); } catch (Exception e) { e.printStackTrace(); - //throw new NormalException(e.getMessage()); } return list; } diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartEmployeeTokenUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartEmployeeTokenUtil.java new file mode 100644 index 00000000..24436ee7 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartEmployeeTokenUtil.java @@ -0,0 +1,31 @@ +package net.lab1024.smartadmin.service.util; + +import net.lab1024.smartadmin.service.module.system.login.domain.EmployeeLoginInfoDTO; + +/** + * @author 罗伊 + */ +public class SmartEmployeeTokenUtil { + + private static final ThreadLocal LOCAL_USER = new ThreadLocal<>(); + + public static void setUser(EmployeeLoginInfoDTO loginInfoDTO) { + LOCAL_USER.set(loginInfoDTO); + } + + public static EmployeeLoginInfoDTO getRequestEmployee() { + return LOCAL_USER.get(); + } + + public static Long getRequestEmployeeId() { + EmployeeLoginInfoDTO requestUser = getRequestEmployee(); + if (null == requestUser) { + return null; + } + return requestUser.getEmployeeId(); + } + + public static void remove() { + LOCAL_USER.remove(); + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartFileUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartFileUtil.java similarity index 84% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartFileUtil.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartFileUtil.java index 45735c9a..8f84fc2d 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartFileUtil.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartFileUtil.java @@ -1,22 +1,15 @@ -package net.lab1024.smartadmin.util; +package net.lab1024.smartadmin.service.util; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; +import java.io.*; import java.nio.charset.Charset; -import org.apache.commons.io.FileUtils; - /** - * @author zhuoda + * [ ] + * + * @author 罗伊 + * @date 2021/2/22 14:19 */ -public class SmartFileUtil extends FileUtils { +public class SmartFileUtil { public static boolean isXmlFile(File file) { return "xml".equalsIgnoreCase(getFileExtension(file.getName())); diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartHttpUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartHttpUtil.java similarity index 96% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartHttpUtil.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartHttpUtil.java index 62e8ff2d..d9f2ed14 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartHttpUtil.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartHttpUtil.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.util; +package net.lab1024.smartadmin.service.util; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -23,12 +23,7 @@ import java.util.Map.Entry; /** * [ HttpUtils ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 + * @author 罗伊 */ public class SmartHttpUtil { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartIPUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartIPUtil.java similarity index 81% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartIPUtil.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartIPUtil.java index fb93cd57..594d6372 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartIPUtil.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartIPUtil.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.util; +package net.lab1024.smartadmin.service.util; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -8,19 +8,12 @@ import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** * [ ] * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/5 0005 下午 15:34 - * @since JDK1.8 + * @author 罗伊 */ public class SmartIPUtil { @@ -62,6 +55,30 @@ public class SmartIPUtil { } } + public static List getLocalHostIPList() { + InetAddress ip = null; + List ipList = new ArrayList(); + try { + Enumeration netInterfaces = (Enumeration) NetworkInterface + .getNetworkInterfaces(); + while (netInterfaces.hasMoreElements()) { + NetworkInterface ni = (NetworkInterface) netInterfaces + .nextElement(); + Enumeration ips = ni.getInetAddresses(); + while (ips.hasMoreElements()) { + ip = (InetAddress) ips.nextElement(); + if (!ip.isLoopbackAddress() + && ip.getHostAddress().matches( + "(\\d{1,3}\\.){3}\\d{1,3}")) { + ipList.add(ip.getHostAddress()); + } + } + } + } catch (Exception e) { + } + return ipList; + } + public static String getRemoteIp(HttpServletRequest request) { // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartPageUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartPageUtil.java new file mode 100644 index 00000000..6ec1e64d --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartPageUtil.java @@ -0,0 +1,144 @@ +package net.lab1024.smartadmin.service.util; + +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.collect.Lists; +import net.lab1024.smartadmin.service.common.domain.PageBaseDTO; +import net.lab1024.smartadmin.service.common.domain.PageResultDTO; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 分页工具类 + * + * @author 1024lab + * @date 2017-12-23 16:40 + */ + +public class SmartPageUtil { + + public static Page convert2PageQuery(PageBaseDTO baseDTO) { + Page page = new Page(baseDTO.getPageNum(), baseDTO.getPageSize()); + + // 设置排序字段 + List sortItemList = baseDTO.getSortItemList(); + if (CollectionUtils.isNotEmpty(sortItemList)) { + List orderItemList = sortItemList.stream().map(e -> build(e.getColumn(), e.getIsAsc())).collect(Collectors.toList()); + page.setOrders(orderItemList); + } + return page; + } + + public static PageResultDTO convert2PageResult(Page page) { + PageResultDTO result = new PageResultDTO<>(); + result.setPageNum(page.getCurrent()); + result.setPageSize(page.getSize()); + result.setTotal(page.getTotal()); + result.setPages(page.getPages()); + result.setList(page.getRecords()); + result.setEmptyFlag(CollectionUtils.isEmpty(page.getRecords())); + return result; + } + + /** + * 转换为 PageResultDTO 对象 + * + * @param page + * @param sourceList 原list + * @param targetClazz 目标类 + * @return + * @author 罗伊 + * @date 2018年5月16日 下午6:05:28 + */ + public static PageResultDTO convert2PageResult(Page page, List sourceList, Class targetClazz) { + PageResultDTO pageResultDTO = setPage(page); + List records = SmartBeanUtil.copyList(sourceList, targetClazz); + page.setRecords(records); + pageResultDTO.setList(records); + pageResultDTO.setEmptyFlag(CollectionUtils.isEmpty(records)); + return pageResultDTO; + } + + /** + * 转换为 PageResultDTO 对象 + * + * @param page + * @param sourceList list + * @return + * @author 罗伊 + * @date 2018年5月16日 下午6:05:28 + */ + public static PageResultDTO convert2PageResult(Page page, List sourceList) { + PageResultDTO pageResultDTO = setPage(page); + page.setRecords(sourceList); + pageResultDTO.setList(sourceList); + pageResultDTO.setEmptyFlag(CollectionUtils.isEmpty(sourceList)); + return pageResultDTO; + } + + /** + * 转换分页结果对象 + * + * @param pageResultDTO + * @param targetClazz + * @param + * @param + * @return + */ + public static PageResultDTO convert2PageResult(PageResultDTO pageResultDTO, Class targetClazz) { + + PageResultDTO newPageResultDTO = new PageResultDTO(); + newPageResultDTO.setPageNum(pageResultDTO.getPageNum()); + newPageResultDTO.setPageSize(pageResultDTO.getPageSize()); + newPageResultDTO.setTotal(pageResultDTO.getTotal()); + newPageResultDTO.setPages(pageResultDTO.getPages()); + + List list = pageResultDTO.getList(); + List copyList = SmartBeanUtil.copyList(list, targetClazz); + newPageResultDTO.setList(copyList); + newPageResultDTO.setEmptyFlag(CollectionUtils.isEmpty(copyList)); + return newPageResultDTO; + } + + private static PageResultDTO setPage(Page page) { + PageResultDTO pageResultDTO = new PageResultDTO(); + pageResultDTO.setPageNum(page.getCurrent()); + pageResultDTO.setPageSize(page.getSize()); + pageResultDTO.setTotal(page.getTotal()); + pageResultDTO.setPages(page.getPages()); + return pageResultDTO; + } + + private static OrderItem build(String column, boolean asc) { + OrderItem item = new OrderItem(); + item.setColumn(column); + item.setAsc(asc); + return item; + } + + + public static PageResultDTO subListPage(Integer pageNum, Integer pageSize, List list) { + PageResultDTO pageRet = new PageResultDTO(); + //总条数 + int count = list.size(); + int pages = count%pageSize == 0 ? count/pageSize:(count/pageSize +1); + int fromIndex = (pageNum-1)*pageSize; + int toIndex = pageNum*pageSize>count ? count : pageNum*pageSize; + + if(pageNum > pages) { + pageRet.setList(Lists.newLinkedList()); + pageRet.setPageNum(pageNum.longValue()); + pageRet.setPages(Long.valueOf(pages)); + pageRet.setTotal(Long.valueOf(count)); + return pageRet; + } + List pageList = list.subList(fromIndex, toIndex); + pageRet.setList(pageList); + pageRet.setPageNum(pageNum.longValue()); + pageRet.setPages(Long.valueOf(pages)); + pageRet.setTotal(Long.valueOf(count)); + return pageRet; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartRandomUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartRandomUtil.java new file mode 100644 index 00000000..ae64fc4b --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartRandomUtil.java @@ -0,0 +1,181 @@ +package net.lab1024.smartadmin.service.util; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.RandomUtils; + +import java.security.SecureRandom; +import java.util.*; + +/** + * 产生随机数,打乱List顺序,随机取值 + * + * @author jiaozi + */ +public class SmartRandomUtil extends RandomUtils { + + private static final String NUM = "1234567890"; + + private static final String WORD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; + + /** + * Returns a random long List within the specified range. + * + * @return + */ + public static List randomDiffInRange(final long startInclusive, final long endExclusive, int randomCount) { + if (randomCount < 1) { + return Collections.emptyList(); + } + + if (startInclusive >= endExclusive) { + throw new RuntimeException("<> randomLong , endExclusive >= startInclusive, " + endExclusive + " >= " + startInclusive); + } + + if (randomCount >= (endExclusive - startInclusive)) { + ArrayList result = new ArrayList(); + for (long i = startInclusive; i < endExclusive; i++) { + result.add(i); + } + return result; + } else { + HashSet set = new HashSet(randomCount); + int i = 0; + while (i < randomCount) { + long nextLong = nextLong(startInclusive, endExclusive); + if (set.add(nextLong)) { + i++; + } + } + return new ArrayList(set); + } + } + + public static List randomDiffInRange(final int startInclusive, final int endExclusive, int randomCount) { + if (randomCount < 1) { + return Collections.emptyList(); + } + + if (startInclusive >= endExclusive) { + throw new RuntimeException("<> randomLong , endExclusive >= startInclusive, " + endExclusive + " >= " + startInclusive); + } + + if (randomCount >= (endExclusive - startInclusive)) { + ArrayList result = new ArrayList(); + for (int i = startInclusive; i < endExclusive; i++) { + result.add(i); + } + return result; + } else { + HashSet set = new HashSet(randomCount); + int i = 0; + while (i < randomCount) { + int nextLong = nextInt(startInclusive, endExclusive); + if (set.add(nextLong)) { + i++; + } + } + return new ArrayList(set); + } + } + + /** + * 随机取一个 + * + * @param list + * @return + */ + public static T randomOne(List list) { + List randomDifferent = randomDiffInRearrange(list, 1); + if (randomDifferent.isEmpty()) { + return null; + } + return randomDifferent.get(0); + } + + /** + * 打乱顺序,重新排列List, 返回的还是原来的list + * + * @param list + * @return + */ + public static List rearrange(List list) { + List result = new ArrayList(list); + int size = list.size(), j = - 1; + T element = null; + Random random = new Random(); + for (int i = 0; i < size / 2; i++) { + j = random.nextInt(size - i) + i; + if (j != i) { + element = result.get(i); + result.set(i, result.get(j)); + result.set(j, element); + } + } + return result; + } + + /** + * 打乱顺序,并从中随机选取几个 + * + * @param list + * @param totalRandomCount + * @return + */ + public static List randomDiffInRearrange(List list, int totalRandomCount) { + if (CollectionUtils.isEmpty(list) || totalRandomCount < 1) { + return Collections.emptyList(); + } + + if (totalRandomCount >= list.size()) { + return rearrange(list); + } + Random random = new Random(); + ArrayList res = new ArrayList(totalRandomCount); + int len = list.size(); + for (int i = 0; i < len; i++) { + if (random.nextInt(len - i) < totalRandomCount) { + res.add(list.get(i)); + totalRandomCount--; + if (totalRandomCount == 0) { + break; + } + } + } + return res; + } + + /** + * 生成N位的随机字符串 + * 包含 大写A-Z 小写a-z 以及数字 + * + * @param length + * @return + * @author listen + */ + public static String generateRandomString(int length) { + final String SOURCES = WORD + NUM; + char[] text = new char[length]; + SecureRandom secureRandom = new SecureRandom(); + for (int i = 0; i < length; i++) { + text[i] = SOURCES.charAt(secureRandom.nextInt(SOURCES.length())); + } + return new String(text); + } + + /** + * 生成N位的随机数字 + * + * @param length + * @return + * @author listen + */ + public static String generateRandomNum(int length) { + final String SOURCES = NUM; + char[] text = new char[length]; + SecureRandom secureRandom = new SecureRandom(); + for (int i = 0; i < length; i++) { + text[i] = SOURCES.charAt(secureRandom.nextInt(SOURCES.length())); + } + return new String(text); + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartSecurityUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartSecurityUtil.java new file mode 100644 index 00000000..a9c39ca9 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartSecurityUtil.java @@ -0,0 +1,80 @@ +package net.lab1024.smartadmin.service.util; + +import com.google.common.collect.Lists; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.lang.reflect.Method; +import java.util.List; + +/** + * [ ] + * + * @author 罗伊 + * @date 2021/8/31 11:30 + */ +public class SmartSecurityUtil { + + /** + * 获取指定方法的uri 前缀 + * 即controller层注解 + * + * @param method + * @return + */ + public static String getUriPrefix(Method method) { + Class clazz = method.getDeclaringClass(); + return getUriPrefix(clazz); + } + + + public static String getUriPrefix(Class clazz) { + String uriPrefix = ""; + RequestMapping classRequestMapping = (RequestMapping) clazz.getAnnotation(RequestMapping.class); + if (classRequestMapping != null) { + uriPrefix = classRequestMapping.value()[0]; + } + Class superclass = clazz.getSuperclass(); + if (superclass == null || superclass == Object.class) { + return uriPrefix; + } + RequestMapping superClassRequestMapping = (RequestMapping) superclass.getAnnotation(RequestMapping.class); + if (superClassRequestMapping != null) { + uriPrefix = superClassRequestMapping.value()[0] + uriPrefix; + } + return uriPrefix; + } + + /** + * 获取完整的uri前缀 + * + * @param method + * @param uriPrefix + * @return + */ + public static List getAnnotationValueList(Method method, String uriPrefix) { + List valueList = Lists.newArrayList(); + GetMapping getMapping = method.getAnnotation(GetMapping.class); + if (getMapping != null) { + valueList.addAll(uriList(uriPrefix, getMapping.value())); + } + PostMapping postMapping = method.getAnnotation(PostMapping.class); + if (postMapping != null) { + valueList.addAll(uriList(uriPrefix, postMapping.value())); + } + RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); + if (requestMapping != null) { + valueList.addAll(uriList(uriPrefix, requestMapping.value())); + } + return valueList; + } + + public static List uriList(String uriPrefix, String[] values) { + List uriList = Lists.newArrayList(); + for (String uri : values) { + uriList.add(uriPrefix + uri); + } + return uriList; + } +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartStringUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartStringUtil.java similarity index 99% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartStringUtil.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartStringUtil.java index da2e1764..c0d91e0f 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartStringUtil.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartStringUtil.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.util; +package net.lab1024.smartadmin.service.util; import org.apache.commons.lang3.StringUtils; diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartThreadFactory.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartThreadFactory.java similarity index 96% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartThreadFactory.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartThreadFactory.java index 367f2b17..2bf36fde 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartThreadFactory.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartThreadFactory.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.util; +package net.lab1024.smartadmin.service.util; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartVerificationUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartVerificationUtil.java similarity index 89% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartVerificationUtil.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartVerificationUtil.java index ceb349f1..62ae063d 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartVerificationUtil.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/SmartVerificationUtil.java @@ -1,6 +1,7 @@ -package net.lab1024.smartadmin.util; +package net.lab1024.smartadmin.service.util; import java.util.regex.Pattern; + /** * 验证工具类 * @@ -46,6 +47,8 @@ public class SmartVerificationUtil { + "|(02-(0[1-9]|[1][0-9]|2[0-8])))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)" + "([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9" + "][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|(" + "(([0-9]{2})(0[48]|[2468][048]|[13579][26])|(" + "(0[48" + "]|[2468][048]|[3579][26])00))-02-29)"; + public static final String DATE_TIME_HM = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9])$"; + /** * 年月校验 例: 2019-10 */ diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/date/SmartDateFormatterEnum.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/date/SmartDateFormatterEnum.java new file mode 100644 index 00000000..0ed67613 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/date/SmartDateFormatterEnum.java @@ -0,0 +1,78 @@ +package net.lab1024.smartadmin.service.util.date; + +import java.time.format.DateTimeFormatter; + +/** + * 时间格式化 枚举类 + * + * @author 胡克 + * @date 2021/6/6 18:45 + */ +public enum SmartDateFormatterEnum { + + /** + * 日期格式 :年月日 yyyy-MM-dd + * 例:2021-10-15 + */ + YMD(DateTimeFormatter.ofPattern("yyyy-MM-dd")), + + /** + * 日期格式 :年月日 时分 yyyy-MM-dd HH:mm + * 例:2021-10-15 10:15 + */ + YMD_HM(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")), + + /** + * 日期格式 :年月日 时分秒 yyyy-MM-dd HH:mm:ss + * 例:2021-10-15 10:15:00 + */ + YMD_HMS(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), + + /** + * 日期格式 :年月 yyyy-MM + * 例:2021-10 + */ + YM(DateTimeFormatter.ofPattern("yyyy-MM")), + + /** + * 日期格式:年月 MM-dd + * 例:10-15 + */ + MD(DateTimeFormatter.ofPattern("MM-dd")), + + /** + * 日期格式:年月 MM月dd日 + * 例:10月15日 + */ + CHINESE_MD(DateTimeFormatter.ofPattern("MM月dd日")), + + /** + * 日期格式 : yyyyMMddHHmmss + * 例:20091225091010 + */ + YMDHMS(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")), + + /** + * 日期格式 :时分秒 HH:mm:ss + * 例:10:15:00 + */ + HMS(DateTimeFormatter.ofPattern("HH:mm:ss")), + + /** + * 日期格式 :时分 HH:mm + * 例:10:15 + */ + HM(DateTimeFormatter.ofPattern("HH:mm")), + + ; + + private final DateTimeFormatter formatter; + + SmartDateFormatterEnum(DateTimeFormatter formatter) { + this.formatter = formatter; + } + + public DateTimeFormatter getFormatter() { + return formatter; + } +} diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/date/SmartLocalDateUtil.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/date/SmartLocalDateUtil.java new file mode 100644 index 00000000..3952303b --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/date/SmartLocalDateUtil.java @@ -0,0 +1,121 @@ +package net.lab1024.smartadmin.service.util.date; + +import java.time.*; +import java.time.format.TextStyle; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.Locale; + +/** + * java8 LocalDate 日期工具类 + * + * @author listen + * @date 2019/02/20 10:16 + */ +public class SmartLocalDateUtil { + + /** + * 格式化 LocalDateTime 返回对应格式字符串 + * + * @param time + * @param formatterEnum {@link SmartDateFormatterEnum} + * @return + */ + public static String format(LocalDateTime time, SmartDateFormatterEnum formatterEnum) { + return time.format(formatterEnum.getFormatter()); + } + + /** + * 格式化 LocalDate返回对应格式字符串 + * + * @param date + * @param formatterEnum {@link SmartDateFormatterEnum} + * @return + */ + public static String format(LocalDate date, SmartDateFormatterEnum formatterEnum) { + return date.format(formatterEnum.getFormatter()); + } + + /** + * 解析时间字符串 返回LocalDateTime + * + * @param time + * @param formatterEnum {@link SmartDateFormatterEnum} + * @return + */ + public static LocalDateTime parse(String time, SmartDateFormatterEnum formatterEnum) { + return LocalDateTime.parse(time, formatterEnum.getFormatter()); + } + + /** + * 解析时间字符串 返回 LocalDate + * + * @param time + * @param formatterEnum {@link SmartDateFormatterEnum} + * @return + */ + public static LocalDate parseDate(String time, SmartDateFormatterEnum formatterEnum) { + return LocalDate.parse(time, formatterEnum.getFormatter()); + } + + /** + * 获取指定日期时间戳 + * + * @param time + * @return + */ + public static Long getTimestamp(LocalDateTime time) { + return time.toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); + } + + /** + * 获取当前时间戳(秒) + * + * @return + */ + public static long nowSecond() { + return System.currentTimeMillis() / 1000; + } + + /** + * 将时间格式化为 星期几,例:星期一 ... 星期日 + * + * @param localDate + * @return + */ + public static String formatToChineseWeek(LocalDate localDate) { + return localDate.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINESE); + } + + /** + * 将时间格式化为 周几,例:周一 ... 周日 + * + * @param localDate + * @return + */ + public static String formatToChineseWeekZhou(LocalDate localDate) { + return formatToChineseWeek(localDate).replace("星期", "周"); + } + + public static LocalDateTime toLocalDateTime(Date date) { + return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); + } + + /** + * 获取当天剩余时间 单位 + * + * @param unit 时间单位 + * @return + */ + public static Long getDayBalanceTime(ChronoUnit unit) { + LocalDateTime now = LocalDateTime.now(); + return Duration.between(now, now.plusDays(1L).with(LocalTime.MIN)).get(unit); + } + + public static void main(String[] args) { + System.out.println(SmartLocalDateUtil.format(LocalDateTime.now(),SmartDateFormatterEnum.YMD_HMS)); + System.out.println(SmartLocalDateUtil.format(LocalDateTime.now(),SmartDateFormatterEnum.YMD_HM)); + System.out.println(SmartLocalDateUtil.parse("2021-10-15 10:10:00",SmartDateFormatterEnum.YMD_HMS)); + } + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartExcel.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartExcel.java similarity index 97% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartExcel.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartExcel.java index 47f6e8cd..d9f6bb02 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartExcel.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartExcel.java @@ -1,4 +1,7 @@ -package net.lab1024.smartadmin.util.excel; +package net.lab1024.smartadmin.service.util.excel; + +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.IOException; @@ -7,11 +10,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; - /** - * zhuoda + * 卓大 */ public class SmartExcel { diff --git a/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartExcelFileType.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartExcelFileType.java new file mode 100644 index 00000000..f65658f9 --- /dev/null +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartExcelFileType.java @@ -0,0 +1,10 @@ +package net.lab1024.smartadmin.service.util.excel; + +/** + * @author 卓大 + */ +public enum SmartExcelFileType { + XLS, + XLSX + +} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartExcelReader.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartExcelReader.java similarity index 77% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartExcelReader.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartExcelReader.java index e5c1ba5b..439c78e2 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartExcelReader.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartExcelReader.java @@ -1,13 +1,16 @@ -package net.lab1024.smartadmin.util.excel; +package net.lab1024.smartadmin.service.util.excel; /** - * @author zhuoda + * @author 卓大 * @Date 2020/8/10 */ -import net.lab1024.smartadmin.util.SmartFileUtil; +import net.lab1024.smartadmin.service.util.SmartFileUtil; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; public class SmartExcelReader { diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartSheet.java b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartSheet.java similarity index 98% rename from smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartSheet.java rename to admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartSheet.java index 80aed760..836657cd 100644 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartSheet.java +++ b/admin-api/java-api/src/main/java/net/lab1024/smartadmin/service/util/excel/SmartSheet.java @@ -1,4 +1,4 @@ -package net.lab1024.smartadmin.util.excel; +package net.lab1024.smartadmin.service.util.excel; import org.apache.poi.ss.usermodel.Cell; @@ -7,7 +7,7 @@ import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.util.CellRangeAddress; /** - * @author zhuoda + * @author 卓大 */ public class SmartSheet { final String name; diff --git a/smart-admin-service/smart-admin-api/src/main/resources/banner.txt b/admin-api/java-api/src/main/resources/banner.txt similarity index 69% rename from smart-admin-service/smart-admin-api/src/main/resources/banner.txt rename to admin-api/java-api/src/main/resources/banner.txt index d3187732..73c66a4e 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/banner.txt +++ b/admin-api/java-api/src/main/resources/banner.txt @@ -1,8 +1,14 @@ + ${AnsiColor.BRIGHT_GREEN} + / ____| | | /\ | | (_) | (___ _ __ ___ __ _ _ __| |_ / \ __| |_ __ ___ _ _ __ \___ \| '_ ` _ \ / _` | '__| __| / /\ \ / _` | '_ ` _ \| | '_ \ ____) | | | | | | (_| | | | |_ / ____ \ (_| | | | | | | | | | | |_____/|_| |_| |_|\__,_|_| \__/_/ \_\__,_|_| |_| |_|_|_| |_| -SmartAdmin v1.2.0 +热爱代码 热爱生活 +永远年轻 永远前行 +SmartAdmin v2.0.0 by 【1024lab team】 + +${AnsiColor.DEFAULT} \ No newline at end of file diff --git a/admin-api/java-api/src/main/resources/dev/application.properties b/admin-api/java-api/src/main/resources/dev/application.properties new file mode 100644 index 00000000..96a556e1 --- /dev/null +++ b/admin-api/java-api/src/main/resources/dev/application.properties @@ -0,0 +1,98 @@ +######################### server ################### +server.servlet.context-path=/ +server.port=10086 +spring.profiles.active=@profiles.active@ + +######################### project ################### +project.name=smart-admin +project.module=net.lab1024.smartadmin.service.module + +######################### tomcat ################### +server.tomcat.basedir=/home/logs/smart-admin/tomcat-logs +server.tomcat.accesslog.enabled=true +server.tomcat.accesslog.pattern=%t %{X-Forwarded-For}i %a "%r" %s %D (%D ms) + +######################### jackson ######################### +spring.jackson.serialization.write-enums-using-to-string=true +spring.jackson.deserialization.read-enums-using-to-string=true +spring.jackson.deserialization.fail-on-unknown-properties=false +spring.jackson.default-property-inclusion=always +spring.jackson.date-format=yyyy-MM-dd HH:mm:ss +spring.jackson.time-zone=GMT+8 +spring.jackson.serialization.write-dates-as-timestamps=false + +######################### database ######################### +spring.datasource.url=jdbc:p6spy:mysql://127.0.0.1:3306/smart_admin_v2?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai +spring.datasource.username=root +spring.datasource.password=1024lab +spring.datasource.initial-size=2 +spring.datasource.min-idle=1 +spring.datasource.max-active=10 +spring.datasource.max-wait=60000 +spring.datasource.time-between-eviction-runs-millis=60000 +spring.datasource.min-evictable-idle-time-millis=300000 +spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver +spring.datasource.filters=stat +spring.datasource.druid.username=druid +spring.datasource.druid.password=123456 +spring.datasource.druid.login.enabled=false +spring.datasource.druid.service.scanner=net.lab1024.smartadmin.module..*Service.* + +######################### redis ####################################### +spring.redis.database=1 +spring.redis.host=127.0.0.1 +spring.redis.lettuce.pool.max-active=100 +spring.redis.lettuce.pool.min-idle=5 +spring.redis.lettuce.pool.max-idle=10 +spring.redis.lettuce.pool.max-wait=30000ms +spring.redis.port=6379 +spring.redis.timeout=10000ms +spring.redis.password= + +######################### swagger ######################### +swagger.apiGroupName=smartAdmin +swagger.title=SmartAdmin +swagger.description=SmartAdmin2.0 +swagger.version=2.0 +swagger.serviceUrl=http://localhost:${server.port}/smart-admin-api +swagger.packAge=net.lab1024.smartadmin.service +swagger.tagClass=net.lab1024.smartadmin.service.common.constant.SwaggerTagConst + +########################## rest http pool ######################### +http.pool.max-total=20 +http.pool.connect-timeout=50000 +http.pool.read-timeout=50000 +http.pool.write-timeout=50000 +http.pool.keep-alive=300000 + +######################### http file ######################### +spring.servlet.multipart.max-file-size=30MB +spring.servlet.multipart.max-request-size=30MB + +######################### ali oss ######################### +file.storage.mode=cloud +file.storage.local.path=/home/upload/ +file.storage.cloud.region=oss-cn-qingdao +file.storage.cloud.endpoint=oss-cn-qingdao.aliyuncs.com +file.storage.cloud.bucket-name=smart-admin-sit +file.storage.cloud.access-key=xxxx +file.storage.cloud.secret-key=xxxx +file.storage.cloud.url.expire=7200000 +file.storage.cloud.url.public=https://${file.storage.cloud.bucket-name}.${file.storage.cloud.endpoint}/ + +######################### redis mq ######################### +redis.mq.topic=smartAdmin +redis.mq.scanPath=${project.module} + +######################### cros ######################### +access-control-allow-origin=* + +######################### heart beat ######################### +heart-beat.delayHandlerTime=60000 +heart-beat.intervalTime=300000 + +######################### cache config ######################### +cache.maximumSize=5000 +cache.expireDays=10 +cache.scanPath=${project.module} + diff --git a/smart-admin-service/smart-admin-api/src/main/resources/dev/log4j2.xml b/admin-api/java-api/src/main/resources/dev/log4j2.xml similarity index 99% rename from smart-admin-service/smart-admin-api/src/main/resources/dev/log4j2.xml rename to admin-api/java-api/src/main/resources/dev/log4j2.xml index 86c514a3..da37dd11 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/dev/log4j2.xml +++ b/admin-api/java-api/src/main/resources/dev/log4j2.xml @@ -85,6 +85,7 @@ + @@ -94,4 +95,5 @@ + \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/dev/spy.properties b/admin-api/java-api/src/main/resources/dev/spy.properties similarity index 100% rename from smart-admin-service/smart-admin-api/src/main/resources/dev/spy.properties rename to admin-api/java-api/src/main/resources/dev/spy.properties diff --git a/admin-api/java-api/src/main/resources/mapper/business/category/CategoryMapper.xml b/admin-api/java-api/src/main/resources/mapper/business/category/CategoryMapper.xml new file mode 100644 index 00000000..c3c73f90 --- /dev/null +++ b/admin-api/java-api/src/main/resources/mapper/business/category/CategoryMapper.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/admin-api/java-api/src/main/resources/mapper/business/goods/GoodsMapper.xml b/admin-api/java-api/src/main/resources/mapper/business/goods/GoodsMapper.xml new file mode 100644 index 00000000..c0913e63 --- /dev/null +++ b/admin-api/java-api/src/main/resources/mapper/business/goods/GoodsMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/notice/NoticeMapper.xml b/admin-api/java-api/src/main/resources/mapper/business/notice/NoticeMapper.xml similarity index 76% rename from smart-admin-service/smart-admin-api/src/main/resources/mapper/business/notice/NoticeMapper.xml rename to admin-api/java-api/src/main/resources/mapper/business/notice/NoticeMapper.xml index d94c0ab7..0cf555fc 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/notice/NoticeMapper.xml +++ b/admin-api/java-api/src/main/resources/mapper/business/notice/NoticeMapper.xml @@ -1,20 +1,8 @@ - + - - - - - - - - - - - - - select n.id, n.title, @@ -34,8 +22,8 @@ AND INSTR(n.title,#{queryDTO.title}) - - AND n.deleted = #{queryDTO.deleted} + + AND n.deleted_flag = #{queryDTO.deletedFlag} ORDER by n.create_time desc @@ -43,7 +31,7 @@ - select n.id, n.title, @@ -59,7 +47,7 @@ - select n.id, n.title, @@ -91,7 +79,7 @@ - select n.id, n.title, @@ -110,13 +98,13 @@ UPDATE t_notice - set deleted = #{deletedFlag} + set deleted_flag = #{deletedFlag} WHERE id =#{id} - UPDATE t_notice set deleted = #{deletedFlag} where id in + UPDATE t_notice set deleted_flag = #{deletedFlag} where id in #{item} @@ -129,7 +117,7 @@ from t_notice where send_status = #{sendStatus} - SELECT nrr.employee_id, count(1) as readCount diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/notice/NoticeReceiveRecordMapper.xml b/admin-api/java-api/src/main/resources/mapper/business/notice/NoticeReceiveRecordMapper.xml similarity index 84% rename from smart-admin-service/smart-admin-api/src/main/resources/mapper/business/notice/NoticeReceiveRecordMapper.xml rename to admin-api/java-api/src/main/resources/mapper/business/notice/NoticeReceiveRecordMapper.xml index 66168c57..424c8d5f 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/notice/NoticeReceiveRecordMapper.xml +++ b/admin-api/java-api/src/main/resources/mapper/business/notice/NoticeReceiveRecordMapper.xml @@ -1,8 +1,8 @@ - + - + diff --git a/admin-api/java-api/src/main/resources/mapper/support/DataTracerMapper.xml b/admin-api/java-api/src/main/resources/mapper/support/DataTracerMapper.xml new file mode 100644 index 00000000..67f5c31e --- /dev/null +++ b/admin-api/java-api/src/main/resources/mapper/support/DataTracerMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + \ No newline at end of file diff --git a/admin-api/java-api/src/main/resources/mapper/support/FileMapper.xml b/admin-api/java-api/src/main/resources/mapper/support/FileMapper.xml new file mode 100644 index 00000000..2f4bd253 --- /dev/null +++ b/admin-api/java-api/src/main/resources/mapper/support/FileMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/heartbeat/HeartBeatRecordMapper.xml b/admin-api/java-api/src/main/resources/mapper/support/HeartBeatRecordMapper.xml similarity index 75% rename from smart-admin-service/smart-admin-api/src/main/resources/mapper/support/heartbeat/HeartBeatRecordMapper.xml rename to admin-api/java-api/src/main/resources/mapper/support/HeartBeatRecordMapper.xml index 27ce75e6..e9fcdf2b 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/heartbeat/HeartBeatRecordMapper.xml +++ b/admin-api/java-api/src/main/resources/mapper/support/HeartBeatRecordMapper.xml @@ -1,6 +1,6 @@ - + @@ -18,7 +18,7 @@ #{processStartTime}, #{heartBeatTime}) - + update t_heart_beat_record set heart_beat_time = #{heartBeatTime} @@ -26,16 +26,17 @@ id = #{id} - - select * from t_heart_beat_record where project_path = #{projectPath} and server_ip = #{serverIp} and process_no =#{processNo} - + SELECT * FROM t_heart_beat_record order by heart_beat_time desc + diff --git a/admin-api/java-api/src/main/resources/mapper/support/IdGeneratorMapper.xml b/admin-api/java-api/src/main/resources/mapper/support/IdGeneratorMapper.xml new file mode 100644 index 00000000..5662d77a --- /dev/null +++ b/admin-api/java-api/src/main/resources/mapper/support/IdGeneratorMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + REPLACE INTO t_id_generator_record (generator_id, `year`, `month`, `day`, last_number,`count`) + values (#{generatorId}, #{year}, #{month}, #{day}, #{lastNumber},#{count}) + + + + \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/UserOperateLogMapper.xml b/admin-api/java-api/src/main/resources/mapper/support/OperateLogMapper.xml similarity index 81% rename from smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/UserOperateLogMapper.xml rename to admin-api/java-api/src/main/resources/mapper/support/OperateLogMapper.xml index 7088f2c4..2e0d2b7e 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/UserOperateLogMapper.xml +++ b/admin-api/java-api/src/main/resources/mapper/support/OperateLogMapper.xml @@ -1,11 +1,8 @@ - + - - - - select id, user_id, @@ -15,7 +12,7 @@ url, method, param, - result, + success_flag, fail_reason, update_time, create_time diff --git a/admin-api/java-api/src/main/resources/mapper/support/SystemConfigMapper.xml b/admin-api/java-api/src/main/resources/mapper/support/SystemConfigMapper.xml new file mode 100644 index 00000000..311c63c4 --- /dev/null +++ b/admin-api/java-api/src/main/resources/mapper/support/SystemConfigMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/datascope/DataScopeRoleMapper.xml b/admin-api/java-api/src/main/resources/mapper/system/datascope/DataScopeRoleMapper.xml similarity index 88% rename from smart-admin-service/smart-admin-api/src/main/resources/mapper/system/datascope/DataScopeRoleMapper.xml rename to admin-api/java-api/src/main/resources/mapper/system/datascope/DataScopeRoleMapper.xml index 88bd6a9d..4e313b18 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/datascope/DataScopeRoleMapper.xml +++ b/admin-api/java-api/src/main/resources/mapper/system/datascope/DataScopeRoleMapper.xml @@ -1,8 +1,8 @@ - + - + + SELECT + d.*, + e.actual_name as managerName, + pd.`name` as parentName + FROM + t_department d + left join t_employee e on d.manager_id= e.id + left join t_department pd on d.parent_id = pd.id + order by sort asc + + + + + + + \ No newline at end of file diff --git a/admin-api/java-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml b/admin-api/java-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml new file mode 100644 index 00000000..fb4c12e0 --- /dev/null +++ b/admin-api/java-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml @@ -0,0 +1,158 @@ + + + + + + + + UPDATE t_employee + SET disabled_flag = #{disabledFlag} + WHERE id in + + #{item} + + + + + UPDATE t_employee + SET disabled_flag = #{disabledFlag} + WHERE id = #{id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE t_employee + SET login_pwd = #{password} + WHERE id = #{employeeId} + + + + \ No newline at end of file diff --git a/admin-api/java-api/src/main/resources/mapper/system/menu/MenuMapper.xml b/admin-api/java-api/src/main/resources/mapper/system/menu/MenuMapper.xml new file mode 100644 index 00000000..c5cfa4b5 --- /dev/null +++ b/admin-api/java-api/src/main/resources/mapper/system/menu/MenuMapper.xml @@ -0,0 +1,76 @@ + + + + + + select m.menu_id, + m.menu_name, + m.menu_type, + m.parent_id, + m.sort, + m.path, + m.component, + m.frame_flag, + m.cache_flag, + m.visible_flag, + m.disabled_flag, + m.perms, + m.icon, + m.context_menu_id, + m.create_user_id, + m.create_time, + m.update_user_id, + m.update_time + from t_menu m + + + + + update t_menu + set delete_flag = #{deleteFlag}, + update_user_id = #{updateUserId} + where menu_id = #{item} + + + + + + + + + + + \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/role/RoleEmployeeMapper.xml b/admin-api/java-api/src/main/resources/mapper/system/role/RoleEmployeeMapper.xml similarity index 50% rename from smart-admin-service/smart-admin-api/src/main/resources/mapper/system/role/RoleEmployeeMapper.xml rename to admin-api/java-api/src/main/resources/mapper/system/role/RoleEmployeeMapper.xml index 5984cb7d..9db6197c 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/role/RoleEmployeeMapper.xml +++ b/admin-api/java-api/src/main/resources/mapper/system/role/RoleEmployeeMapper.xml @@ -1,14 +1,17 @@ - + + type="net.lab1024.smartadmin.service.module.system.employee.domain.dto.EmployeeDTO"> - er.id, + er + . + id + , er.role_id, er.employee_id, er.update_time, @@ -17,12 +20,9 @@ @@ -32,14 +32,9 @@ e.login_name, e.login_pwd, e.actual_name, - e.nick_name, e.phone, - e.id_card, - e.birthday, - e.email, e.department_id, - e.is_leave, - e.is_disabled, + e.disabled_flag, e.remark, e.update_time, e.create_time @@ -49,8 +44,7 @@ left join t_role r on er.role_id = r.id - - AND r.role_name like #{likeRoleName} + AND INSTR(r.role_name,#{queryDTO.roleName}) AND er.role_id = #{queryDTO.roleId} @@ -59,66 +53,72 @@ + + + - DELETE FROM t_role_employee + DELETE + FROM t_role_employee WHERE employee_id = #{employeeId} - DELETE FROM t_role_employee + DELETE + FROM t_role_employee WHERE role_id = #{roleId} - DELETE FROM t_role_employee - WHERE role_id = #{roleId} and employee_id = #{employeeId} + DELETE + FROM t_role_employee + WHERE role_id = #{roleId} + and employee_id = #{employeeId} DELETE FROM t_role_employee WHERE role_id = #{roleId} and employee_id in - + #{item} - - - INSERT INTO t_role_employee (role_id, employee_id, update_time, create_time) VALUES - - ( - #{item.roleId}, - #{item.employeeId}, - now(), - now() - ) - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/role/RoleMapper.xml b/admin-api/java-api/src/main/resources/mapper/system/role/RoleMapper.xml similarity index 72% rename from smart-admin-service/smart-admin-api/src/main/resources/mapper/system/role/RoleMapper.xml rename to admin-api/java-api/src/main/resources/mapper/system/role/RoleMapper.xml index 5b7177dd..84a8b47e 100644 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/role/RoleMapper.xml +++ b/admin-api/java-api/src/main/resources/mapper/system/role/RoleMapper.xml @@ -1,9 +1,9 @@ - + + type="net.lab1024.smartadmin.service.module.system.role.basic.domain.entity.RoleEntity"> diff --git a/admin-api/java-api/src/main/resources/mapper/system/role/RoleMenuMapper.xml b/admin-api/java-api/src/main/resources/mapper/system/role/RoleMenuMapper.xml new file mode 100644 index 00000000..77c6cec3 --- /dev/null +++ b/admin-api/java-api/src/main/resources/mapper/system/role/RoleMenuMapper.xml @@ -0,0 +1,18 @@ + + + + + delete + from t_role_menu + where role_id = #{roleId} + + + + \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/.env b/admin-web/typescript-ant-design-vue/.env new file mode 100644 index 00000000..6181c66e --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.env @@ -0,0 +1,2 @@ + +VITE_APP_PROJECT_TITLE = 'SmartAdmin' \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/.env.development b/admin-web/typescript-ant-design-vue/.env.development new file mode 100644 index 00000000..de2f991c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.env.development @@ -0,0 +1,7 @@ + +VITE_APP_API_URL = 'http://localhost:10086/api' + +VITE_APP_PROJECT_TITLE = 'SmartAdmin Dev' + +VITE_APP_PROFILE = 'dev' +VITE_APP_MODE = 'development' diff --git a/admin-web/typescript-ant-design-vue/.env.localhost b/admin-web/typescript-ant-design-vue/.env.localhost new file mode 100644 index 00000000..88c177ef --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.env.localhost @@ -0,0 +1,7 @@ + +VITE_APP_API_URL = 'http://127.0.0.1:10086/admin' + +VITE_APP_PROJECT_TITLE = 'SmartAdmin Localhost' + +VITE_APP_PROFILE = 'local' +VITE_APP_MODE = 'local' \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/.env.pre b/admin-web/typescript-ant-design-vue/.env.pre new file mode 100644 index 00000000..fb0d72e0 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.env.pre @@ -0,0 +1,8 @@ + +VITE_APP_API_URL = 'http://localhost:10086/api' + +VITE_APP_PROJECT_TITLE = 'SmartAdmin PRE' + +VITE_APP_PROFILE = 'pre' + +VITE_APP_MODE = 'development' \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/.env.production b/admin-web/typescript-ant-design-vue/.env.production new file mode 100644 index 00000000..b2e8e4d3 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.env.production @@ -0,0 +1,6 @@ + +VITE_APP_API_URL = 'http://localhost:10086/api' + +VITE_APP_PROFILE = 'prod' + +VITE_APP_MODE = 'production' \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/.env.sit b/admin-web/typescript-ant-design-vue/.env.sit new file mode 100644 index 00000000..c139f546 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.env.sit @@ -0,0 +1,7 @@ + +VITE_APP_API_URL = 'http://sit-xmf-crm.renminyixue.cn/api/admin' + +VITE_APP_PROJECT_TITLE = 'SmartAdmin Sit' + +VITE_APP_PROFILE = 'sit' +VITE_APP_MODE = 'development' diff --git a/admin-web/typescript-ant-design-vue/.eslintignore b/admin-web/typescript-ant-design-vue/.eslintignore new file mode 100644 index 00000000..6869ab58 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.eslintignore @@ -0,0 +1,17 @@ + +*.sh +node_modules +lib +*.md +*.woff +*.ttf +.vscode +.idea +dist +public +/docs +.husky +.local +/bin +Dockerfile +src/assets diff --git a/admin-web/typescript-ant-design-vue/.eslintrc.js b/admin-web/typescript-ant-design-vue/.eslintrc.js new file mode 100644 index 00000000..43d58245 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.eslintrc.js @@ -0,0 +1,76 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + node: true, + }, + parser: 'vue-eslint-parser', + parserOptions: { + ecmaVersion: 12, + parser: '@typescript-eslint/parser', + sourceType: 'module', + }, + extends: [ + 'plugin:vue/vue3-essential', + 'eslint:recommended', + 'plugin:vue/base' + ], + globals: { + defineProps: "readonly", + defineEmits: "readonly", + defineExpose: "readonly", + withDefaults: "readonly" + }, + plugins: ['vue', '@typescript-eslint'], + rules: { + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-function': 'off', + 'vue/custom-event-name-casing': 'off', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + // we are only using this rule to check for unused arguments since TS + // catches unused variables but not args. + { varsIgnorePattern: '.*', args: 'none' } + ], + 'no-unused-vars': [ + 'error', + // we are only using this rule to check for unused arguments since TS + // catches unused variables but not args. + { varsIgnorePattern: '.*', args: 'none' } + ], + 'space-before-function-paren': 'off', + + 'vue/attributes-order': 'off', + 'vue/one-component-per-file': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/require-default-prop': 'off', + 'vue/html-self-closing': [ + 'error', + { + html: { + void: 'always', + normal: 'never', + component: 'always', + }, + svg: 'always', + math: 'always', + }, + ], + // Enable vue/script-setup-uses-vars rule + 'vue/script-setup-uses-vars': 'error', + } +}; diff --git a/admin-web/typescript-ant-design-vue/.gitignore b/admin-web/typescript-ant-design-vue/.gitignore new file mode 100644 index 00000000..f4f9f437 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.gitignore @@ -0,0 +1,6 @@ +node_modules +.DS_Store +dist +dist-ssr +*.local +.idea diff --git a/admin-web/typescript-ant-design-vue/.prettierrc.js b/admin-web/typescript-ant-design-vue/.prettierrc.js new file mode 100644 index 00000000..5e6a08b2 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.prettierrc.js @@ -0,0 +1,21 @@ +module.exports = { + printWidth: 150,// 每行字符长度 + tabWidth: 2,// 缩进空格数 + useTabs: false,//不用tab缩进 + semi: true,//// 在语句末尾打印分号 + singleQuote: true,// 使用单引号而不是双引号 + vueIndentScriptAndStyle: true,//Vue文件脚本和样式标签缩进 + quoteProps: 'as-needed',// 更改引用对象属性的时间 可选值"" + jsxSingleQuote: false,// 在JSX中使用单引号而不是双引号 + trailingComma: 'es5',//多行时尽可能打印尾随逗号。(例如,单行数组永远不会出现逗号结尾。) 可选值"",默认none + bracketSpacing: true,// 在对象文字中的括号之间打印空格 + jsxBracketSameLine: false,//jsx 标签的反尖括号需要换行 + arrowParens: 'always',// 在单独的箭头函数参数周围包括括号 always:(x) => x \ avoid:x => x + rangeStart: 0,// 这两个选项可用于格式化以给定字符偏移量(分别包括和不包括)开始和结束的代码 + rangeEnd: Infinity, + requirePragma: false,// 指定要使用的解析器,不需要写文件开头的 @prettier + insertPragma: false,// 不需要自动在文件开头插入 @prettier + proseWrap: 'preserve',// 使用默认的折行标准 always\never\preserve + htmlWhitespaceSensitivity: 'css',// 指定HTML文件的全局空格敏感度 css\strict\ignore + endOfLine: 'lf',// 换行符使用 lf 结尾是 可选值"" +}; diff --git a/admin-web/typescript-ant-design-vue/.stylelintignore b/admin-web/typescript-ant-design-vue/.stylelintignore new file mode 100644 index 00000000..05170761 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.stylelintignore @@ -0,0 +1,3 @@ +/dist/* +/public/* +public/* diff --git a/admin-web/typescript-ant-design-vue/.stylelintrc.js b/admin-web/typescript-ant-design-vue/.stylelintrc.js new file mode 100644 index 00000000..06951edd --- /dev/null +++ b/admin-web/typescript-ant-design-vue/.stylelintrc.js @@ -0,0 +1,70 @@ +module.exports = { + root: true, + plugins: ['stylelint-order'], + extends: ['stylelint-config-standard', 'stylelint-config-prettier'], + rules: { + 'selector-pseudo-class-no-unknown': [ + true, + { + ignorePseudoClasses: ['global'], + }, + ], + 'selector-pseudo-element-no-unknown': [ + true, + { + ignorePseudoElements: ['v-deep'], + }, + ], + 'at-rule-no-unknown': [ + true, + { + ignoreAtRules: [ + 'tailwind', + 'apply', + 'variants', + 'responsive', + 'screen', + 'function', + 'if', + 'each', + 'include', + 'mixin', + ], + }, + ], + 'no-empty-source': null, + 'named-grid-areas-no-invalid': null, + 'unicode-bom': 'never', + 'no-descending-specificity': null, + 'font-family-no-missing-generic-family-keyword': null, + 'declaration-colon-space-after': 'always-single-line', + 'declaration-colon-space-before': 'never', + // 'declaration-block-trailing-semicolon': 'always', + 'rule-empty-line-before': [ + 'always', + { + ignore: ['after-comment', 'first-nested'], + }, + ], + 'unit-no-unknown': [true, { ignoreUnits: ['rpx'] }], + 'order/order': [ + [ + 'dollar-variables', + 'custom-properties', + 'at-rules', + 'declarations', + { + type: 'at-rule', + name: 'supports', + }, + { + type: 'at-rule', + name: 'media', + }, + 'rules', + ], + { severity: 'warning' }, + ], + }, + ignoreFiles: ['**/*.js', '**/*.jsx', '**/*.tsx', '**/*.ts'], +}; diff --git a/admin-web/typescript-ant-design-vue/README.en.md b/admin-web/typescript-ant-design-vue/README.en.md new file mode 100644 index 00000000..76e2e42b --- /dev/null +++ b/admin-web/typescript-ant-design-vue/README.en.md @@ -0,0 +1,36 @@ +# smart-admin2 + +#### Description +{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} + +#### Software Architecture +Software architecture description + +#### Installation + +1. xxxx +2. xxxx +3. xxxx + +#### Instructions + +1. xxxx +2. xxxx +3. xxxx + +#### Contribution + +1. Fork the repository +2. Create Feat_xxx branch +3. Commit your code +4. Create Pull Request + + +#### Gitee Feature + +1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md +2. Gitee blog [blog.gitee.com](https://blog.gitee.com) +3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) +4. The most valuable open source project [GVP](https://gitee.com/gvp) +5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) +6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/admin-web/typescript-ant-design-vue/README.md b/admin-web/typescript-ant-design-vue/README.md new file mode 100644 index 00000000..e69de29b diff --git a/admin-web/typescript-ant-design-vue/index.html b/admin-web/typescript-ant-design-vue/index.html new file mode 100644 index 00000000..f4aaac9c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/index.html @@ -0,0 +1,24 @@ + + + + + + + + + SmartAdmin + + + +
+ + + diff --git a/admin-web/typescript-ant-design-vue/package-lock.json b/admin-web/typescript-ant-design-vue/package-lock.json new file mode 100644 index 00000000..e9783199 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/package-lock.json @@ -0,0 +1,5012 @@ +{ + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ant-design/colors": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/@ant-design/colors/download/@ant-design/colors-5.1.1.tgz", + "integrity": "sha1-gAshhrHifmZDLmfQPtlq8+IdiUA=", + "requires": { + "@ctrl/tinycolor": "^3.3.1" + } + }, + "@ant-design/icons-svg": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/@ant-design/icons-svg/download/@ant-design/icons-svg-4.1.0.tgz", + "integrity": "sha1-SAsCX0sg73/o9H1KSEbk/uhOoGw=" + }, + "@ant-design/icons-vue": { + "version": "6.0.1", + "resolved": "https://registry.npm.taobao.org/@ant-design/icons-vue/download/@ant-design/icons-vue-6.0.1.tgz?cache=0&sync_timestamp=1611990835390&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40ant-design%2Ficons-vue%2Fdownload%2F%40ant-design%2Ficons-vue-6.0.1.tgz", + "integrity": "sha1-nYBMPHTSz6+XyxjlgtO5QAk09f0=", + "requires": { + "@ant-design/colors": "^5.0.0", + "@ant-design/icons-svg": "^4.0.0", + "@types/lodash": "^4.14.165", + "lodash": "^4.17.15" + } + }, + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.nlark.com/@babel/code-frame/download/@babel/code-frame-7.12.11.tgz?cache=0&sync_timestamp=1623280355998&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.12.11.tgz", + "integrity": "sha1-9K1DWqJj25NbjxDyxVLSP7cWpj8=", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.14.7", + "resolved": "https://registry.nlark.com/@babel/compat-data/download/@babel/compat-data-7.14.7.tgz", + "integrity": "sha1-ewR9ejqJpn0iWNxh9gTwmPG8fgg=", + "dev": true + }, + "@babel/core": { + "version": "7.14.6", + "resolved": "https://registry.nlark.com/@babel/core/download/@babel/core-7.14.6.tgz?cache=0&sync_timestamp=1623708890157&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.14.6.tgz", + "integrity": "sha1-4IFOwalQAy/xbBOich3jmoQW/Ks=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helpers": "^7.14.6", + "@babel/parser": "^7.14.6", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/code-frame/download/@babel/code-frame-7.14.5.tgz?cache=0&sync_timestamp=1623280355998&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.14.5.tgz", + "integrity": "sha1-I7CNdA6D9JxeWZRfvxtD6Au/Tts=", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.2.0.tgz", + "integrity": "sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463550093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/generator/download/@babel/generator-7.14.5.tgz?cache=0&sync_timestamp=1623280360946&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.14.5.tgz", + "integrity": "sha1-hI17nwMcrKnQzQrwGwY/Im9S14U=", + "dev": true, + "requires": { + "@babel/types": "^7.14.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.14.5.tgz", + "integrity": "sha1-epnF0JZ5Eely/iw0EffVtJhJjs8=", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463550093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-function-name/download/@babel/helper-function-name-7.14.5.tgz?cache=0&sync_timestamp=1623280385237&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-function-name%2Fdownload%2F%40babel%2Fhelper-function-name-7.14.5.tgz", + "integrity": "sha1-ieLEdJcvFdjiM7Uu6MSA4s/NUMQ=", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.14.5.tgz?cache=0&sync_timestamp=1623280360950&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-get-function-arity%2Fdownload%2F%40babel%2Fhelper-get-function-arity-7.14.5.tgz", + "integrity": "sha1-Jfv6V5sJN+7h87gF7OTOOYxDGBU=", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.14.5.tgz?cache=0&sync_timestamp=1623280361512&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-hoist-variables%2Fdownload%2F%40babel%2Fhelper-hoist-variables-7.14.5.tgz", + "integrity": "sha1-4N0nwzp45XfXyIhJFqPn7x98f40=", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.14.7", + "resolved": "https://registry.nlark.com/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.14.7.tgz", + "integrity": "sha1-l+ViRL65QhH+J3vYGOOjKcZveXA=", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-module-imports/download/@babel/helper-module-imports-7.14.5.tgz?cache=0&sync_timestamp=1623280362184&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-module-imports%2Fdownload%2F%40babel%2Fhelper-module-imports-7.14.5.tgz", + "integrity": "sha1-bRpE32o4yVeqfDEtoHZCnxG0IvM=", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.14.5.tgz?cache=0&sync_timestamp=1623280992002&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-module-transforms%2Fdownload%2F%40babel%2Fhelper-module-transforms-7.14.5.tgz", + "integrity": "sha1-feQvENeJtCPrkC69JAMcp3yx4Q4=", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5", + "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.14.5.tgz?cache=0&sync_timestamp=1623280360981&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-optimise-call-expression%2Fdownload%2F%40babel%2Fhelper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha1-8nOVqGGeBmWz8DZM3bQcJdcbSZw=", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-replace-supers": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.14.5.tgz", + "integrity": "sha1-DswLA8Qc1We0Ak6gFhNMKEFKu5Q=", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.14.5", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-simple-access/download/@babel/helper-simple-access-7.14.5.tgz?cache=0&sync_timestamp=1623280360968&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.14.5.tgz", + "integrity": "sha1-ZuqFz1O6C05Yi6d/yBP1OryqQcQ=", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.14.5.tgz?cache=0&sync_timestamp=1623280365934&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-split-export-declaration%2Fdownload%2F%40babel%2Fhelper-split-export-declaration-7.14.5.tgz", + "integrity": "sha1-IrI6VO9RwrdgXYUZMMGXbdC8aTo=", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.14.5.tgz?cache=0&sync_timestamp=1623280518972&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.14.5.tgz", + "integrity": "sha1-0PDid8US4Mk4J3+qhaOWjJpEwOg=" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/helper-validator-option/download/@babel/helper-validator-option-7.14.5.tgz", + "integrity": "sha1-bnKh//GNXfy4eOHmLxoCHEty1aM=", + "dev": true + }, + "@babel/helpers": { + "version": "7.14.6", + "resolved": "https://registry.nlark.com/@babel/helpers/download/@babel/helpers-7.14.6.tgz?cache=0&sync_timestamp=1623708882051&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelpers%2Fdownload%2F%40babel%2Fhelpers-7.14.6.tgz", + "integrity": "sha1-W1gwa5XxtH4qAZlDT6hlj6bCFjU=", + "dev": true, + "requires": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/highlight/download/@babel/highlight-7.14.5.tgz", + "integrity": "sha1-aGGlLwOWZAUAH2qlNKAaJNmejNk=", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995384030&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.14.7", + "resolved": "https://registry.nlark.com/@babel/parser/download/@babel/parser-7.14.7.tgz", + "integrity": "sha1-YJlyDIg5yoZaJjfmyFhS6tC9tZU=" + }, + "@babel/runtime": { + "version": "7.15.3", + "resolved": "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.15.3.tgz?cache=0&sync_timestamp=1628666503436&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.15.3.tgz", + "integrity": "sha1-LhwogMoRjlsvmYgyK9inZWoyUCs=", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/standalone": { + "version": "7.15.2", + "resolved": "https://registry.nlark.com/@babel/standalone/download/@babel/standalone-7.15.2.tgz", + "integrity": "sha1-08h3lDWxwx/evQUvAzN96uF/GbE=", + "dev": true + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/template/download/@babel/template-7.14.5.tgz", + "integrity": "sha1-qbydizM1T/blWpxg0RCSAKaJdPQ=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/code-frame/download/@babel/code-frame-7.14.5.tgz?cache=0&sync_timestamp=1623280355998&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.14.5.tgz", + "integrity": "sha1-I7CNdA6D9JxeWZRfvxtD6Au/Tts=", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + } + } + }, + "@babel/traverse": { + "version": "7.14.7", + "resolved": "https://registry.nlark.com/@babel/traverse/download/@babel/traverse-7.14.7.tgz", + "integrity": "sha1-ZAB8l3TP3Dq9I7B4C8GKPONjF1M=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.14.5", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/code-frame/download/@babel/code-frame-7.14.5.tgz?cache=0&sync_timestamp=1623280355998&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.14.5.tgz", + "integrity": "sha1-I7CNdA6D9JxeWZRfvxtD6Au/Tts=", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.nlark.com/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1622088047458&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz", + "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.14.5", + "resolved": "https://registry.nlark.com/@babel/types/download/@babel/types-7.14.5.tgz?cache=0&sync_timestamp=1623280355970&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.14.5.tgz", + "integrity": "sha1-O7mXuoKaIQTO2yBonEpbgSHTg/8=", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "to-fast-properties": "^2.0.0" + } + }, + "@ctrl/tinycolor": { + "version": "3.4.0", + "resolved": "https://registry.npm.taobao.org/@ctrl/tinycolor/download/@ctrl/tinycolor-3.4.0.tgz", + "integrity": "sha1-w8WuVDyJfKqcKmhjC+01W+X5mQ8=" + }, + "@eslint/eslintrc": { + "version": "0.4.2", + "resolved": "https://registry.nlark.com/@eslint/eslintrc/download/@eslint/eslintrc-0.4.2.tgz?cache=0&sync_timestamp=1622843858887&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40eslint%2Feslintrc%2Fdownload%2F%40eslint%2Feslintrc-0.4.2.tgz", + "integrity": "sha1-9j0O8G9cDFfXbEq19j04NcUbAXk=", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-4.0.6.tgz", + "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", + "dev": true + } + } + }, + "@intlify/core-base": { + "version": "9.1.6", + "resolved": "https://registry.nlark.com/@intlify/core-base/download/@intlify/core-base-9.1.6.tgz", + "integrity": "sha1-iH++r+N9lVusUDGPMKxYmDnw2fs=", + "requires": { + "@intlify/devtools-if": "9.1.6", + "@intlify/message-compiler": "9.1.6", + "@intlify/message-resolver": "9.1.6", + "@intlify/runtime": "9.1.6", + "@intlify/shared": "9.1.6", + "@intlify/vue-devtools": "9.1.6" + } + }, + "@intlify/devtools-if": { + "version": "9.1.6", + "resolved": "https://registry.nlark.com/@intlify/devtools-if/download/@intlify/devtools-if-9.1.6.tgz", + "integrity": "sha1-c5sZXkMOJPv4+GTsilHiQ+M0c4U=", + "requires": { + "@intlify/shared": "9.1.6" + } + }, + "@intlify/message-compiler": { + "version": "9.1.6", + "resolved": "https://registry.nlark.com/@intlify/message-compiler/download/@intlify/message-compiler-9.1.6.tgz", + "integrity": "sha1-4+mRZcHm7MSWIRAXeZrlnhWwWhg=", + "requires": { + "@intlify/message-resolver": "9.1.6", + "@intlify/shared": "9.1.6", + "source-map": "0.6.1" + } + }, + "@intlify/message-resolver": { + "version": "9.1.6", + "resolved": "https://registry.nlark.com/@intlify/message-resolver/download/@intlify/message-resolver-9.1.6.tgz", + "integrity": "sha1-10k8nzJtX+sM2FOKZzW2SKkdjy8=" + }, + "@intlify/runtime": { + "version": "9.1.6", + "resolved": "https://registry.nlark.com/@intlify/runtime/download/@intlify/runtime-9.1.6.tgz", + "integrity": "sha1-vxVI2QNMgO75KwayQMs0fv+0H3E=", + "requires": { + "@intlify/message-compiler": "9.1.6", + "@intlify/message-resolver": "9.1.6", + "@intlify/shared": "9.1.6" + } + }, + "@intlify/shared": { + "version": "9.1.6", + "resolved": "https://registry.nlark.com/@intlify/shared/download/@intlify/shared-9.1.6.tgz", + "integrity": "sha1-0DyTAYmNbd/+KlTAPnZkF0+839k=" + }, + "@intlify/vue-devtools": { + "version": "9.1.6", + "resolved": "https://registry.nlark.com/@intlify/vue-devtools/download/@intlify/vue-devtools-9.1.6.tgz", + "integrity": "sha1-iPqt8gOVGioQEHRA+pm1j0Y31A0=", + "requires": { + "@intlify/message-resolver": "9.1.6", + "@intlify/runtime": "9.1.6", + "@intlify/shared": "9.1.6" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.nlark.com/@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz", + "integrity": "sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.nlark.com/@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.5.tgz?cache=0&sync_timestamp=1622792772584&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.stat%2Fdownload%2F%40nodelib%2Ffs.stat-2.0.5.tgz", + "integrity": "sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.7", + "resolved": "https://registry.nlark.com/@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.7.tgz", + "integrity": "sha1-lMI9sY7kZT4Smr0m+wb4cKyeHuI=", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "13.0.4", + "resolved": "https://registry.nlark.com/@rollup/plugin-node-resolve/download/@rollup/plugin-node-resolve-13.0.4.tgz", + "integrity": "sha1-sQIi9BRaAZdArLdzhAITDYSGYMA=", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.nlark.com/@rollup/pluginutils/download/@rollup/pluginutils-3.1.0.tgz", + "integrity": "sha1-cGtFJO5tyLEDs8mVUz5a1oDAK5s=", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.nlark.com/@types/estree/download/@types/estree-0.0.39.tgz?cache=0&sync_timestamp=1622612050840&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Festree%2Fdownload%2F%40types%2Festree-0.0.39.tgz", + "integrity": "sha1-4Xfmme4bjCLSMXTKqnQiZEOJUJ8=", + "dev": true + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/estree-walker/download/estree-walker-1.0.1.tgz", + "integrity": "sha1-MbxdYSyWtwQQa0d+bdXYqhOMtwA=", + "dev": true + } + } + }, + "@simonwep/pickr": { + "version": "1.8.1", + "resolved": "https://registry.nlark.com/@simonwep/pickr/download/@simonwep/pickr-1.8.1.tgz?cache=0&sync_timestamp=1620897298440&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40simonwep%2Fpickr%2Fdownload%2F%40simonwep%2Fpickr-1.8.1.tgz", + "integrity": "sha1-4TbL2cNF3bt9cesUr1RMeYFl1JU=", + "requires": { + "core-js": "^3.12.1", + "nanopop": "^2.1.0" + } + }, + "@stylelint/postcss-css-in-js": { + "version": "0.37.2", + "resolved": "https://registry.npm.taobao.org/@stylelint/postcss-css-in-js/download/@stylelint/postcss-css-in-js-0.37.2.tgz", + "integrity": "sha1-flqErRgfQjSiSAgDQipHuHSa89I=", + "dev": true, + "requires": { + "@babel/core": ">=7.9.0" + } + }, + "@stylelint/postcss-markdown": { + "version": "0.36.2", + "resolved": "https://registry.npm.taobao.org/@stylelint/postcss-markdown/download/@stylelint/postcss-markdown-0.36.2.tgz", + "integrity": "sha1-ClQMRpL43N/BPI41LBfnv+4rs5E=", + "dev": true, + "requires": { + "remark": "^13.0.0", + "unist-util-find-all-after": "^3.0.2" + } + }, + "@types/estree": { + "version": "0.0.48", + "resolved": "https://registry.nlark.com/@types/estree/download/@types/estree-0.0.48.tgz?cache=0&sync_timestamp=1622612050840&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Festree%2Fdownload%2F%40types%2Festree-0.0.48.tgz", + "integrity": "sha1-GNyAkbKF35DbLyWqfZBs/DlLf3Q=", + "dev": true + }, + "@types/js-cookie": { + "version": "2.2.7", + "resolved": "https://registry.nlark.com/@types/js-cookie/download/@types/js-cookie-2.2.7.tgz", + "integrity": "sha1-ImqeMWgINaYYjoh/OYjmDATT9qM=" + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.172", + "resolved": "https://registry.nlark.com/@types/lodash/download/@types/lodash-4.14.172.tgz", + "integrity": "sha1-qtd0wo57/Xpn3iVAjgPuWow9Aoo=" + }, + "@types/mdast": { + "version": "3.0.3", + "resolved": "https://registry.nlark.com/@types/mdast/download/@types/mdast-3.0.3.tgz?cache=0&sync_timestamp=1621242009980&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fmdast%2Fdownload%2F%40types%2Fmdast-3.0.3.tgz", + "integrity": "sha1-LX1nGxzR6j3rMG6nUDbCoEB9Les=", + "dev": true, + "requires": { + "@types/unist": "*" + } + }, + "@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.nlark.com/@types/minimist/download/@types/minimist-1.2.1.tgz", + "integrity": "sha1-KD9mn/dte4Jg34q3pCYsyD2YglY=", + "dev": true + }, + "@types/mockjs": { + "version": "1.0.4", + "resolved": "https://registry.nlark.com/@types/mockjs/download/@types/mockjs-1.0.4.tgz", + "integrity": "sha1-5waVHV4ztPCku3Ox+LEk4m8IHeA=", + "dev": true + }, + "@types/node": { + "version": "16.4.13", + "resolved": "https://registry.nlark.com/@types/node/download/@types/node-16.4.13.tgz?cache=0&sync_timestamp=1628211811317&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-16.4.13.tgz", + "integrity": "sha1-ff2cFGYe3GXMzUOinrRUF0ZCNw0=", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.nlark.com/@types/normalize-package-data/download/@types/normalize-package-data-2.4.0.tgz?cache=0&sync_timestamp=1621242104575&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fnormalize-package-data%2Fdownload%2F%40types%2Fnormalize-package-data-2.4.0.tgz", + "integrity": "sha1-5IbQ2XOW15vu3QpuM/RTT/a0lz4=", + "dev": true + }, + "@types/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.nlark.com/@types/nprogress/download/@types/nprogress-0.2.0.tgz?cache=0&sync_timestamp=1621242271973&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fnprogress%2Fdownload%2F%40types%2Fnprogress-0.2.0.tgz", + "integrity": "sha1-hsWTaC1BmSEqBQnMPE1WK7vW5F8=", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/@types/parse-json/download/@types/parse-json-4.0.0.tgz?cache=0&sync_timestamp=1621242198435&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fparse-json%2Fdownload%2F%40types%2Fparse-json-4.0.0.tgz", + "integrity": "sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA=", + "dev": true + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.nlark.com/@types/resolve/download/@types/resolve-1.17.1.tgz?cache=0&sync_timestamp=1621242543115&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Fresolve%2Fdownload%2F%40types%2Fresolve-1.17.1.tgz", + "integrity": "sha1-Ov1q2JZ8d+Q3bFmKgt3Vj0bsRdY=", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.nlark.com/@types/unist/download/@types/unist-2.0.3.tgz?cache=0&sync_timestamp=1621243983753&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40types%2Funist%2Fdownload%2F%40types%2Funist-2.0.3.tgz", + "integrity": "sha1-nAiGeYdvN061mD8VDUeHqm+zLX4=", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "4.28.0", + "resolved": "https://registry.nlark.com/@typescript-eslint/eslint-plugin/download/@typescript-eslint/eslint-plugin-4.28.0.tgz?cache=0&sync_timestamp=1624299411502&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40typescript-eslint%2Feslint-plugin%2Fdownload%2F%40typescript-eslint%2Feslint-plugin-4.28.0.tgz", + "integrity": "sha1-GmbwOyZIRDh7633IXh8dQDvRgD8=", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.28.0", + "@typescript-eslint/scope-manager": "4.28.0", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.28.0", + "resolved": "https://registry.nlark.com/@typescript-eslint/experimental-utils/download/@typescript-eslint/experimental-utils-4.28.0.tgz?cache=0&sync_timestamp=1624299370816&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40typescript-eslint%2Fexperimental-utils%2Fdownload%2F%40typescript-eslint%2Fexperimental-utils-4.28.0.tgz", + "integrity": "sha1-ExZ+2ZEyBoS9wjWIE1rmIRWzDuA=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.28.0", + "resolved": "https://registry.nlark.com/@typescript-eslint/parser/download/@typescript-eslint/parser-4.28.0.tgz", + "integrity": "sha1-JATBZ1GihhbvOrq3fI5R1oChLKo=", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.28.0", + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/typescript-estree": "4.28.0", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.28.0", + "resolved": "https://registry.nlark.com/@typescript-eslint/scope-manager/download/@typescript-eslint/scope-manager-4.28.0.tgz?cache=0&sync_timestamp=1624295732180&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40typescript-eslint%2Fscope-manager%2Fdownload%2F%40typescript-eslint%2Fscope-manager-4.28.0.tgz", + "integrity": "sha1-ajAJ0qtkow/IoeJXoaMgBn82oM4=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0" + } + }, + "@typescript-eslint/types": { + "version": "4.28.0", + "resolved": "https://registry.nlark.com/@typescript-eslint/types/download/@typescript-eslint/types-4.28.0.tgz", + "integrity": "sha1-ozUE4c56xR/DkDX1/m8VB51Nr7A=", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.28.0", + "resolved": "https://registry.nlark.com/@typescript-eslint/typescript-estree/download/@typescript-eslint/typescript-estree-4.28.0.tgz?cache=0&sync_timestamp=1624299371640&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40typescript-eslint%2Ftypescript-estree%2Fdownload%2F%40typescript-eslint%2Ftypescript-estree-4.28.0.tgz", + "integrity": "sha1-5m1OWqLt5m/sivQ0iY/mGvEMcc8=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.0", + "@typescript-eslint/visitor-keys": "4.28.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.28.0", + "resolved": "https://registry.nlark.com/@typescript-eslint/visitor-keys/download/@typescript-eslint/visitor-keys-4.28.0.tgz", + "integrity": "sha1-JVxnyWbsKUEEFpppOdlvkciolDQ=", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.0", + "eslint-visitor-keys": "^2.0.0" + } + }, + "@vitejs/plugin-legacy": { + "version": "1.5.1", + "resolved": "https://registry.nlark.com/@vitejs/plugin-legacy/download/@vitejs/plugin-legacy-1.5.1.tgz", + "integrity": "sha1-/vKhHAXYP1qxPS0E5S11usE8bmw=", + "dev": true, + "requires": { + "@babel/standalone": "^7.14.9", + "core-js": "^3.16.0", + "magic-string": "^0.25.7", + "regenerator-runtime": "^0.13.9", + "systemjs": "^6.10.2" + } + }, + "@vitejs/plugin-vue": { + "version": "1.4.0", + "resolved": "https://registry.nlark.com/@vitejs/plugin-vue/download/@vitejs/plugin-vue-1.4.0.tgz?cache=0&sync_timestamp=1628298033751&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vitejs%2Fplugin-vue%2Fdownload%2F%40vitejs%2Fplugin-vue-1.4.0.tgz", + "integrity": "sha1-lirgG3/RatQAeJjGTtY5E24SIVs=", + "dev": true + }, + "@vue/compiler-core": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/@vue/compiler-core/download/@vue/compiler-core-3.2.1.tgz?cache=0&sync_timestamp=1628541189114&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcompiler-core%2Fdownload%2F%40vue%2Fcompiler-core-3.2.1.tgz", + "integrity": "sha1-jhMjL3rvjjCPstShBXGlZAJXBks=", + "requires": { + "@babel/parser": "^7.12.0", + "@babel/types": "^7.12.0", + "@vue/shared": "3.2.1", + "estree-walker": "^2.0.1", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/@vue/compiler-dom/download/@vue/compiler-dom-3.2.1.tgz?cache=0&sync_timestamp=1628541189208&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcompiler-dom%2Fdownload%2F%40vue%2Fcompiler-dom-3.2.1.tgz", + "integrity": "sha1-XMaIc/GSjHua7oyKKEb382LLGrk=", + "requires": { + "@vue/compiler-core": "3.2.1", + "@vue/shared": "3.2.1" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/@vue/compiler-sfc/download/@vue/compiler-sfc-3.2.1.tgz?cache=0&sync_timestamp=1628541189312&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcompiler-sfc%2Fdownload%2F%40vue%2Fcompiler-sfc-3.2.1.tgz", + "integrity": "sha1-eAmymM8PvOYqLGKLffwegt2aOps=", + "dev": true, + "requires": { + "@babel/parser": "^7.13.9", + "@babel/types": "^7.13.0", + "@types/estree": "^0.0.48", + "@vue/compiler-core": "3.2.1", + "@vue/compiler-dom": "3.2.1", + "@vue/compiler-ssr": "3.2.1", + "@vue/shared": "3.2.1", + "consolidate": "^0.16.0", + "estree-walker": "^2.0.1", + "hash-sum": "^2.0.0", + "lru-cache": "^5.1.1", + "magic-string": "^0.25.7", + "merge-source-map": "^1.1.0", + "postcss": "^8.1.10", + "postcss-modules": "^4.0.0", + "postcss-selector-parser": "^6.0.4", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/@vue/compiler-ssr/download/@vue/compiler-ssr-3.2.1.tgz?cache=0&sync_timestamp=1628541189227&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vue%2Fcompiler-ssr%2Fdownload%2F%40vue%2Fcompiler-ssr-3.2.1.tgz", + "integrity": "sha1-+QB2L4NILkTpJgwjIuPTMscRgmw=", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.2.1", + "@vue/shared": "3.2.1" + } + }, + "@vue/devtools-api": { + "version": "6.0.0-beta.14", + "resolved": "https://registry.nlark.com/@vue/devtools-api/download/@vue/devtools-api-6.0.0-beta.14.tgz", + "integrity": "sha1-btLW+NZqklbJrQS//wgwm6h7lyM=" + }, + "@vue/reactivity": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/@vue/reactivity/download/@vue/reactivity-3.2.1.tgz", + "integrity": "sha1-DnHU7gCw0MpqYUGWbDC2iz9oUAI=", + "requires": { + "@vue/shared": "3.2.1" + } + }, + "@vue/runtime-core": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/@vue/runtime-core/download/@vue/runtime-core-3.2.1.tgz", + "integrity": "sha1-OWQRELL4T92juAuGgwgnt7XvBBo=", + "requires": { + "@vue/reactivity": "3.2.1", + "@vue/shared": "3.2.1" + } + }, + "@vue/runtime-dom": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/@vue/runtime-dom/download/@vue/runtime-dom-3.2.1.tgz", + "integrity": "sha1-CHzzb0CtCGlxLEFUaTxiDkeAYag=", + "requires": { + "@vue/runtime-core": "3.2.1", + "@vue/shared": "3.2.1", + "csstype": "^2.6.8" + } + }, + "@vue/shared": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/@vue/shared/download/@vue/shared-3.2.1.tgz", + "integrity": "sha1-Hx/ib+AzRATM4QdAtf+yZU8Sgao=" + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.nlark.com/acorn/download/acorn-7.4.1.tgz", + "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.3.1.tgz?cache=0&sync_timestamp=1599499185510&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn-jsx%2Fdownload%2Facorn-jsx-5.3.1.tgz", + "integrity": "sha1-/IZh4Rt6wVOcR9v+oucrOvNNJns=", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.nlark.com/ajv/download/ajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-4.1.1.tgz", + "integrity": "sha1-y7muJWv3UK8eqzRPIpqif+lLo0g=", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz?cache=0&sync_timestamp=1618552978881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-regex%2Fdownload%2Fansi-regex-5.0.0.tgz", + "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ant-design-vue": { + "version": "2.2.4", + "resolved": "https://registry.nlark.com/ant-design-vue/download/ant-design-vue-2.2.4.tgz", + "integrity": "sha1-OM36Zpr9ZhcOFO9G1HJ9M+KYR1A=", + "requires": { + "@ant-design/icons-vue": "^6.0.0", + "@babel/runtime": "^7.10.5", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^3.3.0", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "moment": "^2.27.0", + "omit.js": "^2.0.0", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz", + "integrity": "sha1-wFV8CWrzLxBhmPT04qODU343hxY=", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fargparse%2Fdownload%2Fargparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/array-tree-filter/download/array-tree-filter-2.1.0.tgz", + "integrity": "sha1-hzrAD+yDdJ8lWsjdCDgUtPYykZA=" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-2.1.0.tgz?cache=0&sync_timestamp=1614624423985&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-union%2Fdownload%2Farray-union-2.1.0.tgz", + "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/arrify/download/arrify-1.0.1.tgz?cache=0&sync_timestamp=1619599511725&other_urls=https%3A%2F%2Fregistry.nlark.com%2Farrify%2Fdownload%2Farrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-2.0.0.tgz", + "integrity": "sha1-SDFDxWeu7UeFdZwIZXhtx319LjE=", + "dev": true + }, + "async-validator": { + "version": "3.5.2", + "resolved": "https://registry.nlark.com/async-validator/download/async-validator-3.5.2.tgz?cache=0&sync_timestamp=1619755921381&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fasync-validator%2Fdownload%2Fasync-validator-3.5.2.tgz", + "integrity": "sha1-aOhmqWgk6LJpT/eoMcGiXETV5QA=" + }, + "autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.nlark.com/autoprefixer/download/autoprefixer-9.8.6.tgz", + "integrity": "sha1-O3NZTKG/kmYyDFrPFYjXTep0IQ8=", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995384030&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.nlark.com/postcss/download/postcss-7.0.36.tgz", + "integrity": "sha1-BW+M/6k5ZiqPWQWVDAfVKFZE38s=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.21.1.tgz", + "integrity": "sha1-IlY0gZYvTWvemnbVFu8OXTwJsrg=", + "requires": { + "follow-redirects": "^1.10.0" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.nlark.com/bail/download/bail-1.0.5.tgz?cache=0&sync_timestamp=1621397830539&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbail%2Fdownload%2Fbail-1.0.5.tgz", + "integrity": "sha1-tvoTNASjksvB+MS/Y/WVM1Hnp3Y=", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz?cache=0&sync_timestamp=1617714298273&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbalanced-match%2Fdownload%2Fbalanced-match-1.0.2.tgz", + "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.nlark.com/big.js/download/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.2.0.tgz?cache=0&sync_timestamp=1610299640881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.2.0.tgz", + "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz", + "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1614010713935&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.nlark.com/browserslist/download/browserslist-4.16.6.tgz?cache=0&sync_timestamp=1619789101558&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.16.6.tgz", + "integrity": "sha1-15ASd6WojlVO0wWxg+ybDAj2b6I=", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/builtin-modules/download/builtin-modules-3.2.0.tgz", + "integrity": "sha1-RdXbmefuXmvE82LgCL+RerUEmIc=", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", + "dev": true + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.2.tgz?cache=0&sync_timestamp=1606869196008&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-4.1.2.tgz", + "integrity": "sha1-lygHKpVPgFIoIlpt7qazhGHhvVo=", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&sync_timestamp=1603921882890&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.nlark.com/camelcase-keys/download/camelcase-keys-6.2.2.tgz?cache=0&sync_timestamp=1624608993530&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcamelcase-keys%2Fdownload%2Fcamelcase-keys-6.2.2.tgz", + "integrity": "sha1-XnVda6UaoiPsfT1S8ld4IQ+dw8A=", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "caniuse-lite": { + "version": "1.0.30001240", + "resolved": "https://registry.nlark.com/caniuse-lite/download/caniuse-lite-1.0.30001240.tgz?cache=0&sync_timestamp=1624686622197&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001240.tgz", + "integrity": "sha1-7BXRJbWQYCyHMVRcU1H/BUrS1S8=", + "dev": true + }, + "capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/capital-case/download/capital-case-1.0.4.tgz", + "integrity": "sha1-nRMCkjU8kkn2sA+lhSvuOKcX5mk=", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.nlark.com/chalk/download/chalk-4.1.1.tgz?cache=0&sync_timestamp=1618995384030&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-4.1.1.tgz", + "integrity": "sha1-yAs/qyi/Y3HmhjMl7uZ+YYt35q0=", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1618559697170&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "change-case": { + "version": "4.1.2", + "resolved": "https://registry.npm.taobao.org/change-case/download/change-case-4.1.2.tgz?cache=0&sync_timestamp=1606867703975&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchange-case%2Fdownload%2Fchange-case-4.1.2.tgz", + "integrity": "sha1-/t/F8TYEXiOYwEEO5EH5VwRkHhI=", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npm.taobao.org/character-entities/download/character-entities-1.2.4.tgz?cache=0&sync_timestamp=1615197575922&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcharacter-entities%2Fdownload%2Fcharacter-entities-1.2.4.tgz", + "integrity": "sha1-4Sw5Obfq9OWxXnrUxeKOHUjFsWs=", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/character-entities-legacy/download/character-entities-legacy-1.1.4.tgz", + "integrity": "sha1-lLwYRdznClu50uzHSHJWYSk9j8E=", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/character-reference-invalid/download/character-reference-invalid-1.1.4.tgz", + "integrity": "sha1-CDMpzaDq4nKrPbvzfpo4LBOvFWA=", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.nlark.com/chokidar/download/chokidar-3.5.2.tgz", + "integrity": "sha1-26OXb8rbAW9m/TZQIdkWANAcHnU=", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "clipboard": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "clone-regexp": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/clone-regexp/download/clone-regexp-2.2.0.tgz?cache=0&sync_timestamp=1617892066413&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclone-regexp%2Fdownload%2Fclone-regexp-2.2.0.tgz", + "integrity": "sha1-fWXgCIXNh5ZAXDWnN+eoa3Qp428=", + "dev": true, + "requires": { + "is-regexp": "^2.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/colorette/download/colorette-1.2.2.tgz?cache=0&sync_timestamp=1614259623635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolorette%2Fdownload%2Fcolorette-1.2.2.tgz", + "integrity": "sha1-y8x51emcrqLb8Q6zom/Ys+as+pQ=", + "dev": true + }, + "compute-scroll-into-view": { + "version": "1.0.17", + "resolved": "https://registry.npm.taobao.org/compute-scroll-into-view/download/compute-scroll-into-view-1.0.17.tgz?cache=0&sync_timestamp=1614042424875&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcompute-scroll-into-view%2Fdownload%2Fcompute-scroll-into-view-1.0.17.tgz", + "integrity": "sha1-aojxis2dQunPS6pr7H4FImB6t6s=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npm.taobao.org/connect/download/connect-3.7.0.tgz", + "integrity": "sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1607566512593&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433816745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "consolidate": { + "version": "0.16.0", + "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.16.0.tgz?cache=0&sync_timestamp=1599596640464&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconsolidate%2Fdownload%2Fconsolidate-0.16.0.tgz", + "integrity": "sha1-oRhkdokw8vGUMWYKZZBmaPX73BY=", + "dev": true, + "requires": { + "bluebird": "^3.7.2" + } + }, + "constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/constant-case/download/constant-case-3.0.4.tgz", + "integrity": "sha1-O4Sprq9M8x7EXmv13pG9+wWJ+vE=", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.nlark.com/convert-source-map/download/convert-source-map-1.8.0.tgz", + "integrity": "sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/copy-anything/download/copy-anything-2.0.3.tgz", + "integrity": "sha1-hCQHugJGaw34RIGbvjuuu+XUXYc=", + "dev": true, + "requires": { + "is-what": "^3.12.0" + } + }, + "core-js": { + "version": "3.16.1", + "resolved": "https://registry.nlark.com/core-js/download/core-js-3.16.1.tgz?cache=0&sync_timestamp=1628444136511&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcore-js%2Fdownload%2Fcore-js-3.16.1.tgz", + "integrity": "sha1-9Ehc5cnzxqfLGPqASI4I02IJckk=" + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-7.0.0.tgz?cache=0&sync_timestamp=1596310591228&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-7.0.0.tgz", + "integrity": "sha1-75tE13OVnK5j3ezRIt4jhTtg+NM=", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz", + "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-js": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/crypto-js/download/crypto-js-4.0.0.tgz", + "integrity": "sha1-KQSrJnep0EKFai6i74DekuSjbcw=" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", + "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", + "dev": true + }, + "csstype": { + "version": "2.6.17", + "resolved": "https://registry.nlark.com/csstype/download/csstype-2.6.17.tgz?cache=0&sync_timestamp=1618818393132&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcsstype%2Fdownload%2Fcsstype-2.6.17.tgz", + "integrity": "sha1-TPMOuH4dGgBdi2UQ+VKSQT9qHA4=" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.3.1.tgz?cache=0&sync_timestamp=1607566512593&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.3.1.tgz", + "integrity": "sha1-8NIpxQXgxtjEmsVT0bE9wYP2su4=", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz?cache=0&sync_timestamp=1610348638646&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/decamelize-keys/download/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz?cache=0&sync_timestamp=1617771296262&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmap-obj%2Fdownload%2Fmap-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-4.2.2.tgz", + "integrity": "sha1-RNLqNnm49NT/ujPwPYZfwee/SVU=", + "dev": true + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-3.0.1.tgz", + "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz", + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-align": { + "version": "1.12.2", + "resolved": "https://registry.nlark.com/dom-align/download/dom-align-1.12.2.tgz?cache=0&sync_timestamp=1621853230649&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-align%2Fdownload%2Fdom-align-1.12.2.tgz", + "integrity": "sha1-D4Fk69DJwhsMeQMQSTzYVYkqzUs=" + }, + "dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/dom-scroll-into-view/download/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha1-DezIUigB/Y0/HGujVadNOCxfmJs=" + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.nlark.com/dom-serializer/download/dom-serializer-0.2.2.tgz?cache=0&sync_timestamp=1621256858583&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.2.2.tgz", + "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz", + "integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1611535326982&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-2.2.0.tgz", + "integrity": "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-1.3.1.tgz", + "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/domhandler/download/domhandler-2.4.2.tgz", + "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.nlark.com/domutils/download/domutils-1.7.0.tgz?cache=0&sync_timestamp=1622995212689&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-1.7.0.tgz", + "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/dot-case/download/dot-case-3.0.4.tgz", + "integrity": "sha1-mytnDQCkMWZ6inW6Kc0bmICc51E=", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.nlark.com/dotenv/download/dotenv-10.0.0.tgz?cache=0&sync_timestamp=1621633079842&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdotenv%2Fdownload%2Fdotenv-10.0.0.tgz", + "integrity": "sha1-PUInuPuV+BCWzdK2ZlP7LHCFuoE=", + "dev": true + }, + "echarts": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.1.2.tgz", + "integrity": "sha512-okUhO4sw22vwZp+rTPNjd/bvTdpug4K4sHNHyrV8NdAncIX9/AarlolFqtJCAYKGFYhUBNjIWu1EznFrSWTFxg==", + "requires": { + "tslib": "2.0.3", + "zrender": "5.1.1" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.759", + "resolved": "https://registry.nlark.com/electron-to-chromium/download/electron-to-chromium-1.3.759.tgz?cache=0&sync_timestamp=1624658593703&other_urls=https%3A%2F%2Fregistry.nlark.com%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.759.tgz", + "integrity": "sha1-sNZS03aDFHCkwjC6ch2iQnv7mWo=", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1614682818988&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", + "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npm.taobao.org/enquirer/download/enquirer-2.3.6.tgz", + "integrity": "sha1-Kn/l3WNKHkElqXXsmU/1RW3Dc00=", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz?cache=0&sync_timestamp=1611535326982&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-1.1.2.tgz", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.8.tgz", + "integrity": "sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8=", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-module-lexer": { + "version": "0.7.1", + "resolved": "https://registry.nlark.com/es-module-lexer/download/es-module-lexer-0.7.1.tgz", + "integrity": "sha1-wsjg9G8t8GJ0za8N0/OzPgoLJn0=", + "dev": true + }, + "esbuild": { + "version": "0.12.11", + "resolved": "https://registry.nlark.com/esbuild/download/esbuild-0.12.11.tgz", + "integrity": "sha1-qyT3jKv0gefcdH59sV+cUJG+qhQ=", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/escalade/download/escalade-3.1.1.tgz?cache=0&sync_timestamp=1602567310672&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.1.1.tgz", + "integrity": "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-4.0.0.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-4.0.0.tgz", + "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=", + "dev": true + }, + "eslint": { + "version": "7.29.0", + "resolved": "https://registry.nlark.com/eslint/download/eslint-7.29.0.tgz", + "integrity": "sha1-7ip2SPLnKUheTQvWOD7B3qvIs8A=", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/eslint-utils/download/eslint-utils-2.1.0.tgz?cache=0&sync_timestamp=1620975524854&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-utils%2Fdownload%2Feslint-utils-2.1.0.tgz", + "integrity": "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=", + "dev": true + } + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-4.0.6.tgz", + "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.nlark.com/eslint-config-prettier/download/eslint-config-prettier-8.3.0.tgz?cache=0&sync_timestamp=1619270948988&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-config-prettier%2Fdownload%2Feslint-config-prettier-8.3.0.tgz", + "integrity": "sha1-90cbILb+ipqSVMxoRFQgKIai3Xo=", + "dev": true + }, + "eslint-plugin-prettier": { + "version": "3.4.0", + "resolved": "https://registry.npm.taobao.org/eslint-plugin-prettier/download/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha1-zbrTvx29Kxd+mCVzf+Y7R2oI8Mc=", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-vue": { + "version": "7.16.0", + "resolved": "https://registry.nlark.com/eslint-plugin-vue/download/eslint-plugin-vue-7.16.0.tgz?cache=0&sync_timestamp=1628592345667&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-plugin-vue%2Fdownload%2Feslint-plugin-vue-7.16.0.tgz", + "integrity": "sha1-f+n+oDmhkLEIMZwTgK31Q+9XcH0=", + "dev": true, + "requires": { + "eslint-utils": "^2.1.0", + "natural-compare": "^1.4.0", + "semver": "^6.3.0", + "vue-eslint-parser": "^7.10.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/eslint-utils/download/eslint-utils-2.1.0.tgz?cache=0&sync_timestamp=1620975524854&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-utils%2Fdownload%2Feslint-utils-2.1.0.tgz", + "integrity": "sha1-0t5eA0JOcH3BDHQGjd7a5wh0Gyc=", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463550093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-5.1.1.tgz", + "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/eslint-utils/download/eslint-utils-3.0.0.tgz?cache=0&sync_timestamp=1620975524854&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-utils%2Fdownload%2Feslint-utils-3.0.0.tgz", + "integrity": "sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI=", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha1-9lMoJZMFknOSyTjtROsKXJsr0wM=", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.nlark.com/espree/download/espree-7.3.1.tgz", + "integrity": "sha1-8t8zC3Usb1UBn4vYm3ZgA5wbu7Y=", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesprima%2Fdownload%2Fesprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/esquery/download/esquery-1.4.0.tgz?cache=0&sync_timestamp=1612565659324&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesquery%2Fdownload%2Fesquery-1.4.0.tgz", + "integrity": "sha1-IUj/w4uC6McFff7UhCWz5h8PJKU=", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1596643087461&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz", + "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.3.0.tgz?cache=0&sync_timestamp=1598900128185&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesrecurse%2Fdownload%2Fesrecurse-4.3.0.tgz", + "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.2.0.tgz?cache=0&sync_timestamp=1596643087461&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.2.0.tgz", + "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1596643087461&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/estree-walker/download/estree-walker-2.0.2.tgz", + "integrity": "sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw=" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz?cache=0&sync_timestamp=1564535492241&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesutils%2Fdownload%2Fesutils-2.0.3.tgz", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "dev": true + }, + "execall": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/execall/download/execall-2.0.0.tgz?cache=0&sync_timestamp=1617892843041&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexecall%2Fdownload%2Fexecall-2.0.0.tgz", + "integrity": "sha1-FqBrX+UJnffQC+XZwG7s3tFmO0U=", + "dev": true, + "requires": { + "clone-regexp": "^2.1.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz?cache=0&sync_timestamp=1591599666712&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.3.tgz", + "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/fast-diff/download/fast-diff-1.2.0.tgz", + "integrity": "sha1-c+4RmC2Gyq95WYKNUZz+kn+sXwM=", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.nlark.com/fast-glob/download/fast-glob-3.2.7.tgz", + "integrity": "sha1-/Wy3otfpqnp4RhEehaGW1rL3ZqE=", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npm.taobao.org/fastest-levenshtein/download/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha1-mZD306iMxan/0fF0V0UlFwDUl+I=", + "dev": true + }, + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npm.taobao.org/fastq/download/fastq-1.11.0.tgz", + "integrity": "sha1-u5+5VaBxMKkY62PB9RYcwypdCFg=", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-6.0.1.tgz", + "integrity": "sha1-IRst2WWcsDlLBz5zI6w8kz1SICc=", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz", + "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1607566512593&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433816745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz?cache=0&sync_timestamp=1597172141619&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-3.0.4.tgz?cache=0&sync_timestamp=1604831825098&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fflat-cache%2Fdownload%2Fflat-cache-3.0.4.tgz", + "integrity": "sha1-YbAzgwKy/p+Vfcwy/CqH8cMEixE=", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/flatted/download/flatted-3.1.1.tgz", + "integrity": "sha1-xLSJ6ACW2d8d/JfHmHGup8YXxGk=", + "dev": true + }, + "follow-redirects": { + "version": "1.14.1", + "resolved": "https://registry.nlark.com/follow-redirects/download/follow-redirects-1.14.1.tgz?cache=0&sync_timestamp=1620555234886&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.1.tgz", + "integrity": "sha1-2RFN7Qoc/dM04WTmZirQK/2R/0M=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz?cache=0&sync_timestamp=1612536422255&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.3.2.tgz", + "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "generic-names": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/generic-names/download/generic-names-2.0.1.tgz", + "integrity": "sha1-+KN46tLMqno08DF7BVVIMq5BuHI=", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.2.tgz?cache=0&sync_timestamp=1603829637456&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgensync%2Fdownload%2Fgensync-1.0.0-beta.2.tgz", + "integrity": "sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=", + "dev": true + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.nlark.com/get-stdin/download/get-stdin-8.0.0.tgz", + "integrity": "sha1-y61qc/63X27rIrqeAfiaooqpelM=", + "dev": true + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.nlark.com/glob/download/glob-7.1.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob%2Fdownload%2Fglob-7.1.7.tgz", + "integrity": "sha1-Oxk+kjPwHULQs/eClLvutBj5SpA=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.nlark.com/glob-parent/download/glob-parent-5.1.2.tgz?cache=0&sync_timestamp=1620073245729&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglob-parent%2Fdownload%2Fglob-parent-5.1.2.tgz", + "integrity": "sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/global-modules/download/global-modules-2.0.0.tgz", + "integrity": "sha1-mXYFrSNF8n9RU5vqJldEISFcd4A=", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/global-prefix/download/global-prefix-3.0.0.tgz", + "integrity": "sha1-/IX3MGTfafUEIfR/iD/luRO6m5c=", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz?cache=0&sync_timestamp=1574116262707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "13.9.0", + "resolved": "https://registry.nlark.com/globals/download/globals-13.9.0.tgz?cache=0&sync_timestamp=1622088047458&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobals%2Fdownload%2Fglobals-13.9.0.tgz", + "integrity": "sha1-S/K/Y1szShc/sdr3xeayGOzcBss=", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.nlark.com/globby/download/globby-11.0.4.tgz?cache=0&sync_timestamp=1623850220985&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fglobby%2Fdownload%2Fglobby-11.0.4.tgz", + "integrity": "sha1-LLr/d8Lypi5x6bKBOme5ejowAaU=", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.nlark.com/globjoin/download/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "dev": true + }, + "gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/gonzales-pe/download/gonzales-pe-4.3.0.tgz", + "integrity": "sha1-/p3sXzxVfurQn/hoxlgmvlTQZ7M=", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "requires": { + "delegate": "^3.1.2" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.6.tgz", + "integrity": "sha1-/wQLKwhTsjw9MQJ1I3BvGIXXa+4=", + "dev": true, + "optional": true + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.nlark.com/hard-rejection/download/hard-rejection-2.1.0.tgz", + "integrity": "sha1-HG7aXBaFxjlCdm15u0Cudzzs2IM=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz?cache=0&sync_timestamp=1618559697170&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-flag%2Fdownload%2Fhas-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhash-sum%2Fdownload%2Fhash-sum-2.0.0.tgz", + "integrity": "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=", + "dev": true + }, + "header-case": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/header-case/download/header-case-2.0.4.tgz", + "integrity": "sha1-WkLmO1UXc0nPQFvrjXdayruSwGM=", + "dev": true, + "requires": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-4.0.2.tgz?cache=0&sync_timestamp=1617826545071&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhosted-git-info%2Fdownload%2Fhosted-git-info-4.0.2.tgz", + "integrity": "sha1-XkJVB+7eT+qEa3Ji8IOEVsQgmWE=", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-6.0.0.tgz?cache=0&sync_timestamp=1594427569171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + } + } + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-3.1.0.tgz", + "integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz", + "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz", + "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-5.1.0.tgz?cache=0&sync_timestamp=1605801312995&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficss-utils%2Fdownload%2Ficss-utils-5.1.0.tgz", + "integrity": "sha1-xr5oWKvQE9do6YNmrkfiXViHsa4=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-5.1.8.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-5.1.8.tgz", + "integrity": "sha1-8VCotQo0KJsz4i9YiavU2AFvDlc=", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.3.0.tgz?cache=0&sync_timestamp=1608469480577&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-3.3.0.tgz", + "integrity": "sha1-NxYsJfy566oublPVtNiM4X2eDCs=", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/import-lazy/download/import-lazy-4.0.0.tgz", + "integrity": "sha1-6OtidIOgpD2jwD8+NVSL5csMwVM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-4.0.0.tgz?cache=0&sync_timestamp=1618679442183&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Findent-string%2Fdownload%2Findent-string-4.0.0.tgz", + "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npm.taobao.org/ini/download/ini-1.3.8.tgz?cache=0&sync_timestamp=1607907874824&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fini%2Fdownload%2Fini-1.3.8.tgz", + "integrity": "sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw=", + "dev": true + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/is-alphabetical/download/is-alphabetical-1.0.4.tgz", + "integrity": "sha1-nn1rlJFr4iFTdF0YTCmMv5hqaG0=", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/is-alphanumerical/download/is-alphanumerical-1.0.4.tgz?cache=0&sync_timestamp=1615453958702&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-alphanumerical%2Fdownload%2Fis-alphanumerical-1.0.4.tgz", + "integrity": "sha1-frmiQx+FX2se8aeOMm31FWlsTb8=", + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", + "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-2.0.5.tgz?cache=0&sync_timestamp=1604432327227&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-2.0.5.tgz", + "integrity": "sha1-68JS5ADSL/jXf6CYiIIaJKZYwZE=", + "dev": true + }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.nlark.com/is-core-module/download/is-core-module-2.4.0.tgz?cache=0&sync_timestamp=1620592629366&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fis-core-module%2Fdownload%2Fis-core-module-2.4.0.tgz", + "integrity": "sha1-jp/I4VAnsBFBgCbpjw5vTYYwXME=", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/is-decimal/download/is-decimal-1.0.4.tgz", + "integrity": "sha1-ZaOllYocW2OnBuGzM9fNn2MNP6U=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-fullwidth-code-point%2Fdownload%2Fis-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/is-hexadecimal/download/is-hexadecimal-1.0.4.tgz?cache=0&sync_timestamp=1615466008748&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-hexadecimal%2Fdownload%2Fis-hexadecimal-1.0.4.tgz", + "integrity": "sha1-zDXJdYjaS9Saju3WvECC1E3LI6c=", + "dev": true + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-module/download/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-2.1.0.tgz?cache=0&sync_timestamp=1618600554597&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-2.1.0.tgz", + "integrity": "sha1-ReQuN/zPH0Dajl927iFRWEDAkoc=", + "dev": true + }, + "is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-3.0.1.tgz?cache=0&sync_timestamp=1599667338683&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-object%2Fdownload%2Fis-plain-object-3.0.1.tgz", + "integrity": "sha1-Zi2S0kwKpDAkB7DUXSHyJRyF+Fs=" + }, + "is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-regexp/download/is-regexp-2.1.0.tgz?cache=0&sync_timestamp=1617816584210&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-regexp%2Fdownload%2Fis-regexp-2.1.0.tgz", + "integrity": "sha1-zXNKVoZOI7lWv058ZsOWpMCyLC0=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/is-unicode-supported/download/is-unicode-supported-0.1.0.tgz?cache=0&sync_timestamp=1618722953653&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-unicode-supported%2Fdownload%2Fis-unicode-supported-0.1.0.tgz", + "integrity": "sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc=", + "dev": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npm.taobao.org/is-what/download/is-what-3.14.1.tgz?cache=0&sync_timestamp=1615169735707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-what%2Fdownload%2Fis-what-3.14.1.tgz", + "integrity": "sha1-4SIvRt3ahd6tD9HJ3xMXYOd3VcE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.nlark.com/js-cookie/download/js-cookie-2.2.1.tgz", + "integrity": "sha1-aeEG3F1YBolFYpAqpbrsN0Tpsrg=" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz?cache=0&sync_timestamp=1619345098261&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-tokens%2Fdownload%2Fjs-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.nlark.com/js-yaml/download/js-yaml-3.14.1.tgz?cache=0&sync_timestamp=1618847165988&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.14.1.tgz", + "integrity": "sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603891175833&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz", + "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npm.taobao.org/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "dev": true + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/klona/download/klona-2.0.4.tgz?cache=0&sync_timestamp=1600226641291&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fklona%2Fdownload%2Fklona-2.0.4.tgz", + "integrity": "sha1-e7Hjr/sMuGJFR+9+j2cI6i4538A=", + "dev": true + }, + "known-css-properties": { + "version": "0.21.0", + "resolved": "https://registry.npm.taobao.org/known-css-properties/download/known-css-properties-0.21.0.tgz", + "integrity": "sha1-FfvQu7g0R/POCdivJH7UfGjt6A0=", + "dev": true + }, + "less": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/less/download/less-4.1.1.tgz", + "integrity": "sha1-Fb8lOpk5eR3GkIiMP/Qk8+bH7bo=", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + } + }, + "less-loader": { + "version": "10.0.1", + "resolved": "https://registry.nlark.com/less-loader/download/less-loader-10.0.1.tgz", + "integrity": "sha1-wFqrpo0AQAggJ18hwq2Hy5+pkj8=", + "dev": true, + "requires": { + "klona": "^2.0.4" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.4.1.tgz", + "integrity": "sha1-rkViwAdHO5MqYgDUAyaN0v/8at4=", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz", + "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz", + "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npm.taobao.org/lodash-es/download/lodash-es-4.17.21.tgz", + "integrity": "sha1-Q+YmxG5lkbd1C+srUBFzkMYJ4+4=" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npm.taobao.org/lodash.clonedeep/download/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npm.taobao.org/lodash.merge/download/lodash.merge-4.6.2.tgz", + "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npm.taobao.org/lodash.truncate/download/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/log-symbols/download/log-symbols-4.1.0.tgz", + "integrity": "sha1-P727lbRoOsn8eFER55LlWNSr1QM=", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/longest-streak/download/longest-streak-2.0.4.tgz?cache=0&sync_timestamp=1615193481278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flongest-streak%2Fdownload%2Flongest-streak-2.0.4.tgz", + "integrity": "sha1-uFmZV9pbXatk3uP+MW+ndFl9kOQ=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-2.0.2.tgz?cache=0&sync_timestamp=1606867317282&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flower-case%2Fdownload%2Flower-case-2.0.2.tgz", + "integrity": "sha1-b6I3xj29xKgsoP2ILkci3F5jTig=", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz?cache=0&sync_timestamp=1594427569171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-5.1.1.tgz", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npm.taobao.org/magic-string/download/magic-string-0.25.7.tgz", + "integrity": "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz?cache=0&sync_timestamp=1587567875186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-2.1.0.tgz", + "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463550093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true, + "optional": true + } + } + }, + "map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npm.taobao.org/map-obj/download/map-obj-4.2.1.tgz?cache=0&sync_timestamp=1617771296262&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmap-obj%2Fdownload%2Fmap-obj-4.2.1.tgz", + "integrity": "sha1-5Oo5nbyXmuc1yDyGPdMb3zZCd7c=", + "dev": true + }, + "mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.nlark.com/mathml-tag-names/download/mathml-tag-names-2.1.3.tgz", + "integrity": "sha1-TdrdZzCOeAzxakdoWHjuJ7c2oKM=", + "dev": true + }, + "mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.nlark.com/mdast-util-from-markdown/download/mdast-util-from-markdown-0.8.5.tgz?cache=0&sync_timestamp=1624394132113&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fmdast-util-from-markdown%2Fdownload%2Fmdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha1-0e8spCvDd+ywRjqYeRDa6JvZoow=", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.nlark.com/mdast-util-to-markdown/download/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha1-sz9nyoINaebMUnqT1AOSSbUEvr4=", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/mdast-util-to-string/download/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha1-uM/mpxPhCRy1tyj8SIhaR2f4uXs=", + "dev": true + }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.nlark.com/meow/download/meow-9.0.0.tgz", + "integrity": "sha1-zZUQvFysne59A8c+4fmtlZ9Oo2Q=", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.nlark.com/type-fest/download/type-fest-0.18.1.tgz", + "integrity": "sha1-20vBUaSiz07r+a3V23VQjbbMhB8=", + "dev": true + } + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", + "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz", + "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", + "dev": true + }, + "micromark": { + "version": "2.11.4", + "resolved": "https://registry.nlark.com/micromark/download/micromark-2.11.4.tgz", + "integrity": "sha1-0TQ2E47qgmOD6CJEnJpcUO5EZlo=", + "dev": true, + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-4.0.4.tgz?cache=0&sync_timestamp=1618054885525&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmicromatch%2Fdownload%2Fmicromatch-4.0.4.tgz", + "integrity": "sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k=", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz", + "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", + "dev": true, + "optional": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/min-indent/download/min-indent-1.0.1.tgz", + "integrity": "sha1-pj9oFnOzBXH76LwlaGrnRu76mGk=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/minimist-options/download/minimist-options-4.1.0.tgz", + "integrity": "sha1-wGVXE8U6ii69d/+iR9NCxA8BBhk=", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz?cache=0&sync_timestamp=1618600554597&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-obj%2Fdownload%2Fis-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, + "mitt": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/mitt/download/mitt-3.0.0.tgz", + "integrity": "sha1-ae+b1cgP9vV0c+jYkybQHEFL4L0=" + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz?cache=0&sync_timestamp=1601983517363&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.29.1.tgz", + "integrity": "sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433816745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "nanoid": { + "version": "3.1.23", + "resolved": "https://registry.nlark.com/nanoid/download/nanoid-3.1.23.tgz", + "integrity": "sha1-90QIbOfCvEfuCoRyV01ceOQYOoE=", + "dev": true + }, + "nanopop": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/nanopop/download/nanopop-2.1.0.tgz", + "integrity": "sha1-I0dlE87iQFiIr9LopLVAZrcLnmA=" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "needle": { + "version": "2.6.0", + "resolved": "https://registry.npm.taobao.org/needle/download/needle-2.6.0.tgz", + "integrity": "sha1-JNu1XyUJ4jJLSpnWH0E5ggE8zb4=", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.7.tgz?cache=0&sync_timestamp=1607566512593&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.2.7.tgz", + "integrity": "sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o=", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-3.0.4.tgz?cache=0&sync_timestamp=1606867315452&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-3.0.4.tgz", + "integrity": "sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0=", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.73", + "resolved": "https://registry.nlark.com/node-releases/download/node-releases-1.1.73.tgz?cache=0&sync_timestamp=1623060224459&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.73.tgz", + "integrity": "sha1-3U6B3dUnf/hGuAtSu0DEnt96eyA=", + "dev": true + }, + "normalize-package-data": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-3.0.2.tgz", + "integrity": "sha1-yuXEEK4kNPmmwbqmXVvDuTZshpk=", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", + "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/normalize-range/download/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/normalize-selector/download/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "dev": true + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/nprogress/download/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/num2fraction/download/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "omit.js": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/omit.js/download/omit.js-2.0.2.tgz", + "integrity": "sha1-3ZuENvq5R6Xz/yFMslOGMeMT7C8=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.9.1.tgz?cache=0&sync_timestamp=1585966141328&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foptionator%2Fdownload%2Foptionator-0.9.1.tgz", + "integrity": "sha1-TyNqY3Pa4FZqbUPhMmZ09QwpFJk=", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", + "dev": true + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/param-case/download/param-case-3.0.4.tgz?cache=0&sync_timestamp=1606869196249&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparam-case%2Fdownload%2Fparam-case-3.0.4.tgz", + "integrity": "sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU=", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/parse-entities/download/parse-entities-2.0.0.tgz", + "integrity": "sha1-U8brW5MUofTsmfoP33zgHs2gy+g=", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.2.0.tgz?cache=0&sync_timestamp=1610966676829&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-5.2.0.tgz", + "integrity": "sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.nlark.com/parse-node-version/download/parse-node-version-1.0.1.tgz", + "integrity": "sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs=", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", + "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/pascal-case/download/pascal-case-3.1.2.tgz", + "integrity": "sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs=", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "path-case": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/path-case/download/path-case-3.0.4.tgz", + "integrity": "sha1-kWhkUzTrlCZYN1xW+AtMDLX4LG8=", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz?cache=0&sync_timestamp=1617971691339&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.nlark.com/path-parse/download/path-parse-1.0.7.tgz", + "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=", + "dev": true + }, + "path-to-regexp": { + "version": "6.2.0", + "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-6.2.0.tgz?cache=0&sync_timestamp=1601401130106&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-6.2.0.tgz", + "integrity": "sha1-97OAMzYQTDRoia3s5hRmkjBkXzg=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-4.0.0.tgz?cache=0&sync_timestamp=1611752074264&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-type%2Fdownload%2Fpath-type-4.0.0.tgz", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/picomatch/download/picomatch-2.3.0.tgz", + "integrity": "sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI=", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", + "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", + "dev": true, + "optional": true + }, + "pinia": { + "version": "2.0.0-beta.3", + "resolved": "https://registry.nlark.com/pinia/download/pinia-2.0.0-beta.3.tgz", + "integrity": "sha1-xvDQfaVNxaojf0zJKBiY6SezPRY=", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.14" + } + }, + "postcss": { + "version": "8.3.6", + "resolved": "https://registry.nlark.com/postcss/download/postcss-8.3.6.tgz?cache=0&sync_timestamp=1626882928473&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss%2Fdownload%2Fpostcss-8.3.6.tgz", + "integrity": "sha1-JzDddql5afN/U7mmCWGXvjEcxOo=", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" + } + }, + "postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npm.taobao.org/postcss-html/download/postcss-html-0.36.0.tgz", + "integrity": "sha1-tAkT+U6qzCRT/TChMnrW7h+IsgQ=", + "dev": true, + "requires": { + "htmlparser2": "^3.10.0" + } + }, + "postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.nlark.com/postcss-less/download/postcss-less-3.1.4.tgz", + "integrity": "sha1-Np9YZCtZKO+Jj/vBpuk8lYMExa0=", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995384030&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.nlark.com/postcss/download/postcss-7.0.36.tgz", + "integrity": "sha1-BW+M/6k5ZiqPWQWVDAfVKFZE38s=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.nlark.com/postcss-media-query-parser/download/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, + "postcss-modules": { + "version": "4.1.3", + "resolved": "https://registry.nlark.com/postcss-modules/download/postcss-modules-4.1.3.tgz", + "integrity": "sha1-xMTEHZjZfSTHDojaz8l69aSz4h0=", + "dev": true, + "requires": { + "generic-names": "^2.0.1", + "icss-replace-symbols": "^1.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-3.0.0.tgz?cache=0&sync_timestamp=1602588256782&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-extract-imports%2Fdownload%2Fpostcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha1-zaHwR8CugMl9vijD52pDuIAldB0=", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-4.0.0.tgz?cache=0&sync_timestamp=1602587676537&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha1-67tU+uFZjuz99pGgKz/zs5ClpRw=", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-3.0.0.tgz?cache=0&sync_timestamp=1602593182204&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-scope%2Fdownload%2Fpostcss-modules-scope-3.0.0.tgz", + "integrity": "sha1-nvMVFFbTu/oSDKRImN/Kby+gHwY=", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-4.0.0.tgz?cache=0&sync_timestamp=1602586306639&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-values%2Fdownload%2Fpostcss-modules-values-4.0.0.tgz", + "integrity": "sha1-18Xn5ow7s8myfL9Iyguz/7RgLJw=", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.nlark.com/postcss-resolve-nested-selector/download/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.nlark.com/postcss-safe-parser/download/postcss-safe-parser-4.0.2.tgz?cache=0&sync_timestamp=1623651635519&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-safe-parser%2Fdownload%2Fpostcss-safe-parser-4.0.2.tgz", + "integrity": "sha1-ptTkjw832ffBGypYG/APi6SHC5Y=", + "dev": true, + "requires": { + "postcss": "^7.0.26" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995384030&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.nlark.com/postcss/download/postcss-7.0.36.tgz", + "integrity": "sha1-BW+M/6k5ZiqPWQWVDAfVKFZE38s=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.nlark.com/postcss-sass/download/postcss-sass-0.4.4.tgz", + "integrity": "sha1-kfDzRHtFzjcyJ6mLYfjY8HhShaM=", + "dev": true, + "requires": { + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995384030&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.nlark.com/postcss/download/postcss-7.0.36.tgz", + "integrity": "sha1-BW+M/6k5ZiqPWQWVDAfVKFZE38s=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.nlark.com/postcss-scss/download/postcss-scss-2.1.1.tgz?cache=0&sync_timestamp=1623651257144&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-scss%2Fdownload%2Fpostcss-scss-2.1.1.tgz", + "integrity": "sha1-7Dp1+imlXgFrkL8yaQJsU8HSs4M=", + "dev": true, + "requires": { + "postcss": "^7.0.6" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995384030&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.nlark.com/postcss/download/postcss-7.0.36.tgz", + "integrity": "sha1-BW+M/6k5ZiqPWQWVDAfVKFZE38s=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.nlark.com/postcss-selector-parser/download/postcss-selector-parser-6.0.6.tgz?cache=0&sync_timestamp=1620752924836&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-6.0.6.tgz", + "integrity": "sha1-LFu6gXSsL2mBq2MaQqsO5UrzMuo=", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-sorting": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/postcss-sorting/download/postcss-sorting-5.0.1.tgz", + "integrity": "sha1-ENXQBZ7qgzTazIIMASGGQDW8PxE=", + "dev": true, + "requires": { + "lodash": "^4.17.14", + "postcss": "^7.0.17" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995384030&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.nlark.com/postcss/download/postcss-7.0.36.tgz", + "integrity": "sha1-BW+M/6k5ZiqPWQWVDAfVKFZE38s=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npm.taobao.org/postcss-syntax/download/postcss-syntax-0.36.2.tgz", + "integrity": "sha1-8IV4x9lYNFdOVZOoLfv6ivrjtRw=", + "dev": true + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-4.1.0.tgz", + "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.2.1.tgz", + "integrity": "sha1-3rxkidem5rDnYRiIzsiAM30xY5Y=", + "dev": true + }, + "prettier": { + "version": "2.3.2", + "resolved": "https://registry.nlark.com/prettier/download/prettier-2.3.2.tgz?cache=0&sync_timestamp=1624696193562&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fprettier%2Fdownload%2Fprettier-2.3.2.tgz", + "integrity": "sha1-7ygKBewlNxLkhiM9tcbyNEHnNC0=", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/prettier-linter-helpers/download/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha1-0j1B/hN1ZG3i0BBNNFSjAIgCz3s=", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true, + "optional": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.nlark.com/queue-microtask/download/queue-microtask-1.2.3.tgz", + "integrity": "sha1-SSkii7xyTfrEPg77BYyve2z7YkM=", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npm.taobao.org/quick-lru/download/quick-lru-4.0.1.tgz?cache=0&sync_timestamp=1610610459445&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fquick-lru%2Fdownload%2Fquick-lru-4.0.1.tgz", + "integrity": "sha1-W4h48ROlgheEjGSCAmxz4bpXcn8=", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-5.2.0.tgz?cache=0&sync_timestamp=1616914810926&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fread-pkg%2Fdownload%2Fread-pkg-5.2.0.tgz", + "integrity": "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w=", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.9.tgz?cache=0&sync_timestamp=1617826545071&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhosted-git-info%2Fdownload%2Fhosted-git-info-2.8.9.tgz", + "integrity": "sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k=", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463550093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.nlark.com/type-fest/download/type-fest-0.6.0.tgz", + "integrity": "sha1-jSojcNPfiG61yQraHFv2GIrPg4s=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-7.0.1.tgz", + "integrity": "sha1-86YTV1hFlzOuK5VjgFbhhU5+9Qc=", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.nlark.com/type-fest/download/type-fest-0.8.1.tgz", + "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=", + "dev": true + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.6.0.tgz", + "integrity": "sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/redent/download/redent-3.0.0.tgz?cache=0&sync_timestamp=1620071175005&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fredent%2Fdownload%2Fredent-3.0.0.tgz", + "integrity": "sha1-5Ve3mYMWu1PJ8fVvpiY1LGljBZ8=", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.nlark.com/regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz", + "integrity": "sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I=" + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.nlark.com/regexpp/download/regexpp-3.2.0.tgz?cache=0&sync_timestamp=1623668905417&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fregexpp%2Fdownload%2Fregexpp-3.2.0.tgz", + "integrity": "sha1-BCWido2PI7rXDKS5BGH6LxIT4bI=", + "dev": true + }, + "remark": { + "version": "13.0.0", + "resolved": "https://registry.npm.taobao.org/remark/download/remark-13.0.0.tgz", + "integrity": "sha1-0V2b9xpAL0Aofr42Bntm1Uho5CU=", + "dev": true, + "requires": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + } + }, + "remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npm.taobao.org/remark-parse/download/remark-parse-9.0.0.tgz", + "integrity": "sha1-TSCimWZYgOT0r12Qt8e4qTWFNkA=", + "dev": true, + "requires": { + "mdast-util-from-markdown": "^0.8.0" + } + }, + "remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npm.taobao.org/remark-stringify/download/remark-stringify-9.0.1.tgz", + "integrity": "sha1-V20G6RBUiwpxkacfJ7M/EhiGKJQ=", + "dev": true, + "requires": { + "mdast-util-to-markdown": "^0.6.0" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.2.tgz", + "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz?cache=0&sync_timestamp=1613054862388&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.20.0.tgz", + "integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/reusify/download/reusify-1.0.4.tgz", + "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-3.0.2.tgz?cache=0&sync_timestamp=1581229865753&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-3.0.2.tgz", + "integrity": "sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho=", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.52.3", + "resolved": "https://registry.nlark.com/rollup/download/rollup-2.52.3.tgz?cache=0&sync_timestamp=1624627360389&other_urls=https%3A%2F%2Fregistry.nlark.com%2Frollup%2Fdownload%2Frollup-2.52.3.tgz", + "integrity": "sha1-Bi/DyF9nc21nWHSTEM/uZINsTio=", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/run-parallel/download/run-parallel-1.2.0.tgz?cache=0&sync_timestamp=1612925912322&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frun-parallel%2Fdownload%2Frun-parallel-1.2.0.tgz", + "integrity": "sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafer-buffer%2Fdownload%2Fsafer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true, + "optional": true + }, + "scroll-into-view-if-needed": { + "version": "2.2.28", + "resolved": "https://registry.npm.taobao.org/scroll-into-view-if-needed/download/scroll-into-view-if-needed-2.2.28.tgz", + "integrity": "sha1-WhWy9YpSZCyIyOylhGROAXA9ZFo=", + "requires": { + "compute-scroll-into-view": "^1.0.17" + } + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-7.3.5.tgz?cache=0&sync_timestamp=1616463550093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.3.5.tgz", + "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-6.0.0.tgz?cache=0&sync_timestamp=1594427569171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", + "dev": true + } + } + }, + "sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/sentence-case/download/sentence-case-3.0.4.tgz", + "integrity": "sha1-NkWnuMEXx4f96HAgViJbtipFEx8=", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/shallow-equal/download/shallow-equal-1.2.1.tgz", + "integrity": "sha1-TBar+lYEOqINBQMk76aJQLDaedo=" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz", + "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/slash/download/slash-3.0.0.tgz", + "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-4.0.0.tgz?cache=0&sync_timestamp=1618555008681&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslice-ansi%2Fdownload%2Fslice-ansi-4.0.0.tgz", + "integrity": "sha1-UA6N0P1VsFgVCGJVsxla3ypF/ms=", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.nlark.com/ansi-styles/download/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true + } + } + }, + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/snake-case/download/snake-case-3.0.4.tgz", + "integrity": "sha1-Tyu9Vo6ZNavf1ZPzTGkdrbScRSw=", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npm.taobao.org/source-map-js/download/source-map-js-0.6.2.tgz", + "integrity": "sha1-C7XeYxtBz72mz7qL0FqA79/SOF4=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz", + "integrity": "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz?cache=0&sync_timestamp=1590161967473&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-correct%2Fdownload%2Fspdx-correct-3.1.1.tgz", + "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz?cache=0&sync_timestamp=1587422410312&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-exceptions%2Fdownload%2Fspdx-exceptions-2.3.0.tgz", + "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.nlark.com/spdx-license-ids/download/spdx-license-ids-3.0.9.tgz", + "integrity": "sha1-illRNd75WSvaaXCUdPHL7qfCRn8=", + "dev": true + }, + "specificity": { + "version": "0.4.1", + "resolved": "https://registry.nlark.com/specificity/download/specificity-0.4.1.tgz?cache=0&sync_timestamp=1620301057306&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fspecificity%2Fdownload%2Fspecificity-0.4.1.tgz", + "integrity": "sha1-qrXmRQEtsIuhguFRFlc40AiHsBk=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsprintf-js%2Fdownload%2Fsprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1609654060878&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/string-hash/download/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", + "dev": true + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.2.tgz?cache=0&sync_timestamp=1618558856477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring-width%2Fdownload%2Fstring-width-4.2.2.tgz", + "integrity": "sha1-2v1PlVmnWFz7pSnGoKT3NIjr1MU=", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz?cache=0&sync_timestamp=1618553351145&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.0.tgz", + "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.nlark.com/strip-indent/download/strip-indent-3.0.0.tgz", + "integrity": "sha1-wy4c7pQLazQyx3G8LFS8znPNMAE=", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-3.1.1.tgz?cache=0&sync_timestamp=1594567586410&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-3.1.1.tgz", + "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", + "dev": true + }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/style-search/download/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, + "stylelint": { + "version": "13.13.1", + "resolved": "https://registry.nlark.com/stylelint/download/stylelint-13.13.1.tgz", + "integrity": "sha1-/KnJ9d55kKsmoA8We4l48IOhjzw=", + "dev": true, + "requires": { + "@stylelint/postcss-css-in-js": "^0.37.2", + "@stylelint/postcss-markdown": "^0.36.2", + "autoprefixer": "^9.8.6", + "balanced-match": "^2.0.0", + "chalk": "^4.1.1", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "execall": "^2.0.0", + "fast-glob": "^3.2.5", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.0.3", + "globjoin": "^0.1.4", + "html-tags": "^3.1.0", + "ignore": "^5.1.8", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.21.0", + "lodash": "^4.17.21", + "log-symbols": "^4.1.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.4", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.35", + "postcss-html": "^0.36.0", + "postcss-less": "^3.1.4", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.2", + "postcss-sass": "^0.4.4", + "postcss-scss": "^2.1.1", + "postcss-selector-parser": "^6.0.5", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.1.0", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.2", + "strip-ansi": "^6.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^6.6.0", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^3.0.3" + }, + "dependencies": { + "balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-2.0.0.tgz?cache=0&sync_timestamp=1617714298273&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbalanced-match%2Fdownload%2Fbalanced-match-2.0.0.tgz", + "integrity": "sha1-3HD5INeNuLhYU1eVhnv0j4IGM9k=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.nlark.com/postcss/download/postcss-7.0.36.tgz", + "integrity": "sha1-BW+M/6k5ZiqPWQWVDAfVKFZE38s=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995384030&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + } + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-5.0.0.tgz", + "integrity": "sha1-w1IlhD3493bfIcV1V7wIfp39/Gk=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "stylelint-config-prettier": { + "version": "8.0.2", + "resolved": "https://registry.npm.taobao.org/stylelint-config-prettier/download/stylelint-config-prettier-8.0.2.tgz", + "integrity": "sha1-2p3jPaTFaJPL5+Jt8jmnN0BF4U4=", + "dev": true + }, + "stylelint-config-recommended": { + "version": "5.0.0", + "resolved": "https://registry.nlark.com/stylelint-config-recommended/download/stylelint-config-recommended-5.0.0.tgz?cache=0&sync_timestamp=1619280044204&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstylelint-config-recommended%2Fdownload%2Fstylelint-config-recommended-5.0.0.tgz", + "integrity": "sha1-+1ZT9JWmC0k48q0+d3EtnhA5rng=", + "dev": true + }, + "stylelint-config-standard": { + "version": "22.0.0", + "resolved": "https://registry.nlark.com/stylelint-config-standard/download/stylelint-config-standard-22.0.0.tgz?cache=0&sync_timestamp=1619280042839&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fstylelint-config-standard%2Fdownload%2Fstylelint-config-standard-22.0.0.tgz", + "integrity": "sha1-yGC+mhPrvBsIRFb6EFJ78TpErd8=", + "dev": true, + "requires": { + "stylelint-config-recommended": "^5.0.0" + } + }, + "stylelint-order": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/stylelint-order/download/stylelint-order-4.1.0.tgz", + "integrity": "sha1-aS0Ft9DCNaxm/PXqHZ5fCKdnR/Y=", + "dev": true, + "requires": { + "lodash": "^4.17.15", + "postcss": "^7.0.31", + "postcss-sorting": "^5.0.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995384030&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.nlark.com/postcss/download/postcss-7.0.36.tgz", + "integrity": "sha1-BW+M/6k5ZiqPWQWVDAfVKFZE38s=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "sugarss": { + "version": "2.0.0", + "resolved": "https://registry.nlark.com/sugarss/download/sugarss-2.0.0.tgz", + "integrity": "sha1-3dduASSyl9QL88yjHIsi7LQ7xh0=", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1618995384030&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1618677243201&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.nlark.com/postcss/download/postcss-7.0.36.tgz", + "integrity": "sha1-BW+M/6k5ZiqPWQWVDAfVKFZE38s=", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-6.1.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-6.1.0.tgz", + "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1622293670728&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "systemjs": { + "version": "6.10.2", + "resolved": "https://registry.nlark.com/systemjs/download/systemjs-6.10.2.tgz", + "integrity": "sha1-yYcCF73fnP0l0S1PzRmJVB7xIHw=", + "dev": true + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.nlark.com/table/download/table-6.7.1.tgz?cache=0&sync_timestamp=1620957183690&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftable%2Fdownload%2Ftable-6.7.1.tgz", + "integrity": "sha1-7gVZK3FDgxqMlPPO5qrkwczvM+I=", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.0", + "resolved": "https://registry.nlark.com/ajv/download/ajv-8.6.0.tgz", + "integrity": "sha1-YMxF2cRqR32A2SxIB22XLDQuVyA=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-1.0.0.tgz", + "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throttle-debounce": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-2.3.0.tgz?cache=0&sync_timestamp=1604315662384&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthrottle-debounce%2Fdownload%2Fthrottle-debounce-2.3.0.tgz", + "integrity": "sha1-/TGGXmZQIHHkEYF+JBRls+nDcuI=", + "dev": true + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.nlark.com/trim-newlines/download/trim-newlines-3.0.1.tgz?cache=0&sync_timestamp=1623341614526&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftrim-newlines%2Fdownload%2Ftrim-newlines-3.0.1.tgz", + "integrity": "sha1-Jgpdli2LdSQlsy86fbDcrNF2wUQ=", + "dev": true + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.nlark.com/trough/download/trough-1.0.5.tgz", + "integrity": "sha1-uLY5zvrX0LsqvTfUM/+Ck++l9AY=", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.nlark.com/tslib/download/tslib-1.14.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npm.taobao.org/tsutils/download/tsutils-3.21.0.tgz?cache=0&sync_timestamp=1615138637708&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftsutils%2Fdownload%2Ftsutils-3.21.0.tgz", + "integrity": "sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM=", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.4.0.tgz", + "integrity": "sha1-B7ggO/pwVsBlcFDjzNLDdzC6uPE=", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.nlark.com/type-fest/download/type-fest-0.20.2.tgz", + "integrity": "sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npm.taobao.org/typedarray-to-buffer/download/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha1-qX7nqf9CaRufeD/xvFES/j/KkIA=", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.3.4", + "resolved": "https://registry.nlark.com/typescript/download/typescript-4.3.4.tgz", + "integrity": "sha1-P4W5hpRbzzEHHezdls+L+mX53Lw=", + "dev": true + }, + "unified": { + "version": "9.2.1", + "resolved": "https://registry.npm.taobao.org/unified/download/unified-9.2.1.tgz?cache=0&sync_timestamp=1614242914877&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funified%2Fdownload%2Funified-9.2.1.tgz", + "integrity": "sha1-rhjVZ0wRQCG/299zhlymD0ECFaM=", + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + }, + "unist-util-find-all-after": { + "version": "3.0.2", + "resolved": "https://registry.nlark.com/unist-util-find-all-after/download/unist-util-find-all-after-3.0.2.tgz", + "integrity": "sha1-/f7NFMW3rqXp7zjV4NX3dO61YfY=", + "dev": true, + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.nlark.com/unist-util-is/download/unist-util-is-4.1.0.tgz", + "integrity": "sha1-l25fRip6Xec9lLcGusG5BnG1d5c=", + "dev": true + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/unist-util-stringify-position/download/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha1-zOO/oc34W6c3XR1bF73Eytqb2do=", + "dev": true, + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-2.0.2.tgz", + "integrity": "sha1-2JgQgj+qsd8VSbfZenb4Ziuub3o=", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/upper-case-first/download/upper-case-first-2.0.2.tgz", + "integrity": "sha1-mSwyc/iCq9GdHgKJTMFHEX+EQyQ=", + "dev": true, + "requires": { + "tslib": "^2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.nlark.com/tslib/download/tslib-2.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ftslib%2Fdownload%2Ftslib-2.3.0.tgz", + "integrity": "sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz?cache=0&sync_timestamp=1610237756396&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furi-js%2Fdownload%2Furi-js-4.4.1.tgz", + "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "v-viewer": { + "version": "1.6.4", + "resolved": "https://registry.nlark.com/v-viewer/download/v-viewer-1.6.4.tgz", + "integrity": "sha1-OeNrU0uqs0B2+4FnBManNN4Nxy8=", + "dev": true, + "requires": { + "throttle-debounce": "^2.0.1", + "viewerjs": "^1.5.0" + } + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz", + "integrity": "sha1-LeGWGMZtwkfc+2+ZM4A12CRaLO4=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.nlark.com/vfile/download/vfile-4.2.1.tgz?cache=0&sync_timestamp=1620239829054&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvfile%2Fdownload%2Fvfile-4.2.1.tgz", + "integrity": "sha1-A/Hc4o/GJcYlvGUUNQ+9sA+p5iQ=", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.nlark.com/vfile-message/download/vfile-message-2.0.4.tgz?cache=0&sync_timestamp=1620225355335&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvfile-message%2Fdownload%2Fvfile-message-2.0.4.tgz", + "integrity": "sha1-W0O4gXHUCerlhHfRPyPdQdUsNxo=", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "viewerjs": { + "version": "1.10.1", + "resolved": "https://registry.nlark.com/viewerjs/download/viewerjs-1.10.1.tgz", + "integrity": "sha1-B0me0EPQop4wArkPVcWyKL0adCw=", + "dev": true + }, + "vite": { + "version": "2.4.4", + "resolved": "https://registry.nlark.com/vite/download/vite-2.4.4.tgz", + "integrity": "sha1-jEAqB61F8Wj261Qovq048+Q2Pkc=", + "dev": true, + "requires": { + "esbuild": "^0.12.8", + "fsevents": "~2.3.2", + "postcss": "^8.3.6", + "resolve": "^1.20.0", + "rollup": "^2.38.5" + } + }, + "vite-plugin-mock": { + "version": "2.9.4", + "resolved": "https://registry.nlark.com/vite-plugin-mock/download/vite-plugin-mock-2.9.4.tgz", + "integrity": "sha1-DXOfwbL/Pzg/I6viuQbayiiVkJ0=", + "dev": true, + "requires": { + "@rollup/plugin-node-resolve": "^13.0.2", + "@types/mockjs": "^1.0.4", + "chalk": "^4.1.1", + "chokidar": "^3.5.2", + "connect": "^3.7.0", + "debug": "^4.3.2", + "esbuild": "0.11.3", + "fast-glob": "^3.2.7", + "path-to-regexp": "^6.2.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.3.2.tgz?cache=0&sync_timestamp=1607566512593&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.3.2.tgz", + "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "esbuild": { + "version": "0.11.3", + "resolved": "https://registry.nlark.com/esbuild/download/esbuild-0.11.3.tgz", + "integrity": "sha1-tXFluQe+T/umUfZFBTjOjYwdXrA=", + "dev": true + } + } + }, + "vite-plugin-style-import": { + "version": "1.1.1", + "resolved": "https://registry.nlark.com/vite-plugin-style-import/download/vite-plugin-style-import-1.1.1.tgz", + "integrity": "sha1-fM67BCvOlO6y9pXHM5NUotrEjCU=", + "dev": true, + "requires": { + "@rollup/pluginutils": "^4.1.1", + "change-case": "^4.1.2", + "debug": "^4.3.2", + "es-module-lexer": "^0.7.1", + "magic-string": "^0.25.7" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "4.1.1", + "resolved": "https://registry.nlark.com/@rollup/pluginutils/download/@rollup/pluginutils-4.1.1.tgz", + "integrity": "sha1-HU2obdTt7RVlalfZM/2iuaCNR+w=", + "dev": true, + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.3.2.tgz?cache=0&sync_timestamp=1607566512593&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.3.2.tgz", + "integrity": "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos=", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "vue": { + "version": "3.2.1", + "resolved": "https://registry.nlark.com/vue/download/vue-3.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue%2Fdownload%2Fvue-3.2.1.tgz", + "integrity": "sha1-MN3hUvL9rQZp6phU1akKAO+Wl0s=", + "requires": { + "@vue/compiler-dom": "3.2.1", + "@vue/runtime-dom": "3.2.1", + "@vue/shared": "3.2.1" + } + }, + "vue-eslint-parser": { + "version": "7.10.0", + "resolved": "https://registry.nlark.com/vue-eslint-parser/download/vue-eslint-parser-7.10.0.tgz?cache=0&sync_timestamp=1627452620913&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-eslint-parser%2Fdownload%2Fvue-eslint-parser-7.10.0.tgz", + "integrity": "sha1-6k5LEP0QqjXIp5rHg0iNirzSm+g=", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^6.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.nlark.com/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.nlark.com/espree/download/espree-6.2.1.tgz", + "integrity": "sha1-d/xy4f10SiBSwg84pbV1gy6Cc0o=", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1616463550093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, + "vue-i18n": { + "version": "9.1.6", + "resolved": "https://registry.nlark.com/vue-i18n/download/vue-i18n-9.1.6.tgz", + "integrity": "sha1-TPmS4q7FRYvBk2mXPJbqfQ9WAyE=", + "requires": { + "@intlify/core-base": "9.1.6", + "@intlify/shared": "9.1.6", + "@intlify/vue-devtools": "9.1.6", + "@vue/devtools-api": "^6.0.0-beta.7" + } + }, + "vue-router": { + "version": "4.0.10", + "resolved": "https://registry.nlark.com/vue-router/download/vue-router-4.0.10.tgz", + "integrity": "sha1-7I/aAylJsqMdMnMXD483bobrUqw=", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.14" + } + }, + "vue-types": { + "version": "3.0.2", + "resolved": "https://registry.nlark.com/vue-types/download/vue-types-3.0.2.tgz", + "integrity": "sha1-7BbgXUEsA4Ji/B76TOuWR+f7YB0=", + "requires": { + "is-plain-object": "3.0.1" + } + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npm.taobao.org/warning/download/warning-4.0.3.tgz", + "integrity": "sha1-Fungd+uKhtavfWSqHgX9hbRnjKM=", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz?cache=0&sync_timestamp=1574116262707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz", + "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npm.taobao.org/write-file-atomic/download/write-file-atomic-3.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwrite-file-atomic%2Fdownload%2Fwrite-file-atomic-3.0.3.tgz", + "integrity": "sha1-Vr1cWlxwSBzRnFcb05q5ZaXeVug=", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.nlark.com/yaml/download/yaml-1.10.2.tgz?cache=0&sync_timestamp=1623654032636&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyaml%2Fdownload%2Fyaml-1.10.2.tgz", + "integrity": "sha1-IwHF/78StGfejaIzOkWeKeeSDks=", + "dev": true + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.nlark.com/yargs-parser/download/yargs-parser-20.2.9.tgz?cache=0&sync_timestamp=1624233275366&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyargs-parser%2Fdownload%2Fyargs-parser-20.2.9.tgz", + "integrity": "sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=", + "dev": true + }, + "zrender": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.1.1.tgz", + "integrity": "sha512-oeWlmUZPQdS9f5hK4pV21tHPqA3wgQ7CkKkw7l0CCBgWlJ/FP+lRgLFtUBW6yam4JX8y9CdHJo1o587VVrbcoQ==", + "requires": { + "tslib": "2.0.3" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.nlark.com/zwitch/download/zwitch-1.0.5.tgz", + "integrity": "sha1-0R1zgf/tFrdC9q97PyI9XNn+mSA=", + "dev": true + } + } +} diff --git a/admin-web/typescript-ant-design-vue/package.json b/admin-web/typescript-ant-design-vue/package.json new file mode 100644 index 00000000..018b40a9 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/package.json @@ -0,0 +1,68 @@ +{ + "version": "0.0.0", + "author": { + "name": "1024lab", + "email": "1024lab@sina.com", + "url": "https://1024lab.net" + }, + "license": "MIT", + "homepage": "https://smartadmin.1024lab.net", + "scripts": { + "dev": "vite", + "sit": "vite build --base=/manage/ --mode sit", + "localhost": "vite --mode localhost", + "build": "vue-tsc --noEmit && vite build", + "serve": "vite preview" + }, + "dependencies": { + "@types/js-cookie": "^2.2.7", + "ant-design-vue": "2.2.4", + "axios": "^0.21.1", + "clipboard": "^2.0.8", + "crypto-js": "^4.0.0", + "echarts": "^5.1.2", + "js-cookie": "^2.2.1", + "mitt": "^3.0.0", + "moment": "2.29.1", + "nprogress": "^0.2.0", + "pinia": "^2.0.0-beta.3", + "vue": "^3.2.1", + "vue-i18n": "9.1.6", + "vue-router": "^4.0.10" + }, + "devDependencies": { + "@types/nprogress": "^0.2.0", + "@typescript-eslint/eslint-plugin": "^4.28.0", + "@typescript-eslint/parser": "^4.28.0", + "@vitejs/plugin-legacy": "^1.5.1", + "@vitejs/plugin-vue": "^1.4.0", + "@vue/compiler-sfc": "^3.2.1", + "dotenv": "^10.0.0", + "eslint": "^7.29.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-vue": "^7.16.0", + "less": "^4.1.1", + "less-loader": "^10.0.1", + "postcss": "^8.3.5", + "prettier": "^2.3.1", + "rimraf": "^3.0.2", + "stylelint": "^13.13.1", + "stylelint-config-prettier": "^8.0.2", + "stylelint-config-standard": "^22.0.0", + "stylelint-order": "^4.1.0", + "typescript": "^4.3.4", + "v-viewer": "^1.5.1", + "vite": "^2.4.4", + "vite-plugin-mock": "^2.9.4", + "vite-plugin-style-import": "^1.1.1", + "vue-eslint-parser": "^7.10.0" + }, + "engines": { + "node": ">=12" + }, + "repository": { + "type": "git", + "url": "https://github.com/1024-lab/smart-admin.git" + } +} diff --git a/smart-admin-web/.postcssrc.js b/admin-web/typescript-ant-design-vue/postcss.config.js similarity index 51% rename from smart-admin-web/.postcssrc.js rename to admin-web/typescript-ant-design-vue/postcss.config.js index 961986e2..a47ef4f9 100644 --- a/smart-admin-web/.postcssrc.js +++ b/admin-web/typescript-ant-design-vue/postcss.config.js @@ -1,5 +1,5 @@ module.exports = { plugins: { - autoprefixer: {} - } -} + autoprefixer: {}, + }, +}; diff --git a/smart-admin-h5/public/favicon.ico b/admin-web/typescript-ant-design-vue/public/favicon.ico similarity index 100% rename from smart-admin-h5/public/favicon.ico rename to admin-web/typescript-ant-design-vue/public/favicon.ico diff --git a/admin-web/typescript-ant-design-vue/public/images/1024lab-gzh.jpg b/admin-web/typescript-ant-design-vue/public/images/1024lab-gzh.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d6b03f53c5696aa2c81fadc5b2c64454abc08155 GIT binary patch literal 27898 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 Bn_vI{ literal 0 HcmV?d00001 diff --git a/admin-web/typescript-ant-design-vue/public/images/google-icon.png b/admin-web/typescript-ant-design-vue/public/images/google-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4bc6e4b0820a9d52258c4111ca75b3a875062431 GIT binary patch literal 6228 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%0D7T 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

2A2D&#y=sjzTiBJuY|{74C-QwN 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%0DS!H(S7dxcoBrQke9(&cUjwPG7&Q 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 z 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 p5_fEdePB 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

)RC|LMuaf`gO>Ibx{w3@7iX=qWD!^vF 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

0rX2L)Y%aMM1oK0!H%)fq1# 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≷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%0AJgOYNb6yBWHW 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

_arnpTm|?r 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\K{jbFPD&aGsc{Gc4miERPl^E#{3GM=%8 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 z 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

#qea+BQm79Ix*Wf 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 aIF){hZ0W{618 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 co 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%0D0UPSw(6%sH<~*MrN(nNQUe`&vQX zmGLxrpkw#G-c;h&nVig%6MG=GXJaaDTcv6FG=X@Ly4OA5*fgdqR4C`6lsJS@dkBuE z*`4})JS|XHm+wHq5jj*H82}m}_`<>TSo_1XURgsJ)H!Yn4u8af>Y@i& zqPdf(R|$D^v(G4sML%kuUA4^jxsUClnvM5S=gn&Ur#|svd<{H7O>{EwUhm=!5*$q0yMO^?t8s@sJv@2qPdfRH^FeW zIWAjTzp7WH51oF|t?qM_hH9BT&X&q;*lpGUz_Y<

9|J$DIT4fn~&I;+YE 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 literal 0 HcmV?d00001 diff --git a/admin-web/typescript-ant-design-vue/public/images/login-form-open-eyes-close.png b/admin-web/typescript-ant-design-vue/public/images/login-form-open-eyes-close.png new file mode 100644 index 0000000000000000000000000000000000000000..89f85301e181ddf8f463b8cf4a75454271ebf404 GIT binary patch literal 4914 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

-af%1Zul`J}yKS!PghH0hw%v;gN+E0F84| z+_tbF4_B-Tt{80!*tMpbDOdX&y^5KJ zV73!*7augw0gFZU;Q|};Jv(I3ku=82q%usJS>J4C=`U}x%OYr^jESA?ROY~J|=av)(#w-O-CMUffkQ$Oow8%V?--HiC}$ZmZd z23cxIBSt<#3UJCW5W(Tln4pQj+Bb7SQQ?94WQx(HwdlcB!{ko^ud zru@uK)%kDRX1NpBY~U0Y;hWt=vgeaM?e!mYbh&ceUnD@@d_(!?%Z57?4FyIV@183| zSOzM~>RdE8BZr2cGJ-0)=Ykoba$DY*Z-F-a0M45lZ#EVMubMkMt?0bESkT__>u9fU z0(_muYkmNAZRW8atEKtZmN^%>$W+=oP~JHrW!@p*4|lnk)E}MD2|@kMTFWZDW32Rj z*^8C1vW@6r$l|DH6|J$?(y9pF4Y=di_!KB=#XKZ2Vt}C?gPiiFkCAV z^d)gHR0FuoCQGQB)J2UA)vS1){a#wTn#{(hSd{-Hg>K1%!&m6^pKQ1$Cuc|hXjF#9 z-M5bW@anhoI;F)1-hKHS8mK{AQ27~uVKG@tHH`VV z&gb?>MJ+EI9$1SudO|9&?}Dx%m>xF%fO4+LRfFLEOOv7;0bSe;o##kE&CJ#14ytFi z!=5x^YQ zO`m2bZsA238F0H!7idT?Umx?In)G*u<-=A?=rO#5wXKJVsw%6^_zfWcwB zFWhc4RBlAu38ti_7=O9<_UvH7BL+-G5})a3sbV_Z(} zS$J;)Wh~5iP|oHtU2ho7u&P667PPk4{UEpMzni^O1|}!0z!Iois(NR9GpJs6{C#OK z#`<`)TQ78En3hUN$HkW1(N=KB;mIgS=i4e6=;o%~Ua!*@zxn3wsY95#ebPHHZoEA| z;^o7i$@sORIH^=Mz@(eWP) z-y`=#`!M(R=&+%8bzB%R6h*N3@{el#R;N}H(3GK7tIDflx?Z~2c5>zEl%aNjS8-nm z9sXsXb)g?(_NLJG0kWPWm}Y1{zVdQZNn!((;<3kHO;mcjgNz%o#VoM}rr$?S@6z3N zyE?ls(Tn)BQUnxwe(C8y=hzn&3?yxc>3^x^rbD`0Xma|nJy{Hpq%s64QyWGeMljEp z7o(YusE%QESN{<#Gs7f>Jf9oK<8`zm>E0dMGhc5k+<@gfg+hrood02o-{O!LCaV$E z$iB>hp{_|?ioyT$q-DR=S4DQ>-QkgHETedmjttg?*Y$Q+MW21Eec{fX>oS2zpi+?j zo9Y0fe*C(ISETB??G!2P#K%muMk`sPp}sC}@twCPrA~1Fo3nS6OGD}r@3*c|WcA5! z7gej@uP$BOZiHFkagG}Hc3wx1DDCmVWB4YSyGS*80NG zi*gizuDO(Wd+?h@L%)E~{No1!yv8b&GQUdAq=mfON|{xB)9;7%lP&$GS1p+MWg(Jn z(kj*$6s_MT2W^^%HR#HoZqNUIHr(0?OT3d|*7a;GiwZ@8J|&7u5(lrJii$bWwvn+& zCi{{fhERzHL#n%JP}E{l3`2jp>|XsrR_2?;WR0oq1EU;@%hu*{NSh$D`Zs=#lL4s$ zoO+F073-R5_hs=~j~OzO1WobZE8BVZ)Mrvjf@%blHFV`&508rQ;F(#E`XkB90GIX1 zu9TBI30~Lso~qRwB9_AWltG%Jn1qR1@zYiqIF@fNz7f|Y;;?}Y2v$pOxZ?*b_};Sf zGU1aBmlQ)Z^ligO)FEV<-?yNJv^9G-GQQ@vRAH=jNIn9c=23?FpI6NMVH969U4KMR zS}ie?X0KOt(bQKwYC0Oq=miR-Mkjwal6i?-Lr0%rEt+gbW5h6mf+tsm9U@)dG=$u~E)D-b=9$fQX4CJvd z#Iq#ru$(M8Bn8$S4HY{(oMA2`Fx zdXhGvDh#M4ekw|;{i73Ok4&ALZBeI&f)*{{axC2-TF5Cg&zOS>V#Z^ z*L2fEl9pbLC1bCjACX;9h46=FrGEDQ{(+Q>c!2T;NF4VqU6<86eEu@$U%7f{RMNUHKD-*VvaiwQj(lR9D*4?&(F4L zS4DYYOK2pz3!q&oXV8N~RmCWFSKKch%uq-?S1}<&4DJxo!w@b-%}5AGD)zLU`5~~K zY(OA-mv%h50DZF)*~x9ImI{|utVuPr6%}|B{tv8-r8|#Z8r?a)+|{OO%gGGHQOk_t zU_26zmoO5bc zT3E=dU(;}|YM&4PYn~^zpiMF;3Ty%@j_a!KC@)OsK_QMqG8;kla|M+un>xp)iHVd`7u^&%9U(XzLMq8L7lx$O zNxz~BUVj$B(XPcFin9IvyHg0k0X$nD)tNPh+{DeF%EEnsCBWN!_=e0CMQwiJcRvqI z{$=3tlsHir1MaM)G}8Vr_dbAzD0cU?QhYx~f8z3_*=JIuCe+V+U>qi{l}N9lLAe3wI=3c|84^rSL0#hTE=&#cUTwwpukyAKCBmrT zxGbjf!jbV1V$m{Z2%^6LTD;^8g-mu5ITQ-Z1A((;AA`lF8zp=B>CjLRhIb6QTr8jhbHQc8qF3zr13`#DVl(8C>F5eTBnpu%$gi!x=F1 zLco~>9(wuVG5TV&Zq@}OaGJ_rWV{T(E3ja!B?Q0E(qEsCGH((CUnQ6nup$UpqYJTb z_pz}gS(9#exZww_dPDDI5}}Hn#C&ZgTF>Td?VZbd{D}2w8J{ylS0iQtw;Ym7XDOj7*;$YSIC?vtFCv{`SY zsmyJ+uSBa}M{gASl^F(wWfQ~1XD+5c5C&TurH=ITUrHYg0vowK6@9N0)oDNTF0V_R z6=daGhg@)fs2Ccec1s8bijUA+MVadjwn zolY1U7asa%5jr|3ZoUXnuDU!H`=Ls$bm*3tnLW+*uu5$pFnYcoQJ_T;^AdqO3?qcp z(((<4Oh4EMBc$VA`fWj9Di-r!Mp|B6C_Gw}Xwo@0X)|Jqou*|*>2UM|xR27mpi1X7 z4ACJo;G-LYgXKz%=bX+{0Yj_3M@Qte)jM1wqtS2Cbt>zQABp2T>mxoAhw1r}{q;Ju zc@hb3MZf9=>hf>~7eO_2Xi@ZTFdVR;qIx<*yqQEsn(+HovX* z)0)Yodo@a3%q9Ao9G1|F@67t0OBW9g?ZToMp2P3Bx+G7lJexPS|L%Ynk{sId1cGu& zBi86&---pm|8k6?P?mu!44zC2fGC2+<|MC0fy3lmRLi)p-YMhAJ(hKIL$%;)48&A+ zZ`Ea-h>0uhY6k&+|L80;iTEptIvo$kX9D&knb9}Fy&ycohoXlO(%tF}xuc%+{Jv5+ zum`J#QBRBoBe}?EYS*|S94^MznT9#yH~&w)mcN7wR4iRX1e58qR@HyqJ(qXvO)szg zJpbBf$CCT42PlHUML(T}uM;eOrzy+H;;uOfYE%4OIKON%Ch}#;4lx7RH>8Y;Gi3qx zThl&~!RDKle`f`;PD^d$*2vZ>_iOBj3@E-OL86LlM|;EAzDxGdpiCY&P0b3H$=?d( z>ka0Ad|%x?NxuJzP^muY{f>p7*|&WO|v@<&1lnHkJ(qeQd)4(OM-_ zU#WjC2u`AZ&dt!FR5vBBp`gd*v~xo_t0aI8DuD_}+WP^daRc zXdz|tHJnmo|K{fIJGk80;Kcvk%4X8yy|WN_lrm{szk~o|ZzDoVtwmZ(;G$~fz~iSm zOJ}NCdTG7CS2;wuvOfBP3MBY>(3VZA`0H$sL%#u7bu=<8!A-C6?tQ^UPy%8`wu7F} zGBh_GQHx{r(yCRlf2w3*op`M_;33T-0EqJc|LzlRAB=2SN6MRk%o&B2{+;*GFF7Q6 zvM%*|f7=?}=;^k%*Zi5VYq0Y1ejLR6fo}MwGrM~KkLh+XgR$XvEpvl< zD=FT$bE0(S?W1p}8#!AYz>-NSY;bwX{I|~eO;yrZ`DkN|8OblX*i`ikAnp)0x1ach z=v|btO!)e>G=aVIM8A6T)zGojQ6UvVL06uEH0dZyEZi&hZG6}Bi2^rIjD>wU2D;om zNrPzP1mT2>6?^FdFI2(<-hsu8>+EF#4U8cqxLL11?3F`{8UGl(%bdi*NjzAkJ@8Xh zjwLMrLk4%cbM8~2x;#Nhobygb5>Oq~NW;gQNlT|-upE|(h*o88%;W-Q6Q8<-)q=6*SIaQ!a;@RC|Y4T>&d+sjhsGQspqquJL^$u+XGeE^d>a8^2I={+=7N2sK z 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 literal 0 HcmV?d00001 diff --git a/admin-web/typescript-ant-design-vue/public/images/login-qr.png b/admin-web/typescript-ant-design-vue/public/images/login-qr.png new file mode 100644 index 0000000000000000000000000000000000000000..9f002819dcf8ae00ab0e7f624c6a251d509cc980 GIT binary patch literal 11297 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 literal 0 HcmV?d00001 diff --git a/smart-admin-web/src/assets/images/logo-min.png b/admin-web/typescript-ant-design-vue/public/images/logo-min.png similarity index 100% rename from smart-admin-web/src/assets/images/logo-min.png rename to admin-web/typescript-ant-design-vue/public/images/logo-min.png diff --git a/admin-web/typescript-ant-design-vue/public/images/logo.png b/admin-web/typescript-ant-design-vue/public/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9b11579ea73c684f8817bcee35ea21670ca4a994 GIT binary patch literal 6053 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 literal 0 HcmV?d00001 diff --git a/admin-web/typescript-ant-design-vue/public/images/qq-icon.png b/admin-web/typescript-ant-design-vue/public/images/qq-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..87cefd14e216fdb8870c9837902c2526c412cc3a GIT binary patch literal 5353 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 Hu0mjfP3RiF literal 0 HcmV?d00001 diff --git a/admin-web/typescript-ant-design-vue/public/images/wechat-icon.png b/admin-web/typescript-ant-design-vue/public/images/wechat-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..23a41d6ecc1389c8a10497020a0cd6ab89366798 GIT binary patch literal 6657 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 JPDHLkV1i5|ztjK# literal 0 HcmV?d00001 diff --git a/admin-web/typescript-ant-design-vue/src/App.vue b/admin-web/typescript-ant-design-vue/src/App.vue new file mode 100644 index 00000000..6de3cc75 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/App.vue @@ -0,0 +1,50 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/api/base-model/page-param-model.ts b/admin-web/typescript-ant-design-vue/src/api/base-model/page-param-model.ts new file mode 100644 index 00000000..434fb682 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/base-model/page-param-model.ts @@ -0,0 +1,35 @@ +/* + * @Description: 分页查询你参数 + * @Author: zhuoda + * @Date: 2021-08-12 + * @LastEditTime: 2021-08-14 + * @LastEditors: zhuoda + */ +import { SortItemModel } from './sort-item-model'; + +/** + * + * @export + * @interface PageResultDto + */ +export interface PageParamModel { + /** + * 页码(不能为空) + * @type {number} + * @memberof ClueUserQueryForm + */ + pageNum: number; + /** + * 每页数量(不能为空) + * @type {number} + * @memberof ClueUserQueryForm + */ + pageSize: number; + + /** + * 排序字段集合 + * @type {Array} + * @memberof ClueUserQueryForm + */ + sortItemList?: Array; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/base-model/page-result-model.ts b/admin-web/typescript-ant-design-vue/src/api/base-model/page-result-model.ts new file mode 100644 index 00000000..7f145710 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/base-model/page-result-model.ts @@ -0,0 +1,50 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-11 18:12:07 + * @LastEditTime: 2021-08-12 15:11:54 + * @LastEditors: zhuoda + */ +/** + * + * @export + * @interface PageResultModel + */ +export interface PageResultModel { + /** + * 是否为空 + * @type {boolean} + * @memberof PageResultModel + */ + emptyFlag?: boolean; + /** + * 结果集 + * @type {Array} + * @memberof PageResultModel + */ + list: Array; + /** + * 当前页 + * @type {number} + * @memberof PageResultModel + */ + pageNum?: number; + /** + * 每页的数量 + * @type {number} + * @memberof PageResultModel + */ + pageSize?: number; + /** + * 总页数 + * @type {number} + * @memberof PageResultModel + */ + pages?: number; + /** + * 总记录数 + * @type {number} + * @memberof PageResultModel + */ + total: number; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/base-model/response-model.ts b/admin-web/typescript-ant-design-vue/src/api/base-model/response-model.ts new file mode 100644 index 00000000..19ee2f8d --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/base-model/response-model.ts @@ -0,0 +1,30 @@ + +/** + * + */ +export interface ResponseModel { + /** + * + * @type {number} + * @memberof ResponseDtoOfLoginDetailVo + */ + code: number; + /** + * + * @type {LoginDetailVo} + * @memberof ResponseDtoOfLoginDetailVo + */ + data: T; + /** + * + * @type {string} + * @memberof ResponseDtoOfLoginDetailVo + */ + msg?: string; + /** + * + * @type {boolean} + * @memberof ResponseDtoOfLoginDetailVo + */ + success: boolean; +} \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/src/api/base-model/sort-item-model.ts b/admin-web/typescript-ant-design-vue/src/api/base-model/sort-item-model.ts new file mode 100644 index 00000000..a2795f38 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/base-model/sort-item-model.ts @@ -0,0 +1,24 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-11 + * @LastEditTime: 2021-08-14 + * @LastEditors: zhuoda + */ +/** + * + */ +export interface SortItemModel { + /** + * + * @type {boolean} + * @memberof SortItemModel + */ + asc: boolean; + /** + * + * @type {string} + * @memberof SortItemModel + */ + column: string; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/business/category/category-api.ts b/admin-web/typescript-ant-design-vue/src/api/business/category/category-api.ts new file mode 100644 index 00000000..496346d3 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/category/category-api.ts @@ -0,0 +1,38 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-12 16:46:21 + * @LastEditTime: 2021-08-12 16:47:04 + * @LastEditors: zhuoda + */ +import { ResponseModel } from '../../base-model/response-model'; +import { CategoryAddForm } from './model/category-add-form'; +import { CategoryTreeQueryForm } from './model/category-tree-query-form'; +import { CategoryTreeVo } from './model/category-tree-vo'; +import { CategoryUpdateForm } from './model/category-update-form'; +import { getRequest, postRequest } from '/@/lib/axios'; + +export const categoryApi = { + // 添加类目 by zhuoda + addCategory: (param: CategoryAddForm) => { + return postRequest>('/category/add', param); + }, + // GET + // 删除类目 by zhuoda + deleteCategoryById: (categoryId: number) => { + return getRequest>(`/category/del/${categoryId}`); + }, + // 查询类目层级树 by zhuoda + queryCategoryTree: (param: CategoryTreeQueryForm) => { + return postRequest>('/category/tree', param); + }, + // 更新类目 by zhuoda + updateCategory: (param: CategoryUpdateForm) => { + return postRequest>('/category/update', param); + }, + // 查询类目详情 by zhuoda + getCategory: (categoryId: number) => { + // POST /admin/clue/user/track/add + return getRequest>(`/category/${categoryId}`); + }, +}; diff --git a/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-add-form.ts b/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-add-form.ts new file mode 100644 index 00000000..d7d54765 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-add-form.ts @@ -0,0 +1,43 @@ +/** + * + * @export + * @interface CategoryAddDto + */ +export interface CategoryAddForm { + /** + * 类目名称 + * @type {string} + * @memberof CategoryAddDto + */ + categoryName: string; + /** + * 分类类型:
export const
CATEGORY_TYPE_ENUM =

+ * @type {number} + * @memberof CategoryAddDto + */ + categoryType: number; + /** + * 禁用状态 + * @type {boolean} + * @memberof CategoryAddDto + */ + disabledFlag?: boolean; + /** + * 父级类目id|可选 + * @type {number} + * @memberof CategoryAddDto + */ + parentId?: number; + /** + * 备注|可选 + * @type {string} + * @memberof CategoryAddDto + */ + remark?: string; + /** + * 排序|可选 + * @type {number} + * @memberof CategoryAddDto + */ + sort?: number; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-tree-query-form.ts b/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-tree-query-form.ts new file mode 100644 index 00000000..3fae312f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-tree-query-form.ts @@ -0,0 +1,19 @@ +/** + * + * @export + * @interface CategoryTreeQueryDto + */ +export interface CategoryTreeQueryForm { + /** + * 分类类型|可选:
export const
CATEGORY_TYPE_ENUM
+ * @type {number} + * @memberof CategoryTreeQueryDto + */ + categoryType: number; + /** + * 父级类目id|可选 + * @type {number} + * @memberof CategoryTreeQueryDto + */ + parentId?: number; +} \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-tree-vo.ts b/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-tree-vo.ts new file mode 100644 index 00000000..31f058d7 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-tree-vo.ts @@ -0,0 +1,49 @@ +/** + * + * @export + * @interface CategoryTreeVo + */ +export interface CategoryTreeVo { + /** + * 类目层级全称 + * @type {string} + * @memberof CategoryTreeVo + */ + categoryFullName?: string; + /** + * 类目id + * @type {number} + * @memberof CategoryTreeVo + */ + categoryId?: number; + /** + * 类目名称 + * @type {string} + * @memberof CategoryTreeVo + */ + categoryName?: string; + /** + * 子类 + * @type {Array} + * @memberof CategoryTreeVo + */ + children?: Array; + /** + * 类目名称 + * @type {string} + * @memberof CategoryTreeVo + */ + label?: string; + /** + * 父级id + * @type {number} + * @memberof CategoryTreeVo + */ + parentId?: number; + /** + * 类目id + * @type {number} + * @memberof CategoryTreeVo + */ + value?: number; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-update-form.ts b/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-update-form.ts new file mode 100644 index 00000000..444a5777 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-update-form.ts @@ -0,0 +1,49 @@ +/** + * + * @export + * @interface CategoryUpdateDto + */ +export interface CategoryUpdateForm { + /** + * 类目id + * @type {number} + * @memberof CategoryUpdateDto + */ + categoryId?: number; + /** + * 类目名称 + * @type {string} + * @memberof CategoryUpdateDto + */ + categoryName: string; + /** + * 分类类型:
export const
CATEGORY_TYPE_ENUM
+ * @type {number} + * @memberof CategoryUpdateDto + */ + categoryType: number; + /** + * 禁用状态 + * @type {boolean} + * @memberof CategoryUpdateDto + */ + disabledFlag?: boolean; + /** + * 父级类目id|可选 + * @type {number} + * @memberof CategoryUpdateDto + */ + parentId?: number; + /** + * 备注|可选 + * @type {string} + * @memberof CategoryUpdateDto + */ + remark?: string; + /** + * 排序|可选 + * @type {number} + * @memberof CategoryUpdateDto + */ + sort?: number; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-vo.ts b/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-vo.ts new file mode 100644 index 00000000..f6dedc29 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/category/model/category-vo.ts @@ -0,0 +1,61 @@ +/** + * + * @export + * @interface CategoryVo + */ +export interface CategoryVo { + /** + * 类目id + * @type {number} + * @memberof CategoryVo + */ + categoryId?: number; + /** + * 类目名称 + * @type {string} + * @memberof CategoryVo + */ + categoryName: string; + /** + * 分类类型:
export const
CATEGORY_TYPE_ENUM
+ * @type {number} + * @memberof CategoryVo + */ + categoryType: number; + /** + * + * @type {Date} + * @memberof CategoryVo + */ + createTime?: Date; + /** + * 禁用状态 + * @type {boolean} + * @memberof CategoryVo + */ + disabledFlag?: boolean; + /** + * 父级类目id|可选 + * @type {number} + * @memberof CategoryVo + */ + parentId?: number; + /** + * 备注|可选 + * @type {string} + * @memberof CategoryVo + */ + remark?: string; + /** + * 排序|可选 + * @type {number} + * @memberof CategoryVo + */ + sort?: number; + /** + * + * @type {Date} + * @memberof CategoryVo + */ + updateTime?: Date; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/business/file/file-api.ts b/admin-web/typescript-ant-design-vue/src/api/business/file/file-api.ts new file mode 100644 index 00000000..5195ae3f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/file/file-api.ts @@ -0,0 +1,19 @@ +/* + * @Description: + * @version: + * @Author: zhuoda + * @Date: 2021-08-17 23:32:36 + * @LastEditors: zhuoda + * @LastEditTime: 2021-08-18 14:35:52 + */ +import { ResponseModel } from '../../base-model/response-model'; +import { FileUploadVo } from './model/file-upload-vo'; +import { postRequest } from '/@/lib/axios'; + +export const fileApi = { + // 文件上传 by zhuoda + uploadUrl: '/file/upload', + uploadFile: (param: any, folder: number) => { + return postRequest>(`/file/upload?folder=${folder}`, param); + }, +}; diff --git a/admin-web/typescript-ant-design-vue/src/api/business/file/model/file-upload-vo.ts b/admin-web/typescript-ant-design-vue/src/api/business/file/model/file-upload-vo.ts new file mode 100644 index 00000000..17eb9674 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/file/model/file-upload-vo.ts @@ -0,0 +1,38 @@ +/* + * @Description: + * @version: + * @Author: zhuoda + * @Date: 2021-08-18 10:41:31 + * @LastEditors: zhuoda + * @LastEditTime: 2021-08-18 18:02:18 + */ +export interface FileUploadVo { + /** + * 文件id + */ + fileId?: number; + /** + * fileKey + */ + fileKey: string; + /** + * 文件名称 + */ + fileName?: string; + /** + * 文件大小 + */ + fileSize?: number; + /** + * 文件类型 + */ + fileType?: string; + /** + * fileUrl + */ + fileUrl?: string; + /** + * 自定义的url用于文件上传的展示 + */ + url?: string; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/business/goods/goods-api.ts b/admin-web/typescript-ant-design-vue/src/api/business/goods/goods-api.ts new file mode 100644 index 00000000..b773fe20 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/goods/goods-api.ts @@ -0,0 +1,30 @@ +import { postRequest } from '/@/lib/axios'; +import { ResponseModel } from '/@/api/base-model/response-model'; +import {GoodsAddForm} from "./model/goods-add-form"; +import {GoodsDelDto} from "./model/goods-del-dto"; +import {GoodsQueryDto} from "./model/goods-query-dto"; +import { GoodsUpdateForm } from './model/goods-update-form'; +import { GoodsAdminVo } from './model/goods-admin-vo'; +import { PageResultModel } from '../../base-model/page-result-model'; + +export const goodsApi = { + // 添加商品 by zhuoda + addGoods: (param: GoodsAddForm) => { + return postRequest>('/goods/add', param); + }, + // POST /admin/goods/del + // 删除 by zhuoda + deleteGoods: (param: GoodsDelDto) => { + return postRequest>('/goods/del', param); + }, + // POST /admin/goods/query + // 分页查询 by zhuoda + queryGoodsList: (param: GoodsQueryDto) => { + return postRequest>>('/goods/query', param); + }, + // POST /admin/goods/update + // 更新商品 by zhuoda + updateGoods: (param: GoodsUpdateForm) => { + return postRequest>('/goods/update', param); + } +}; diff --git a/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-add-form.ts b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-add-form.ts new file mode 100644 index 00000000..e554c81f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-add-form.ts @@ -0,0 +1,67 @@ +/** + * + * @export + * @interface GoodsAddDto + */ +export interface GoodsAddForm { + /** + * 商品分类 + * @type {number} + * @memberof GoodsAddDto + */ + categoryId?: number; + /** + * 商品封面 + * @type {string} + * @memberof GoodsAddDto + */ + coverPic?: string; + /** + * 商品简介 + * @type {string} + * @memberof GoodsAddDto + */ + goodsIntro?: string; + /** + * 商品名称 + * @type {string} + * @memberof GoodsAddDto + */ + goodsName?: string; + /** + * 商品类型|可选:
export const
GOODS_TYPE_ENUM
+ * @type {number} + * @memberof GoodsAddDto + */ + goodsType?: number; + /** + * 商品分组:
export const
GOODS_GROUP_TYPE_ENUM =
+ * @type {number} + * @memberof GoodsAddDto + */ + groupType?: number; + /** + * 商品价格 + * @type {number} + * @memberof GoodsAddDto + */ + price?: number; + /** + * 上架状态 + * @type {boolean} + * @memberof GoodsAddDto + */ + shelvesFlag?: boolean; + /** + * 第三方商品id|可选 + * @type {number} + * @memberof GoodsAddDto + */ + thirdGoodsId?: number; + /** + * 备注|可选 + * @type {string} + * @memberof GoodsUpdateDto + */ + remark?: string; +} \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-admin-vo.ts b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-admin-vo.ts new file mode 100644 index 00000000..300948bc --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-admin-vo.ts @@ -0,0 +1,93 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-12 18:10:22 + * @LastEditTime: 2021-09-01 21:25:35 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/business/goods/model/goods-admin-vo.ts + */ +/** + * + * @export + * @interface GoodsAdminVo + */ +export interface GoodsAdminVo { + /** + * 商品分类 + * @type {number} + * @memberof GoodsAdminVo + */ + categoryId?: number; + /** + * 商品封面 + * @type {string} + * @memberof GoodsAdminVo + */ + coverPic?: string; + /** + * + * @type {Date} + * @memberof GoodsAdminVo + */ + createTime?: Date; + /** + * 商品id + * @type {number} + * @memberof GoodsAdminVo + */ + goodsId: number; + /** + * 商品简介 + * @type {string} + * @memberof GoodsAdminVo + */ + goodsIntro?: string; + /** + * 商品名称 + * @type {string} + * @memberof GoodsAdminVo + */ + goodsName?: string; + /** + * 商品类型|可选:
export const
GOODS_TYPE_ENUM
+ * @type {number} + * @memberof GoodsAdminVo + */ + goodsType: number; + /** + * 商品分组:
export const
GOODS_GROUP_TYPE_ENUM
+ * @type {number} + * @memberof GoodsAdminVo + */ + groupType: number; + /** + * 商品价格 + * @type {number} + * @memberof GoodsAdminVo + */ + price?: number; + /** + * + * @type {string} + * @memberof GoodsAdminVo + */ + remark?: string; + /** + * 上架状态 + * @type {boolean} + * @memberof GoodsAdminVo + */ + shelvesFlag?: boolean; + /** + * 第三方商品id|可选 + * @type {number} + * @memberof GoodsAdminVo + */ + thirdGoodsId?: number; + /** + * + * @type {Date} + * @memberof GoodsAdminVo + */ + updateTime?: Date; +} \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-del-dto.ts b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-del-dto.ts new file mode 100644 index 00000000..37ad0d3a --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-del-dto.ts @@ -0,0 +1,13 @@ +/** + * + * @export + * @interface GoodsDelDto + */ +export interface GoodsDelDto { + /** + * 商品id集合 + * @type {Array} + * @memberof GoodsDelDto + */ + goodsIdList?: Array; +} \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-query-dto.ts b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-query-dto.ts new file mode 100644 index 00000000..0c91f9ad --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-query-dto.ts @@ -0,0 +1,60 @@ +import { + SortItemModel +} from '../../../base-model/sort-item-model'; + +/** + * + * @export + * @interface GoodsQueryDto + */ +export interface GoodsQueryDto { + /** + * 商品分类 + * @type {number} + * @memberof GoodsQueryDto + */ + categoryId?: number; + /** + * 商品类型|可选:
export const
GOODS_TYPE_ENUM
+ * @type {number} + * @memberof GoodsQueryDto + */ + goodsType?: number; + /** + * 商品分组:
export const
GOODS_GROUP_TYPE_ENUM
+ * @type {number} + * @memberof GoodsQueryDto + */ + groupType?: number; + /** + * 页码(不能为空) + * @type {number} + * @memberof GoodsQueryDto + */ + pageNum: number; + /** + * 每页数量(不能为空) + * @type {number} + * @memberof GoodsQueryDto + */ + pageSize: number; + /** + * 搜索词 + * @type {string} + * @memberof GoodsQueryDto + */ + searchWord?: string; + /** + * 上架状态 + * @type {boolean} + * @memberof GoodsQueryDto + */ + shelvesFlag?: boolean | string; + /** + * 排序字段集合 + * @type {Array} + * @memberof GoodsQueryDto + */ + sortItemList?: Array; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-update-form.ts b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-update-form.ts new file mode 100644 index 00000000..c5a1dfac --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-update-form.ts @@ -0,0 +1,73 @@ +/** + * + * @export + * @interface GoodsUpdateDto + */ +export interface GoodsUpdateForm { + /** + * 商品分类 + * @type {number} + * @memberof GoodsUpdateDto + */ + categoryId?: number; + /** + * 商品封面 + * @type {string} + * @memberof GoodsUpdateDto + */ + coverPic?: string; + /** + * 商品id + * @type {number} + * @memberof GoodsUpdateDto + */ + goodsId?: number; + /** + * 商品简介 + * @type {string} + * @memberof GoodsUpdateDto + */ + goodsIntro?: string; + /** + * 商品名称 + * @type {string} + * @memberof GoodsUpdateDto + */ + goodsName?: string; + /** + * 商品类型|可选:
export const
GOODS_TYPE_ENUM
+ * @type {number} + * @memberof GoodsUpdateDto + */ + goodsType?: number; + /** + * 商品分组:
export const
GOODS_GROUP_TYPE_ENUM
+ * @type {number} + * @memberof GoodsUpdateDto + */ + groupType?: number; + /** + * 商品价格 + * @type {number} + * @memberof GoodsUpdateDto + */ + price?: number; + /** + * 上架状态 + * @type {boolean} + * @memberof GoodsUpdateDto + */ + shelvesFlag?: boolean; + /** + * 第三方商品id|可选 + * @type {number} + * @memberof GoodsUpdateDto + */ + thirdGoodsId?: number; + /** + * 备注|可选 + * @type {string} + * @memberof GoodsUpdateDto + */ + remark?: string; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-vo.ts b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-vo.ts new file mode 100644 index 00000000..b5785e21 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods-vo.ts @@ -0,0 +1,25 @@ +/** + * + * @export + * @interface Goods + */ +export interface GoodsVo { + /** + * 实际销售单价 + * @type {number} + * @memberof Goods + */ + actualSalePrice?: number; + /** + * 件数 + * @type {number} + * @memberof Goods + */ + count?: number; + /** + * 商品id + * @type {number} + * @memberof Goods + */ + goodsId?: number; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods.ts b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods.ts new file mode 100644 index 00000000..04e50202 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/business/goods/model/goods.ts @@ -0,0 +1,15 @@ +export interface Goods { + /** + * 实际销售单价 + */ + actualSalePrice?: number; + /** + * 件数 + */ + count?: number; + /** + * 商品id + */ + goodsId?: number; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/department/department-api.ts b/admin-web/typescript-ant-design-vue/src/api/system/department/department-api.ts new file mode 100644 index 00000000..7b732da9 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/department/department-api.ts @@ -0,0 +1,66 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-12 17:56:25 + * @LastEditTime: 2021-08-16 10:45:05 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/department/department-api.ts + */ +import { ResponseModel } from '../../base-model/response-model'; +import { DepartmentCreateDto } from './model/department-create-dto'; +import { DepartmentTreeVo } from './model/department-tree-vo'; +import { DepartmentVo } from './model/department-vo'; +import { getRequest, postRequest } from '/@/lib/axios'; +export const departmentApi = { + /** + * @description: 查询部门列表 + * @param {*} + * @return {*} + */ + queryAllDepartment: (): Promise> => { + return getRequest>>('/department/listAll'); + }, + + /** + * @description: 查询部门树形列表 + * @param {*} + * @return {*} + */ + departmentTree: (): Promise> => { + return getRequest>>('/department/treeList'); + }, + + /** + * @description: 获取校区列表 by zhuoda + * @param {*} + * @return {*} + */ + querySchoolDepartmentList: (): Promise> => { + return getRequest>('/department/querySchoolList'); + }, + + /** + * @description: 添加部门 by zhuoda + * @param {*} + * @return {*} + */ + addDepartment: (param: DepartmentCreateDto) => { + return postRequest>('/department/add', param); + }, + /** + * @description: 更新部门信息 by zhuoda + * @param {*} + * @return {*} + */ + updateDepartment: (param: DepartmentCreateDto) => { + return postRequest>('/department/update', param); + }, + /** + * @description: 获取校区列表 by zhuoda + * @param {*} + * @return {*} + */ + deleteDepartment: (deptId: number) => { + return getRequest>(`/department/delete/${deptId}`); + }, +}; diff --git a/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-create-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-create-dto.ts new file mode 100644 index 00000000..758a67ad --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-create-dto.ts @@ -0,0 +1,32 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface DepartmentCreateDto { + /** + * 部门负责人id + */ + managerId?: number; + /** + * 部门名称 + */ + name?: string; + /** + * 上级部门id (可选) + */ + parentId?: number; + /** + * 部门简称 + */ + shortName?: string; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-simple-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-simple-vo.ts new file mode 100644 index 00000000..c98223eb --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-simple-vo.ts @@ -0,0 +1,30 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-12 18:19:34 + * @LastEditTime: 2021-09-01 + * @LastEditors: zhuoda + */ +/** + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface DepartmentSimpleVo { + /** + * 部门id + */ + id: number; + /** + * 部门名称 + */ + name: string; + /** + * 部门简称 + */ + shortName?: string; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-tree-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-tree-vo.ts new file mode 100644 index 00000000..382f44dc --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-tree-vo.ts @@ -0,0 +1,63 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-12 17:53:15 + * @LastEditTime: 2021-09-01 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/department/model/department-tree-vo.ts + */ +/** + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface DepartmentTreeVo { + /** + * 子部门 + */ + children?: Array; + /** + * 部门id + */ + id: number; + /** + * 部门负责人id + */ + managerId?: number; + /** + * 部门负责人姓名 + */ + managerName?: string; + /** + * 部门名称 + */ + name: string; + /** + * 同级下一个元素id + */ + nextId?: number; + /** + * 父级部门id + */ + parentId?: number; + /** + * 父级部门名称 + */ + parentName?: string; + /** + * 同级上一个元素id + */ + preId?: number; + /** + * 部门简称 + */ + shortName?: string; + /** + * 排序 + */ + sort?: number; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-update-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-update-dto.ts new file mode 100644 index 00000000..c490ea27 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-update-dto.ts @@ -0,0 +1,36 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface DepartmentUpdateDto { + /** + * 部门id + */ + id?: number; + /** + * 部门负责人id + */ + managerId?: number; + /** + * 部门名称 + */ + name?: string; + /** + * 上级部门id (可选) + */ + parentId?: number; + /** + * 部门简称 + */ + shortName?: string; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-vo.ts new file mode 100644 index 00000000..dc779eb6 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/department/model/department-vo.ts @@ -0,0 +1,59 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-12 18:51:32 + * @LastEditTime: 2021-09-01 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/department/model/department-vo.ts + */ +/** + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface DepartmentVo { + /** + * 部门id + */ + id: number; + /** + * 部门负责人id + */ + managerId?: number; + /** + * 部门负责人姓名 + */ + managerName?: string; + /** + * 部门名称 + */ + name: string; + /** + * 同级下一个元素id + */ + nextId?: number; + /** + * 父级部门id + */ + parentId?: number; + /** + * 父级部门名称 + */ + parentName?: string; + /** + * 同级上一个元素id + */ + preId?: number; + /** + * 部门简称 + */ + shortName?: string; + /** + * 排序 + */ + sort?: number; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/employee/employee-api.ts b/admin-web/typescript-ant-design-vue/src/api/system/employee/employee-api.ts new file mode 100644 index 00000000..4212f04b --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/employee/employee-api.ts @@ -0,0 +1,102 @@ +/* + * @Description: 员工api + * @Author: zhuoda + * @Date: 2021-08-12 18:00:56 + * @LastEditTime: 2021-08-25 11:24:51 + * @LastEditors: zhuoda + */ + +import { PageResultModel } from '../../base-model/page-result-model'; +import { ResponseModel } from '../../base-model/response-model'; +import { EmployeeAddDto } from './model/employee-add-dto'; +import { EmployeeDepartmentUpdateDto } from './model/employee-department-update-dto'; +import { EmployeeQueryDto } from './model/employee-query-dto'; +import { EmployeeUpdateDto } from './model/employee-update-dto'; +import { EmployeeVo } from './model/employee-vo'; +import { getRequest, postRequest } from '/@/lib/axios'; +export const employeeApi = { + /** + * @description: 查询所有员工 by zhuoda + * @param {*} + * @return {*} + */ + queryAll: (): Promise> => { + return getRequest>('/employee/queryAll'); + }, + /** + * @description: 员工管理查询 + * @param {*} + * @return {*} + */ + queryEmployee: (params: EmployeeQueryDto): Promise>> => { + return postRequest>>('/employee/query', params); + }, + /** + * @description: 添加员工 + * @param {EmployeeAddDto} params + * @return {*} + */ + addEmployee: (params: EmployeeAddDto) => { + return postRequest>('/employee/add', params); + }, + /** + * @description: 更新员工信息 + * @param {EmployeeUpdateDto} params + * @return {*} + */ + updateEmployee: (params: EmployeeUpdateDto) => { + return postRequest>('/employee/update', params); + }, + /** + * @description: 删除员工 + * @param {number} employeeId + * @return {*} + */ + deleteEmployee: (employeeId: number) => { + return getRequest>(`/employee/delete/${employeeId}`); + }, + /** + * @description: 批量删除员工 + * @param {number} employeeIdList + * @return {*} + */ + batchDeleteEmployee: (employeeIdList: number[]) => { + return getRequest>(`/employee/update/batch/delete?employeeIdList=${employeeIdList}`); + }, + /** + * @description: 批量调整员工部门 + * @param {EmployeeDepartmentUpdateDto} updateDto + * @return {*} + */ + batchUpdateDepartmentEmployee: (updateDto: EmployeeDepartmentUpdateDto) => { + return postRequest>('/employee/update/batch/department', updateDto); + }, + /** + * @description: 重置员工密码 + * @param {number} employeeId + * @return {*} + */ + resetPassword: (employeeId: number) => { + return getRequest>(`employee/update/pwd/reset/${employeeId}`); + }, + /** + * @description: 更新员工禁用状态 + * @param {number} employeeId + * @return {*} + */ + updateDisabled: (employeeId: number) => { + return getRequest>(`employee/update/disabled/${employeeId}`); + }, + /** + * @description: 查询员工-根据校区id + * @param {number} deptId + * @return {*} + */ + querySchoolEmployee: (deptId: number) => { + return getRequest>(`/employee/query/school/${deptId}`); + }, + // 查询员工-根据部门id + queryEmployeeByDeptId: (deptId: number) => { + return getRequest>(`/employee/query/dept/${deptId}`); + }, +}; diff --git a/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-add-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-add-dto.ts new file mode 100644 index 00000000..82352dd2 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-add-dto.ts @@ -0,0 +1,50 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-16 15:10:08 + * @LastEditTime: 2021-09-01 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/employee/model/employee-add-dto.ts + */ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface EmployeeAddDto { + /** + * 姓名 + */ + actualName?: string; + /** + * 部门id + */ + departmentId?: number; + /** + * 是否启用 + */ + disabledFlag?: boolean; + /** + * :
export const
GenderEnum =
{
  UNKNOWN:{
    value:0,
    desc:\'未知\'
  },
  MAN:{
    value:1,
    desc:\'男\'
  },
  WOMAN:{
    value:2,
    desc:\'女\'
  }
}
+ */ + gender?: number; + /** + * 登录账号 + */ + loginName?: string; + /** + * 手机号 + */ + phone?: string; + /** + * 角色列表 + */ + roleIdList?: Array; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-department-update-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-department-update-dto.ts new file mode 100644 index 00000000..65e4eef3 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-department-update-dto.ts @@ -0,0 +1,22 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface EmployeeDepartmentUpdateDto { + /** + * 部门ID集合 + */ + departmentId?: number; + /** + * 员工id + */ + employeeIdList?: Array; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-query-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-query-dto.ts new file mode 100644 index 00000000..e63f530b --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-query-dto.ts @@ -0,0 +1,45 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-14 16:52:13 + * @LastEditTime: 2021-08-14 16:53:58 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/employee/model/employee-query-dto.ts + */ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { PageParamModel } from "/@/api/base-model/page-param-model"; + +export interface EmployeeQueryDto extends PageParamModel{ + /** + * 部门id + */ + departmentId?: number; + /** + * 是否禁用 + */ + disabledFlag?: boolean; + /** + * 员工id集合 + */ + employeeIdList?: Array; + /** + * 搜索词 + */ + keyword?: string; + /** + * 是否查询总条数 + */ + searchCount?: boolean; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-update-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-update-dto.ts new file mode 100644 index 00000000..75d3e4a1 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-update-dto.ts @@ -0,0 +1,54 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-16 15:10:08 + * @LastEditTime: 2021-09-01 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/employee/model/employee-update-dto.ts + */ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface EmployeeUpdateDto { + /** + * 姓名 + */ + actualName?: string; + /** + * 部门id + */ + departmentId?: number; + /** + * 是否启用 + */ + disabledFlag?: boolean | number; + /** + * :
export const
GenderEnum =
{
  UNKNOWN:{
    value:0,
    desc:\'未知\'
  },
  MAN:{
    value:1,
    desc:\'男\'
  },
  WOMAN:{
    value:2,
    desc:\'女\'
  }
}
+ */ + gender?: number; + /** + * 员工id + */ + id?: number; + /** + * 登录账号 + */ + loginName?: string; + /** + * 手机号 + */ + phone?: string; + /** + * 角色列表 + */ + roleIdList?: Array; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-vo.ts new file mode 100644 index 00000000..6d3b5e2f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/employee/model/employee-vo.ts @@ -0,0 +1,71 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-12 18:07:31 + * @LastEditTime: 2021-09-01 + * @LastEditors: zhuoda + */ +/** + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { DepartmentSimpleVo } from '/@/api/system/department/model/department-simple-vo'; + +export interface EmployeeVo { + /** + * 员工名称 + */ + actualName?: string; + /** + * 出生日期 + */ + birthday?: string; + /** + * 创建时间 + */ + createTime?: string; + /** + * 部门 + */ + department?: Array; + /** + * 部门id + */ + departmentId?: string; + /** + * 是否被禁用 + */ + disabledFlag?: boolean; + /** + * 邮箱 + */ + email?: string; + /** + * 主键id + */ + id: number; + /** + * 身份证 + */ + idCard?: string; + /** + * 是否离职 + */ + leaveFlag?: boolean; + /** + * 登录账号 + */ + loginName?: string; + /** + * 别名 + */ + nickName?: string; + /** + * 手机号码 + */ + phone?: string; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/home/home-api.ts b/admin-web/typescript-ant-design-vue/src/api/system/home/home-api.ts new file mode 100644 index 00000000..474f452f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/home/home-api.ts @@ -0,0 +1,30 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-24 17:21:35 + * @LastEditTime: 2021-08-24 17:24:31 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/home/home-api.ts + */ +import { ResponseModel } from '../../base-model/response-model'; +import { HomeAmountStatisticsVo } from './model/home-amount-statistics-vo'; +import { HomeWaitHandleVo } from './model/home-wait-handle-vo'; +import { getRequest, postRequest } from '/@/lib/axios'; +export const homeApi = { + /** + * @description: 首页-金额统计(业绩、收款、订单数等) by zhuoda + * @param {*} + * @return {*} + */ + homeAmountStatistics: () => { + return getRequest>('/home/amount/statistics'); + }, + /** + * @description: 首页-待办信息 by zhuoda + * @param {*} + * @return {*} + */ + homeWaitHandle: () => { + return getRequest>('home/wait/handle'); + }, +}; diff --git a/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-amount-statistics-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-amount-statistics-vo.ts new file mode 100644 index 00000000..25be7548 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-amount-statistics-vo.ts @@ -0,0 +1,22 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { HomeEmployeeReceiveVo } from './home-employee-receive-vo'; +import { HomeEmployeeOrderVo } from './home-employee-order-vo'; +import { HomeEmployeeSaleTargetVo } from './home-employee-sale-target-vo'; + + +export interface HomeAmountStatisticsVo { + orderVO?: HomeEmployeeOrderVo; + receiveVO?: HomeEmployeeReceiveVo; + saleTargetVO?: HomeEmployeeSaleTargetVo; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-order-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-order-vo.ts new file mode 100644 index 00000000..63960590 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-order-vo.ts @@ -0,0 +1,24 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface HomeEmployeeOrderVo { + /** + * 上月订单数 + */ + lastMonthNum?: number; + /** + * 本月订单数 + */ + thisMonthNum?: number; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-receive-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-receive-vo.ts new file mode 100644 index 00000000..bf7cc6b0 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-receive-vo.ts @@ -0,0 +1,24 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface HomeEmployeeReceiveVo { + /** + * 上月收款金额 + */ + lastMonthAmount?: number; + /** + * 本月收款金额 + */ + thisMonthAmount?: number; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-sale-target-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-sale-target-vo.ts new file mode 100644 index 00000000..e9f55c85 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-employee-sale-target-vo.ts @@ -0,0 +1,28 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface HomeEmployeeSaleTargetVo { + /** + * 日均金额 + */ + averageAmount?: number; + /** + * 月度销售金额(完成金额) + */ + salesAmount?: number; + /** + * 月度目标金额 + */ + targetAmount?: number; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-wait-handle-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-wait-handle-vo.ts new file mode 100644 index 00000000..8de2d859 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/home/model/home-wait-handle-vo.ts @@ -0,0 +1,40 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface HomeWaitHandleVo { + /** + * 驳回完成收款单数 + */ + rejectCompleteReceiveOrderNum?: number; + /** + * 驳回收款单数 + */ + rejectReceiveOrderNum?: number; + /** + * 驳回退款单数 + */ + rejectRefundOrderNum?: number; + /** + * 签订合同数 + */ + signContractNum?: number; + /** + * 关联线索欠款(余额)总金额 + */ + userTotalAmount?: number; + /** + * 待跟进数量 + */ + waitTrackNum?: number; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/login/login-model.ts b/admin-web/typescript-ant-design-vue/src/api/system/login/login-model.ts new file mode 100644 index 00000000..1f5aff13 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/login/login-model.ts @@ -0,0 +1,40 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-03 10:27:11 + * @LastEditTime: 2021-08-18 20:03:44 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/login/login-model.ts + */ + +/** + * + * @export + * @interface EmployeeLoginFormDto + */ +export interface EmployeeLoginFormDto { + /** + * 验证码 + * @type {string} + * @memberof EmployeeLoginFormDto + */ + code?: string; + /** + * 验证码uuid + * @type {string} + * @memberof EmployeeLoginFormDto + */ + codeUuid?: string; + /** + * + * @type {string} + * @memberof EmployeeLoginFormDto + */ + loginName: string; + /** + * + * @type {string} + * @memberof EmployeeLoginFormDto + */ + loginPwd: string; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/login/login.ts b/admin-web/typescript-ant-design-vue/src/api/system/login/login.ts new file mode 100644 index 00000000..da9639a1 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/login/login.ts @@ -0,0 +1,30 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-03 10:27:11 + * @LastEditTime: 2021-08-18 20:04:05 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/login/login.ts + */ +import { EmployeeLoginVo } from './model/employee-login-vo'; +import { ResponseModel } from '/@/api/base-model/response-model'; +import { EmployeeLoginFormDto } from '/@/api/system/login/login-model'; +import { getRequest, postRequest } from '/@/lib/axios'; + +export const loginApi = { + /** + * 登录 + * @param param + */ + login: (param: EmployeeLoginFormDto) => { + return postRequest>('/login', param); + }, + + /** + * 获取登录信息 + * @param param + */ + getLogin: () => { + return getRequest>('/login/get'); + }, +}; diff --git a/admin-web/typescript-ant-design-vue/src/api/system/login/model/employee-login-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/login/model/employee-login-vo.ts new file mode 100644 index 00000000..ba10444f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/login/model/employee-login-vo.ts @@ -0,0 +1,84 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-18 20:02:35 + * @LastEditTime: 2021-09-01 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/login/model/employee-login-vo.ts + */ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { MenuTreeVo } from '../../menu/model/menu-tree-vo'; + +export interface EmployeeLoginVo { + /** + * 员工名称 + */ + actualName: string; + /** + * 部门id + */ + departmentId?: number; + /** + * 部门名称 + */ + departmentName?: string; + /** + * 是否被禁用 + */ + disabledFlag?: boolean; + /** + * 员工id + */ + employeeId?: number; + /** + * :
export const
GenderEnum =
{
  UNKNOWN:{
    value:0,
    desc:\'未知\'
  },
  MAN:{
    value:1,
    desc:\'男\'
  },
  WOMAN:{
    value:2,
    desc:\'女\'
  }
}
+ */ + gender?: number; + /** + * 是否为超管 + */ + isSuperMan?: boolean; + /** + * 登录账号 + */ + loginName?: string; + /** + * 菜单树 + */ + menuTree?: Array; + /** + * 手机号码 + */ + phone?: string; + /** + * 功能点权限列表 + */ + pointsList?: Array; + /** + * 角色列表 + */ + roleList?: Array; + /** + * token + */ + token?: string; + /** + * 所属校区 + */ + schoolId?: number; + /** + * 所属校区名称 + */ + schoolName?: string; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/menu/menu-api.ts b/admin-web/typescript-ant-design-vue/src/api/system/menu/menu-api.ts new file mode 100644 index 00000000..71248f36 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/menu/menu-api.ts @@ -0,0 +1,59 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-11 22:15:04 + * @LastEditTime: 2021-09-01 20:21:29 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/menu/menu-api.ts + */ +import { getRequest, postRequest } from '/@/lib/axios'; +import { MenuAddForm } from '/@/api/system/menu/model/menu-add-form'; +import { ResponseModel } from '/@/api/base-model/response-model'; +import { MenuUpdateForm } from '/@/api/system/menu/model/menu-update-form'; +import { MenuVo } from '/@/api/system/menu/model/menu-vo'; +import { MenuTreeVo } from '/@/api/system/menu/model/menu-tree-vo'; +import { RequestUrlVo } from './model/request-url-vo'; + +export const menuApi = { + /** + * 添加菜单 + */ + addMenu: (param: MenuAddForm) => { + return postRequest>('/menu/add', param); + }, + + /** + * 更新菜单 + */ + updateMenu: (param: MenuUpdateForm) => { + return postRequest>('/menu/update', param); + }, + + /** + * 批量删除菜单 + */ + batchDeleteMenu: (menuIdList: Array) => { + return getRequest>(`/menu/batchDelete?menuIdList=${menuIdList}`); + }, + + /** + * 查询所有菜单列表 + */ + queryMenu: (): Promise> => { + return getRequest>('/menu/query'); + }, + + /** + * 查询菜单树 + */ + queryMenuTree: (onlyMenu?: boolean): Promise> => { + return getRequest>(`/menu/tree?onlyMenu=${onlyMenu}`); + }, + + /** + * 获取所有请求路径 + */ + getAllUrl: () => { + return getRequest>('/menu/getAllUrl'); + }, +}; diff --git a/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-add-form.ts b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-add-form.ts new file mode 100644 index 00000000..682c6c3f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-add-form.ts @@ -0,0 +1,83 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-03 10:27:11 + * @LastEditTime: 2021-09-01 20:57:32 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/menu/model/menu-add-form.ts + */ +/** + * smart-admin-java-2.0-admin + * http://localhost:20086/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { MenuPointsOperateForm } from './menu-points-operate-form'; + +export interface MenuAddForm { + /** + * 是否缓存 + */ + cacheFlag?: boolean; + /** + * 组件路径 + */ + component?: string; + /** + * 功能点关联菜单ID + */ + contextMenuId?: number; + /** + * 禁用状态 + */ + disabledFlag?: boolean; + /** + * 是否为外链 + */ + frameFlag?: boolean; + /** + * 菜单图标 + */ + icon?: string; + /** + * 菜单名称 + */ + menuName?: string; + /** + * 类型:
export const
MENU_TYPE_ENUM =
{
  CATALOG:{
    value:1,
    desc:\'目录\'
  },
  MENU:{
    value:2,
    desc:\'菜单\'
  },
  POINTS:{
    value:3,
    desc:\'功能点\'
  }
}
+ */ + menuType: string | number; + /** + * 父菜单ID + */ + parentId?: number; + /** + * 路由地址 + */ + path?: string; + /** + * 接口权限 + */ + perms?: string; + /** + * 接口权限(拆分) + */ + permsList?: string[]; + /** + * 功能点列表 + */ + pointList?: Array; + /** + * 显示顺序 + */ + sort?: number; + /** + * 显示状态 + */ + visibleFlag?: boolean; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-points-operate-form.ts b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-points-operate-form.ts new file mode 100644 index 00000000..754504ca --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-points-operate-form.ts @@ -0,0 +1,42 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-03 10:27:11 + * @LastEditTime: 2021-09-01 20:56:03 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/menu/model/menu-points-operate-form.ts + */ +/** + * smart-admin-java-2.0-admin + * http://localhost:20086/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface MenuPointsOperateForm { + /** + * 功能点关联菜单ID + */ + contextMenuId?: number; + /** + * 禁用状态 + */ + disabledFlag?: boolean; + /** + * 菜单ID + */ + menuId?: number; + /** + * 功能点名称 + */ + menuName?: string; + /** + * 接口权限 + */ + permsList?: string[]; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-simple-tree-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-simple-tree-vo.ts new file mode 100644 index 00000000..202a4bcd --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-simple-tree-vo.ts @@ -0,0 +1,46 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-28 14:19:22 + * @LastEditTime: 2021-08-28 15:08:02 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/menu/model/menu-simple-tree-vo.ts + */ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface MenuSimpleTreeVo { + /** + * 子菜单 + */ + children?: Array; + /** + * 功能点关联菜单ID + */ + contextMenuId?: number; + /** + * 菜单ID + */ + menuId?: number; + /** + * 父菜单ID + */ + parentId?: number; + /** + * 菜单类型 + */ + menuType?:number; + /** + * 菜单名称 + */ + menuName?: string; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-tree-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-tree-vo.ts new file mode 100644 index 00000000..65e5e986 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-tree-vo.ts @@ -0,0 +1,100 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-10 + * @LastEditTime: 2021-09-01 21:16:00 + * @LastEditors: zhuoda + */ +/** + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface MenuTreeVo { + /** + * 是否缓存 + */ + cacheFlag?: boolean; + /** + * 菜单子集 + */ + children?: Array; + /** + * 组件路径 + */ + component?: string; + /** + * 功能点关联菜单ID + */ + contextMenuId?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 创建人 + */ + createUserId?: number; + /** + * 禁用状态 + */ + disabledFlag?: boolean; + /** + * 是否为外链 + */ + frameFlag?: boolean; + /** + * 菜单图标 + */ + icon?: string; + /** + * 菜单ID + */ + menuId: number; + /** + * 菜单名称 + */ + menuName?: string; + /** + * 类型:
export const
MENU_TYPE_ENUM =
{
  CATALOG:{
    value:1,
    desc:\'目录\'
  },
  MENU:{
    value:2,
    desc:\'菜单\'
  },
  POINTS:{
    value:3,
    desc:\'功能点\'
  }
}
+ */ + menuType: number; + /** + * 父菜单ID 无上级可传0 + */ + parentId?: number; + /** + * 路由地址 + */ + path?: string; + /** + * 接口权限 + */ + perms?: string; + /** + * 接口权限 + */ + permsList?: string[]; + /** + * 显示顺序 + */ + sort?: number; + /** + * 更新时间 + */ + updateTime?: string; + /** + * 更新人 + */ + updateUserId?: number; + /** + * 显示状态 + */ + visibleFlag?: boolean; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-update-form.ts b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-update-form.ts new file mode 100644 index 00000000..791c8095 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-update-form.ts @@ -0,0 +1,88 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-03 10:27:11 + * @LastEditTime: 2021-09-01 20:57:27 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/menu/model/menu-update-form.ts + */ +/** + * smart-admin-java-2.0-admin + * http://localhost:20086/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { MenuPointsOperateForm } from './menu-points-operate-form'; + +export interface MenuUpdateForm { + /** + * 是否缓存 + */ + cacheFlag?: boolean; + /** + * 组件路径 + */ + component?: string; + /** + * 功能点关联菜单ID + */ + contextMenuId?: number; + /** + * 禁用状态 + */ + disabledFlag?: boolean; + /** + * 是否为外链 + */ + frameFlag?: boolean; + /** + * 菜单图标 + */ + icon?: string; + /** + * 菜单ID + */ + menuId?: number; + /** + * 菜单名称 + */ + menuName?: string; + /** + * 类型:
export const
MENU_TYPE_ENUM =
{
  CATALOG:{
    value:1,
    desc:\'目录\'
  },
  MENU:{
    value:2,
    desc:\'菜单\'
  },
  POINTS:{
    value:3,
    desc:\'功能点\'
  }
}
+ */ + menuType: string | number; + /** + * 父菜单ID + */ + parentId?: number; + /** + * 路由地址 + */ + path?: string; + /** + * 接口权限 + */ + perms?: string; + /** + * 接口权限(拆分) + */ + permsList?: string[]; + /** + * 功能点列表 + */ + pointList?: Array; + /** + * 显示顺序 + */ + sort?: number; + /** + * 显示状态 + */ + visibleFlag?: boolean; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-vo.ts new file mode 100644 index 00000000..01bc59f8 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/menu-vo.ts @@ -0,0 +1,103 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-11 11:52:11 + * @LastEditTime: 2021-09-01 20:55:06 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/menu/model/menu-vo.ts + */ +/** + * smart-admin-java-2.0-admin + * http://localhost:20086/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +export interface MenuVo { + /** + * 是否缓存 + */ + cacheFlag?: boolean; + /** + * 组件路径 + */ + component?: string; + /** + * 功能点关联菜单ID + */ + contextMenuId?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 创建人 + */ + createUser?: number; + /** + * 禁用状态 + */ + disabledFlag?: boolean; + /** + * 是否为外链 + */ + frameFlag?: boolean; + /** + * 菜单图标 + */ + icon?: string; + /** + * 菜单ID + */ + menuId?: number; + /** + * 菜单名称 + */ + menuName?: string; + /** + * 类型:
export const
MENU_TYPE_ENUM =
{
  CATALOG:{
    value:1,
    desc:\'目录\'
  },
  MENU:{
    value:2,
    desc:\'菜单\'
  },
  POINTS:{
    value:3,
    desc:\'功能点\'
  }
}
+ */ + menuType: number; + /** + * 父菜单ID + */ + parentId?: number; + /** + * 路由地址 + */ + path?: string; + /** + * 接口权限 + */ + perms?: string; + /** + * 接口权限(拆分) + */ + permsList?: string[]; + /** + * 显示顺序 + */ + sort?: number; + /** + * 更新时间 + */ + updateTime?: string; + /** + * 更新人 + */ + updateUser?: number; + /** + * 显示状态 + */ + visibleFlag?: boolean; + + /** + * 孩子 + */ + children?: MenuVo[]; +} diff --git a/admin-web/typescript-ant-design-vue/src/api/system/menu/model/models.ts b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/models.ts new file mode 100644 index 00000000..09993d12 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/models.ts @@ -0,0 +1,3 @@ +export * from './menu-add-form'; +export * from './menu-points-operate-form'; +export * from './response-dto-ofstring'; diff --git a/admin-web/typescript-ant-design-vue/src/api/system/menu/model/request-url-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/request-url-vo.ts new file mode 100644 index 00000000..1a89b254 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/menu/model/request-url-vo.ts @@ -0,0 +1,28 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface RequestUrlVo { + /** + * 注释说明 + */ + comment?: string; + /** + * controller.method + */ + name?: string; + /** + * url + */ + url?: string; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role-menu/modal/role-menu-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/role-menu/modal/role-menu-dto.ts new file mode 100644 index 00000000..7caf388f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role-menu/modal/role-menu-dto.ts @@ -0,0 +1,24 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface RoleMenuDto { + /** + * 菜单ID集合 + */ + menuIdList?: Array; + /** + * 角色id + */ + roleId?: number; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role-menu/modal/role-menu-tree-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/role-menu/modal/role-menu-tree-vo.ts new file mode 100644 index 00000000..4e6e78ea --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role-menu/modal/role-menu-tree-vo.ts @@ -0,0 +1,38 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-28 14:19:33 + * @LastEditTime: 2021-08-28 14:19:46 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/role-menu/modal/role-menu-tree-vo.ts + */ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + +import { MenuSimpleTreeVo } from "../../menu/model/menu-simple-tree-vo"; + + +export interface RoleMenuTreeVo { + /** + * 菜单列表 + */ + menuTreeList?: Array; + /** + * 角色ID + */ + roleId?: number; + /** + * 选中的菜单ID + */ + selectedMenuId?: Array; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role-menu/role-menu-api.ts b/admin-web/typescript-ant-design-vue/src/api/system/role-menu/role-menu-api.ts new file mode 100644 index 00000000..e4738a42 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role-menu/role-menu-api.ts @@ -0,0 +1,30 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-28 14:16:46 + * @LastEditTime: 2021-08-28 14:25:36 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/role-menu/role-menu-api.ts + */ +import { ResponseModel } from '../../base-model/response-model'; +import { RoleMenuDto } from './modal/role-menu-dto'; +import { RoleMenuTreeVo } from './modal/role-menu-tree-vo'; +import { getRequest, postRequest } from '/@/lib/axios'; +export const roleMenuApi = { + /** + * @description: 获取角色关联菜单权限 + * @param {*} + * @return {*} + */ + getRoleSelectedMenu: (roleId: number) => { + return getRequest>(`role/menu/getRoleSelectedMenu/${roleId}`); + }, + /** + * @description: 更新角色权限 + * @param {*} + * @return {*} + */ + updateRoleMenu: (data: RoleMenuDto) => { + return postRequest>('role/menu/updateRoleMenu', data); + }, +}; diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-and-view-type-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-and-view-type-vo.ts new file mode 100644 index 00000000..6d1ce334 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-and-view-type-vo.ts @@ -0,0 +1,37 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { DataScopeViewTypeVo } from './data-scope-view-type-vo'; + + +export interface DataScopeAndViewTypeVo { + /** + * 数据范围类型 + */ + dataScopeType?: number; + /** + * 描述 + */ + dataScopeTypeDesc?: string; + /** + * 数据范围名称 + */ + dataScopeTypeName?: string; + /** + * 顺序 + */ + dataScopeTypeSort?: number; + /** + * 可见范围列表 + */ + viewTypeList?: Array; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-batch-set-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-batch-set-dto.ts new file mode 100644 index 00000000..6b5f5019 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-batch-set-dto.ts @@ -0,0 +1,24 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface DataScopeBatchSetDto { + /** + * 数据范围类型 + */ + dataScopeType?: number; + /** + * 可见范围 + */ + viewType?: number; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-batch-set-role-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-batch-set-role-dto.ts new file mode 100644 index 00000000..e1607fe4 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-batch-set-role-dto.ts @@ -0,0 +1,25 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { DataScopeBatchSetDto } from './data-scope-batch-set-dto'; + + +export interface DataScopeBatchSetRoleDto { + /** + * 设置信息 + */ + batchSetList?: Array; + /** + * 角色id + */ + roleId?: number; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-select-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-select-vo.ts new file mode 100644 index 00000000..1dc69fc0 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-select-vo.ts @@ -0,0 +1,24 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface DataScopeSelectVo { + /** + * 数据范围id + */ + dataScopeType?: number; + /** + * 可见范围 + */ + viewType?: number; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-view-type-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-view-type-vo.ts new file mode 100644 index 00000000..806749ba --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role/model/data-scope-view-type-vo.ts @@ -0,0 +1,28 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface DataScopeViewTypeVo { + /** + * 可见范围 + */ + viewType?: number; + /** + * 级别,用于表示范围大小 + */ + viewTypeLevel?: number; + /** + * 可见范围名称 + */ + viewTypeName?: string; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-add-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-add-dto.ts new file mode 100644 index 00000000..5d9bcdff --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-add-dto.ts @@ -0,0 +1,24 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface RoleAddDto { + /** + * 角色描述 + */ + remark?: string; + /** + * 角色名称 + */ + roleName?: string; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-employee-batch-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-employee-batch-dto.ts new file mode 100644 index 00000000..ebc06d76 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-employee-batch-dto.ts @@ -0,0 +1,24 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface RoleEmployeeBatchDto { + /** + * 员工id集合 + */ + employeeIdList?: Array; + /** + * 角色id + */ + roleId?: number; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-query-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-query-dto.ts new file mode 100644 index 00000000..91058b45 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-query-dto.ts @@ -0,0 +1,49 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-30 11:10:09 + * @LastEditTime: 2021-08-30 11:20:04 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/role/model/role-query-dto.ts + */ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ +import { SortItemDto } from './sort-item-dto'; + + +export interface RoleQueryDto { + /** + * 页码(不能为空) + */ + pageNum: number; + /** + * 每页数量(不能为空) + */ + pageSize: number; + /** + * 角色id + */ + roleId?: number; + /** + * 角色名称 + */ + roleName?: string; + /** + * 是否查询总条数 + */ + searchCount?: boolean; + /** + * 排序字段集合 + */ + sortItemList?: Array; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-update-dto.ts b/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-update-dto.ts new file mode 100644 index 00000000..a9534d54 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-update-dto.ts @@ -0,0 +1,28 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface RoleUpdateDto { + /** + * 角色id + */ + id?: number; + /** + * 角色描述 + */ + remark?: string; + /** + * 角色名称 + */ + roleName?: string; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-vo.ts b/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-vo.ts new file mode 100644 index 00000000..e233e456 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role/model/role-vo.ts @@ -0,0 +1,28 @@ +/** + * smart-admin-local + * http://localhost:50110/v2/api-docs?group=Admin + * + * The version of the OpenAPI document: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +export interface RoleVo { + /** + * 角色ID + */ + id?: number; + /** + * 角色备注 + */ + remark?: string; + /** + * 角色名称 + */ + roleName?: string; +} + diff --git a/admin-web/typescript-ant-design-vue/src/api/system/role/role-api.ts b/admin-web/typescript-ant-design-vue/src/api/system/role/role-api.ts new file mode 100644 index 00000000..ca88b744 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/api/system/role/role-api.ts @@ -0,0 +1,119 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-16 15:53:46 + * @LastEditTime: 2021-08-30 15:18:18 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/api/system/role/role-api.ts + */ +import { PageResultModel } from '../../base-model/page-result-model'; +import { ResponseModel } from '../../base-model/response-model'; +import { EmployeeVo } from '../employee/model/employee-vo'; +import { DataScopeAndViewTypeVo } from './model/data-scope-and-view-type-vo'; +import { DataScopeBatchSetRoleDto } from './model/data-scope-batch-set-role-dto'; +import { DataScopeSelectVo } from './model/data-scope-select-vo'; +import { RoleAddDto } from './model/role-add-dto'; +import { RoleEmployeeBatchDto } from './model/role-employee-batch-dto'; +import { RoleQueryDto } from './model/role-query-dto'; +import { RoleUpdateDto } from './model/role-update-dto'; +import { RoleVo } from './model/role-vo'; +import { getRequest, postRequest } from '/@/lib/axios'; +export const roleApi = { + /** + * @description: 获取所有角色 + * @param {*} + * @return {*} + */ + queryAll: (): Promise> => { + return getRequest>('role/getAll'); + }, + /** + * @description:添加角色 + * @param {*} + * @return {*} + */ + addRole: (data: RoleAddDto) => { + return postRequest>('role/add', data); + }, + /** + * @description:更新角色 + * @param {*} + * @return {*} + */ + updateRole: (data: RoleUpdateDto) => { + return postRequest>('role/update', data); + }, + /** + * @description: 删除角色 + * @param {number} roleId + * @return {*} + */ + deleteRole: (roleId: number) => { + return getRequest>(`role/delete/${roleId}`); + }, + /** + * @description: 批量设置某角色数据范围 + * @param {DataScopeBatchSetRoleDto} data + * @return {*} + */ + updateDataScope: (data: DataScopeBatchSetRoleDto) => { + return postRequest>('/dataScope/batchSet', data); + }, + /** + * @description: 获取当前系统所配置的所有数据范围 + * @param {*} + * @return {*} + */ + getDataScopeList: () => { + return getRequest>('/dataScope/list'); + }, + /** + * @description: 获取某角色所设置的数据范围 + * @param {number} roleId + * @return {*} + */ + getDataScopeByRoleId: (roleId: number) => { + return getRequest>(`/dataScope/listByRole/${roleId}`); + }, + /** + * @description: 获取角色成员-员工列表 + * @param {*} + * @return {*} + */ + queryRoleEmployee: (params: RoleQueryDto) => { + return postRequest>>('/role/listEmployee', params); + }, + /** + * @description: 从角色成员列表中移除员工 + * @param {number} employeeId + * @param {number} roleId + * @return {*} + */ + deleteEmployeeRole: (employeeId: number, roleId: number) => { + return getRequest>('/role/removeEmployee?employeeId=' + employeeId + '&roleId=' + roleId); + }, + /** + * @description: 从角色成员列表中批量移除员工 + * @param {RoleEmployeeBatchDto} data + * @return {*} + */ + deleteEmployeeList: (data: RoleEmployeeBatchDto) => { + return postRequest>('/role/removeEmployeeList', data); + }, + /** + * @description: 根据角色id获取角色员工列表(无分页) + * @param {*} + * @return {*} + */ + getRoleAllEmployee: (roleId: number) => { + return getRequest>(`role/listAllEmployee/${roleId}`); + }, + /** + * @description: 角色成员列表中批量添加员工 + * @param {RoleEmployeeBatchDto} data + * @return {*} + */ + addRoleEmployeeList: (data: RoleEmployeeBatchDto) => { + return postRequest>('/role/addEmployeeList', data); + }, +}; diff --git a/smart-admin-h5/src/assets/logo.png b/admin-web/typescript-ant-design-vue/src/assets/img/logo.png similarity index 100% rename from smart-admin-h5/src/assets/logo.png rename to admin-web/typescript-ant-design-vue/src/assets/img/logo.png diff --git a/admin-web/typescript-ant-design-vue/src/assets/logo.png b/admin-web/typescript-ant-design-vue/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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 +

{{ msg }}

+ +
+ +

See README.md for more information.

+ +

+ + Vite Docs + + | + Vue 3 Docs +

+ + +

+ Edit + components/HelloWorld.vue to test hot module replacement. +

+ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/category-tree-select/index.vue b/admin-web/typescript-ant-design-vue/src/components/category-tree-select/index.vue new file mode 100644 index 00000000..76ad2bf1 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/category-tree-select/index.vue @@ -0,0 +1,93 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/department-tree-select/index.vue b/admin-web/typescript-ant-design-vue/src/components/department-tree-select/index.vue new file mode 100644 index 00000000..d5130c8e --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/department-tree-select/index.vue @@ -0,0 +1,72 @@ + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/employee-select/index.vue b/admin-web/typescript-ant-design-vue/src/components/employee-select/index.vue new file mode 100644 index 00000000..cdec9d6c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/employee-select/index.vue @@ -0,0 +1,80 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/menu-location-breadcrumb/index.vue b/admin-web/typescript-ant-design-vue/src/components/menu-location-breadcrumb/index.vue new file mode 100644 index 00000000..3c61e078 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/menu-location-breadcrumb/index.vue @@ -0,0 +1,31 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/recursion-menu/index.vue b/admin-web/typescript-ant-design-vue/src/components/recursion-menu/index.vue new file mode 100644 index 00000000..ec0400d5 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/recursion-menu/index.vue @@ -0,0 +1,115 @@ + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/recursion-menu/sub-menu.vue b/admin-web/typescript-ant-design-vue/src/components/recursion-menu/sub-menu.vue new file mode 100644 index 00000000..41d21628 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/recursion-menu/sub-menu.vue @@ -0,0 +1,56 @@ + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/school-department-select/index.vue b/admin-web/typescript-ant-design-vue/src/components/school-department-select/index.vue new file mode 100644 index 00000000..f0edac51 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/school-department-select/index.vue @@ -0,0 +1,96 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/select-employee-modal/index.vue b/admin-web/typescript-ant-design-vue/src/components/select-employee-modal/index.vue new file mode 100644 index 00000000..8cb8e6bf --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/select-employee-modal/index.vue @@ -0,0 +1,177 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/index.vue b/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/index.vue new file mode 100644 index 00000000..6a76fc9b --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/index.vue @@ -0,0 +1,61 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/recursion-menu.vue b/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/recursion-menu.vue new file mode 100644 index 00000000..774a02d5 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/recursion-menu.vue @@ -0,0 +1,87 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/sub-menu.vue b/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/sub-menu.vue new file mode 100644 index 00000000..1aaa1256 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/sub-menu.vue @@ -0,0 +1,56 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/top-menu.vue b/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/top-menu.vue new file mode 100644 index 00000000..9ea372e2 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/side-expand/side-menu/top-menu.vue @@ -0,0 +1,113 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/side-menu/index.less b/admin-web/typescript-ant-design-vue/src/components/side-menu/index.less new file mode 100644 index 00000000..37241638 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/side-menu/index.less @@ -0,0 +1,38 @@ +.shadow{ + box-shadow: 2px 0 6px rgba(0, 21, 41, .35); +} +.side-menu{ + min-height: 100vh; + overflow-y: auto; + z-index: 10; + .logo{ + height: @header-user-height; + position: relative; + line-height: @header-user-height; + padding-left: 24px; + -webkit-transition: all .3s; + transition: all .3s; + overflow: hidden; + background-color: @layout-trigger-background; + &.light{ + background-color: #fff; + h1{ + color: @primary-color; + } + } + h1{ + color: @menu-dark-highlight-color; + font-size: 20px; + margin: 0 0 0 12px; + display: inline-block; + vertical-align: middle; + } + img{ + width: 32px; + vertical-align: middle; + } + } +} +.menu{ + padding: 16px 0; +} diff --git a/admin-web/typescript-ant-design-vue/src/components/side-menu/index.vue b/admin-web/typescript-ant-design-vue/src/components/side-menu/index.vue new file mode 100644 index 00000000..bea10e19 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/side-menu/index.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/index.vue b/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/index.vue new file mode 100644 index 00000000..da9ac3cb --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/index.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/province-city-district.ts b/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/province-city-district.ts new file mode 100644 index 00000000..5d8cbef0 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/province-city-district.ts @@ -0,0 +1,17546 @@ +export const PROVINCE_CITY_DISTRICT = [ + { + children: [ + { + children: [ + { + children: [], + label: '东城区', + value: 110101, + }, + { + children: [], + label: '西城区', + value: 110102, + }, + { + children: [], + label: '朝阳区', + value: 110105, + }, + { + children: [], + label: '丰台区', + value: 110106, + }, + { + children: [], + label: '石景山区', + value: 110107, + }, + { + children: [], + label: '海淀区', + value: 110108, + }, + { + children: [], + label: '门头沟区', + value: 110109, + }, + { + children: [], + label: '房山区', + value: 110111, + }, + { + children: [], + label: '通州区', + value: 110112, + }, + { + children: [], + label: '顺义区', + value: 110113, + }, + { + children: [], + label: '昌平区', + value: 110114, + }, + { + children: [], + label: '大兴区', + value: 110115, + }, + { + children: [], + label: '怀柔区', + value: 110116, + }, + { + children: [], + label: '平谷区', + value: 110117, + }, + { + children: [], + label: '密云区', + value: 110118, + }, + { + children: [], + label: '延庆区', + value: 110119, + }, + ], + label: '北京市', + value: 110100, + }, + ], + label: '北京市', + value: 110000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '和平区', + value: 120101, + }, + { + children: [], + label: '河东区', + value: 120102, + }, + { + children: [], + label: '河西区', + value: 120103, + }, + { + children: [], + label: '南开区', + value: 120104, + }, + { + children: [], + label: '河北区', + value: 120105, + }, + { + children: [], + label: '红桥区', + value: 120106, + }, + { + children: [], + label: '东丽区', + value: 120110, + }, + { + children: [], + label: '西青区', + value: 120111, + }, + { + children: [], + label: '津南区', + value: 120112, + }, + { + children: [], + label: '北辰区', + value: 120113, + }, + { + children: [], + label: '武清区', + value: 120114, + }, + { + children: [], + label: '宝坻区', + value: 120115, + }, + { + children: [], + label: '滨海新区', + value: 120116, + }, + { + children: [], + label: '宁河区', + value: 120117, + }, + { + children: [], + label: '静海区', + value: 120118, + }, + { + children: [], + label: '蓟州区', + value: 120119, + }, + ], + label: '天津市', + value: 120100, + }, + ], + label: '天津市', + value: 120000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '长安区', + value: 130102, + }, + { + children: [], + label: '桥西区', + value: 130104, + }, + { + children: [], + label: '新华区', + value: 130105, + }, + { + children: [], + label: '井陉矿区', + value: 130107, + }, + { + children: [], + label: '裕华区', + value: 130108, + }, + { + children: [], + label: '藁城区', + value: 130109, + }, + { + children: [], + label: '鹿泉区', + value: 130110, + }, + { + children: [], + label: '栾城区', + value: 130111, + }, + { + children: [], + label: '井陉县', + value: 130121, + }, + { + children: [], + label: '正定县', + value: 130123, + }, + { + children: [], + label: '行唐县', + value: 130125, + }, + { + children: [], + label: '灵寿县', + value: 130126, + }, + { + children: [], + label: '高邑县', + value: 130127, + }, + { + children: [], + label: '深泽县', + value: 130128, + }, + { + children: [], + label: '赞皇县', + value: 130129, + }, + { + children: [], + label: '无极县', + value: 130130, + }, + { + children: [], + label: '平山县', + value: 130131, + }, + { + children: [], + label: '元氏县', + value: 130132, + }, + { + children: [], + label: '赵县', + value: 130133, + }, + { + children: [], + label: '辛集市', + value: 130181, + }, + { + children: [], + label: '晋州市', + value: 130183, + }, + { + children: [], + label: '新乐市', + value: 130184, + }, + ], + label: '石家庄市', + value: 130100, + }, + { + children: [ + { + children: [], + label: '路南区', + value: 130202, + }, + { + children: [], + label: '路北区', + value: 130203, + }, + { + children: [], + label: '古冶区', + value: 130204, + }, + { + children: [], + label: '开平区', + value: 130205, + }, + { + children: [], + label: '丰南区', + value: 130207, + }, + { + children: [], + label: '丰润区', + value: 130208, + }, + { + children: [], + label: '曹妃甸区', + value: 130209, + }, + { + children: [], + label: '滦南县', + value: 130224, + }, + { + children: [], + label: '乐亭县', + value: 130225, + }, + { + children: [], + label: '迁西县', + value: 130227, + }, + { + children: [], + label: '玉田县', + value: 130229, + }, + { + children: [], + label: '遵化市', + value: 130281, + }, + { + children: [], + label: '迁安市', + value: 130283, + }, + { + children: [], + label: '滦州市', + value: 130284, + }, + ], + label: '唐山市', + value: 130200, + }, + { + children: [ + { + children: [], + label: '海港区', + value: 130302, + }, + { + children: [], + label: '山海关区', + value: 130303, + }, + { + children: [], + label: '北戴河区', + value: 130304, + }, + { + children: [], + label: '抚宁区', + value: 130306, + }, + { + children: [], + label: '青龙满族自治县', + value: 130321, + }, + { + children: [], + label: '昌黎县', + value: 130322, + }, + { + children: [], + label: '卢龙县', + value: 130324, + }, + ], + label: '秦皇岛市', + value: 130300, + }, + { + children: [ + { + children: [], + label: '邯山区', + value: 130402, + }, + { + children: [], + label: '丛台区', + value: 130403, + }, + { + children: [], + label: '复兴区', + value: 130404, + }, + { + children: [], + label: '峰峰矿区', + value: 130406, + }, + { + children: [], + label: '肥乡区', + value: 130407, + }, + { + children: [], + label: '永年区', + value: 130408, + }, + { + children: [], + label: '临漳县', + value: 130423, + }, + { + children: [], + label: '成安县', + value: 130424, + }, + { + children: [], + label: '大名县', + value: 130425, + }, + { + children: [], + label: '涉县', + value: 130426, + }, + { + children: [], + label: '磁县', + value: 130427, + }, + { + children: [], + label: '邱县', + value: 130430, + }, + { + children: [], + label: '鸡泽县', + value: 130431, + }, + { + children: [], + label: '广平县', + value: 130432, + }, + { + children: [], + label: '馆陶县', + value: 130433, + }, + { + children: [], + label: '魏县', + value: 130434, + }, + { + children: [], + label: '曲周县', + value: 130435, + }, + { + children: [], + label: '武安市', + value: 130481, + }, + ], + label: '邯郸市', + value: 130400, + }, + { + children: [ + { + children: [], + label: '桥东区', + value: 130502, + }, + { + children: [], + label: '桥西区', + value: 130503, + }, + { + children: [], + label: '邢台县', + value: 130521, + }, + { + children: [], + label: '临城县', + value: 130522, + }, + { + children: [], + label: '内丘县', + value: 130523, + }, + { + children: [], + label: '柏乡县', + value: 130524, + }, + { + children: [], + label: '隆尧县', + value: 130525, + }, + { + children: [], + label: '任县', + value: 130526, + }, + { + children: [], + label: '南和县', + value: 130527, + }, + { + children: [], + label: '宁晋县', + value: 130528, + }, + { + children: [], + label: '巨鹿县', + value: 130529, + }, + { + children: [], + label: '新河县', + value: 130530, + }, + { + children: [], + label: '广宗县', + value: 130531, + }, + { + children: [], + label: '平乡县', + value: 130532, + }, + { + children: [], + label: '威县', + value: 130533, + }, + { + children: [], + label: '清河县', + value: 130534, + }, + { + children: [], + label: '临西县', + value: 130535, + }, + { + children: [], + label: '南宫市', + value: 130581, + }, + { + children: [], + label: '沙河市', + value: 130582, + }, + ], + label: '邢台市', + value: 130500, + }, + { + children: [ + { + children: [], + label: '竞秀区', + value: 130602, + }, + { + children: [], + label: '莲池区', + value: 130606, + }, + { + children: [], + label: '满城区', + value: 130607, + }, + { + children: [], + label: '清苑区', + value: 130608, + }, + { + children: [], + label: '徐水区', + value: 130609, + }, + { + children: [], + label: '涞水县', + value: 130623, + }, + { + children: [], + label: '阜平县', + value: 130624, + }, + { + children: [], + label: '定兴县', + value: 130626, + }, + { + children: [], + label: '唐县', + value: 130627, + }, + { + children: [], + label: '高阳县', + value: 130628, + }, + { + children: [], + label: '容城县', + value: 130629, + }, + { + children: [], + label: '涞源县', + value: 130630, + }, + { + children: [], + label: '望都县', + value: 130631, + }, + { + children: [], + label: '安新县', + value: 130632, + }, + { + children: [], + label: '易县', + value: 130633, + }, + { + children: [], + label: '曲阳县', + value: 130634, + }, + { + children: [], + label: '蠡县', + value: 130635, + }, + { + children: [], + label: '顺平县', + value: 130636, + }, + { + children: [], + label: '博野县', + value: 130637, + }, + { + children: [], + label: '雄县', + value: 130638, + }, + { + children: [], + label: '涿州市', + value: 130681, + }, + { + children: [], + label: '定州市', + value: 130682, + }, + { + children: [], + label: '安国市', + value: 130683, + }, + { + children: [], + label: '高碑店市', + value: 130684, + }, + ], + label: '保定市', + value: 130600, + }, + { + children: [ + { + children: [], + label: '桥东区', + value: 130702, + }, + { + children: [], + label: '桥西区', + value: 130703, + }, + { + children: [], + label: '宣化区', + value: 130705, + }, + { + children: [], + label: '下花园区', + value: 130706, + }, + { + children: [], + label: '万全区', + value: 130708, + }, + { + children: [], + label: '崇礼区', + value: 130709, + }, + { + children: [], + label: '张北县', + value: 130722, + }, + { + children: [], + label: '康保县', + value: 130723, + }, + { + children: [], + label: '沽源县', + value: 130724, + }, + { + children: [], + label: '尚义县', + value: 130725, + }, + { + children: [], + label: '蔚县', + value: 130726, + }, + { + children: [], + label: '阳原县', + value: 130727, + }, + { + children: [], + label: '怀安县', + value: 130728, + }, + { + children: [], + label: '怀来县', + value: 130730, + }, + { + children: [], + label: '涿鹿县', + value: 130731, + }, + { + children: [], + label: '赤城县', + value: 130732, + }, + ], + label: '张家口市', + value: 130700, + }, + { + children: [ + { + children: [], + label: '双桥区', + value: 130802, + }, + { + children: [], + label: '双滦区', + value: 130803, + }, + { + children: [], + label: '鹰手营子矿区', + value: 130804, + }, + { + children: [], + label: '承德县', + value: 130821, + }, + { + children: [], + label: '兴隆县', + value: 130822, + }, + { + children: [], + label: '滦平县', + value: 130824, + }, + { + children: [], + label: '隆化县', + value: 130825, + }, + { + children: [], + label: '丰宁满族自治县', + value: 130826, + }, + { + children: [], + label: '宽城满族自治县', + value: 130827, + }, + { + children: [], + label: '围场满族蒙古族自治县', + value: 130828, + }, + { + children: [], + label: '平泉市', + value: 130881, + }, + ], + label: '承德市', + value: 130800, + }, + { + children: [ + { + children: [], + label: '新华区', + value: 130902, + }, + { + children: [], + label: '运河区', + value: 130903, + }, + { + children: [], + label: '沧县', + value: 130921, + }, + { + children: [], + label: '青县', + value: 130922, + }, + { + children: [], + label: '东光县', + value: 130923, + }, + { + children: [], + label: '海兴县', + value: 130924, + }, + { + children: [], + label: '盐山县', + value: 130925, + }, + { + children: [], + label: '肃宁县', + value: 130926, + }, + { + children: [], + label: '南皮县', + value: 130927, + }, + { + children: [], + label: '吴桥县', + value: 130928, + }, + { + children: [], + label: '献县', + value: 130929, + }, + { + children: [], + label: '孟村回族自治县', + value: 130930, + }, + { + children: [], + label: '泊头市', + value: 130981, + }, + { + children: [], + label: '任丘市', + value: 130982, + }, + { + children: [], + label: '黄骅市', + value: 130983, + }, + { + children: [], + label: '河间市', + value: 130984, + }, + ], + label: '沧州市', + value: 130900, + }, + { + children: [ + { + children: [], + label: '安次区', + value: 131002, + }, + { + children: [], + label: '广阳区', + value: 131003, + }, + { + children: [], + label: '固安县', + value: 131022, + }, + { + children: [], + label: '永清县', + value: 131023, + }, + { + children: [], + label: '香河县', + value: 131024, + }, + { + children: [], + label: '大城县', + value: 131025, + }, + { + children: [], + label: '文安县', + value: 131026, + }, + { + children: [], + label: '大厂回族自治县', + value: 131028, + }, + { + children: [], + label: '霸州市', + value: 131081, + }, + { + children: [], + label: '三河市', + value: 131082, + }, + ], + label: '廊坊市', + value: 131000, + }, + { + children: [ + { + children: [], + label: '桃城区', + value: 131102, + }, + { + children: [], + label: '冀州区', + value: 131103, + }, + { + children: [], + label: '枣强县', + value: 131121, + }, + { + children: [], + label: '武邑县', + value: 131122, + }, + { + children: [], + label: '武强县', + value: 131123, + }, + { + children: [], + label: '饶阳县', + value: 131124, + }, + { + children: [], + label: '安平县', + value: 131125, + }, + { + children: [], + label: '故城县', + value: 131126, + }, + { + children: [], + label: '景县', + value: 131127, + }, + { + children: [], + label: '阜城县', + value: 131128, + }, + { + children: [], + label: '深州市', + value: 131182, + }, + ], + label: '衡水市', + value: 131100, + }, + ], + label: '河北省', + value: 130000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '小店区', + value: 140105, + }, + { + children: [], + label: '迎泽区', + value: 140106, + }, + { + children: [], + label: '杏花岭区', + value: 140107, + }, + { + children: [], + label: '尖草坪区', + value: 140108, + }, + { + children: [], + label: '万柏林区', + value: 140109, + }, + { + children: [], + label: '晋源区', + value: 140110, + }, + { + children: [], + label: '清徐县', + value: 140121, + }, + { + children: [], + label: '阳曲县', + value: 140122, + }, + { + children: [], + label: '娄烦县', + value: 140123, + }, + { + children: [], + label: '古交市', + value: 140181, + }, + ], + label: '太原市', + value: 140100, + }, + { + children: [ + { + children: [], + label: '新荣区', + value: 140212, + }, + { + children: [], + label: '平城区', + value: 140213, + }, + { + children: [], + label: '云冈区', + value: 140214, + }, + { + children: [], + label: '云州区', + value: 140215, + }, + { + children: [], + label: '阳高县', + value: 140221, + }, + { + children: [], + label: '天镇县', + value: 140222, + }, + { + children: [], + label: '广灵县', + value: 140223, + }, + { + children: [], + label: '灵丘县', + value: 140224, + }, + { + children: [], + label: '浑源县', + value: 140225, + }, + { + children: [], + label: '左云县', + value: 140226, + }, + ], + label: '大同市', + value: 140200, + }, + { + children: [ + { + children: [], + label: '城区', + value: 140302, + }, + { + children: [], + label: '矿区', + value: 140303, + }, + { + children: [], + label: '郊区', + value: 140311, + }, + { + children: [], + label: '平定县', + value: 140321, + }, + { + children: [], + label: '盂县', + value: 140322, + }, + ], + label: '阳泉市', + value: 140300, + }, + { + children: [ + { + children: [], + label: '潞州区', + value: 140403, + }, + { + children: [], + label: '上党区', + value: 140404, + }, + { + children: [], + label: '屯留区', + value: 140405, + }, + { + children: [], + label: '潞城区', + value: 140406, + }, + { + children: [], + label: '襄垣县', + value: 140423, + }, + { + children: [], + label: '平顺县', + value: 140425, + }, + { + children: [], + label: '黎城县', + value: 140426, + }, + { + children: [], + label: '壶关县', + value: 140427, + }, + { + children: [], + label: '长子县', + value: 140428, + }, + { + children: [], + label: '武乡县', + value: 140429, + }, + { + children: [], + label: '沁县', + value: 140430, + }, + { + children: [], + label: '沁源县', + value: 140431, + }, + ], + label: '长治市', + value: 140400, + }, + { + children: [ + { + children: [], + label: '城区', + value: 140502, + }, + { + children: [], + label: '沁水县', + value: 140521, + }, + { + children: [], + label: '阳城县', + value: 140522, + }, + { + children: [], + label: '陵川县', + value: 140524, + }, + { + children: [], + label: '泽州县', + value: 140525, + }, + { + children: [], + label: '高平市', + value: 140581, + }, + ], + label: '晋城市', + value: 140500, + }, + { + children: [ + { + children: [], + label: '朔城区', + value: 140602, + }, + { + children: [], + label: '平鲁区', + value: 140603, + }, + { + children: [], + label: '山阴县', + value: 140621, + }, + { + children: [], + label: '应县', + value: 140622, + }, + { + children: [], + label: '右玉县', + value: 140623, + }, + { + children: [], + label: '怀仁市', + value: 140681, + }, + ], + label: '朔州市', + value: 140600, + }, + { + children: [ + { + children: [], + label: '榆次区', + value: 140702, + }, + { + children: [], + label: '榆社县', + value: 140721, + }, + { + children: [], + label: '左权县', + value: 140722, + }, + { + children: [], + label: '和顺县', + value: 140723, + }, + { + children: [], + label: '昔阳县', + value: 140724, + }, + { + children: [], + label: '寿阳县', + value: 140725, + }, + { + children: [], + label: '太谷县', + value: 140726, + }, + { + children: [], + label: '祁县', + value: 140727, + }, + { + children: [], + label: '平遥县', + value: 140728, + }, + { + children: [], + label: '灵石县', + value: 140729, + }, + { + children: [], + label: '介休市', + value: 140781, + }, + ], + label: '晋中市', + value: 140700, + }, + { + children: [ + { + children: [], + label: '盐湖区', + value: 140802, + }, + { + children: [], + label: '临猗县', + value: 140821, + }, + { + children: [], + label: '万荣县', + value: 140822, + }, + { + children: [], + label: '闻喜县', + value: 140823, + }, + { + children: [], + label: '稷山县', + value: 140824, + }, + { + children: [], + label: '新绛县', + value: 140825, + }, + { + children: [], + label: '绛县', + value: 140826, + }, + { + children: [], + label: '垣曲县', + value: 140827, + }, + { + children: [], + label: '夏县', + value: 140828, + }, + { + children: [], + label: '平陆县', + value: 140829, + }, + { + children: [], + label: '芮城县', + value: 140830, + }, + { + children: [], + label: '永济市', + value: 140881, + }, + { + children: [], + label: '河津市', + value: 140882, + }, + ], + label: '运城市', + value: 140800, + }, + { + children: [ + { + children: [], + label: '忻府区', + value: 140902, + }, + { + children: [], + label: '定襄县', + value: 140921, + }, + { + children: [], + label: '五台县', + value: 140922, + }, + { + children: [], + label: '代县', + value: 140923, + }, + { + children: [], + label: '繁峙县', + value: 140924, + }, + { + children: [], + label: '宁武县', + value: 140925, + }, + { + children: [], + label: '静乐县', + value: 140926, + }, + { + children: [], + label: '神池县', + value: 140927, + }, + { + children: [], + label: '五寨县', + value: 140928, + }, + { + children: [], + label: '岢岚县', + value: 140929, + }, + { + children: [], + label: '河曲县', + value: 140930, + }, + { + children: [], + label: '保德县', + value: 140931, + }, + { + children: [], + label: '偏关县', + value: 140932, + }, + { + children: [], + label: '原平市', + value: 140981, + }, + ], + label: '忻州市', + value: 140900, + }, + { + children: [ + { + children: [], + label: '尧都区', + value: 141002, + }, + { + children: [], + label: '曲沃县', + value: 141021, + }, + { + children: [], + label: '翼城县', + value: 141022, + }, + { + children: [], + label: '襄汾县', + value: 141023, + }, + { + children: [], + label: '洪洞县', + value: 141024, + }, + { + children: [], + label: '古县', + value: 141025, + }, + { + children: [], + label: '安泽县', + value: 141026, + }, + { + children: [], + label: '浮山县', + value: 141027, + }, + { + children: [], + label: '吉县', + value: 141028, + }, + { + children: [], + label: '乡宁县', + value: 141029, + }, + { + children: [], + label: '大宁县', + value: 141030, + }, + { + children: [], + label: '隰县', + value: 141031, + }, + { + children: [], + label: '永和县', + value: 141032, + }, + { + children: [], + label: '蒲县', + value: 141033, + }, + { + children: [], + label: '汾西县', + value: 141034, + }, + { + children: [], + label: '侯马市', + value: 141081, + }, + { + children: [], + label: '霍州市', + value: 141082, + }, + ], + label: '临汾市', + value: 141000, + }, + { + children: [ + { + children: [], + label: '离石区', + value: 141102, + }, + { + children: [], + label: '文水县', + value: 141121, + }, + { + children: [], + label: '交城县', + value: 141122, + }, + { + children: [], + label: '兴县', + value: 141123, + }, + { + children: [], + label: '临县', + value: 141124, + }, + { + children: [], + label: '柳林县', + value: 141125, + }, + { + children: [], + label: '石楼县', + value: 141126, + }, + { + children: [], + label: '岚县', + value: 141127, + }, + { + children: [], + label: '方山县', + value: 141128, + }, + { + children: [], + label: '中阳县', + value: 141129, + }, + { + children: [], + label: '交口县', + value: 141130, + }, + { + children: [], + label: '孝义市', + value: 141181, + }, + { + children: [], + label: '汾阳市', + value: 141182, + }, + ], + label: '吕梁市', + value: 141100, + }, + ], + label: '山西省', + value: 140000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '新城区', + value: 150102, + }, + { + children: [], + label: '回民区', + value: 150103, + }, + { + children: [], + label: '玉泉区', + value: 150104, + }, + { + children: [], + label: '赛罕区', + value: 150105, + }, + { + children: [], + label: '土默特左旗', + value: 150121, + }, + { + children: [], + label: '托克托县', + value: 150122, + }, + { + children: [], + label: '和林格尔县', + value: 150123, + }, + { + children: [], + label: '清水河县', + value: 150124, + }, + { + children: [], + label: '武川县', + value: 150125, + }, + ], + label: '呼和浩特市', + value: 150100, + }, + { + children: [ + { + children: [], + label: '东河区', + value: 150202, + }, + { + children: [], + label: '昆都仑区', + value: 150203, + }, + { + children: [], + label: '青山区', + value: 150204, + }, + { + children: [], + label: '石拐区', + value: 150205, + }, + { + children: [], + label: '白云鄂博矿区', + value: 150206, + }, + { + children: [], + label: '九原区', + value: 150207, + }, + { + children: [], + label: '土默特右旗', + value: 150221, + }, + { + children: [], + label: '固阳县', + value: 150222, + }, + { + children: [], + label: '达尔罕茂明安联合旗', + value: 150223, + }, + ], + label: '包头市', + value: 150200, + }, + { + children: [ + { + children: [], + label: '海勃湾区', + value: 150302, + }, + { + children: [], + label: '海南区', + value: 150303, + }, + { + children: [], + label: '乌达区', + value: 150304, + }, + ], + label: '乌海市', + value: 150300, + }, + { + children: [ + { + children: [], + label: '红山区', + value: 150402, + }, + { + children: [], + label: '元宝山区', + value: 150403, + }, + { + children: [], + label: '松山区', + value: 150404, + }, + { + children: [], + label: '阿鲁科尔沁旗', + value: 150421, + }, + { + children: [], + label: '巴林左旗', + value: 150422, + }, + { + children: [], + label: '巴林右旗', + value: 150423, + }, + { + children: [], + label: '林西县', + value: 150424, + }, + { + children: [], + label: '克什克腾旗', + value: 150425, + }, + { + children: [], + label: '翁牛特旗', + value: 150426, + }, + { + children: [], + label: '喀喇沁旗', + value: 150428, + }, + { + children: [], + label: '宁城县', + value: 150429, + }, + { + children: [], + label: '敖汉旗', + value: 150430, + }, + ], + label: '赤峰市', + value: 150400, + }, + { + children: [ + { + children: [], + label: '科尔沁区', + value: 150502, + }, + { + children: [], + label: '科尔沁左翼中旗', + value: 150521, + }, + { + children: [], + label: '科尔沁左翼后旗', + value: 150522, + }, + { + children: [], + label: '开鲁县', + value: 150523, + }, + { + children: [], + label: '库伦旗', + value: 150524, + }, + { + children: [], + label: '奈曼旗', + value: 150525, + }, + { + children: [], + label: '扎鲁特旗', + value: 150526, + }, + { + children: [], + label: '霍林郭勒市', + value: 150581, + }, + ], + label: '通辽市', + value: 150500, + }, + { + children: [ + { + children: [], + label: '东胜区', + value: 150602, + }, + { + children: [], + label: '康巴什区', + value: 150603, + }, + { + children: [], + label: '达拉特旗', + value: 150621, + }, + { + children: [], + label: '准格尔旗', + value: 150622, + }, + { + children: [], + label: '鄂托克前旗', + value: 150623, + }, + { + children: [], + label: '鄂托克旗', + value: 150624, + }, + { + children: [], + label: '杭锦旗', + value: 150625, + }, + { + children: [], + label: '乌审旗', + value: 150626, + }, + { + children: [], + label: '伊金霍洛旗', + value: 150627, + }, + ], + label: '鄂尔多斯市', + value: 150600, + }, + { + children: [ + { + children: [], + label: '海拉尔区', + value: 150702, + }, + { + children: [], + label: '扎赉诺尔区', + value: 150703, + }, + { + children: [], + label: '阿荣旗', + value: 150721, + }, + { + children: [], + label: '莫力达瓦达斡尔族自治旗', + value: 150722, + }, + { + children: [], + label: '鄂伦春自治旗', + value: 150723, + }, + { + children: [], + label: '鄂温克族自治旗', + value: 150724, + }, + { + children: [], + label: '陈巴尔虎旗', + value: 150725, + }, + { + children: [], + label: '新巴尔虎左旗', + value: 150726, + }, + { + children: [], + label: '新巴尔虎右旗', + value: 150727, + }, + { + children: [], + label: '满洲里市', + value: 150781, + }, + { + children: [], + label: '牙克石市', + value: 150782, + }, + { + children: [], + label: '扎兰屯市', + value: 150783, + }, + { + children: [], + label: '额尔古纳市', + value: 150784, + }, + { + children: [], + label: '根河市', + value: 150785, + }, + ], + label: '呼伦贝尔市', + value: 150700, + }, + { + children: [ + { + children: [], + label: '临河区', + value: 150802, + }, + { + children: [], + label: '五原县', + value: 150821, + }, + { + children: [], + label: '磴口县', + value: 150822, + }, + { + children: [], + label: '乌拉特前旗', + value: 150823, + }, + { + children: [], + label: '乌拉特中旗', + value: 150824, + }, + { + children: [], + label: '乌拉特后旗', + value: 150825, + }, + { + children: [], + label: '杭锦后旗', + value: 150826, + }, + ], + label: '巴彦淖尔市', + value: 150800, + }, + { + children: [ + { + children: [], + label: '集宁区', + value: 150902, + }, + { + children: [], + label: '卓资县', + value: 150921, + }, + { + children: [], + label: '化德县', + value: 150922, + }, + { + children: [], + label: '商都县', + value: 150923, + }, + { + children: [], + label: '兴和县', + value: 150924, + }, + { + children: [], + label: '凉城县', + value: 150925, + }, + { + children: [], + label: '察哈尔右翼前旗', + value: 150926, + }, + { + children: [], + label: '察哈尔右翼中旗', + value: 150927, + }, + { + children: [], + label: '察哈尔右翼后旗', + value: 150928, + }, + { + children: [], + label: '四子王旗', + value: 150929, + }, + { + children: [], + label: '丰镇市', + value: 150981, + }, + ], + label: '乌兰察布市', + value: 150900, + }, + { + children: [ + { + children: [], + label: '乌兰浩特市', + value: 152201, + }, + { + children: [], + label: '阿尔山市', + value: 152202, + }, + { + children: [], + label: '科尔沁右翼前旗', + value: 152221, + }, + { + children: [], + label: '科尔沁右翼中旗', + value: 152222, + }, + { + children: [], + label: '扎赉特旗', + value: 152223, + }, + { + children: [], + label: '突泉县', + value: 152224, + }, + ], + label: '兴安盟', + value: 152200, + }, + { + children: [ + { + children: [], + label: '二连浩特市', + value: 152501, + }, + { + children: [], + label: '锡林浩特市', + value: 152502, + }, + { + children: [], + label: '阿巴嘎旗', + value: 152522, + }, + { + children: [], + label: '苏尼特左旗', + value: 152523, + }, + { + children: [], + label: '苏尼特右旗', + value: 152524, + }, + { + children: [], + label: '东乌珠穆沁旗', + value: 152525, + }, + { + children: [], + label: '西乌珠穆沁旗', + value: 152526, + }, + { + children: [], + label: '太仆寺旗', + value: 152527, + }, + { + children: [], + label: '镶黄旗', + value: 152528, + }, + { + children: [], + label: '正镶白旗', + value: 152529, + }, + { + children: [], + label: '正蓝旗', + value: 152530, + }, + { + children: [], + label: '多伦县', + value: 152531, + }, + ], + label: '锡林郭勒盟', + value: 152500, + }, + { + children: [ + { + children: [], + label: '阿拉善左旗', + value: 152921, + }, + { + children: [], + label: '阿拉善右旗', + value: 152922, + }, + { + children: [], + label: '额济纳旗', + value: 152923, + }, + ], + label: '阿拉善盟', + value: 152900, + }, + ], + label: '内蒙古自治区', + value: 150000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '和平区', + value: 210102, + }, + { + children: [], + label: '沈河区', + value: 210103, + }, + { + children: [], + label: '大东区', + value: 210104, + }, + { + children: [], + label: '皇姑区', + value: 210105, + }, + { + children: [], + label: '铁西区', + value: 210106, + }, + { + children: [], + label: '苏家屯区', + value: 210111, + }, + { + children: [], + label: '浑南区', + value: 210112, + }, + { + children: [], + label: '沈北新区', + value: 210113, + }, + { + children: [], + label: '于洪区', + value: 210114, + }, + { + children: [], + label: '辽中区', + value: 210115, + }, + { + children: [], + label: '康平县', + value: 210123, + }, + { + children: [], + label: '法库县', + value: 210124, + }, + { + children: [], + label: '新民市', + value: 210181, + }, + ], + label: '沈阳市', + value: 210100, + }, + { + children: [ + { + children: [], + label: '中山区', + value: 210202, + }, + { + children: [], + label: '西岗区', + value: 210203, + }, + { + children: [], + label: '沙河口区', + value: 210204, + }, + { + children: [], + label: '甘井子区', + value: 210211, + }, + { + children: [], + label: '旅顺口区', + value: 210212, + }, + { + children: [], + label: '金州区', + value: 210213, + }, + { + children: [], + label: '普兰店区', + value: 210214, + }, + { + children: [], + label: '长海县', + value: 210224, + }, + { + children: [], + label: '瓦房店市', + value: 210281, + }, + { + children: [], + label: '庄河市', + value: 210283, + }, + ], + label: '大连市', + value: 210200, + }, + { + children: [ + { + children: [], + label: '铁东区', + value: 210302, + }, + { + children: [], + label: '铁西区', + value: 210303, + }, + { + children: [], + label: '立山区', + value: 210304, + }, + { + children: [], + label: '千山区', + value: 210311, + }, + { + children: [], + label: '台安县', + value: 210321, + }, + { + children: [], + label: '岫岩满族自治县', + value: 210323, + }, + { + children: [], + label: '海城市', + value: 210381, + }, + ], + label: '鞍山市', + value: 210300, + }, + { + children: [ + { + children: [], + label: '新抚区', + value: 210402, + }, + { + children: [], + label: '东洲区', + value: 210403, + }, + { + children: [], + label: '望花区', + value: 210404, + }, + { + children: [], + label: '顺城区', + value: 210411, + }, + { + children: [], + label: '抚顺县', + value: 210421, + }, + { + children: [], + label: '新宾满族自治县', + value: 210422, + }, + { + children: [], + label: '清原满族自治县', + value: 210423, + }, + ], + label: '抚顺市', + value: 210400, + }, + { + children: [ + { + children: [], + label: '平山区', + value: 210502, + }, + { + children: [], + label: '溪湖区', + value: 210503, + }, + { + children: [], + label: '明山区', + value: 210504, + }, + { + children: [], + label: '南芬区', + value: 210505, + }, + { + children: [], + label: '本溪满族自治县', + value: 210521, + }, + { + children: [], + label: '桓仁满族自治县', + value: 210522, + }, + ], + label: '本溪市', + value: 210500, + }, + { + children: [ + { + children: [], + label: '元宝区', + value: 210602, + }, + { + children: [], + label: '振兴区', + value: 210603, + }, + { + children: [], + label: '振安区', + value: 210604, + }, + { + children: [], + label: '宽甸满族自治县', + value: 210624, + }, + { + children: [], + label: '东港市', + value: 210681, + }, + { + children: [], + label: '凤城市', + value: 210682, + }, + ], + label: '丹东市', + value: 210600, + }, + { + children: [ + { + children: [], + label: '古塔区', + value: 210702, + }, + { + children: [], + label: '凌河区', + value: 210703, + }, + { + children: [], + label: '太和区', + value: 210711, + }, + { + children: [], + label: '黑山县', + value: 210726, + }, + { + children: [], + label: '义县', + value: 210727, + }, + { + children: [], + label: '凌海市', + value: 210781, + }, + { + children: [], + label: '北镇市', + value: 210782, + }, + ], + label: '锦州市', + value: 210700, + }, + { + children: [ + { + children: [], + label: '站前区', + value: 210802, + }, + { + children: [], + label: '西市区', + value: 210803, + }, + { + children: [], + label: '鲅鱼圈区', + value: 210804, + }, + { + children: [], + label: '老边区', + value: 210811, + }, + { + children: [], + label: '盖州市', + value: 210881, + }, + { + children: [], + label: '大石桥市', + value: 210882, + }, + ], + label: '营口市', + value: 210800, + }, + { + children: [ + { + children: [], + label: '海州区', + value: 210902, + }, + { + children: [], + label: '新邱区', + value: 210903, + }, + { + children: [], + label: '太平区', + value: 210904, + }, + { + children: [], + label: '清河门区', + value: 210905, + }, + { + children: [], + label: '细河区', + value: 210911, + }, + { + children: [], + label: '阜新蒙古族自治县', + value: 210921, + }, + { + children: [], + label: '彰武县', + value: 210922, + }, + ], + label: '阜新市', + value: 210900, + }, + { + children: [ + { + children: [], + label: '白塔区', + value: 211002, + }, + { + children: [], + label: '文圣区', + value: 211003, + }, + { + children: [], + label: '宏伟区', + value: 211004, + }, + { + children: [], + label: '弓长岭区', + value: 211005, + }, + { + children: [], + label: '太子河区', + value: 211011, + }, + { + children: [], + label: '辽阳县', + value: 211021, + }, + { + children: [], + label: '灯塔市', + value: 211081, + }, + ], + label: '辽阳市', + value: 211000, + }, + { + children: [ + { + children: [], + label: '双台子区', + value: 211102, + }, + { + children: [], + label: '兴隆台区', + value: 211103, + }, + { + children: [], + label: '大洼区', + value: 211104, + }, + { + children: [], + label: '盘山县', + value: 211122, + }, + ], + label: '盘锦市', + value: 211100, + }, + { + children: [ + { + children: [], + label: '银州区', + value: 211202, + }, + { + children: [], + label: '清河区', + value: 211204, + }, + { + children: [], + label: '铁岭县', + value: 211221, + }, + { + children: [], + label: '西丰县', + value: 211223, + }, + { + children: [], + label: '昌图县', + value: 211224, + }, + { + children: [], + label: '调兵山市', + value: 211281, + }, + { + children: [], + label: '开原市', + value: 211282, + }, + ], + label: '铁岭市', + value: 211200, + }, + { + children: [ + { + children: [], + label: '双塔区', + value: 211302, + }, + { + children: [], + label: '龙城区', + value: 211303, + }, + { + children: [], + label: '朝阳县', + value: 211321, + }, + { + children: [], + label: '建平县', + value: 211322, + }, + { + children: [], + label: '喀喇沁左翼蒙古族自治县', + value: 211324, + }, + { + children: [], + label: '北票市', + value: 211381, + }, + { + children: [], + label: '凌源市', + value: 211382, + }, + ], + label: '朝阳市', + value: 211300, + }, + { + children: [ + { + children: [], + label: '连山区', + value: 211402, + }, + { + children: [], + label: '龙港区', + value: 211403, + }, + { + children: [], + label: '南票区', + value: 211404, + }, + { + children: [], + label: '绥中县', + value: 211421, + }, + { + children: [], + label: '建昌县', + value: 211422, + }, + { + children: [], + label: '兴城市', + value: 211481, + }, + ], + label: '葫芦岛市', + value: 211400, + }, + ], + label: '辽宁省', + value: 210000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '南关区', + value: 220102, + }, + { + children: [], + label: '宽城区', + value: 220103, + }, + { + children: [], + label: '朝阳区', + value: 220104, + }, + { + children: [], + label: '二道区', + value: 220105, + }, + { + children: [], + label: '绿园区', + value: 220106, + }, + { + children: [], + label: '双阳区', + value: 220112, + }, + { + children: [], + label: '九台区', + value: 220113, + }, + { + children: [], + label: '农安县', + value: 220122, + }, + { + children: [], + label: '榆树市', + value: 220182, + }, + { + children: [], + label: '德惠市', + value: 220183, + }, + ], + label: '长春市', + value: 220100, + }, + { + children: [ + { + children: [], + label: '昌邑区', + value: 220202, + }, + { + children: [], + label: '龙潭区', + value: 220203, + }, + { + children: [], + label: '船营区', + value: 220204, + }, + { + children: [], + label: '丰满区', + value: 220211, + }, + { + children: [], + label: '永吉县', + value: 220221, + }, + { + children: [], + label: '蛟河市', + value: 220281, + }, + { + children: [], + label: '桦甸市', + value: 220282, + }, + { + children: [], + label: '舒兰市', + value: 220283, + }, + { + children: [], + label: '磐石市', + value: 220284, + }, + ], + label: '吉林市', + value: 220200, + }, + { + children: [ + { + children: [], + label: '铁西区', + value: 220302, + }, + { + children: [], + label: '铁东区', + value: 220303, + }, + { + children: [], + label: '梨树县', + value: 220322, + }, + { + children: [], + label: '伊通满族自治县', + value: 220323, + }, + { + children: [], + label: '公主岭市', + value: 220381, + }, + { + children: [], + label: '双辽市', + value: 220382, + }, + ], + label: '四平市', + value: 220300, + }, + { + children: [ + { + children: [], + label: '龙山区', + value: 220402, + }, + { + children: [], + label: '西安区', + value: 220403, + }, + { + children: [], + label: '东丰县', + value: 220421, + }, + { + children: [], + label: '东辽县', + value: 220422, + }, + ], + label: '辽源市', + value: 220400, + }, + { + children: [ + { + children: [], + label: '东昌区', + value: 220502, + }, + { + children: [], + label: '二道江区', + value: 220503, + }, + { + children: [], + label: '通化县', + value: 220521, + }, + { + children: [], + label: '辉南县', + value: 220523, + }, + { + children: [], + label: '柳河县', + value: 220524, + }, + { + children: [], + label: '梅河口市', + value: 220581, + }, + { + children: [], + label: '集安市', + value: 220582, + }, + ], + label: '通化市', + value: 220500, + }, + { + children: [ + { + children: [], + label: '浑江区', + value: 220602, + }, + { + children: [], + label: '江源区', + value: 220605, + }, + { + children: [], + label: '抚松县', + value: 220621, + }, + { + children: [], + label: '靖宇县', + value: 220622, + }, + { + children: [], + label: '长白朝鲜族自治县', + value: 220623, + }, + { + children: [], + label: '临江市', + value: 220681, + }, + ], + label: '白山市', + value: 220600, + }, + { + children: [ + { + children: [], + label: '宁江区', + value: 220702, + }, + { + children: [], + label: '前郭尔罗斯蒙古族自治县', + value: 220721, + }, + { + children: [], + label: '长岭县', + value: 220722, + }, + { + children: [], + label: '乾安县', + value: 220723, + }, + { + children: [], + label: '扶余市', + value: 220781, + }, + ], + label: '松原市', + value: 220700, + }, + { + children: [ + { + children: [], + label: '洮北区', + value: 220802, + }, + { + children: [], + label: '镇赉县', + value: 220821, + }, + { + children: [], + label: '通榆县', + value: 220822, + }, + { + children: [], + label: '洮南市', + value: 220881, + }, + { + children: [], + label: '大安市', + value: 220882, + }, + ], + label: '白城市', + value: 220800, + }, + { + children: [ + { + children: [], + label: '延吉市', + value: 222401, + }, + { + children: [], + label: '图们市', + value: 222402, + }, + { + children: [], + label: '敦化市', + value: 222403, + }, + { + children: [], + label: '珲春市', + value: 222404, + }, + { + children: [], + label: '龙井市', + value: 222405, + }, + { + children: [], + label: '和龙市', + value: 222406, + }, + { + children: [], + label: '汪清县', + value: 222424, + }, + { + children: [], + label: '安图县', + value: 222426, + }, + ], + label: '延边朝鲜族自治州', + value: 222400, + }, + ], + label: '吉林省', + value: 220000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '道里区', + value: 230102, + }, + { + children: [], + label: '南岗区', + value: 230103, + }, + { + children: [], + label: '道外区', + value: 230104, + }, + { + children: [], + label: '平房区', + value: 230108, + }, + { + children: [], + label: '松北区', + value: 230109, + }, + { + children: [], + label: '香坊区', + value: 230110, + }, + { + children: [], + label: '呼兰区', + value: 230111, + }, + { + children: [], + label: '阿城区', + value: 230112, + }, + { + children: [], + label: '双城区', + value: 230113, + }, + { + children: [], + label: '依兰县', + value: 230123, + }, + { + children: [], + label: '方正县', + value: 230124, + }, + { + children: [], + label: '宾县', + value: 230125, + }, + { + children: [], + label: '巴彦县', + value: 230126, + }, + { + children: [], + label: '木兰县', + value: 230127, + }, + { + children: [], + label: '通河县', + value: 230128, + }, + { + children: [], + label: '延寿县', + value: 230129, + }, + { + children: [], + label: '尚志市', + value: 230183, + }, + { + children: [], + label: '五常市', + value: 230184, + }, + ], + label: '哈尔滨市', + value: 230100, + }, + { + children: [ + { + children: [], + label: '龙沙区', + value: 230202, + }, + { + children: [], + label: '建华区', + value: 230203, + }, + { + children: [], + label: '铁锋区', + value: 230204, + }, + { + children: [], + label: '昂昂溪区', + value: 230205, + }, + { + children: [], + label: '富拉尔基区', + value: 230206, + }, + { + children: [], + label: '碾子山区', + value: 230207, + }, + { + children: [], + label: '梅里斯达斡尔族区', + value: 230208, + }, + { + children: [], + label: '龙江县', + value: 230221, + }, + { + children: [], + label: '依安县', + value: 230223, + }, + { + children: [], + label: '泰来县', + value: 230224, + }, + { + children: [], + label: '甘南县', + value: 230225, + }, + { + children: [], + label: '富裕县', + value: 230227, + }, + { + children: [], + label: '克山县', + value: 230229, + }, + { + children: [], + label: '克东县', + value: 230230, + }, + { + children: [], + label: '拜泉县', + value: 230231, + }, + { + children: [], + label: '讷河市', + value: 230281, + }, + ], + label: '齐齐哈尔市', + value: 230200, + }, + { + children: [ + { + children: [], + label: '鸡冠区', + value: 230302, + }, + { + children: [], + label: '恒山区', + value: 230303, + }, + { + children: [], + label: '滴道区', + value: 230304, + }, + { + children: [], + label: '梨树区', + value: 230305, + }, + { + children: [], + label: '城子河区', + value: 230306, + }, + { + children: [], + label: '麻山区', + value: 230307, + }, + { + children: [], + label: '鸡东县', + value: 230321, + }, + { + children: [], + label: '虎林市', + value: 230381, + }, + { + children: [], + label: '密山市', + value: 230382, + }, + ], + label: '鸡西市', + value: 230300, + }, + { + children: [ + { + children: [], + label: '向阳区', + value: 230402, + }, + { + children: [], + label: '工农区', + value: 230403, + }, + { + children: [], + label: '南山区', + value: 230404, + }, + { + children: [], + label: '兴安区', + value: 230405, + }, + { + children: [], + label: '东山区', + value: 230406, + }, + { + children: [], + label: '兴山区', + value: 230407, + }, + { + children: [], + label: '萝北县', + value: 230421, + }, + { + children: [], + label: '绥滨县', + value: 230422, + }, + ], + label: '鹤岗市', + value: 230400, + }, + { + children: [ + { + children: [], + label: '尖山区', + value: 230502, + }, + { + children: [], + label: '岭东区', + value: 230503, + }, + { + children: [], + label: '四方台区', + value: 230505, + }, + { + children: [], + label: '宝山区', + value: 230506, + }, + { + children: [], + label: '集贤县', + value: 230521, + }, + { + children: [], + label: '友谊县', + value: 230522, + }, + { + children: [], + label: '宝清县', + value: 230523, + }, + { + children: [], + label: '饶河县', + value: 230524, + }, + ], + label: '双鸭山市', + value: 230500, + }, + { + children: [ + { + children: [], + label: '萨尔图区', + value: 230602, + }, + { + children: [], + label: '龙凤区', + value: 230603, + }, + { + children: [], + label: '让胡路区', + value: 230604, + }, + { + children: [], + label: '红岗区', + value: 230605, + }, + { + children: [], + label: '大同区', + value: 230606, + }, + { + children: [], + label: '肇州县', + value: 230621, + }, + { + children: [], + label: '肇源县', + value: 230622, + }, + { + children: [], + label: '林甸县', + value: 230623, + }, + { + children: [], + label: '杜尔伯特蒙古族自治县', + value: 230624, + }, + ], + label: '大庆市', + value: 230600, + }, + { + children: [ + { + children: [], + label: '伊春区', + value: 230702, + }, + { + children: [], + label: '南岔区', + value: 230703, + }, + { + children: [], + label: '友好区', + value: 230704, + }, + { + children: [], + label: '西林区', + value: 230705, + }, + { + children: [], + label: '翠峦区', + value: 230706, + }, + { + children: [], + label: '新青区', + value: 230707, + }, + { + children: [], + label: '美溪区', + value: 230708, + }, + { + children: [], + label: '金山屯区', + value: 230709, + }, + { + children: [], + label: '五营区', + value: 230710, + }, + { + children: [], + label: '乌马河区', + value: 230711, + }, + { + children: [], + label: '汤旺河区', + value: 230712, + }, + { + children: [], + label: '带岭区', + value: 230713, + }, + { + children: [], + label: '乌伊岭区', + value: 230714, + }, + { + children: [], + label: '红星区', + value: 230715, + }, + { + children: [], + label: '上甘岭区', + value: 230716, + }, + { + children: [], + label: '嘉荫县', + value: 230722, + }, + { + children: [], + label: '铁力市', + value: 230781, + }, + ], + label: '伊春市', + value: 230700, + }, + { + children: [ + { + children: [], + label: '向阳区', + value: 230803, + }, + { + children: [], + label: '前进区', + value: 230804, + }, + { + children: [], + label: '东风区', + value: 230805, + }, + { + children: [], + label: '郊区', + value: 230811, + }, + { + children: [], + label: '桦南县', + value: 230822, + }, + { + children: [], + label: '桦川县', + value: 230826, + }, + { + children: [], + label: '汤原县', + value: 230828, + }, + { + children: [], + label: '同江市', + value: 230881, + }, + { + children: [], + label: '富锦市', + value: 230882, + }, + { + children: [], + label: '抚远市', + value: 230883, + }, + ], + label: '佳木斯市', + value: 230800, + }, + { + children: [ + { + children: [], + label: '新兴区', + value: 230902, + }, + { + children: [], + label: '桃山区', + value: 230903, + }, + { + children: [], + label: '茄子河区', + value: 230904, + }, + { + children: [], + label: '勃利县', + value: 230921, + }, + ], + label: '七台河市', + value: 230900, + }, + { + children: [ + { + children: [], + label: '东安区', + value: 231002, + }, + { + children: [], + label: '阳明区', + value: 231003, + }, + { + children: [], + label: '爱民区', + value: 231004, + }, + { + children: [], + label: '西安区', + value: 231005, + }, + { + children: [], + label: '林口县', + value: 231025, + }, + { + children: [], + label: '绥芬河市', + value: 231081, + }, + { + children: [], + label: '海林市', + value: 231083, + }, + { + children: [], + label: '宁安市', + value: 231084, + }, + { + children: [], + label: '穆棱市', + value: 231085, + }, + { + children: [], + label: '东宁市', + value: 231086, + }, + ], + label: '牡丹江市', + value: 231000, + }, + { + children: [ + { + children: [], + label: '爱辉区', + value: 231102, + }, + { + children: [], + label: '嫩江县', + value: 231121, + }, + { + children: [], + label: '逊克县', + value: 231123, + }, + { + children: [], + label: '孙吴县', + value: 231124, + }, + { + children: [], + label: '北安市', + value: 231181, + }, + { + children: [], + label: '五大连池市', + value: 231182, + }, + ], + label: '黑河市', + value: 231100, + }, + { + children: [ + { + children: [], + label: '北林区', + value: 231202, + }, + { + children: [], + label: '望奎县', + value: 231221, + }, + { + children: [], + label: '兰西县', + value: 231222, + }, + { + children: [], + label: '青冈县', + value: 231223, + }, + { + children: [], + label: '庆安县', + value: 231224, + }, + { + children: [], + label: '明水县', + value: 231225, + }, + { + children: [], + label: '绥棱县', + value: 231226, + }, + { + children: [], + label: '安达市', + value: 231281, + }, + { + children: [], + label: '肇东市', + value: 231282, + }, + { + children: [], + label: '海伦市', + value: 231283, + }, + ], + label: '绥化市', + value: 231200, + }, + { + children: [ + { + children: [], + label: '漠河市', + value: 232701, + }, + { + children: [], + label: '呼玛县', + value: 232721, + }, + { + children: [], + label: '塔河县', + value: 232722, + }, + { + children: [], + label: '大兴安岭地区直辖', + value: 232723, + }, + ], + label: '大兴安岭地区', + value: 232700, + }, + ], + label: '黑龙江省', + value: 230000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '黄浦区', + value: 310101, + }, + { + children: [], + label: '徐汇区', + value: 310104, + }, + { + children: [], + label: '长宁区', + value: 310105, + }, + { + children: [], + label: '静安区', + value: 310106, + }, + { + children: [], + label: '普陀区', + value: 310107, + }, + { + children: [], + label: '虹口区', + value: 310109, + }, + { + children: [], + label: '杨浦区', + value: 310110, + }, + { + children: [], + label: '闵行区', + value: 310112, + }, + { + children: [], + label: '宝山区', + value: 310113, + }, + { + children: [], + label: '嘉定区', + value: 310114, + }, + { + children: [], + label: '浦东新区', + value: 310115, + }, + { + children: [], + label: '金山区', + value: 310116, + }, + { + children: [], + label: '松江区', + value: 310117, + }, + { + children: [], + label: '青浦区', + value: 310118, + }, + { + children: [], + label: '奉贤区', + value: 310120, + }, + { + children: [], + label: '崇明区', + value: 310151, + }, + ], + label: '上海市', + value: 310100, + }, + ], + label: '上海市', + value: 310000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '玄武区', + value: 320102, + }, + { + children: [], + label: '秦淮区', + value: 320104, + }, + { + children: [], + label: '建邺区', + value: 320105, + }, + { + children: [], + label: '鼓楼区', + value: 320106, + }, + { + children: [], + label: '浦口区', + value: 320111, + }, + { + children: [], + label: '栖霞区', + value: 320113, + }, + { + children: [], + label: '雨花台区', + value: 320114, + }, + { + children: [], + label: '江宁区', + value: 320115, + }, + { + children: [], + label: '六合区', + value: 320116, + }, + { + children: [], + label: '溧水区', + value: 320117, + }, + { + children: [], + label: '高淳区', + value: 320118, + }, + ], + label: '南京市', + value: 320100, + }, + { + children: [ + { + children: [], + label: '锡山区', + value: 320205, + }, + { + children: [], + label: '惠山区', + value: 320206, + }, + { + children: [], + label: '滨湖区', + value: 320211, + }, + { + children: [], + label: '梁溪区', + value: 320213, + }, + { + children: [], + label: '新吴区', + value: 320214, + }, + { + children: [], + label: '江阴市', + value: 320281, + }, + { + children: [], + label: '宜兴市', + value: 320282, + }, + ], + label: '无锡市', + value: 320200, + }, + { + children: [ + { + children: [], + label: '鼓楼区', + value: 320302, + }, + { + children: [], + label: '云龙区', + value: 320303, + }, + { + children: [], + label: '贾汪区', + value: 320305, + }, + { + children: [], + label: '泉山区', + value: 320311, + }, + { + children: [], + label: '铜山区', + value: 320312, + }, + { + children: [], + label: '丰县', + value: 320321, + }, + { + children: [], + label: '沛县', + value: 320322, + }, + { + children: [], + label: '睢宁县', + value: 320324, + }, + { + children: [], + label: '新沂市', + value: 320381, + }, + { + children: [], + label: '邳州市', + value: 320382, + }, + ], + label: '徐州市', + value: 320300, + }, + { + children: [ + { + children: [], + label: '天宁区', + value: 320402, + }, + { + children: [], + label: '钟楼区', + value: 320404, + }, + { + children: [], + label: '新北区', + value: 320411, + }, + { + children: [], + label: '武进区', + value: 320412, + }, + { + children: [], + label: '金坛区', + value: 320413, + }, + { + children: [], + label: '溧阳市', + value: 320481, + }, + ], + label: '常州市', + value: 320400, + }, + { + children: [ + { + children: [], + label: '虎丘区', + value: 320505, + }, + { + children: [], + label: '吴中区', + value: 320506, + }, + { + children: [], + label: '相城区', + value: 320507, + }, + { + children: [], + label: '姑苏区', + value: 320508, + }, + { + children: [], + label: '吴江区', + value: 320509, + }, + { + children: [], + label: '苏州工业园区', + value: 320571, + }, + { + children: [], + label: '常熟市', + value: 320581, + }, + { + children: [], + label: '张家港市', + value: 320582, + }, + { + children: [], + label: '昆山市', + value: 320583, + }, + { + children: [], + label: '太仓市', + value: 320585, + }, + ], + label: '苏州市', + value: 320500, + }, + { + children: [ + { + children: [], + label: '崇川区', + value: 320602, + }, + { + children: [], + label: '港闸区', + value: 320611, + }, + { + children: [], + label: '通州区', + value: 320612, + }, + { + children: [], + label: '如东县', + value: 320623, + }, + { + children: [], + label: '启东市', + value: 320681, + }, + { + children: [], + label: '如皋市', + value: 320682, + }, + { + children: [], + label: '海门市', + value: 320684, + }, + { + children: [], + label: '海安市', + value: 320685, + }, + ], + label: '南通市', + value: 320600, + }, + { + children: [ + { + children: [], + label: '连云区', + value: 320703, + }, + { + children: [], + label: '海州区', + value: 320706, + }, + { + children: [], + label: '赣榆区', + value: 320707, + }, + { + children: [], + label: '东海县', + value: 320722, + }, + { + children: [], + label: '灌云县', + value: 320723, + }, + { + children: [], + label: '灌南县', + value: 320724, + }, + ], + label: '连云港市', + value: 320700, + }, + { + children: [ + { + children: [], + label: '淮安区', + value: 320803, + }, + { + children: [], + label: '淮阴区', + value: 320804, + }, + { + children: [], + label: '清江浦区', + value: 320812, + }, + { + children: [], + label: '洪泽区', + value: 320813, + }, + { + children: [], + label: '涟水县', + value: 320826, + }, + { + children: [], + label: '盱眙县', + value: 320830, + }, + { + children: [], + label: '金湖县', + value: 320831, + }, + ], + label: '淮安市', + value: 320800, + }, + { + children: [ + { + children: [], + label: '亭湖区', + value: 320902, + }, + { + children: [], + label: '盐都区', + value: 320903, + }, + { + children: [], + label: '大丰区', + value: 320904, + }, + { + children: [], + label: '响水县', + value: 320921, + }, + { + children: [], + label: '滨海县', + value: 320922, + }, + { + children: [], + label: '阜宁县', + value: 320923, + }, + { + children: [], + label: '射阳县', + value: 320924, + }, + { + children: [], + label: '建湖县', + value: 320925, + }, + { + children: [], + label: '东台市', + value: 320981, + }, + ], + label: '盐城市', + value: 320900, + }, + { + children: [ + { + children: [], + label: '广陵区', + value: 321002, + }, + { + children: [], + label: '邗江区', + value: 321003, + }, + { + children: [], + label: '江都区', + value: 321012, + }, + { + children: [], + label: '宝应县', + value: 321023, + }, + { + children: [], + label: '仪征市', + value: 321081, + }, + { + children: [], + label: '高邮市', + value: 321084, + }, + ], + label: '扬州市', + value: 321000, + }, + { + children: [ + { + children: [], + label: '京口区', + value: 321102, + }, + { + children: [], + label: '润州区', + value: 321111, + }, + { + children: [], + label: '丹徒区', + value: 321112, + }, + { + children: [], + label: '丹阳市', + value: 321181, + }, + { + children: [], + label: '扬中市', + value: 321182, + }, + { + children: [], + label: '句容市', + value: 321183, + }, + ], + label: '镇江市', + value: 321100, + }, + { + children: [ + { + children: [], + label: '海陵区', + value: 321202, + }, + { + children: [], + label: '高港区', + value: 321203, + }, + { + children: [], + label: '姜堰区', + value: 321204, + }, + { + children: [], + label: '兴化市', + value: 321281, + }, + { + children: [], + label: '靖江市', + value: 321282, + }, + { + children: [], + label: '泰兴市', + value: 321283, + }, + ], + label: '泰州市', + value: 321200, + }, + { + children: [ + { + children: [], + label: '宿城区', + value: 321302, + }, + { + children: [], + label: '宿豫区', + value: 321311, + }, + { + children: [], + label: '沭阳县', + value: 321322, + }, + { + children: [], + label: '泗阳县', + value: 321323, + }, + { + children: [], + label: '泗洪县', + value: 321324, + }, + ], + label: '宿迁市', + value: 321300, + }, + ], + label: '江苏省', + value: 320000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '上城区', + value: 330102, + }, + { + children: [], + label: '下城区', + value: 330103, + }, + { + children: [], + label: '江干区', + value: 330104, + }, + { + children: [], + label: '拱墅区', + value: 330105, + }, + { + children: [], + label: '西湖区', + value: 330106, + }, + { + children: [], + label: '滨江区', + value: 330108, + }, + { + children: [], + label: '萧山区', + value: 330109, + }, + { + children: [], + label: '余杭区', + value: 330110, + }, + { + children: [], + label: '富阳区', + value: 330111, + }, + { + children: [], + label: '临安区', + value: 330112, + }, + { + children: [], + label: '桐庐县', + value: 330122, + }, + { + children: [], + label: '淳安县', + value: 330127, + }, + { + children: [], + label: '建德市', + value: 330182, + }, + ], + label: '杭州市', + value: 330100, + }, + { + children: [ + { + children: [], + label: '海曙区', + value: 330203, + }, + { + children: [], + label: '江北区', + value: 330205, + }, + { + children: [], + label: '北仑区', + value: 330206, + }, + { + children: [], + label: '镇海区', + value: 330211, + }, + { + children: [], + label: '鄞州区', + value: 330212, + }, + { + children: [], + label: '奉化区', + value: 330213, + }, + { + children: [], + label: '象山县', + value: 330225, + }, + { + children: [], + label: '宁海县', + value: 330226, + }, + { + children: [], + label: '余姚市', + value: 330281, + }, + { + children: [], + label: '慈溪市', + value: 330282, + }, + ], + label: '宁波市', + value: 330200, + }, + { + children: [ + { + children: [], + label: '鹿城区', + value: 330302, + }, + { + children: [], + label: '龙湾区', + value: 330303, + }, + { + children: [], + label: '瓯海区', + value: 330304, + }, + { + children: [], + label: '洞头区', + value: 330305, + }, + { + children: [], + label: '永嘉县', + value: 330324, + }, + { + children: [], + label: '平阳县', + value: 330326, + }, + { + children: [], + label: '苍南县', + value: 330327, + }, + { + children: [], + label: '文成县', + value: 330328, + }, + { + children: [], + label: '泰顺县', + value: 330329, + }, + { + children: [], + label: '瑞安市', + value: 330381, + }, + { + children: [], + label: '乐清市', + value: 330382, + }, + ], + label: '温州市', + value: 330300, + }, + { + children: [ + { + children: [], + label: '南湖区', + value: 330402, + }, + { + children: [], + label: '秀洲区', + value: 330411, + }, + { + children: [], + label: '嘉善县', + value: 330421, + }, + { + children: [], + label: '海盐县', + value: 330424, + }, + { + children: [], + label: '海宁市', + value: 330481, + }, + { + children: [], + label: '平湖市', + value: 330482, + }, + { + children: [], + label: '桐乡市', + value: 330483, + }, + ], + label: '嘉兴市', + value: 330400, + }, + { + children: [ + { + children: [], + label: '吴兴区', + value: 330502, + }, + { + children: [], + label: '南浔区', + value: 330503, + }, + { + children: [], + label: '德清县', + value: 330521, + }, + { + children: [], + label: '长兴县', + value: 330522, + }, + { + children: [], + label: '安吉县', + value: 330523, + }, + ], + label: '湖州市', + value: 330500, + }, + { + children: [ + { + children: [], + label: '越城区', + value: 330602, + }, + { + children: [], + label: '柯桥区', + value: 330603, + }, + { + children: [], + label: '上虞区', + value: 330604, + }, + { + children: [], + label: '新昌县', + value: 330624, + }, + { + children: [], + label: '诸暨市', + value: 330681, + }, + { + children: [], + label: '嵊州市', + value: 330683, + }, + ], + label: '绍兴市', + value: 330600, + }, + { + children: [ + { + children: [], + label: '婺城区', + value: 330702, + }, + { + children: [], + label: '金东区', + value: 330703, + }, + { + children: [], + label: '武义县', + value: 330723, + }, + { + children: [], + label: '浦江县', + value: 330726, + }, + { + children: [], + label: '磐安县', + value: 330727, + }, + { + children: [], + label: '兰溪市', + value: 330781, + }, + { + children: [], + label: '义乌市', + value: 330782, + }, + { + children: [], + label: '东阳市', + value: 330783, + }, + { + children: [], + label: '永康市', + value: 330784, + }, + ], + label: '金华市', + value: 330700, + }, + { + children: [ + { + children: [], + label: '柯城区', + value: 330802, + }, + { + children: [], + label: '衢江区', + value: 330803, + }, + { + children: [], + label: '常山县', + value: 330822, + }, + { + children: [], + label: '开化县', + value: 330824, + }, + { + children: [], + label: '龙游县', + value: 330825, + }, + { + children: [], + label: '江山市', + value: 330881, + }, + ], + label: '衢州市', + value: 330800, + }, + { + children: [ + { + children: [], + label: '定海区', + value: 330902, + }, + { + children: [], + label: '普陀区', + value: 330903, + }, + { + children: [], + label: '岱山县', + value: 330921, + }, + { + children: [], + label: '嵊泗县', + value: 330922, + }, + ], + label: '舟山市', + value: 330900, + }, + { + children: [ + { + children: [], + label: '椒江区', + value: 331002, + }, + { + children: [], + label: '黄岩区', + value: 331003, + }, + { + children: [], + label: '路桥区', + value: 331004, + }, + { + children: [], + label: '三门县', + value: 331022, + }, + { + children: [], + label: '天台县', + value: 331023, + }, + { + children: [], + label: '仙居县', + value: 331024, + }, + { + children: [], + label: '温岭市', + value: 331081, + }, + { + children: [], + label: '临海市', + value: 331082, + }, + { + children: [], + label: '玉环市', + value: 331083, + }, + ], + label: '台州市', + value: 331000, + }, + { + children: [ + { + children: [], + label: '莲都区', + value: 331102, + }, + { + children: [], + label: '青田县', + value: 331121, + }, + { + children: [], + label: '缙云县', + value: 331122, + }, + { + children: [], + label: '遂昌县', + value: 331123, + }, + { + children: [], + label: '松阳县', + value: 331124, + }, + { + children: [], + label: '云和县', + value: 331125, + }, + { + children: [], + label: '庆元县', + value: 331126, + }, + { + children: [], + label: '景宁畲族自治县', + value: 331127, + }, + { + children: [], + label: '龙泉市', + value: 331181, + }, + ], + label: '丽水市', + value: 331100, + }, + ], + label: '浙江省', + value: 330000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '瑶海区', + value: 340102, + }, + { + children: [], + label: '庐阳区', + value: 340103, + }, + { + children: [], + label: '蜀山区', + value: 340104, + }, + { + children: [], + label: '包河区', + value: 340111, + }, + { + children: [], + label: '长丰县', + value: 340121, + }, + { + children: [], + label: '肥东县', + value: 340122, + }, + { + children: [], + label: '肥西县', + value: 340123, + }, + { + children: [], + label: '庐江县', + value: 340124, + }, + { + children: [], + label: '巢湖市', + value: 340181, + }, + ], + label: '合肥市', + value: 340100, + }, + { + children: [ + { + children: [], + label: '镜湖区', + value: 340202, + }, + { + children: [], + label: '弋江区', + value: 340203, + }, + { + children: [], + label: '鸠江区', + value: 340207, + }, + { + children: [], + label: '三山区', + value: 340208, + }, + { + children: [], + label: '芜湖县', + value: 340221, + }, + { + children: [], + label: '繁昌县', + value: 340222, + }, + { + children: [], + label: '南陵县', + value: 340223, + }, + { + children: [], + label: '无为县', + value: 340225, + }, + ], + label: '芜湖市', + value: 340200, + }, + { + children: [ + { + children: [], + label: '龙子湖区', + value: 340302, + }, + { + children: [], + label: '蚌山区', + value: 340303, + }, + { + children: [], + label: '禹会区', + value: 340304, + }, + { + children: [], + label: '淮上区', + value: 340311, + }, + { + children: [], + label: '怀远县', + value: 340321, + }, + { + children: [], + label: '五河县', + value: 340322, + }, + { + children: [], + label: '固镇县', + value: 340323, + }, + ], + label: '蚌埠市', + value: 340300, + }, + { + children: [ + { + children: [], + label: '大通区', + value: 340402, + }, + { + children: [], + label: '田家庵区', + value: 340403, + }, + { + children: [], + label: '谢家集区', + value: 340404, + }, + { + children: [], + label: '八公山区', + value: 340405, + }, + { + children: [], + label: '潘集区', + value: 340406, + }, + { + children: [], + label: '凤台县', + value: 340421, + }, + { + children: [], + label: '寿县', + value: 340422, + }, + ], + label: '淮南市', + value: 340400, + }, + { + children: [ + { + children: [], + label: '花山区', + value: 340503, + }, + { + children: [], + label: '雨山区', + value: 340504, + }, + { + children: [], + label: '博望区', + value: 340506, + }, + { + children: [], + label: '当涂县', + value: 340521, + }, + { + children: [], + label: '含山县', + value: 340522, + }, + { + children: [], + label: '和县', + value: 340523, + }, + ], + label: '马鞍山市', + value: 340500, + }, + { + children: [ + { + children: [], + label: '杜集区', + value: 340602, + }, + { + children: [], + label: '相山区', + value: 340603, + }, + { + children: [], + label: '烈山区', + value: 340604, + }, + { + children: [], + label: '濉溪县', + value: 340621, + }, + ], + label: '淮北市', + value: 340600, + }, + { + children: [ + { + children: [], + label: '铜官区', + value: 340705, + }, + { + children: [], + label: '义安区', + value: 340706, + }, + { + children: [], + label: '郊区', + value: 340711, + }, + { + children: [], + label: '枞阳县', + value: 340722, + }, + ], + label: '铜陵市', + value: 340700, + }, + { + children: [ + { + children: [], + label: '迎江区', + value: 340802, + }, + { + children: [], + label: '大观区', + value: 340803, + }, + { + children: [], + label: '宜秀区', + value: 340811, + }, + { + children: [], + label: '怀宁县', + value: 340822, + }, + { + children: [], + label: '太湖县', + value: 340825, + }, + { + children: [], + label: '宿松县', + value: 340826, + }, + { + children: [], + label: '望江县', + value: 340827, + }, + { + children: [], + label: '岳西县', + value: 340828, + }, + { + children: [], + label: '桐城市', + value: 340881, + }, + { + children: [], + label: '潜山市', + value: 340882, + }, + ], + label: '安庆市', + value: 340800, + }, + { + children: [ + { + children: [], + label: '屯溪区', + value: 341002, + }, + { + children: [], + label: '黄山区', + value: 341003, + }, + { + children: [], + label: '徽州区', + value: 341004, + }, + { + children: [], + label: '歙县', + value: 341021, + }, + { + children: [], + label: '休宁县', + value: 341022, + }, + { + children: [], + label: '黟县', + value: 341023, + }, + { + children: [], + label: '祁门县', + value: 341024, + }, + ], + label: '黄山市', + value: 341000, + }, + { + children: [ + { + children: [], + label: '琅琊区', + value: 341102, + }, + { + children: [], + label: '南谯区', + value: 341103, + }, + { + children: [], + label: '来安县', + value: 341122, + }, + { + children: [], + label: '全椒县', + value: 341124, + }, + { + children: [], + label: '定远县', + value: 341125, + }, + { + children: [], + label: '凤阳县', + value: 341126, + }, + { + children: [], + label: '天长市', + value: 341181, + }, + { + children: [], + label: '明光市', + value: 341182, + }, + ], + label: '滁州市', + value: 341100, + }, + { + children: [ + { + children: [], + label: '颍州区', + value: 341202, + }, + { + children: [], + label: '颍东区', + value: 341203, + }, + { + children: [], + label: '颍泉区', + value: 341204, + }, + { + children: [], + label: '临泉县', + value: 341221, + }, + { + children: [], + label: '太和县', + value: 341222, + }, + { + children: [], + label: '阜南县', + value: 341225, + }, + { + children: [], + label: '颍上县', + value: 341226, + }, + { + children: [], + label: '界首市', + value: 341282, + }, + ], + label: '阜阳市', + value: 341200, + }, + { + children: [ + { + children: [], + label: '埇桥区', + value: 341302, + }, + { + children: [], + label: '砀山县', + value: 341321, + }, + { + children: [], + label: '萧县', + value: 341322, + }, + { + children: [], + label: '灵璧县', + value: 341323, + }, + { + children: [], + label: '泗县', + value: 341324, + }, + ], + label: '宿州市', + value: 341300, + }, + { + children: [ + { + children: [], + label: '金安区', + value: 341502, + }, + { + children: [], + label: '裕安区', + value: 341503, + }, + { + children: [], + label: '叶集区', + value: 341504, + }, + { + children: [], + label: '霍邱县', + value: 341522, + }, + { + children: [], + label: '舒城县', + value: 341523, + }, + { + children: [], + label: '金寨县', + value: 341524, + }, + { + children: [], + label: '霍山县', + value: 341525, + }, + ], + label: '六安市', + value: 341500, + }, + { + children: [ + { + children: [], + label: '谯城区', + value: 341602, + }, + { + children: [], + label: '涡阳县', + value: 341621, + }, + { + children: [], + label: '蒙城县', + value: 341622, + }, + { + children: [], + label: '利辛县', + value: 341623, + }, + ], + label: '亳州市', + value: 341600, + }, + { + children: [ + { + children: [], + label: '贵池区', + value: 341702, + }, + { + children: [], + label: '东至县', + value: 341721, + }, + { + children: [], + label: '石台县', + value: 341722, + }, + { + children: [], + label: '青阳县', + value: 341723, + }, + ], + label: '池州市', + value: 341700, + }, + { + children: [ + { + children: [], + label: '宣州区', + value: 341802, + }, + { + children: [], + label: '郎溪县', + value: 341821, + }, + { + children: [], + label: '广德县', + value: 341822, + }, + { + children: [], + label: '泾县', + value: 341823, + }, + { + children: [], + label: '绩溪县', + value: 341824, + }, + { + children: [], + label: '旌德县', + value: 341825, + }, + { + children: [], + label: '宁国市', + value: 341881, + }, + ], + label: '宣城市', + value: 341800, + }, + ], + label: '安徽省', + value: 340000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '鼓楼区', + value: 350102, + }, + { + children: [], + label: '台江区', + value: 350103, + }, + { + children: [], + label: '仓山区', + value: 350104, + }, + { + children: [], + label: '马尾区', + value: 350105, + }, + { + children: [], + label: '晋安区', + value: 350111, + }, + { + children: [], + label: '长乐区', + value: 350112, + }, + { + children: [], + label: '闽侯县', + value: 350121, + }, + { + children: [], + label: '连江县', + value: 350122, + }, + { + children: [], + label: '罗源县', + value: 350123, + }, + { + children: [], + label: '闽清县', + value: 350124, + }, + { + children: [], + label: '永泰县', + value: 350125, + }, + { + children: [], + label: '平潭县', + value: 350128, + }, + { + children: [], + label: '福清市', + value: 350181, + }, + ], + label: '福州市', + value: 350100, + }, + { + children: [ + { + children: [], + label: '思明区', + value: 350203, + }, + { + children: [], + label: '海沧区', + value: 350205, + }, + { + children: [], + label: '湖里区', + value: 350206, + }, + { + children: [], + label: '集美区', + value: 350211, + }, + { + children: [], + label: '同安区', + value: 350212, + }, + { + children: [], + label: '翔安区', + value: 350213, + }, + ], + label: '厦门市', + value: 350200, + }, + { + children: [ + { + children: [], + label: '城厢区', + value: 350302, + }, + { + children: [], + label: '涵江区', + value: 350303, + }, + { + children: [], + label: '荔城区', + value: 350304, + }, + { + children: [], + label: '秀屿区', + value: 350305, + }, + { + children: [], + label: '仙游县', + value: 350322, + }, + ], + label: '莆田市', + value: 350300, + }, + { + children: [ + { + children: [], + label: '梅列区', + value: 350402, + }, + { + children: [], + label: '三元区', + value: 350403, + }, + { + children: [], + label: '明溪县', + value: 350421, + }, + { + children: [], + label: '清流县', + value: 350423, + }, + { + children: [], + label: '宁化县', + value: 350424, + }, + { + children: [], + label: '大田县', + value: 350425, + }, + { + children: [], + label: '尤溪县', + value: 350426, + }, + { + children: [], + label: '沙县', + value: 350427, + }, + { + children: [], + label: '将乐县', + value: 350428, + }, + { + children: [], + label: '泰宁县', + value: 350429, + }, + { + children: [], + label: '建宁县', + value: 350430, + }, + { + children: [], + label: '永安市', + value: 350481, + }, + ], + label: '三明市', + value: 350400, + }, + { + children: [ + { + children: [], + label: '鲤城区', + value: 350502, + }, + { + children: [], + label: '丰泽区', + value: 350503, + }, + { + children: [], + label: '洛江区', + value: 350504, + }, + { + children: [], + label: '泉港区', + value: 350505, + }, + { + children: [], + label: '惠安县', + value: 350521, + }, + { + children: [], + label: '安溪县', + value: 350524, + }, + { + children: [], + label: '永春县', + value: 350525, + }, + { + children: [], + label: '德化县', + value: 350526, + }, + { + children: [], + label: '金门县', + value: 350527, + }, + { + children: [], + label: '石狮市', + value: 350581, + }, + { + children: [], + label: '晋江市', + value: 350582, + }, + { + children: [], + label: '南安市', + value: 350583, + }, + ], + label: '泉州市', + value: 350500, + }, + { + children: [ + { + children: [], + label: '芗城区', + value: 350602, + }, + { + children: [], + label: '龙文区', + value: 350603, + }, + { + children: [], + label: '云霄县', + value: 350622, + }, + { + children: [], + label: '漳浦县', + value: 350623, + }, + { + children: [], + label: '诏安县', + value: 350624, + }, + { + children: [], + label: '长泰县', + value: 350625, + }, + { + children: [], + label: '东山县', + value: 350626, + }, + { + children: [], + label: '南靖县', + value: 350627, + }, + { + children: [], + label: '平和县', + value: 350628, + }, + { + children: [], + label: '华安县', + value: 350629, + }, + { + children: [], + label: '龙海市', + value: 350681, + }, + ], + label: '漳州市', + value: 350600, + }, + { + children: [ + { + children: [], + label: '延平区', + value: 350702, + }, + { + children: [], + label: '建阳区', + value: 350703, + }, + { + children: [], + label: '顺昌县', + value: 350721, + }, + { + children: [], + label: '浦城县', + value: 350722, + }, + { + children: [], + label: '光泽县', + value: 350723, + }, + { + children: [], + label: '松溪县', + value: 350724, + }, + { + children: [], + label: '政和县', + value: 350725, + }, + { + children: [], + label: '邵武市', + value: 350781, + }, + { + children: [], + label: '武夷山市', + value: 350782, + }, + { + children: [], + label: '建瓯市', + value: 350783, + }, + ], + label: '南平市', + value: 350700, + }, + { + children: [ + { + children: [], + label: '新罗区', + value: 350802, + }, + { + children: [], + label: '永定区', + value: 350803, + }, + { + children: [], + label: '长汀县', + value: 350821, + }, + { + children: [], + label: '上杭县', + value: 350823, + }, + { + children: [], + label: '武平县', + value: 350824, + }, + { + children: [], + label: '连城县', + value: 350825, + }, + { + children: [], + label: '漳平市', + value: 350881, + }, + ], + label: '龙岩市', + value: 350800, + }, + { + children: [ + { + children: [], + label: '蕉城区', + value: 350902, + }, + { + children: [], + label: '霞浦县', + value: 350921, + }, + { + children: [], + label: '古田县', + value: 350922, + }, + { + children: [], + label: '屏南县', + value: 350923, + }, + { + children: [], + label: '寿宁县', + value: 350924, + }, + { + children: [], + label: '周宁县', + value: 350925, + }, + { + children: [], + label: '柘荣县', + value: 350926, + }, + { + children: [], + label: '福安市', + value: 350981, + }, + { + children: [], + label: '福鼎市', + value: 350982, + }, + ], + label: '宁德市', + value: 350900, + }, + ], + label: '福建省', + value: 350000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '东湖区', + value: 360102, + }, + { + children: [], + label: '西湖区', + value: 360103, + }, + { + children: [], + label: '青云谱区', + value: 360104, + }, + { + children: [], + label: '湾里区', + value: 360105, + }, + { + children: [], + label: '青山湖区', + value: 360111, + }, + { + children: [], + label: '新建区', + value: 360112, + }, + { + children: [], + label: '南昌县', + value: 360121, + }, + { + children: [], + label: '安义县', + value: 360123, + }, + { + children: [], + label: '进贤县', + value: 360124, + }, + ], + label: '南昌市', + value: 360100, + }, + { + children: [ + { + children: [], + label: '昌江区', + value: 360202, + }, + { + children: [], + label: '珠山区', + value: 360203, + }, + { + children: [], + label: '浮梁县', + value: 360222, + }, + { + children: [], + label: '乐平市', + value: 360281, + }, + ], + label: '景德镇市', + value: 360200, + }, + { + children: [ + { + children: [], + label: '安源区', + value: 360302, + }, + { + children: [], + label: '湘东区', + value: 360313, + }, + { + children: [], + label: '莲花县', + value: 360321, + }, + { + children: [], + label: '上栗县', + value: 360322, + }, + { + children: [], + label: '芦溪县', + value: 360323, + }, + ], + label: '萍乡市', + value: 360300, + }, + { + children: [ + { + children: [], + label: '濂溪区', + value: 360402, + }, + { + children: [], + label: '浔阳区', + value: 360403, + }, + { + children: [], + label: '柴桑区', + value: 360404, + }, + { + children: [], + label: '武宁县', + value: 360423, + }, + { + children: [], + label: '修水县', + value: 360424, + }, + { + children: [], + label: '永修县', + value: 360425, + }, + { + children: [], + label: '德安县', + value: 360426, + }, + { + children: [], + label: '都昌县', + value: 360428, + }, + { + children: [], + label: '湖口县', + value: 360429, + }, + { + children: [], + label: '彭泽县', + value: 360430, + }, + { + children: [], + label: '瑞昌市', + value: 360481, + }, + { + children: [], + label: '共青城市', + value: 360482, + }, + { + children: [], + label: '庐山市', + value: 360483, + }, + ], + label: '九江市', + value: 360400, + }, + { + children: [ + { + children: [], + label: '渝水区', + value: 360502, + }, + { + children: [], + label: '分宜县', + value: 360521, + }, + ], + label: '新余市', + value: 360500, + }, + { + children: [ + { + children: [], + label: '月湖区', + value: 360602, + }, + { + children: [], + label: '余江区', + value: 360603, + }, + { + children: [], + label: '贵溪市', + value: 360681, + }, + ], + label: '鹰潭市', + value: 360600, + }, + { + children: [ + { + children: [], + label: '章贡区', + value: 360702, + }, + { + children: [], + label: '南康区', + value: 360703, + }, + { + children: [], + label: '赣县区', + value: 360704, + }, + { + children: [], + label: '信丰县', + value: 360722, + }, + { + children: [], + label: '大余县', + value: 360723, + }, + { + children: [], + label: '上犹县', + value: 360724, + }, + { + children: [], + label: '崇义县', + value: 360725, + }, + { + children: [], + label: '安远县', + value: 360726, + }, + { + children: [], + label: '龙南县', + value: 360727, + }, + { + children: [], + label: '定南县', + value: 360728, + }, + { + children: [], + label: '全南县', + value: 360729, + }, + { + children: [], + label: '宁都县', + value: 360730, + }, + { + children: [], + label: '于都县', + value: 360731, + }, + { + children: [], + label: '兴国县', + value: 360732, + }, + { + children: [], + label: '会昌县', + value: 360733, + }, + { + children: [], + label: '寻乌县', + value: 360734, + }, + { + children: [], + label: '石城县', + value: 360735, + }, + { + children: [], + label: '瑞金市', + value: 360781, + }, + ], + label: '赣州市', + value: 360700, + }, + { + children: [ + { + children: [], + label: '吉州区', + value: 360802, + }, + { + children: [], + label: '青原区', + value: 360803, + }, + { + children: [], + label: '吉安县', + value: 360821, + }, + { + children: [], + label: '吉水县', + value: 360822, + }, + { + children: [], + label: '峡江县', + value: 360823, + }, + { + children: [], + label: '新干县', + value: 360824, + }, + { + children: [], + label: '永丰县', + value: 360825, + }, + { + children: [], + label: '泰和县', + value: 360826, + }, + { + children: [], + label: '遂川县', + value: 360827, + }, + { + children: [], + label: '万安县', + value: 360828, + }, + { + children: [], + label: '安福县', + value: 360829, + }, + { + children: [], + label: '永新县', + value: 360830, + }, + { + children: [], + label: '井冈山市', + value: 360881, + }, + ], + label: '吉安市', + value: 360800, + }, + { + children: [ + { + children: [], + label: '袁州区', + value: 360902, + }, + { + children: [], + label: '奉新县', + value: 360921, + }, + { + children: [], + label: '万载县', + value: 360922, + }, + { + children: [], + label: '上高县', + value: 360923, + }, + { + children: [], + label: '宜丰县', + value: 360924, + }, + { + children: [], + label: '靖安县', + value: 360925, + }, + { + children: [], + label: '铜鼓县', + value: 360926, + }, + { + children: [], + label: '丰城市', + value: 360981, + }, + { + children: [], + label: '樟树市', + value: 360982, + }, + { + children: [], + label: '高安市', + value: 360983, + }, + ], + label: '宜春市', + value: 360900, + }, + { + children: [ + { + children: [], + label: '临川区', + value: 361002, + }, + { + children: [], + label: '东乡区', + value: 361003, + }, + { + children: [], + label: '南城县', + value: 361021, + }, + { + children: [], + label: '黎川县', + value: 361022, + }, + { + children: [], + label: '南丰县', + value: 361023, + }, + { + children: [], + label: '崇仁县', + value: 361024, + }, + { + children: [], + label: '乐安县', + value: 361025, + }, + { + children: [], + label: '宜黄县', + value: 361026, + }, + { + children: [], + label: '金溪县', + value: 361027, + }, + { + children: [], + label: '资溪县', + value: 361028, + }, + { + children: [], + label: '广昌县', + value: 361030, + }, + ], + label: '抚州市', + value: 361000, + }, + { + children: [ + { + children: [], + label: '信州区', + value: 361102, + }, + { + children: [], + label: '广丰区', + value: 361103, + }, + { + children: [], + label: '上饶县', + value: 361121, + }, + { + children: [], + label: '玉山县', + value: 361123, + }, + { + children: [], + label: '铅山县', + value: 361124, + }, + { + children: [], + label: '横峰县', + value: 361125, + }, + { + children: [], + label: '弋阳县', + value: 361126, + }, + { + children: [], + label: '余干县', + value: 361127, + }, + { + children: [], + label: '鄱阳县', + value: 361128, + }, + { + children: [], + label: '万年县', + value: 361129, + }, + { + children: [], + label: '婺源县', + value: 361130, + }, + { + children: [], + label: '德兴市', + value: 361181, + }, + ], + label: '上饶市', + value: 361100, + }, + ], + label: '江西省', + value: 360000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '历下区', + value: 370102, + }, + { + children: [], + label: '市中区', + value: 370103, + }, + { + children: [], + label: '槐荫区', + value: 370104, + }, + { + children: [], + label: '天桥区', + value: 370105, + }, + { + children: [], + label: '历城区', + value: 370112, + }, + { + children: [], + label: '长清区', + value: 370113, + }, + { + children: [], + label: '章丘区', + value: 370114, + }, + { + children: [], + label: '济阳区', + value: 370115, + }, + { + children: [], + label: '莱芜区', + value: 370116, + }, + { + children: [], + label: '钢城区', + value: 370117, + }, + { + children: [], + label: '平阴县', + value: 370124, + }, + { + children: [], + label: '商河县', + value: 370126, + }, + ], + label: '济南市', + value: 370100, + }, + { + children: [ + { + children: [], + label: '市南区', + value: 370202, + }, + { + children: [], + label: '市北区', + value: 370203, + }, + { + children: [], + label: '黄岛区', + value: 370211, + }, + { + children: [], + label: '崂山区', + value: 370212, + }, + { + children: [], + label: '李沧区', + value: 370213, + }, + { + children: [], + label: '城阳区', + value: 370214, + }, + { + children: [], + label: '即墨区', + value: 370215, + }, + { + children: [], + label: '胶州市', + value: 370281, + }, + { + children: [], + label: '平度市', + value: 370283, + }, + { + children: [], + label: '莱西市', + value: 370285, + }, + ], + label: '青岛市', + value: 370200, + }, + { + children: [ + { + children: [], + label: '淄川区', + value: 370302, + }, + { + children: [], + label: '张店区', + value: 370303, + }, + { + children: [], + label: '博山区', + value: 370304, + }, + { + children: [], + label: '临淄区', + value: 370305, + }, + { + children: [], + label: '周村区', + value: 370306, + }, + { + children: [], + label: '桓台县', + value: 370321, + }, + { + children: [], + label: '高青县', + value: 370322, + }, + { + children: [], + label: '沂源县', + value: 370323, + }, + ], + label: '淄博市', + value: 370300, + }, + { + children: [ + { + children: [], + label: '市中区', + value: 370402, + }, + { + children: [], + label: '薛城区', + value: 370403, + }, + { + children: [], + label: '峄城区', + value: 370404, + }, + { + children: [], + label: '台儿庄区', + value: 370405, + }, + { + children: [], + label: '山亭区', + value: 370406, + }, + { + children: [], + label: '滕州市', + value: 370481, + }, + ], + label: '枣庄市', + value: 370400, + }, + { + children: [ + { + children: [], + label: '东营区', + value: 370502, + }, + { + children: [], + label: '河口区', + value: 370503, + }, + { + children: [], + label: '垦利区', + value: 370505, + }, + { + children: [], + label: '利津县', + value: 370522, + }, + { + children: [], + label: '广饶县', + value: 370523, + }, + ], + label: '东营市', + value: 370500, + }, + { + children: [ + { + children: [], + label: '芝罘区', + value: 370602, + }, + { + children: [], + label: '福山区', + value: 370611, + }, + { + children: [], + label: '牟平区', + value: 370612, + }, + { + children: [], + label: '莱山区', + value: 370613, + }, + { + children: [], + label: '长岛县', + value: 370634, + }, + { + children: [], + label: '龙口市', + value: 370681, + }, + { + children: [], + label: '莱阳市', + value: 370682, + }, + { + children: [], + label: '莱州市', + value: 370683, + }, + { + children: [], + label: '蓬莱市', + value: 370684, + }, + { + children: [], + label: '招远市', + value: 370685, + }, + { + children: [], + label: '栖霞市', + value: 370686, + }, + { + children: [], + label: '海阳市', + value: 370687, + }, + ], + label: '烟台市', + value: 370600, + }, + { + children: [ + { + children: [], + label: '潍城区', + value: 370702, + }, + { + children: [], + label: '寒亭区', + value: 370703, + }, + { + children: [], + label: '坊子区', + value: 370704, + }, + { + children: [], + label: '奎文区', + value: 370705, + }, + { + children: [], + label: '临朐县', + value: 370724, + }, + { + children: [], + label: '昌乐县', + value: 370725, + }, + { + children: [], + label: '青州市', + value: 370781, + }, + { + children: [], + label: '诸城市', + value: 370782, + }, + { + children: [], + label: '寿光市', + value: 370783, + }, + { + children: [], + label: '安丘市', + value: 370784, + }, + { + children: [], + label: '高密市', + value: 370785, + }, + { + children: [], + label: '昌邑市', + value: 370786, + }, + ], + label: '潍坊市', + value: 370700, + }, + { + children: [ + { + children: [], + label: '任城区', + value: 370811, + }, + { + children: [], + label: '兖州区', + value: 370812, + }, + { + children: [], + label: '微山县', + value: 370826, + }, + { + children: [], + label: '鱼台县', + value: 370827, + }, + { + children: [], + label: '金乡县', + value: 370828, + }, + { + children: [], + label: '嘉祥县', + value: 370829, + }, + { + children: [], + label: '汶上县', + value: 370830, + }, + { + children: [], + label: '泗水县', + value: 370831, + }, + { + children: [], + label: '梁山县', + value: 370832, + }, + { + children: [], + label: '曲阜市', + value: 370881, + }, + { + children: [], + label: '邹城市', + value: 370883, + }, + ], + label: '济宁市', + value: 370800, + }, + { + children: [ + { + children: [], + label: '泰山区', + value: 370902, + }, + { + children: [], + label: '岱岳区', + value: 370911, + }, + { + children: [], + label: '宁阳县', + value: 370921, + }, + { + children: [], + label: '东平县', + value: 370923, + }, + { + children: [], + label: '新泰市', + value: 370982, + }, + { + children: [], + label: '肥城市', + value: 370983, + }, + ], + label: '泰安市', + value: 370900, + }, + { + children: [ + { + children: [], + label: '环翠区', + value: 371002, + }, + { + children: [], + label: '文登区', + value: 371003, + }, + { + children: [], + label: '荣成市', + value: 371082, + }, + { + children: [], + label: '乳山市', + value: 371083, + }, + ], + label: '威海市', + value: 371000, + }, + { + children: [ + { + children: [], + label: '东港区', + value: 371102, + }, + { + children: [], + label: '岚山区', + value: 371103, + }, + { + children: [], + label: '五莲县', + value: 371121, + }, + { + children: [], + label: '莒县', + value: 371122, + }, + ], + label: '日照市', + value: 371100, + }, + { + children: [ + { + children: [], + label: '兰山区', + value: 371302, + }, + { + children: [], + label: '罗庄区', + value: 371311, + }, + { + children: [], + label: '河东区', + value: 371312, + }, + { + children: [], + label: '沂南县', + value: 371321, + }, + { + children: [], + label: '郯城县', + value: 371322, + }, + { + children: [], + label: '沂水县', + value: 371323, + }, + { + children: [], + label: '兰陵县', + value: 371324, + }, + { + children: [], + label: '费县', + value: 371325, + }, + { + children: [], + label: '平邑县', + value: 371326, + }, + { + children: [], + label: '莒南县', + value: 371327, + }, + { + children: [], + label: '蒙阴县', + value: 371328, + }, + { + children: [], + label: '临沭县', + value: 371329, + }, + ], + label: '临沂市', + value: 371300, + }, + { + children: [ + { + children: [], + label: '德城区', + value: 371402, + }, + { + children: [], + label: '陵城区', + value: 371403, + }, + { + children: [], + label: '宁津县', + value: 371422, + }, + { + children: [], + label: '庆云县', + value: 371423, + }, + { + children: [], + label: '临邑县', + value: 371424, + }, + { + children: [], + label: '齐河县', + value: 371425, + }, + { + children: [], + label: '平原县', + value: 371426, + }, + { + children: [], + label: '夏津县', + value: 371427, + }, + { + children: [], + label: '武城县', + value: 371428, + }, + { + children: [], + label: '乐陵市', + value: 371481, + }, + { + children: [], + label: '禹城市', + value: 371482, + }, + ], + label: '德州市', + value: 371400, + }, + { + children: [ + { + children: [], + label: '东昌府区', + value: 371502, + }, + { + children: [], + label: '阳谷县', + value: 371521, + }, + { + children: [], + label: '莘县', + value: 371522, + }, + { + children: [], + label: '茌平县', + value: 371523, + }, + { + children: [], + label: '东阿县', + value: 371524, + }, + { + children: [], + label: '冠县', + value: 371525, + }, + { + children: [], + label: '高唐县', + value: 371526, + }, + { + children: [], + label: '临清市', + value: 371581, + }, + ], + label: '聊城市', + value: 371500, + }, + { + children: [ + { + children: [], + label: '滨城区', + value: 371602, + }, + { + children: [], + label: '沾化区', + value: 371603, + }, + { + children: [], + label: '惠民县', + value: 371621, + }, + { + children: [], + label: '阳信县', + value: 371622, + }, + { + children: [], + label: '无棣县', + value: 371623, + }, + { + children: [], + label: '博兴县', + value: 371625, + }, + { + children: [], + label: '邹平市', + value: 371681, + }, + ], + label: '滨州市', + value: 371600, + }, + { + children: [ + { + children: [], + label: '牡丹区', + value: 371702, + }, + { + children: [], + label: '定陶区', + value: 371703, + }, + { + children: [], + label: '曹县', + value: 371721, + }, + { + children: [], + label: '单县', + value: 371722, + }, + { + children: [], + label: '成武县', + value: 371723, + }, + { + children: [], + label: '巨野县', + value: 371724, + }, + { + children: [], + label: '郓城县', + value: 371725, + }, + { + children: [], + label: '鄄城县', + value: 371726, + }, + { + children: [], + label: '东明县', + value: 371728, + }, + ], + label: '菏泽市', + value: 371700, + }, + ], + label: '山东省', + value: 370000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '中原区', + value: 410102, + }, + { + children: [], + label: '二七区', + value: 410103, + }, + { + children: [], + label: '管城回族区', + value: 410104, + }, + { + children: [], + label: '金水区', + value: 410105, + }, + { + children: [], + label: '上街区', + value: 410106, + }, + { + children: [], + label: '惠济区', + value: 410108, + }, + { + children: [], + label: '中牟县', + value: 410122, + }, + { + children: [], + label: '巩义市', + value: 410181, + }, + { + children: [], + label: '荥阳市', + value: 410182, + }, + { + children: [], + label: '新密市', + value: 410183, + }, + { + children: [], + label: '新郑市', + value: 410184, + }, + { + children: [], + label: '登封市', + value: 410185, + }, + ], + label: '郑州市', + value: 410100, + }, + { + children: [ + { + children: [], + label: '龙亭区', + value: 410202, + }, + { + children: [], + label: '顺河回族区', + value: 410203, + }, + { + children: [], + label: '鼓楼区', + value: 410204, + }, + { + children: [], + label: '禹王台区', + value: 410205, + }, + { + children: [], + label: '祥符区', + value: 410212, + }, + { + children: [], + label: '杞县', + value: 410221, + }, + { + children: [], + label: '通许县', + value: 410222, + }, + { + children: [], + label: '尉氏县', + value: 410223, + }, + { + children: [], + label: '兰考县', + value: 410225, + }, + ], + label: '开封市', + value: 410200, + }, + { + children: [ + { + children: [], + label: '老城区', + value: 410302, + }, + { + children: [], + label: '西工区', + value: 410303, + }, + { + children: [], + label: '瀍河回族区', + value: 410304, + }, + { + children: [], + label: '涧西区', + value: 410305, + }, + { + children: [], + label: '吉利区', + value: 410306, + }, + { + children: [], + label: '洛龙区', + value: 410311, + }, + { + children: [], + label: '孟津县', + value: 410322, + }, + { + children: [], + label: '新安县', + value: 410323, + }, + { + children: [], + label: '栾川县', + value: 410324, + }, + { + children: [], + label: '嵩县', + value: 410325, + }, + { + children: [], + label: '汝阳县', + value: 410326, + }, + { + children: [], + label: '宜阳县', + value: 410327, + }, + { + children: [], + label: '洛宁县', + value: 410328, + }, + { + children: [], + label: '伊川县', + value: 410329, + }, + { + children: [], + label: '偃师市', + value: 410381, + }, + ], + label: '洛阳市', + value: 410300, + }, + { + children: [ + { + children: [], + label: '新华区', + value: 410402, + }, + { + children: [], + label: '卫东区', + value: 410403, + }, + { + children: [], + label: '石龙区', + value: 410404, + }, + { + children: [], + label: '湛河区', + value: 410411, + }, + { + children: [], + label: '宝丰县', + value: 410421, + }, + { + children: [], + label: '叶县', + value: 410422, + }, + { + children: [], + label: '鲁山县', + value: 410423, + }, + { + children: [], + label: '郏县', + value: 410425, + }, + { + children: [], + label: '舞钢市', + value: 410481, + }, + { + children: [], + label: '汝州市', + value: 410482, + }, + ], + label: '平顶山市', + value: 410400, + }, + { + children: [ + { + children: [], + label: '文峰区', + value: 410502, + }, + { + children: [], + label: '北关区', + value: 410503, + }, + { + children: [], + label: '殷都区', + value: 410505, + }, + { + children: [], + label: '龙安区', + value: 410506, + }, + { + children: [], + label: '安阳县', + value: 410522, + }, + { + children: [], + label: '汤阴县', + value: 410523, + }, + { + children: [], + label: '滑县', + value: 410526, + }, + { + children: [], + label: '内黄县', + value: 410527, + }, + { + children: [], + label: '林州市', + value: 410581, + }, + ], + label: '安阳市', + value: 410500, + }, + { + children: [ + { + children: [], + label: '鹤山区', + value: 410602, + }, + { + children: [], + label: '山城区', + value: 410603, + }, + { + children: [], + label: '淇滨区', + value: 410611, + }, + { + children: [], + label: '浚县', + value: 410621, + }, + { + children: [], + label: '淇县', + value: 410622, + }, + ], + label: '鹤壁市', + value: 410600, + }, + { + children: [ + { + children: [], + label: '红旗区', + value: 410702, + }, + { + children: [], + label: '卫滨区', + value: 410703, + }, + { + children: [], + label: '凤泉区', + value: 410704, + }, + { + children: [], + label: '牧野区', + value: 410711, + }, + { + children: [], + label: '新乡县', + value: 410721, + }, + { + children: [], + label: '获嘉县', + value: 410724, + }, + { + children: [], + label: '原阳县', + value: 410725, + }, + { + children: [], + label: '延津县', + value: 410726, + }, + { + children: [], + label: '封丘县', + value: 410727, + }, + { + children: [], + label: '长垣县', + value: 410728, + }, + { + children: [], + label: '卫辉市', + value: 410781, + }, + { + children: [], + label: '辉县市', + value: 410782, + }, + ], + label: '新乡市', + value: 410700, + }, + { + children: [ + { + children: [], + label: '解放区', + value: 410802, + }, + { + children: [], + label: '中站区', + value: 410803, + }, + { + children: [], + label: '马村区', + value: 410804, + }, + { + children: [], + label: '山阳区', + value: 410811, + }, + { + children: [], + label: '修武县', + value: 410821, + }, + { + children: [], + label: '博爱县', + value: 410822, + }, + { + children: [], + label: '武陟县', + value: 410823, + }, + { + children: [], + label: '温县', + value: 410825, + }, + { + children: [], + label: '沁阳市', + value: 410882, + }, + { + children: [], + label: '孟州市', + value: 410883, + }, + ], + label: '焦作市', + value: 410800, + }, + { + children: [ + { + children: [], + label: '华龙区', + value: 410902, + }, + { + children: [], + label: '清丰县', + value: 410922, + }, + { + children: [], + label: '南乐县', + value: 410923, + }, + { + children: [], + label: '范县', + value: 410926, + }, + { + children: [], + label: '台前县', + value: 410927, + }, + { + children: [], + label: '濮阳县', + value: 410928, + }, + ], + label: '濮阳市', + value: 410900, + }, + { + children: [ + { + children: [], + label: '魏都区', + value: 411002, + }, + { + children: [], + label: '建安区', + value: 411003, + }, + { + children: [], + label: '鄢陵县', + value: 411024, + }, + { + children: [], + label: '襄城县', + value: 411025, + }, + { + children: [], + label: '禹州市', + value: 411081, + }, + { + children: [], + label: '长葛市', + value: 411082, + }, + ], + label: '许昌市', + value: 411000, + }, + { + children: [ + { + children: [], + label: '源汇区', + value: 411102, + }, + { + children: [], + label: '郾城区', + value: 411103, + }, + { + children: [], + label: '召陵区', + value: 411104, + }, + { + children: [], + label: '舞阳县', + value: 411121, + }, + { + children: [], + label: '临颍县', + value: 411122, + }, + ], + label: '漯河市', + value: 411100, + }, + { + children: [ + { + children: [], + label: '湖滨区', + value: 411202, + }, + { + children: [], + label: '陕州区', + value: 411203, + }, + { + children: [], + label: '渑池县', + value: 411221, + }, + { + children: [], + label: '卢氏县', + value: 411224, + }, + { + children: [], + label: '义马市', + value: 411281, + }, + { + children: [], + label: '灵宝市', + value: 411282, + }, + ], + label: '三门峡市', + value: 411200, + }, + { + children: [ + { + children: [], + label: '宛城区', + value: 411302, + }, + { + children: [], + label: '卧龙区', + value: 411303, + }, + { + children: [], + label: '南召县', + value: 411321, + }, + { + children: [], + label: '方城县', + value: 411322, + }, + { + children: [], + label: '西峡县', + value: 411323, + }, + { + children: [], + label: '镇平县', + value: 411324, + }, + { + children: [], + label: '内乡县', + value: 411325, + }, + { + children: [], + label: '淅川县', + value: 411326, + }, + { + children: [], + label: '社旗县', + value: 411327, + }, + { + children: [], + label: '唐河县', + value: 411328, + }, + { + children: [], + label: '新野县', + value: 411329, + }, + { + children: [], + label: '桐柏县', + value: 411330, + }, + { + children: [], + label: '邓州市', + value: 411381, + }, + ], + label: '南阳市', + value: 411300, + }, + { + children: [ + { + children: [], + label: '梁园区', + value: 411402, + }, + { + children: [], + label: '睢阳区', + value: 411403, + }, + { + children: [], + label: '民权县', + value: 411421, + }, + { + children: [], + label: '睢县', + value: 411422, + }, + { + children: [], + label: '宁陵县', + value: 411423, + }, + { + children: [], + label: '柘城县', + value: 411424, + }, + { + children: [], + label: '虞城县', + value: 411425, + }, + { + children: [], + label: '夏邑县', + value: 411426, + }, + { + children: [], + label: '永城市', + value: 411481, + }, + ], + label: '商丘市', + value: 411400, + }, + { + children: [ + { + children: [], + label: '浉河区', + value: 411502, + }, + { + children: [], + label: '平桥区', + value: 411503, + }, + { + children: [], + label: '罗山县', + value: 411521, + }, + { + children: [], + label: '光山县', + value: 411522, + }, + { + children: [], + label: '新县', + value: 411523, + }, + { + children: [], + label: '商城县', + value: 411524, + }, + { + children: [], + label: '固始县', + value: 411525, + }, + { + children: [], + label: '潢川县', + value: 411526, + }, + { + children: [], + label: '淮滨县', + value: 411527, + }, + { + children: [], + label: '息县', + value: 411528, + }, + ], + label: '信阳市', + value: 411500, + }, + { + children: [ + { + children: [], + label: '川汇区', + value: 411602, + }, + { + children: [], + label: '扶沟县', + value: 411621, + }, + { + children: [], + label: '西华县', + value: 411622, + }, + { + children: [], + label: '商水县', + value: 411623, + }, + { + children: [], + label: '沈丘县', + value: 411624, + }, + { + children: [], + label: '郸城县', + value: 411625, + }, + { + children: [], + label: '淮阳县', + value: 411626, + }, + { + children: [], + label: '太康县', + value: 411627, + }, + { + children: [], + label: '鹿邑县', + value: 411628, + }, + { + children: [], + label: '项城市', + value: 411681, + }, + ], + label: '周口市', + value: 411600, + }, + { + children: [ + { + children: [], + label: '驿城区', + value: 411702, + }, + { + children: [], + label: '西平县', + value: 411721, + }, + { + children: [], + label: '上蔡县', + value: 411722, + }, + { + children: [], + label: '平舆县', + value: 411723, + }, + { + children: [], + label: '正阳县', + value: 411724, + }, + { + children: [], + label: '确山县', + value: 411725, + }, + { + children: [], + label: '泌阳县', + value: 411726, + }, + { + children: [], + label: '汝南县', + value: 411727, + }, + { + children: [], + label: '遂平县', + value: 411728, + }, + { + children: [], + label: '新蔡县', + value: 411729, + }, + ], + label: '驻马店市', + value: 411700, + }, + { + children: [], + label: '济源市', + value: 419001, + }, + ], + label: '河南省', + value: 410000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '江岸区', + value: 420102, + }, + { + children: [], + label: '江汉区', + value: 420103, + }, + { + children: [], + label: '硚口区', + value: 420104, + }, + { + children: [], + label: '汉阳区', + value: 420105, + }, + { + children: [], + label: '武昌区', + value: 420106, + }, + { + children: [], + label: '青山区', + value: 420107, + }, + { + children: [], + label: '洪山区', + value: 420111, + }, + { + children: [], + label: '东西湖区', + value: 420112, + }, + { + children: [], + label: '汉南区', + value: 420113, + }, + { + children: [], + label: '蔡甸区', + value: 420114, + }, + { + children: [], + label: '江夏区', + value: 420115, + }, + { + children: [], + label: '黄陂区', + value: 420116, + }, + { + children: [], + label: '新洲区', + value: 420117, + }, + ], + label: '武汉市', + value: 420100, + }, + { + children: [ + { + children: [], + label: '黄石港区', + value: 420202, + }, + { + children: [], + label: '西塞山区', + value: 420203, + }, + { + children: [], + label: '下陆区', + value: 420204, + }, + { + children: [], + label: '铁山区', + value: 420205, + }, + { + children: [], + label: '阳新县', + value: 420222, + }, + { + children: [], + label: '大冶市', + value: 420281, + }, + ], + label: '黄石市', + value: 420200, + }, + { + children: [ + { + children: [], + label: '茅箭区', + value: 420302, + }, + { + children: [], + label: '张湾区', + value: 420303, + }, + { + children: [], + label: '郧阳区', + value: 420304, + }, + { + children: [], + label: '郧西县', + value: 420322, + }, + { + children: [], + label: '竹山县', + value: 420323, + }, + { + children: [], + label: '竹溪县', + value: 420324, + }, + { + children: [], + label: '房县', + value: 420325, + }, + { + children: [], + label: '丹江口市', + value: 420381, + }, + ], + label: '十堰市', + value: 420300, + }, + { + children: [ + { + children: [], + label: '西陵区', + value: 420502, + }, + { + children: [], + label: '伍家岗区', + value: 420503, + }, + { + children: [], + label: '点军区', + value: 420504, + }, + { + children: [], + label: '猇亭区', + value: 420505, + }, + { + children: [], + label: '夷陵区', + value: 420506, + }, + { + children: [], + label: '远安县', + value: 420525, + }, + { + children: [], + label: '兴山县', + value: 420526, + }, + { + children: [], + label: '秭归县', + value: 420527, + }, + { + children: [], + label: '长阳土家族自治县', + value: 420528, + }, + { + children: [], + label: '五峰土家族自治县', + value: 420529, + }, + { + children: [], + label: '宜都市', + value: 420581, + }, + { + children: [], + label: '当阳市', + value: 420582, + }, + { + children: [], + label: '枝江市', + value: 420583, + }, + ], + label: '宜昌市', + value: 420500, + }, + { + children: [ + { + children: [], + label: '襄城区', + value: 420602, + }, + { + children: [], + label: '樊城区', + value: 420606, + }, + { + children: [], + label: '襄州区', + value: 420607, + }, + { + children: [], + label: '南漳县', + value: 420624, + }, + { + children: [], + label: '谷城县', + value: 420625, + }, + { + children: [], + label: '保康县', + value: 420626, + }, + { + children: [], + label: '老河口市', + value: 420682, + }, + { + children: [], + label: '枣阳市', + value: 420683, + }, + { + children: [], + label: '宜城市', + value: 420684, + }, + ], + label: '襄阳市', + value: 420600, + }, + { + children: [ + { + children: [], + label: '梁子湖区', + value: 420702, + }, + { + children: [], + label: '华容区', + value: 420703, + }, + { + children: [], + label: '鄂城区', + value: 420704, + }, + ], + label: '鄂州市', + value: 420700, + }, + { + children: [ + { + children: [], + label: '东宝区', + value: 420802, + }, + { + children: [], + label: '掇刀区', + value: 420804, + }, + { + children: [], + label: '沙洋县', + value: 420822, + }, + { + children: [], + label: '钟祥市', + value: 420881, + }, + { + children: [], + label: '京山市', + value: 420882, + }, + ], + label: '荆门市', + value: 420800, + }, + { + children: [ + { + children: [], + label: '孝南区', + value: 420902, + }, + { + children: [], + label: '孝昌县', + value: 420921, + }, + { + children: [], + label: '大悟县', + value: 420922, + }, + { + children: [], + label: '云梦县', + value: 420923, + }, + { + children: [], + label: '应城市', + value: 420981, + }, + { + children: [], + label: '安陆市', + value: 420982, + }, + { + children: [], + label: '汉川市', + value: 420984, + }, + ], + label: '孝感市', + value: 420900, + }, + { + children: [ + { + children: [], + label: '沙市区', + value: 421002, + }, + { + children: [], + label: '荆州区', + value: 421003, + }, + { + children: [], + label: '公安县', + value: 421022, + }, + { + children: [], + label: '监利县', + value: 421023, + }, + { + children: [], + label: '江陵县', + value: 421024, + }, + { + children: [], + label: '石首市', + value: 421081, + }, + { + children: [], + label: '洪湖市', + value: 421083, + }, + { + children: [], + label: '松滋市', + value: 421087, + }, + ], + label: '荆州市', + value: 421000, + }, + { + children: [ + { + children: [], + label: '黄州区', + value: 421102, + }, + { + children: [], + label: '团风县', + value: 421121, + }, + { + children: [], + label: '红安县', + value: 421122, + }, + { + children: [], + label: '罗田县', + value: 421123, + }, + { + children: [], + label: '英山县', + value: 421124, + }, + { + children: [], + label: '浠水县', + value: 421125, + }, + { + children: [], + label: '蕲春县', + value: 421126, + }, + { + children: [], + label: '黄梅县', + value: 421127, + }, + { + children: [], + label: '麻城市', + value: 421181, + }, + { + children: [], + label: '武穴市', + value: 421182, + }, + ], + label: '黄冈市', + value: 421100, + }, + { + children: [ + { + children: [], + label: '咸安区', + value: 421202, + }, + { + children: [], + label: '嘉鱼县', + value: 421221, + }, + { + children: [], + label: '通城县', + value: 421222, + }, + { + children: [], + label: '崇阳县', + value: 421223, + }, + { + children: [], + label: '通山县', + value: 421224, + }, + { + children: [], + label: '赤壁市', + value: 421281, + }, + ], + label: '咸宁市', + value: 421200, + }, + { + children: [ + { + children: [], + label: '曾都区', + value: 421303, + }, + { + children: [], + label: '随县', + value: 421321, + }, + { + children: [], + label: '广水市', + value: 421381, + }, + ], + label: '随州市', + value: 421300, + }, + { + children: [ + { + children: [], + label: '恩施市', + value: 422801, + }, + { + children: [], + label: '利川市', + value: 422802, + }, + { + children: [], + label: '建始县', + value: 422822, + }, + { + children: [], + label: '巴东县', + value: 422823, + }, + { + children: [], + label: '宣恩县', + value: 422825, + }, + { + children: [], + label: '咸丰县', + value: 422826, + }, + { + children: [], + label: '来凤县', + value: 422827, + }, + { + children: [], + label: '鹤峰县', + value: 422828, + }, + ], + label: '恩施土家族苗族自治州', + value: 422800, + }, + { + children: [], + label: '仙桃市', + value: 429004, + }, + { + children: [], + label: '潜江市', + value: 429005, + }, + { + children: [], + label: '天门市', + value: 429006, + }, + { + children: [], + label: '神农架林区', + value: 429021, + }, + ], + label: '湖北省', + value: 420000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '芙蓉区', + value: 430102, + }, + { + children: [], + label: '天心区', + value: 430103, + }, + { + children: [], + label: '岳麓区', + value: 430104, + }, + { + children: [], + label: '开福区', + value: 430105, + }, + { + children: [], + label: '雨花区', + value: 430111, + }, + { + children: [], + label: '望城区', + value: 430112, + }, + { + children: [], + label: '长沙县', + value: 430121, + }, + { + children: [], + label: '浏阳市', + value: 430181, + }, + { + children: [], + label: '宁乡市', + value: 430182, + }, + ], + label: '长沙市', + value: 430100, + }, + { + children: [ + { + children: [], + label: '荷塘区', + value: 430202, + }, + { + children: [], + label: '芦淞区', + value: 430203, + }, + { + children: [], + label: '石峰区', + value: 430204, + }, + { + children: [], + label: '天元区', + value: 430211, + }, + { + children: [], + label: '渌口区', + value: 430212, + }, + { + children: [], + label: '攸县', + value: 430223, + }, + { + children: [], + label: '茶陵县', + value: 430224, + }, + { + children: [], + label: '炎陵县', + value: 430225, + }, + { + children: [], + label: '醴陵市', + value: 430281, + }, + ], + label: '株洲市', + value: 430200, + }, + { + children: [ + { + children: [], + label: '雨湖区', + value: 430302, + }, + { + children: [], + label: '岳塘区', + value: 430304, + }, + { + children: [], + label: '湘潭县', + value: 430321, + }, + { + children: [], + label: '湘乡市', + value: 430381, + }, + { + children: [], + label: '韶山市', + value: 430382, + }, + ], + label: '湘潭市', + value: 430300, + }, + { + children: [ + { + children: [], + label: '珠晖区', + value: 430405, + }, + { + children: [], + label: '雁峰区', + value: 430406, + }, + { + children: [], + label: '石鼓区', + value: 430407, + }, + { + children: [], + label: '蒸湘区', + value: 430408, + }, + { + children: [], + label: '南岳区', + value: 430412, + }, + { + children: [], + label: '衡阳县', + value: 430421, + }, + { + children: [], + label: '衡南县', + value: 430422, + }, + { + children: [], + label: '衡山县', + value: 430423, + }, + { + children: [], + label: '衡东县', + value: 430424, + }, + { + children: [], + label: '祁东县', + value: 430426, + }, + { + children: [], + label: '耒阳市', + value: 430481, + }, + { + children: [], + label: '常宁市', + value: 430482, + }, + ], + label: '衡阳市', + value: 430400, + }, + { + children: [ + { + children: [], + label: '双清区', + value: 430502, + }, + { + children: [], + label: '大祥区', + value: 430503, + }, + { + children: [], + label: '北塔区', + value: 430511, + }, + { + children: [], + label: '邵东县', + value: 430521, + }, + { + children: [], + label: '新邵县', + value: 430522, + }, + { + children: [], + label: '邵阳县', + value: 430523, + }, + { + children: [], + label: '隆回县', + value: 430524, + }, + { + children: [], + label: '洞口县', + value: 430525, + }, + { + children: [], + label: '绥宁县', + value: 430527, + }, + { + children: [], + label: '新宁县', + value: 430528, + }, + { + children: [], + label: '城步苗族自治县', + value: 430529, + }, + { + children: [], + label: '武冈市', + value: 430581, + }, + ], + label: '邵阳市', + value: 430500, + }, + { + children: [ + { + children: [], + label: '岳阳楼区', + value: 430602, + }, + { + children: [], + label: '云溪区', + value: 430603, + }, + { + children: [], + label: '君山区', + value: 430611, + }, + { + children: [], + label: '岳阳县', + value: 430621, + }, + { + children: [], + label: '华容县', + value: 430623, + }, + { + children: [], + label: '湘阴县', + value: 430624, + }, + { + children: [], + label: '平江县', + value: 430626, + }, + { + children: [], + label: '汨罗市', + value: 430681, + }, + { + children: [], + label: '临湘市', + value: 430682, + }, + ], + label: '岳阳市', + value: 430600, + }, + { + children: [ + { + children: [], + label: '武陵区', + value: 430702, + }, + { + children: [], + label: '鼎城区', + value: 430703, + }, + { + children: [], + label: '安乡县', + value: 430721, + }, + { + children: [], + label: '汉寿县', + value: 430722, + }, + { + children: [], + label: '澧县', + value: 430723, + }, + { + children: [], + label: '临澧县', + value: 430724, + }, + { + children: [], + label: '桃源县', + value: 430725, + }, + { + children: [], + label: '石门县', + value: 430726, + }, + { + children: [], + label: '津市市', + value: 430781, + }, + ], + label: '常德市', + value: 430700, + }, + { + children: [ + { + children: [], + label: '永定区', + value: 430802, + }, + { + children: [], + label: '武陵源区', + value: 430811, + }, + { + children: [], + label: '慈利县', + value: 430821, + }, + { + children: [], + label: '桑植县', + value: 430822, + }, + ], + label: '张家界市', + value: 430800, + }, + { + children: [ + { + children: [], + label: '资阳区', + value: 430902, + }, + { + children: [], + label: '赫山区', + value: 430903, + }, + { + children: [], + label: '南县', + value: 430921, + }, + { + children: [], + label: '桃江县', + value: 430922, + }, + { + children: [], + label: '安化县', + value: 430923, + }, + { + children: [], + label: '沅江市', + value: 430981, + }, + ], + label: '益阳市', + value: 430900, + }, + { + children: [ + { + children: [], + label: '北湖区', + value: 431002, + }, + { + children: [], + label: '苏仙区', + value: 431003, + }, + { + children: [], + label: '桂阳县', + value: 431021, + }, + { + children: [], + label: '宜章县', + value: 431022, + }, + { + children: [], + label: '永兴县', + value: 431023, + }, + { + children: [], + label: '嘉禾县', + value: 431024, + }, + { + children: [], + label: '临武县', + value: 431025, + }, + { + children: [], + label: '汝城县', + value: 431026, + }, + { + children: [], + label: '桂东县', + value: 431027, + }, + { + children: [], + label: '安仁县', + value: 431028, + }, + { + children: [], + label: '资兴市', + value: 431081, + }, + ], + label: '郴州市', + value: 431000, + }, + { + children: [ + { + children: [], + label: '零陵区', + value: 431102, + }, + { + children: [], + label: '冷水滩区', + value: 431103, + }, + { + children: [], + label: '祁阳县', + value: 431121, + }, + { + children: [], + label: '东安县', + value: 431122, + }, + { + children: [], + label: '双牌县', + value: 431123, + }, + { + children: [], + label: '道县', + value: 431124, + }, + { + children: [], + label: '江永县', + value: 431125, + }, + { + children: [], + label: '宁远县', + value: 431126, + }, + { + children: [], + label: '蓝山县', + value: 431127, + }, + { + children: [], + label: '新田县', + value: 431128, + }, + { + children: [], + label: '江华瑶族自治县', + value: 431129, + }, + ], + label: '永州市', + value: 431100, + }, + { + children: [ + { + children: [], + label: '鹤城区', + value: 431202, + }, + { + children: [], + label: '中方县', + value: 431221, + }, + { + children: [], + label: '沅陵县', + value: 431222, + }, + { + children: [], + label: '辰溪县', + value: 431223, + }, + { + children: [], + label: '溆浦县', + value: 431224, + }, + { + children: [], + label: '会同县', + value: 431225, + }, + { + children: [], + label: '麻阳苗族自治县', + value: 431226, + }, + { + children: [], + label: '新晃侗族自治县', + value: 431227, + }, + { + children: [], + label: '芷江侗族自治县', + value: 431228, + }, + { + children: [], + label: '靖州苗族侗族自治县', + value: 431229, + }, + { + children: [], + label: '通道侗族自治县', + value: 431230, + }, + { + children: [], + label: '洪江市', + value: 431281, + }, + ], + label: '怀化市', + value: 431200, + }, + { + children: [ + { + children: [], + label: '娄星区', + value: 431302, + }, + { + children: [], + label: '双峰县', + value: 431321, + }, + { + children: [], + label: '新化县', + value: 431322, + }, + { + children: [], + label: '冷水江市', + value: 431381, + }, + { + children: [], + label: '涟源市', + value: 431382, + }, + ], + label: '娄底市', + value: 431300, + }, + { + children: [ + { + children: [], + label: '吉首市', + value: 433101, + }, + { + children: [], + label: '泸溪县', + value: 433122, + }, + { + children: [], + label: '凤凰县', + value: 433123, + }, + { + children: [], + label: '花垣县', + value: 433124, + }, + { + children: [], + label: '保靖县', + value: 433125, + }, + { + children: [], + label: '古丈县', + value: 433126, + }, + { + children: [], + label: '永顺县', + value: 433127, + }, + { + children: [], + label: '龙山县', + value: 433130, + }, + ], + label: '湘西土家族苗族自治州', + value: 433100, + }, + ], + label: '湖南省', + value: 430000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '荔湾区', + value: 440103, + }, + { + children: [], + label: '越秀区', + value: 440104, + }, + { + children: [], + label: '海珠区', + value: 440105, + }, + { + children: [], + label: '天河区', + value: 440106, + }, + { + children: [], + label: '白云区', + value: 440111, + }, + { + children: [], + label: '黄埔区', + value: 440112, + }, + { + children: [], + label: '番禺区', + value: 440113, + }, + { + children: [], + label: '花都区', + value: 440114, + }, + { + children: [], + label: '南沙区', + value: 440115, + }, + { + children: [], + label: '从化区', + value: 440117, + }, + { + children: [], + label: '增城区', + value: 440118, + }, + ], + label: '广州市', + value: 440100, + }, + { + children: [ + { + children: [], + label: '武江区', + value: 440203, + }, + { + children: [], + label: '浈江区', + value: 440204, + }, + { + children: [], + label: '曲江区', + value: 440205, + }, + { + children: [], + label: '始兴县', + value: 440222, + }, + { + children: [], + label: '仁化县', + value: 440224, + }, + { + children: [], + label: '翁源县', + value: 440229, + }, + { + children: [], + label: '乳源瑶族自治县', + value: 440232, + }, + { + children: [], + label: '新丰县', + value: 440233, + }, + { + children: [], + label: '乐昌市', + value: 440281, + }, + { + children: [], + label: '南雄市', + value: 440282, + }, + ], + label: '韶关市', + value: 440200, + }, + { + children: [ + { + children: [], + label: '罗湖区', + value: 440303, + }, + { + children: [], + label: '福田区', + value: 440304, + }, + { + children: [], + label: '南山区', + value: 440305, + }, + { + children: [], + label: '宝安区', + value: 440306, + }, + { + children: [], + label: '龙岗区', + value: 440307, + }, + { + children: [], + label: '盐田区', + value: 440308, + }, + { + children: [], + label: '龙华区', + value: 440309, + }, + { + children: [], + label: '坪山区', + value: 440310, + }, + { + children: [], + label: '光明区', + value: 440311, + }, + ], + label: '深圳市', + value: 440300, + }, + { + children: [ + { + children: [], + label: '香洲区', + value: 440402, + }, + { + children: [], + label: '斗门区', + value: 440403, + }, + { + children: [], + label: '金湾区', + value: 440404, + }, + ], + label: '珠海市', + value: 440400, + }, + { + children: [ + { + children: [], + label: '龙湖区', + value: 440507, + }, + { + children: [], + label: '金平区', + value: 440511, + }, + { + children: [], + label: '濠江区', + value: 440512, + }, + { + children: [], + label: '潮阳区', + value: 440513, + }, + { + children: [], + label: '潮南区', + value: 440514, + }, + { + children: [], + label: '澄海区', + value: 440515, + }, + { + children: [], + label: '南澳县', + value: 440523, + }, + ], + label: '汕头市', + value: 440500, + }, + { + children: [ + { + children: [], + label: '禅城区', + value: 440604, + }, + { + children: [], + label: '南海区', + value: 440605, + }, + { + children: [], + label: '顺德区', + value: 440606, + }, + { + children: [], + label: '三水区', + value: 440607, + }, + { + children: [], + label: '高明区', + value: 440608, + }, + ], + label: '佛山市', + value: 440600, + }, + { + children: [ + { + children: [], + label: '蓬江区', + value: 440703, + }, + { + children: [], + label: '江海区', + value: 440704, + }, + { + children: [], + label: '新会区', + value: 440705, + }, + { + children: [], + label: '台山市', + value: 440781, + }, + { + children: [], + label: '开平市', + value: 440783, + }, + { + children: [], + label: '鹤山市', + value: 440784, + }, + { + children: [], + label: '恩平市', + value: 440785, + }, + ], + label: '江门市', + value: 440700, + }, + { + children: [ + { + children: [], + label: '赤坎区', + value: 440802, + }, + { + children: [], + label: '霞山区', + value: 440803, + }, + { + children: [], + label: '坡头区', + value: 440804, + }, + { + children: [], + label: '麻章区', + value: 440811, + }, + { + children: [], + label: '遂溪县', + value: 440823, + }, + { + children: [], + label: '徐闻县', + value: 440825, + }, + { + children: [], + label: '廉江市', + value: 440881, + }, + { + children: [], + label: '雷州市', + value: 440882, + }, + { + children: [], + label: '吴川市', + value: 440883, + }, + ], + label: '湛江市', + value: 440800, + }, + { + children: [ + { + children: [], + label: '茂南区', + value: 440902, + }, + { + children: [], + label: '电白区', + value: 440904, + }, + { + children: [], + label: '高州市', + value: 440981, + }, + { + children: [], + label: '化州市', + value: 440982, + }, + { + children: [], + label: '信宜市', + value: 440983, + }, + ], + label: '茂名市', + value: 440900, + }, + { + children: [ + { + children: [], + label: '端州区', + value: 441202, + }, + { + children: [], + label: '鼎湖区', + value: 441203, + }, + { + children: [], + label: '高要区', + value: 441204, + }, + { + children: [], + label: '广宁县', + value: 441223, + }, + { + children: [], + label: '怀集县', + value: 441224, + }, + { + children: [], + label: '封开县', + value: 441225, + }, + { + children: [], + label: '德庆县', + value: 441226, + }, + { + children: [], + label: '四会市', + value: 441284, + }, + ], + label: '肇庆市', + value: 441200, + }, + { + children: [ + { + children: [], + label: '惠城区', + value: 441302, + }, + { + children: [], + label: '惠阳区', + value: 441303, + }, + { + children: [], + label: '博罗县', + value: 441322, + }, + { + children: [], + label: '惠东县', + value: 441323, + }, + { + children: [], + label: '龙门县', + value: 441324, + }, + ], + label: '惠州市', + value: 441300, + }, + { + children: [ + { + children: [], + label: '梅江区', + value: 441402, + }, + { + children: [], + label: '梅县区', + value: 441403, + }, + { + children: [], + label: '大埔县', + value: 441422, + }, + { + children: [], + label: '丰顺县', + value: 441423, + }, + { + children: [], + label: '五华县', + value: 441424, + }, + { + children: [], + label: '平远县', + value: 441426, + }, + { + children: [], + label: '蕉岭县', + value: 441427, + }, + { + children: [], + label: '兴宁市', + value: 441481, + }, + ], + label: '梅州市', + value: 441400, + }, + { + children: [ + { + children: [], + label: '城区', + value: 441502, + }, + { + children: [], + label: '海丰县', + value: 441521, + }, + { + children: [], + label: '陆河县', + value: 441523, + }, + { + children: [], + label: '陆丰市', + value: 441581, + }, + ], + label: '汕尾市', + value: 441500, + }, + { + children: [ + { + children: [], + label: '源城区', + value: 441602, + }, + { + children: [], + label: '紫金县', + value: 441621, + }, + { + children: [], + label: '龙川县', + value: 441622, + }, + { + children: [], + label: '连平县', + value: 441623, + }, + { + children: [], + label: '和平县', + value: 441624, + }, + { + children: [], + label: '东源县', + value: 441625, + }, + ], + label: '河源市', + value: 441600, + }, + { + children: [ + { + children: [], + label: '江城区', + value: 441702, + }, + { + children: [], + label: '阳东区', + value: 441704, + }, + { + children: [], + label: '阳西县', + value: 441721, + }, + { + children: [], + label: '阳春市', + value: 441781, + }, + ], + label: '阳江市', + value: 441700, + }, + { + children: [ + { + children: [], + label: '清城区', + value: 441802, + }, + { + children: [], + label: '清新区', + value: 441803, + }, + { + children: [], + label: '佛冈县', + value: 441821, + }, + { + children: [], + label: '阳山县', + value: 441823, + }, + { + children: [], + label: '连山壮族瑶族自治县', + value: 441825, + }, + { + children: [], + label: '连南瑶族自治县', + value: 441826, + }, + { + children: [], + label: '英德市', + value: 441881, + }, + { + children: [], + label: '连州市', + value: 441882, + }, + ], + label: '清远市', + value: 441800, + }, + { + children: [], + label: '东莞市', + value: 441900, + }, + { + children: [], + label: '中山市', + value: 442000, + }, + { + children: [ + { + children: [], + label: '湘桥区', + value: 445102, + }, + { + children: [], + label: '潮安区', + value: 445103, + }, + { + children: [], + label: '饶平县', + value: 445122, + }, + ], + label: '潮州市', + value: 445100, + }, + { + children: [ + { + children: [], + label: '榕城区', + value: 445202, + }, + { + children: [], + label: '揭东区', + value: 445203, + }, + { + children: [], + label: '揭西县', + value: 445222, + }, + { + children: [], + label: '惠来县', + value: 445224, + }, + { + children: [], + label: '普宁市', + value: 445281, + }, + ], + label: '揭阳市', + value: 445200, + }, + { + children: [ + { + children: [], + label: '云城区', + value: 445302, + }, + { + children: [], + label: '云安区', + value: 445303, + }, + { + children: [], + label: '新兴县', + value: 445321, + }, + { + children: [], + label: '郁南县', + value: 445322, + }, + { + children: [], + label: '罗定市', + value: 445381, + }, + ], + label: '云浮市', + value: 445300, + }, + ], + label: '广东省', + value: 440000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '兴宁区', + value: 450102, + }, + { + children: [], + label: '青秀区', + value: 450103, + }, + { + children: [], + label: '江南区', + value: 450105, + }, + { + children: [], + label: '西乡塘区', + value: 450107, + }, + { + children: [], + label: '良庆区', + value: 450108, + }, + { + children: [], + label: '邕宁区', + value: 450109, + }, + { + children: [], + label: '武鸣区', + value: 450110, + }, + { + children: [], + label: '隆安县', + value: 450123, + }, + { + children: [], + label: '马山县', + value: 450124, + }, + { + children: [], + label: '上林县', + value: 450125, + }, + { + children: [], + label: '宾阳县', + value: 450126, + }, + { + children: [], + label: '横县', + value: 450127, + }, + ], + label: '南宁市', + value: 450100, + }, + { + children: [ + { + children: [], + label: '城中区', + value: 450202, + }, + { + children: [], + label: '鱼峰区', + value: 450203, + }, + { + children: [], + label: '柳南区', + value: 450204, + }, + { + children: [], + label: '柳北区', + value: 450205, + }, + { + children: [], + label: '柳江区', + value: 450206, + }, + { + children: [], + label: '柳城县', + value: 450222, + }, + { + children: [], + label: '鹿寨县', + value: 450223, + }, + { + children: [], + label: '融安县', + value: 450224, + }, + { + children: [], + label: '融水苗族自治县', + value: 450225, + }, + { + children: [], + label: '三江侗族自治县', + value: 450226, + }, + ], + label: '柳州市', + value: 450200, + }, + { + children: [ + { + children: [], + label: '秀峰区', + value: 450302, + }, + { + children: [], + label: '叠彩区', + value: 450303, + }, + { + children: [], + label: '象山区', + value: 450304, + }, + { + children: [], + label: '七星区', + value: 450305, + }, + { + children: [], + label: '雁山区', + value: 450311, + }, + { + children: [], + label: '临桂区', + value: 450312, + }, + { + children: [], + label: '阳朔县', + value: 450321, + }, + { + children: [], + label: '灵川县', + value: 450323, + }, + { + children: [], + label: '全州县', + value: 450324, + }, + { + children: [], + label: '兴安县', + value: 450325, + }, + { + children: [], + label: '永福县', + value: 450326, + }, + { + children: [], + label: '灌阳县', + value: 450327, + }, + { + children: [], + label: '龙胜各族自治县', + value: 450328, + }, + { + children: [], + label: '资源县', + value: 450329, + }, + { + children: [], + label: '平乐县', + value: 450330, + }, + { + children: [], + label: '恭城瑶族自治县', + value: 450332, + }, + { + children: [], + label: '荔浦市', + value: 450381, + }, + ], + label: '桂林市', + value: 450300, + }, + { + children: [ + { + children: [], + label: '万秀区', + value: 450403, + }, + { + children: [], + label: '长洲区', + value: 450405, + }, + { + children: [], + label: '龙圩区', + value: 450406, + }, + { + children: [], + label: '苍梧县', + value: 450421, + }, + { + children: [], + label: '藤县', + value: 450422, + }, + { + children: [], + label: '蒙山县', + value: 450423, + }, + { + children: [], + label: '岑溪市', + value: 450481, + }, + ], + label: '梧州市', + value: 450400, + }, + { + children: [ + { + children: [], + label: '海城区', + value: 450502, + }, + { + children: [], + label: '银海区', + value: 450503, + }, + { + children: [], + label: '铁山港区', + value: 450512, + }, + { + children: [], + label: '合浦县', + value: 450521, + }, + ], + label: '北海市', + value: 450500, + }, + { + children: [ + { + children: [], + label: '港口区', + value: 450602, + }, + { + children: [], + label: '防城区', + value: 450603, + }, + { + children: [], + label: '上思县', + value: 450621, + }, + { + children: [], + label: '东兴市', + value: 450681, + }, + ], + label: '防城港市', + value: 450600, + }, + { + children: [ + { + children: [], + label: '钦南区', + value: 450702, + }, + { + children: [], + label: '钦北区', + value: 450703, + }, + { + children: [], + label: '灵山县', + value: 450721, + }, + { + children: [], + label: '浦北县', + value: 450722, + }, + ], + label: '钦州市', + value: 450700, + }, + { + children: [ + { + children: [], + label: '港北区', + value: 450802, + }, + { + children: [], + label: '港南区', + value: 450803, + }, + { + children: [], + label: '覃塘区', + value: 450804, + }, + { + children: [], + label: '平南县', + value: 450821, + }, + { + children: [], + label: '桂平市', + value: 450881, + }, + ], + label: '贵港市', + value: 450800, + }, + { + children: [ + { + children: [], + label: '玉州区', + value: 450902, + }, + { + children: [], + label: '福绵区', + value: 450903, + }, + { + children: [], + label: '容县', + value: 450921, + }, + { + children: [], + label: '陆川县', + value: 450922, + }, + { + children: [], + label: '博白县', + value: 450923, + }, + { + children: [], + label: '兴业县', + value: 450924, + }, + { + children: [], + label: '北流市', + value: 450981, + }, + ], + label: '玉林市', + value: 450900, + }, + { + children: [ + { + children: [], + label: '右江区', + value: 451002, + }, + { + children: [], + label: '田阳县', + value: 451021, + }, + { + children: [], + label: '田东县', + value: 451022, + }, + { + children: [], + label: '平果县', + value: 451023, + }, + { + children: [], + label: '德保县', + value: 451024, + }, + { + children: [], + label: '那坡县', + value: 451026, + }, + { + children: [], + label: '凌云县', + value: 451027, + }, + { + children: [], + label: '乐业县', + value: 451028, + }, + { + children: [], + label: '田林县', + value: 451029, + }, + { + children: [], + label: '西林县', + value: 451030, + }, + { + children: [], + label: '隆林各族自治县', + value: 451031, + }, + { + children: [], + label: '靖西市', + value: 451081, + }, + ], + label: '百色市', + value: 451000, + }, + { + children: [ + { + children: [], + label: '八步区', + value: 451102, + }, + { + children: [], + label: '平桂区', + value: 451103, + }, + { + children: [], + label: '昭平县', + value: 451121, + }, + { + children: [], + label: '钟山县', + value: 451122, + }, + { + children: [], + label: '富川瑶族自治县', + value: 451123, + }, + ], + label: '贺州市', + value: 451100, + }, + { + children: [ + { + children: [], + label: '金城江区', + value: 451202, + }, + { + children: [], + label: '宜州区', + value: 451203, + }, + { + children: [], + label: '南丹县', + value: 451221, + }, + { + children: [], + label: '天峨县', + value: 451222, + }, + { + children: [], + label: '凤山县', + value: 451223, + }, + { + children: [], + label: '东兰县', + value: 451224, + }, + { + children: [], + label: '罗城仫佬族自治县', + value: 451225, + }, + { + children: [], + label: '环江毛南族自治县', + value: 451226, + }, + { + children: [], + label: '巴马瑶族自治县', + value: 451227, + }, + { + children: [], + label: '都安瑶族自治县', + value: 451228, + }, + { + children: [], + label: '大化瑶族自治县', + value: 451229, + }, + ], + label: '河池市', + value: 451200, + }, + { + children: [ + { + children: [], + label: '兴宾区', + value: 451302, + }, + { + children: [], + label: '忻城县', + value: 451321, + }, + { + children: [], + label: '象州县', + value: 451322, + }, + { + children: [], + label: '武宣县', + value: 451323, + }, + { + children: [], + label: '金秀瑶族自治县', + value: 451324, + }, + { + children: [], + label: '合山市', + value: 451381, + }, + ], + label: '来宾市', + value: 451300, + }, + { + children: [ + { + children: [], + label: '江州区', + value: 451402, + }, + { + children: [], + label: '扶绥县', + value: 451421, + }, + { + children: [], + label: '宁明县', + value: 451422, + }, + { + children: [], + label: '龙州县', + value: 451423, + }, + { + children: [], + label: '大新县', + value: 451424, + }, + { + children: [], + label: '天等县', + value: 451425, + }, + { + children: [], + label: '凭祥市', + value: 451481, + }, + ], + label: '崇左市', + value: 451400, + }, + ], + label: '广西壮族自治区', + value: 450000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '秀英区', + value: 460105, + }, + { + children: [], + label: '龙华区', + value: 460106, + }, + { + children: [], + label: '琼山区', + value: 460107, + }, + { + children: [], + label: '美兰区', + value: 460108, + }, + ], + label: '海口市', + value: 460100, + }, + { + children: [ + { + children: [], + label: '海棠区', + value: 460202, + }, + { + children: [], + label: '吉阳区', + value: 460203, + }, + { + children: [], + label: '天涯区', + value: 460204, + }, + { + children: [], + label: '崖州区', + value: 460205, + }, + ], + label: '三亚市', + value: 460200, + }, + { + children: [ + { + children: [], + label: '西沙群岛', + value: 460321, + }, + { + children: [], + label: '南沙群岛', + value: 460322, + }, + { + children: [], + label: '中沙群岛', + value: 460323, + }, + ], + label: '三沙市', + value: 460300, + }, + { + children: [], + label: '儋州市', + value: 460400, + }, + { + children: [], + label: '五指山市', + value: 469001, + }, + { + children: [], + label: '琼海市', + value: 469002, + }, + { + children: [], + label: '文昌市', + value: 469005, + }, + { + children: [], + label: '万宁市', + value: 469006, + }, + { + children: [], + label: '东方市', + value: 469007, + }, + { + children: [], + label: '定安县', + value: 469021, + }, + { + children: [], + label: '屯昌县', + value: 469022, + }, + { + children: [], + label: '澄迈县', + value: 469023, + }, + { + children: [], + label: '临高县', + value: 469024, + }, + { + children: [], + label: '白沙黎族自治县', + value: 469025, + }, + { + children: [], + label: '昌江黎族自治县', + value: 469026, + }, + { + children: [], + label: '乐东黎族自治县', + value: 469027, + }, + { + children: [], + label: '陵水黎族自治县', + value: 469028, + }, + { + children: [], + label: '保亭黎族苗族自治县', + value: 469029, + }, + { + children: [], + label: '琼中黎族苗族自治县', + value: 469030, + }, + ], + label: '海南省', + value: 460000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '万州区', + value: 500101, + }, + { + children: [], + label: '涪陵区', + value: 500102, + }, + { + children: [], + label: '渝中区', + value: 500103, + }, + { + children: [], + label: '大渡口区', + value: 500104, + }, + { + children: [], + label: '江北区', + value: 500105, + }, + { + children: [], + label: '沙坪坝区', + value: 500106, + }, + { + children: [], + label: '九龙坡区', + value: 500107, + }, + { + children: [], + label: '南岸区', + value: 500108, + }, + { + children: [], + label: '北碚区', + value: 500109, + }, + { + children: [], + label: '綦江区', + value: 500110, + }, + { + children: [], + label: '大足区', + value: 500111, + }, + { + children: [], + label: '渝北区', + value: 500112, + }, + { + children: [], + label: '巴南区', + value: 500113, + }, + { + children: [], + label: '黔江区', + value: 500114, + }, + { + children: [], + label: '长寿区', + value: 500115, + }, + { + children: [], + label: '江津区', + value: 500116, + }, + { + children: [], + label: '合川区', + value: 500117, + }, + { + children: [], + label: '永川区', + value: 500118, + }, + { + children: [], + label: '南川区', + value: 500119, + }, + { + children: [], + label: '璧山区', + value: 500120, + }, + { + children: [], + label: '铜梁区', + value: 500151, + }, + { + children: [], + label: '潼南区', + value: 500152, + }, + { + children: [], + label: '荣昌区', + value: 500153, + }, + { + children: [], + label: '开州区', + value: 500154, + }, + { + children: [], + label: '梁平区', + value: 500155, + }, + { + children: [], + label: '武隆区', + value: 500156, + }, + ], + label: '重庆市', + value: 500100, + }, + { + children: [ + { + children: [], + label: '城口县', + value: 500229, + }, + { + children: [], + label: '丰都县', + value: 500230, + }, + { + children: [], + label: '垫江县', + value: 500231, + }, + { + children: [], + label: '忠县', + value: 500233, + }, + { + children: [], + label: '云阳县', + value: 500235, + }, + { + children: [], + label: '奉节县', + value: 500236, + }, + { + children: [], + label: '巫山县', + value: 500237, + }, + { + children: [], + label: '巫溪县', + value: 500238, + }, + { + children: [], + label: '石柱土家族自治县', + value: 500240, + }, + { + children: [], + label: '秀山土家族苗族自治县', + value: 500241, + }, + { + children: [], + label: '酉阳土家族苗族自治县', + value: 500242, + }, + { + children: [], + label: '彭水苗族土家族自治县', + value: 500243, + }, + ], + label: '重庆市', + value: 500200, + }, + ], + label: '重庆市', + value: 500000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '锦江区', + value: 510104, + }, + { + children: [], + label: '青羊区', + value: 510105, + }, + { + children: [], + label: '金牛区', + value: 510106, + }, + { + children: [], + label: '武侯区', + value: 510107, + }, + { + children: [], + label: '成华区', + value: 510108, + }, + { + children: [], + label: '龙泉驿区', + value: 510112, + }, + { + children: [], + label: '青白江区', + value: 510113, + }, + { + children: [], + label: '新都区', + value: 510114, + }, + { + children: [], + label: '温江区', + value: 510115, + }, + { + children: [], + label: '双流区', + value: 510116, + }, + { + children: [], + label: '郫都区', + value: 510117, + }, + { + children: [], + label: '金堂县', + value: 510121, + }, + { + children: [], + label: '大邑县', + value: 510129, + }, + { + children: [], + label: '蒲江县', + value: 510131, + }, + { + children: [], + label: '新津县', + value: 510132, + }, + { + children: [], + label: '都江堰市', + value: 510181, + }, + { + children: [], + label: '彭州市', + value: 510182, + }, + { + children: [], + label: '邛崃市', + value: 510183, + }, + { + children: [], + label: '崇州市', + value: 510184, + }, + { + children: [], + label: '简阳市', + value: 510185, + }, + ], + label: '成都市', + value: 510100, + }, + { + children: [ + { + children: [], + label: '自流井区', + value: 510302, + }, + { + children: [], + label: '贡井区', + value: 510303, + }, + { + children: [], + label: '大安区', + value: 510304, + }, + { + children: [], + label: '沿滩区', + value: 510311, + }, + { + children: [], + label: '荣县', + value: 510321, + }, + { + children: [], + label: '富顺县', + value: 510322, + }, + ], + label: '自贡市', + value: 510300, + }, + { + children: [ + { + children: [], + label: '东区', + value: 510402, + }, + { + children: [], + label: '西区', + value: 510403, + }, + { + children: [], + label: '仁和区', + value: 510411, + }, + { + children: [], + label: '米易县', + value: 510421, + }, + { + children: [], + label: '盐边县', + value: 510422, + }, + ], + label: '攀枝花市', + value: 510400, + }, + { + children: [ + { + children: [], + label: '江阳区', + value: 510502, + }, + { + children: [], + label: '纳溪区', + value: 510503, + }, + { + children: [], + label: '龙马潭区', + value: 510504, + }, + { + children: [], + label: '泸县', + value: 510521, + }, + { + children: [], + label: '合江县', + value: 510522, + }, + { + children: [], + label: '叙永县', + value: 510524, + }, + { + children: [], + label: '古蔺县', + value: 510525, + }, + ], + label: '泸州市', + value: 510500, + }, + { + children: [ + { + children: [], + label: '旌阳区', + value: 510603, + }, + { + children: [], + label: '罗江区', + value: 510604, + }, + { + children: [], + label: '中江县', + value: 510623, + }, + { + children: [], + label: '广汉市', + value: 510681, + }, + { + children: [], + label: '什邡市', + value: 510682, + }, + { + children: [], + label: '绵竹市', + value: 510683, + }, + ], + label: '德阳市', + value: 510600, + }, + { + children: [ + { + children: [], + label: '涪城区', + value: 510703, + }, + { + children: [], + label: '游仙区', + value: 510704, + }, + { + children: [], + label: '安州区', + value: 510705, + }, + { + children: [], + label: '三台县', + value: 510722, + }, + { + children: [], + label: '盐亭县', + value: 510723, + }, + { + children: [], + label: '梓潼县', + value: 510725, + }, + { + children: [], + label: '北川羌族自治县', + value: 510726, + }, + { + children: [], + label: '平武县', + value: 510727, + }, + { + children: [], + label: '江油市', + value: 510781, + }, + ], + label: '绵阳市', + value: 510700, + }, + { + children: [ + { + children: [], + label: '利州区', + value: 510802, + }, + { + children: [], + label: '昭化区', + value: 510811, + }, + { + children: [], + label: '朝天区', + value: 510812, + }, + { + children: [], + label: '旺苍县', + value: 510821, + }, + { + children: [], + label: '青川县', + value: 510822, + }, + { + children: [], + label: '剑阁县', + value: 510823, + }, + { + children: [], + label: '苍溪县', + value: 510824, + }, + ], + label: '广元市', + value: 510800, + }, + { + children: [ + { + children: [], + label: '船山区', + value: 510903, + }, + { + children: [], + label: '安居区', + value: 510904, + }, + { + children: [], + label: '蓬溪县', + value: 510921, + }, + { + children: [], + label: '射洪县', + value: 510922, + }, + { + children: [], + label: '大英县', + value: 510923, + }, + ], + label: '遂宁市', + value: 510900, + }, + { + children: [ + { + children: [], + label: '市中区', + value: 511002, + }, + { + children: [], + label: '东兴区', + value: 511011, + }, + { + children: [], + label: '威远县', + value: 511024, + }, + { + children: [], + label: '资中县', + value: 511025, + }, + { + children: [], + label: '隆昌市', + value: 511083, + }, + ], + label: '内江市', + value: 511000, + }, + { + children: [ + { + children: [], + label: '市中区', + value: 511102, + }, + { + children: [], + label: '沙湾区', + value: 511111, + }, + { + children: [], + label: '五通桥区', + value: 511112, + }, + { + children: [], + label: '金口河区', + value: 511113, + }, + { + children: [], + label: '犍为县', + value: 511123, + }, + { + children: [], + label: '井研县', + value: 511124, + }, + { + children: [], + label: '夹江县', + value: 511126, + }, + { + children: [], + label: '沐川县', + value: 511129, + }, + { + children: [], + label: '峨边彝族自治县', + value: 511132, + }, + { + children: [], + label: '马边彝族自治县', + value: 511133, + }, + { + children: [], + label: '峨眉山市', + value: 511181, + }, + ], + label: '乐山市', + value: 511100, + }, + { + children: [ + { + children: [], + label: '顺庆区', + value: 511302, + }, + { + children: [], + label: '高坪区', + value: 511303, + }, + { + children: [], + label: '嘉陵区', + value: 511304, + }, + { + children: [], + label: '南部县', + value: 511321, + }, + { + children: [], + label: '营山县', + value: 511322, + }, + { + children: [], + label: '蓬安县', + value: 511323, + }, + { + children: [], + label: '仪陇县', + value: 511324, + }, + { + children: [], + label: '西充县', + value: 511325, + }, + { + children: [], + label: '阆中市', + value: 511381, + }, + ], + label: '南充市', + value: 511300, + }, + { + children: [ + { + children: [], + label: '东坡区', + value: 511402, + }, + { + children: [], + label: '彭山区', + value: 511403, + }, + { + children: [], + label: '仁寿县', + value: 511421, + }, + { + children: [], + label: '洪雅县', + value: 511423, + }, + { + children: [], + label: '丹棱县', + value: 511424, + }, + { + children: [], + label: '青神县', + value: 511425, + }, + ], + label: '眉山市', + value: 511400, + }, + { + children: [ + { + children: [], + label: '翠屏区', + value: 511502, + }, + { + children: [], + label: '南溪区', + value: 511503, + }, + { + children: [], + label: '叙州区', + value: 511504, + }, + { + children: [], + label: '江安县', + value: 511523, + }, + { + children: [], + label: '长宁县', + value: 511524, + }, + { + children: [], + label: '高县', + value: 511525, + }, + { + children: [], + label: '珙县', + value: 511526, + }, + { + children: [], + label: '筠连县', + value: 511527, + }, + { + children: [], + label: '兴文县', + value: 511528, + }, + { + children: [], + label: '屏山县', + value: 511529, + }, + ], + label: '宜宾市', + value: 511500, + }, + { + children: [ + { + children: [], + label: '广安区', + value: 511602, + }, + { + children: [], + label: '前锋区', + value: 511603, + }, + { + children: [], + label: '岳池县', + value: 511621, + }, + { + children: [], + label: '武胜县', + value: 511622, + }, + { + children: [], + label: '邻水县', + value: 511623, + }, + { + children: [], + label: '华蓥市', + value: 511681, + }, + ], + label: '广安市', + value: 511600, + }, + { + children: [ + { + children: [], + label: '通川区', + value: 511702, + }, + { + children: [], + label: '达川区', + value: 511703, + }, + { + children: [], + label: '宣汉县', + value: 511722, + }, + { + children: [], + label: '开江县', + value: 511723, + }, + { + children: [], + label: '大竹县', + value: 511724, + }, + { + children: [], + label: '渠县', + value: 511725, + }, + { + children: [], + label: '万源市', + value: 511781, + }, + ], + label: '达州市', + value: 511700, + }, + { + children: [ + { + children: [], + label: '雨城区', + value: 511802, + }, + { + children: [], + label: '名山区', + value: 511803, + }, + { + children: [], + label: '荥经县', + value: 511822, + }, + { + children: [], + label: '汉源县', + value: 511823, + }, + { + children: [], + label: '石棉县', + value: 511824, + }, + { + children: [], + label: '天全县', + value: 511825, + }, + { + children: [], + label: '芦山县', + value: 511826, + }, + { + children: [], + label: '宝兴县', + value: 511827, + }, + ], + label: '雅安市', + value: 511800, + }, + { + children: [ + { + children: [], + label: '巴州区', + value: 511902, + }, + { + children: [], + label: '恩阳区', + value: 511903, + }, + { + children: [], + label: '通江县', + value: 511921, + }, + { + children: [], + label: '南江县', + value: 511922, + }, + { + children: [], + label: '平昌县', + value: 511923, + }, + ], + label: '巴中市', + value: 511900, + }, + { + children: [ + { + children: [], + label: '雁江区', + value: 512002, + }, + { + children: [], + label: '安岳县', + value: 512021, + }, + { + children: [], + label: '乐至县', + value: 512022, + }, + ], + label: '资阳市', + value: 512000, + }, + { + children: [ + { + children: [], + label: '马尔康市', + value: 513201, + }, + { + children: [], + label: '汶川县', + value: 513221, + }, + { + children: [], + label: '理县', + value: 513222, + }, + { + children: [], + label: '茂县', + value: 513223, + }, + { + children: [], + label: '松潘县', + value: 513224, + }, + { + children: [], + label: '九寨沟县', + value: 513225, + }, + { + children: [], + label: '金川县', + value: 513226, + }, + { + children: [], + label: '小金县', + value: 513227, + }, + { + children: [], + label: '黑水县', + value: 513228, + }, + { + children: [], + label: '壤塘县', + value: 513230, + }, + { + children: [], + label: '阿坝县', + value: 513231, + }, + { + children: [], + label: '若尔盖县', + value: 513232, + }, + { + children: [], + label: '红原县', + value: 513233, + }, + ], + label: '阿坝藏族羌族自治州', + value: 513200, + }, + { + children: [ + { + children: [], + label: '康定市', + value: 513301, + }, + { + children: [], + label: '泸定县', + value: 513322, + }, + { + children: [], + label: '丹巴县', + value: 513323, + }, + { + children: [], + label: '九龙县', + value: 513324, + }, + { + children: [], + label: '雅江县', + value: 513325, + }, + { + children: [], + label: '道孚县', + value: 513326, + }, + { + children: [], + label: '炉霍县', + value: 513327, + }, + { + children: [], + label: '甘孜县', + value: 513328, + }, + { + children: [], + label: '新龙县', + value: 513329, + }, + { + children: [], + label: '德格县', + value: 513330, + }, + { + children: [], + label: '白玉县', + value: 513331, + }, + { + children: [], + label: '石渠县', + value: 513332, + }, + { + children: [], + label: '色达县', + value: 513333, + }, + { + children: [], + label: '理塘县', + value: 513334, + }, + { + children: [], + label: '巴塘县', + value: 513335, + }, + { + children: [], + label: '乡城县', + value: 513336, + }, + { + children: [], + label: '稻城县', + value: 513337, + }, + { + children: [], + label: '得荣县', + value: 513338, + }, + ], + label: '甘孜藏族自治州', + value: 513300, + }, + { + children: [ + { + children: [], + label: '西昌市', + value: 513401, + }, + { + children: [], + label: '木里藏族自治县', + value: 513422, + }, + { + children: [], + label: '盐源县', + value: 513423, + }, + { + children: [], + label: '德昌县', + value: 513424, + }, + { + children: [], + label: '会理县', + value: 513425, + }, + { + children: [], + label: '会东县', + value: 513426, + }, + { + children: [], + label: '宁南县', + value: 513427, + }, + { + children: [], + label: '普格县', + value: 513428, + }, + { + children: [], + label: '布拖县', + value: 513429, + }, + { + children: [], + label: '金阳县', + value: 513430, + }, + { + children: [], + label: '昭觉县', + value: 513431, + }, + { + children: [], + label: '喜德县', + value: 513432, + }, + { + children: [], + label: '冕宁县', + value: 513433, + }, + { + children: [], + label: '越西县', + value: 513434, + }, + { + children: [], + label: '甘洛县', + value: 513435, + }, + { + children: [], + label: '美姑县', + value: 513436, + }, + { + children: [], + label: '雷波县', + value: 513437, + }, + ], + label: '凉山彝族自治州', + value: 513400, + }, + ], + label: '四川省', + value: 510000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '南明区', + value: 520102, + }, + { + children: [], + label: '云岩区', + value: 520103, + }, + { + children: [], + label: '花溪区', + value: 520111, + }, + { + children: [], + label: '乌当区', + value: 520112, + }, + { + children: [], + label: '白云区', + value: 520113, + }, + { + children: [], + label: '观山湖区', + value: 520115, + }, + { + children: [], + label: '开阳县', + value: 520121, + }, + { + children: [], + label: '息烽县', + value: 520122, + }, + { + children: [], + label: '修文县', + value: 520123, + }, + { + children: [], + label: '清镇市', + value: 520181, + }, + ], + label: '贵阳市', + value: 520100, + }, + { + children: [ + { + children: [], + label: '钟山区', + value: 520201, + }, + { + children: [], + label: '六枝特区', + value: 520203, + }, + { + children: [], + label: '水城县', + value: 520221, + }, + { + children: [], + label: '盘州市', + value: 520281, + }, + ], + label: '六盘水市', + value: 520200, + }, + { + children: [ + { + children: [], + label: '红花岗区', + value: 520302, + }, + { + children: [], + label: '汇川区', + value: 520303, + }, + { + children: [], + label: '播州区', + value: 520304, + }, + { + children: [], + label: '桐梓县', + value: 520322, + }, + { + children: [], + label: '绥阳县', + value: 520323, + }, + { + children: [], + label: '正安县', + value: 520324, + }, + { + children: [], + label: '道真仡佬族苗族自治县', + value: 520325, + }, + { + children: [], + label: '务川仡佬族苗族自治县', + value: 520326, + }, + { + children: [], + label: '凤冈县', + value: 520327, + }, + { + children: [], + label: '湄潭县', + value: 520328, + }, + { + children: [], + label: '余庆县', + value: 520329, + }, + { + children: [], + label: '习水县', + value: 520330, + }, + { + children: [], + label: '赤水市', + value: 520381, + }, + { + children: [], + label: '仁怀市', + value: 520382, + }, + ], + label: '遵义市', + value: 520300, + }, + { + children: [ + { + children: [], + label: '西秀区', + value: 520402, + }, + { + children: [], + label: '平坝区', + value: 520403, + }, + { + children: [], + label: '普定县', + value: 520422, + }, + { + children: [], + label: '镇宁布依族苗族自治县', + value: 520423, + }, + { + children: [], + label: '关岭布依族苗族自治县', + value: 520424, + }, + { + children: [], + label: '紫云苗族布依族自治县', + value: 520425, + }, + ], + label: '安顺市', + value: 520400, + }, + { + children: [ + { + children: [], + label: '七星关区', + value: 520502, + }, + { + children: [], + label: '大方县', + value: 520521, + }, + { + children: [], + label: '黔西县', + value: 520522, + }, + { + children: [], + label: '金沙县', + value: 520523, + }, + { + children: [], + label: '织金县', + value: 520524, + }, + { + children: [], + label: '纳雍县', + value: 520525, + }, + { + children: [], + label: '威宁彝族回族苗族自治县', + value: 520526, + }, + { + children: [], + label: '赫章县', + value: 520527, + }, + ], + label: '毕节市', + value: 520500, + }, + { + children: [ + { + children: [], + label: '碧江区', + value: 520602, + }, + { + children: [], + label: '万山区', + value: 520603, + }, + { + children: [], + label: '江口县', + value: 520621, + }, + { + children: [], + label: '玉屏侗族自治县', + value: 520622, + }, + { + children: [], + label: '石阡县', + value: 520623, + }, + { + children: [], + label: '思南县', + value: 520624, + }, + { + children: [], + label: '印江土家族苗族自治县', + value: 520625, + }, + { + children: [], + label: '德江县', + value: 520626, + }, + { + children: [], + label: '沿河土家族自治县', + value: 520627, + }, + { + children: [], + label: '松桃苗族自治县', + value: 520628, + }, + ], + label: '铜仁市', + value: 520600, + }, + { + children: [ + { + children: [], + label: '兴义市', + value: 522301, + }, + { + children: [], + label: '兴仁市', + value: 522302, + }, + { + children: [], + label: '普安县', + value: 522323, + }, + { + children: [], + label: '晴隆县', + value: 522324, + }, + { + children: [], + label: '贞丰县', + value: 522325, + }, + { + children: [], + label: '望谟县', + value: 522326, + }, + { + children: [], + label: '册亨县', + value: 522327, + }, + { + children: [], + label: '安龙县', + value: 522328, + }, + ], + label: '黔西南布依族苗族自治州', + value: 522300, + }, + { + children: [ + { + children: [], + label: '凯里市', + value: 522601, + }, + { + children: [], + label: '黄平县', + value: 522622, + }, + { + children: [], + label: '施秉县', + value: 522623, + }, + { + children: [], + label: '三穗县', + value: 522624, + }, + { + children: [], + label: '镇远县', + value: 522625, + }, + { + children: [], + label: '岑巩县', + value: 522626, + }, + { + children: [], + label: '天柱县', + value: 522627, + }, + { + children: [], + label: '锦屏县', + value: 522628, + }, + { + children: [], + label: '剑河县', + value: 522629, + }, + { + children: [], + label: '台江县', + value: 522630, + }, + { + children: [], + label: '黎平县', + value: 522631, + }, + { + children: [], + label: '榕江县', + value: 522632, + }, + { + children: [], + label: '从江县', + value: 522633, + }, + { + children: [], + label: '雷山县', + value: 522634, + }, + { + children: [], + label: '麻江县', + value: 522635, + }, + { + children: [], + label: '丹寨县', + value: 522636, + }, + ], + label: '黔东南苗族侗族自治州', + value: 522600, + }, + { + children: [ + { + children: [], + label: '都匀市', + value: 522701, + }, + { + children: [], + label: '福泉市', + value: 522702, + }, + { + children: [], + label: '荔波县', + value: 522722, + }, + { + children: [], + label: '贵定县', + value: 522723, + }, + { + children: [], + label: '瓮安县', + value: 522725, + }, + { + children: [], + label: '独山县', + value: 522726, + }, + { + children: [], + label: '平塘县', + value: 522727, + }, + { + children: [], + label: '罗甸县', + value: 522728, + }, + { + children: [], + label: '长顺县', + value: 522729, + }, + { + children: [], + label: '龙里县', + value: 522730, + }, + { + children: [], + label: '惠水县', + value: 522731, + }, + { + children: [], + label: '三都水族自治县', + value: 522732, + }, + ], + label: '黔南布依族苗族自治州', + value: 522700, + }, + ], + label: '贵州省', + value: 520000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '五华区', + value: 530102, + }, + { + children: [], + label: '盘龙区', + value: 530103, + }, + { + children: [], + label: '官渡区', + value: 530111, + }, + { + children: [], + label: '西山区', + value: 530112, + }, + { + children: [], + label: '东川区', + value: 530113, + }, + { + children: [], + label: '呈贡区', + value: 530114, + }, + { + children: [], + label: '晋宁区', + value: 530115, + }, + { + children: [], + label: '富民县', + value: 530124, + }, + { + children: [], + label: '宜良县', + value: 530125, + }, + { + children: [], + label: '石林彝族自治县', + value: 530126, + }, + { + children: [], + label: '嵩明县', + value: 530127, + }, + { + children: [], + label: '禄劝彝族苗族自治县', + value: 530128, + }, + { + children: [], + label: '寻甸回族彝族自治县', + value: 530129, + }, + { + children: [], + label: '安宁市', + value: 530181, + }, + ], + label: '昆明市', + value: 530100, + }, + { + children: [ + { + children: [], + label: '麒麟区', + value: 530302, + }, + { + children: [], + label: '沾益区', + value: 530303, + }, + { + children: [], + label: '马龙区', + value: 530304, + }, + { + children: [], + label: '陆良县', + value: 530322, + }, + { + children: [], + label: '师宗县', + value: 530323, + }, + { + children: [], + label: '罗平县', + value: 530324, + }, + { + children: [], + label: '富源县', + value: 530325, + }, + { + children: [], + label: '会泽县', + value: 530326, + }, + { + children: [], + label: '宣威市', + value: 530381, + }, + ], + label: '曲靖市', + value: 530300, + }, + { + children: [ + { + children: [], + label: '红塔区', + value: 530402, + }, + { + children: [], + label: '江川区', + value: 530403, + }, + { + children: [], + label: '澄江县', + value: 530422, + }, + { + children: [], + label: '通海县', + value: 530423, + }, + { + children: [], + label: '华宁县', + value: 530424, + }, + { + children: [], + label: '易门县', + value: 530425, + }, + { + children: [], + label: '峨山彝族自治县', + value: 530426, + }, + { + children: [], + label: '新平彝族傣族自治县', + value: 530427, + }, + { + children: [], + label: '元江哈尼族彝族傣族自治县', + value: 530428, + }, + ], + label: '玉溪市', + value: 530400, + }, + { + children: [ + { + children: [], + label: '隆阳区', + value: 530502, + }, + { + children: [], + label: '施甸县', + value: 530521, + }, + { + children: [], + label: '龙陵县', + value: 530523, + }, + { + children: [], + label: '昌宁县', + value: 530524, + }, + { + children: [], + label: '腾冲市', + value: 530581, + }, + ], + label: '保山市', + value: 530500, + }, + { + children: [ + { + children: [], + label: '昭阳区', + value: 530602, + }, + { + children: [], + label: '鲁甸县', + value: 530621, + }, + { + children: [], + label: '巧家县', + value: 530622, + }, + { + children: [], + label: '盐津县', + value: 530623, + }, + { + children: [], + label: '大关县', + value: 530624, + }, + { + children: [], + label: '永善县', + value: 530625, + }, + { + children: [], + label: '绥江县', + value: 530626, + }, + { + children: [], + label: '镇雄县', + value: 530627, + }, + { + children: [], + label: '彝良县', + value: 530628, + }, + { + children: [], + label: '威信县', + value: 530629, + }, + { + children: [], + label: '水富市', + value: 530681, + }, + ], + label: '昭通市', + value: 530600, + }, + { + children: [ + { + children: [], + label: '古城区', + value: 530702, + }, + { + children: [], + label: '玉龙纳西族自治县', + value: 530721, + }, + { + children: [], + label: '永胜县', + value: 530722, + }, + { + children: [], + label: '华坪县', + value: 530723, + }, + { + children: [], + label: '宁蒗彝族自治县', + value: 530724, + }, + ], + label: '丽江市', + value: 530700, + }, + { + children: [ + { + children: [], + label: '思茅区', + value: 530802, + }, + { + children: [], + label: '宁洱哈尼族彝族自治县', + value: 530821, + }, + { + children: [], + label: '墨江哈尼族自治县', + value: 530822, + }, + { + children: [], + label: '景东彝族自治县', + value: 530823, + }, + { + children: [], + label: '景谷傣族彝族自治县', + value: 530824, + }, + { + children: [], + label: '镇沅彝族哈尼族拉祜族自治县', + value: 530825, + }, + { + children: [], + label: '江城哈尼族彝族自治县', + value: 530826, + }, + { + children: [], + label: '孟连傣族拉祜族佤族自治县', + value: 530827, + }, + { + children: [], + label: '澜沧拉祜族自治县', + value: 530828, + }, + { + children: [], + label: '西盟佤族自治县', + value: 530829, + }, + ], + label: '普洱市', + value: 530800, + }, + { + children: [ + { + children: [], + label: '临翔区', + value: 530902, + }, + { + children: [], + label: '凤庆县', + value: 530921, + }, + { + children: [], + label: '云县', + value: 530922, + }, + { + children: [], + label: '永德县', + value: 530923, + }, + { + children: [], + label: '镇康县', + value: 530924, + }, + { + children: [], + label: '双江拉祜族佤族布朗族傣族自治县', + value: 530925, + }, + { + children: [], + label: '耿马傣族佤族自治县', + value: 530926, + }, + { + children: [], + label: '沧源佤族自治县', + value: 530927, + }, + ], + label: '临沧市', + value: 530900, + }, + { + children: [ + { + children: [], + label: '楚雄市', + value: 532301, + }, + { + children: [], + label: '双柏县', + value: 532322, + }, + { + children: [], + label: '牟定县', + value: 532323, + }, + { + children: [], + label: '南华县', + value: 532324, + }, + { + children: [], + label: '姚安县', + value: 532325, + }, + { + children: [], + label: '大姚县', + value: 532326, + }, + { + children: [], + label: '永仁县', + value: 532327, + }, + { + children: [], + label: '元谋县', + value: 532328, + }, + { + children: [], + label: '武定县', + value: 532329, + }, + { + children: [], + label: '禄丰县', + value: 532331, + }, + ], + label: '楚雄彝族自治州', + value: 532300, + }, + { + children: [ + { + children: [], + label: '个旧市', + value: 532501, + }, + { + children: [], + label: '开远市', + value: 532502, + }, + { + children: [], + label: '蒙自市', + value: 532503, + }, + { + children: [], + label: '弥勒市', + value: 532504, + }, + { + children: [], + label: '屏边苗族自治县', + value: 532523, + }, + { + children: [], + label: '建水县', + value: 532524, + }, + { + children: [], + label: '石屏县', + value: 532525, + }, + { + children: [], + label: '泸西县', + value: 532527, + }, + { + children: [], + label: '元阳县', + value: 532528, + }, + { + children: [], + label: '红河县', + value: 532529, + }, + { + children: [], + label: '金平苗族瑶族傣族自治县', + value: 532530, + }, + { + children: [], + label: '绿春县', + value: 532531, + }, + { + children: [], + label: '河口瑶族自治县', + value: 532532, + }, + ], + label: '红河哈尼族彝族自治州', + value: 532500, + }, + { + children: [ + { + children: [], + label: '文山市', + value: 532601, + }, + { + children: [], + label: '砚山县', + value: 532622, + }, + { + children: [], + label: '西畴县', + value: 532623, + }, + { + children: [], + label: '麻栗坡县', + value: 532624, + }, + { + children: [], + label: '马关县', + value: 532625, + }, + { + children: [], + label: '丘北县', + value: 532626, + }, + { + children: [], + label: '广南县', + value: 532627, + }, + { + children: [], + label: '富宁县', + value: 532628, + }, + ], + label: '文山壮族苗族自治州', + value: 532600, + }, + { + children: [ + { + children: [], + label: '景洪市', + value: 532801, + }, + { + children: [], + label: '勐海县', + value: 532822, + }, + { + children: [], + label: '勐腊县', + value: 532823, + }, + ], + label: '西双版纳傣族自治州', + value: 532800, + }, + { + children: [ + { + children: [], + label: '大理市', + value: 532901, + }, + { + children: [], + label: '漾濞彝族自治县', + value: 532922, + }, + { + children: [], + label: '祥云县', + value: 532923, + }, + { + children: [], + label: '宾川县', + value: 532924, + }, + { + children: [], + label: '弥渡县', + value: 532925, + }, + { + children: [], + label: '南涧彝族自治县', + value: 532926, + }, + { + children: [], + label: '巍山彝族回族自治县', + value: 532927, + }, + { + children: [], + label: '永平县', + value: 532928, + }, + { + children: [], + label: '云龙县', + value: 532929, + }, + { + children: [], + label: '洱源县', + value: 532930, + }, + { + children: [], + label: '剑川县', + value: 532931, + }, + { + children: [], + label: '鹤庆县', + value: 532932, + }, + ], + label: '大理白族自治州', + value: 532900, + }, + { + children: [ + { + children: [], + label: '瑞丽市', + value: 533102, + }, + { + children: [], + label: '芒市', + value: 533103, + }, + { + children: [], + label: '梁河县', + value: 533122, + }, + { + children: [], + label: '盈江县', + value: 533123, + }, + { + children: [], + label: '陇川县', + value: 533124, + }, + ], + label: '德宏傣族景颇族自治州', + value: 533100, + }, + { + children: [ + { + children: [], + label: '泸水市', + value: 533301, + }, + { + children: [], + label: '福贡县', + value: 533323, + }, + { + children: [], + label: '贡山独龙族怒族自治县', + value: 533324, + }, + { + children: [], + label: '兰坪白族普米族自治县', + value: 533325, + }, + ], + label: '怒江傈僳族自治州', + value: 533300, + }, + { + children: [ + { + children: [], + label: '香格里拉市', + value: 533401, + }, + { + children: [], + label: '德钦县', + value: 533422, + }, + { + children: [], + label: '维西傈僳族自治县', + value: 533423, + }, + ], + label: '迪庆藏族自治州', + value: 533400, + }, + ], + label: '云南省', + value: 530000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '城关区', + value: 540102, + }, + { + children: [], + label: '堆龙德庆区', + value: 540103, + }, + { + children: [], + label: '达孜区', + value: 540104, + }, + { + children: [], + label: '林周县', + value: 540121, + }, + { + children: [], + label: '当雄县', + value: 540122, + }, + { + children: [], + label: '尼木县', + value: 540123, + }, + { + children: [], + label: '曲水县', + value: 540124, + }, + { + children: [], + label: '墨竹工卡县', + value: 540127, + }, + ], + label: '拉萨市', + value: 540100, + }, + { + children: [ + { + children: [], + label: '桑珠孜区', + value: 540202, + }, + { + children: [], + label: '南木林县', + value: 540221, + }, + { + children: [], + label: '江孜县', + value: 540222, + }, + { + children: [], + label: '定日县', + value: 540223, + }, + { + children: [], + label: '萨迦县', + value: 540224, + }, + { + children: [], + label: '拉孜县', + value: 540225, + }, + { + children: [], + label: '昂仁县', + value: 540226, + }, + { + children: [], + label: '谢通门县', + value: 540227, + }, + { + children: [], + label: '白朗县', + value: 540228, + }, + { + children: [], + label: '仁布县', + value: 540229, + }, + { + children: [], + label: '康马县', + value: 540230, + }, + { + children: [], + label: '定结县', + value: 540231, + }, + { + children: [], + label: '仲巴县', + value: 540232, + }, + { + children: [], + label: '亚东县', + value: 540233, + }, + { + children: [], + label: '吉隆县', + value: 540234, + }, + { + children: [], + label: '聂拉木县', + value: 540235, + }, + { + children: [], + label: '萨嘎县', + value: 540236, + }, + { + children: [], + label: '岗巴县', + value: 540237, + }, + ], + label: '日喀则市', + value: 540200, + }, + { + children: [ + { + children: [], + label: '卡若区', + value: 540302, + }, + { + children: [], + label: '江达县', + value: 540321, + }, + { + children: [], + label: '贡觉县', + value: 540322, + }, + { + children: [], + label: '类乌齐县', + value: 540323, + }, + { + children: [], + label: '丁青县', + value: 540324, + }, + { + children: [], + label: '察雅县', + value: 540325, + }, + { + children: [], + label: '八宿县', + value: 540326, + }, + { + children: [], + label: '左贡县', + value: 540327, + }, + { + children: [], + label: '芒康县', + value: 540328, + }, + { + children: [], + label: '洛隆县', + value: 540329, + }, + { + children: [], + label: '边坝县', + value: 540330, + }, + ], + label: '昌都市', + value: 540300, + }, + { + children: [ + { + children: [], + label: '巴宜区', + value: 540402, + }, + { + children: [], + label: '工布江达县', + value: 540421, + }, + { + children: [], + label: '米林县', + value: 540422, + }, + { + children: [], + label: '墨脱县', + value: 540423, + }, + { + children: [], + label: '波密县', + value: 540424, + }, + { + children: [], + label: '察隅县', + value: 540425, + }, + { + children: [], + label: '朗县', + value: 540426, + }, + ], + label: '林芝市', + value: 540400, + }, + { + children: [ + { + children: [], + label: '乃东区', + value: 540502, + }, + { + children: [], + label: '扎囊县', + value: 540521, + }, + { + children: [], + label: '贡嘎县', + value: 540522, + }, + { + children: [], + label: '桑日县', + value: 540523, + }, + { + children: [], + label: '琼结县', + value: 540524, + }, + { + children: [], + label: '曲松县', + value: 540525, + }, + { + children: [], + label: '措美县', + value: 540526, + }, + { + children: [], + label: '洛扎县', + value: 540527, + }, + { + children: [], + label: '加查县', + value: 540528, + }, + { + children: [], + label: '隆子县', + value: 540529, + }, + { + children: [], + label: '错那县', + value: 540530, + }, + { + children: [], + label: '浪卡子县', + value: 540531, + }, + ], + label: '山南市', + value: 540500, + }, + { + children: [ + { + children: [], + label: '色尼区', + value: 540602, + }, + { + children: [], + label: '嘉黎县', + value: 540621, + }, + { + children: [], + label: '比如县', + value: 540622, + }, + { + children: [], + label: '聂荣县', + value: 540623, + }, + { + children: [], + label: '安多县', + value: 540624, + }, + { + children: [], + label: '申扎县', + value: 540625, + }, + { + children: [], + label: '索县', + value: 540626, + }, + { + children: [], + label: '班戈县', + value: 540627, + }, + { + children: [], + label: '巴青县', + value: 540628, + }, + { + children: [], + label: '尼玛县', + value: 540629, + }, + { + children: [], + label: '双湖县', + value: 540630, + }, + ], + label: '那曲市', + value: 540600, + }, + { + children: [ + { + children: [], + label: '普兰县', + value: 542521, + }, + { + children: [], + label: '札达县', + value: 542522, + }, + { + children: [], + label: '噶尔县', + value: 542523, + }, + { + children: [], + label: '日土县', + value: 542524, + }, + { + children: [], + label: '革吉县', + value: 542525, + }, + { + children: [], + label: '改则县', + value: 542526, + }, + { + children: [], + label: '措勤县', + value: 542527, + }, + ], + label: '阿里地区', + value: 542500, + }, + ], + label: '西藏自治区', + value: 540000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '新城区', + value: 610102, + }, + { + children: [], + label: '碑林区', + value: 610103, + }, + { + children: [], + label: '莲湖区', + value: 610104, + }, + { + children: [], + label: '灞桥区', + value: 610111, + }, + { + children: [], + label: '未央区', + value: 610112, + }, + { + children: [], + label: '雁塔区', + value: 610113, + }, + { + children: [], + label: '阎良区', + value: 610114, + }, + { + children: [], + label: '临潼区', + value: 610115, + }, + { + children: [], + label: '长安区', + value: 610116, + }, + { + children: [], + label: '高陵区', + value: 610117, + }, + { + children: [], + label: '鄠邑区', + value: 610118, + }, + { + children: [], + label: '蓝田县', + value: 610122, + }, + { + children: [], + label: '周至县', + value: 610124, + }, + ], + label: '西安市', + value: 610100, + }, + { + children: [ + { + children: [], + label: '王益区', + value: 610202, + }, + { + children: [], + label: '印台区', + value: 610203, + }, + { + children: [], + label: '耀州区', + value: 610204, + }, + { + children: [], + label: '宜君县', + value: 610222, + }, + ], + label: '铜川市', + value: 610200, + }, + { + children: [ + { + children: [], + label: '渭滨区', + value: 610302, + }, + { + children: [], + label: '金台区', + value: 610303, + }, + { + children: [], + label: '陈仓区', + value: 610304, + }, + { + children: [], + label: '凤翔县', + value: 610322, + }, + { + children: [], + label: '岐山县', + value: 610323, + }, + { + children: [], + label: '扶风县', + value: 610324, + }, + { + children: [], + label: '眉县', + value: 610326, + }, + { + children: [], + label: '陇县', + value: 610327, + }, + { + children: [], + label: '千阳县', + value: 610328, + }, + { + children: [], + label: '麟游县', + value: 610329, + }, + { + children: [], + label: '凤县', + value: 610330, + }, + { + children: [], + label: '太白县', + value: 610331, + }, + ], + label: '宝鸡市', + value: 610300, + }, + { + children: [ + { + children: [], + label: '秦都区', + value: 610402, + }, + { + children: [], + label: '杨陵区', + value: 610403, + }, + { + children: [], + label: '渭城区', + value: 610404, + }, + { + children: [], + label: '三原县', + value: 610422, + }, + { + children: [], + label: '泾阳县', + value: 610423, + }, + { + children: [], + label: '乾县', + value: 610424, + }, + { + children: [], + label: '礼泉县', + value: 610425, + }, + { + children: [], + label: '永寿县', + value: 610426, + }, + { + children: [], + label: '长武县', + value: 610428, + }, + { + children: [], + label: '旬邑县', + value: 610429, + }, + { + children: [], + label: '淳化县', + value: 610430, + }, + { + children: [], + label: '武功县', + value: 610431, + }, + { + children: [], + label: '兴平市', + value: 610481, + }, + { + children: [], + label: '彬州市', + value: 610482, + }, + ], + label: '咸阳市', + value: 610400, + }, + { + children: [ + { + children: [], + label: '临渭区', + value: 610502, + }, + { + children: [], + label: '华州区', + value: 610503, + }, + { + children: [], + label: '潼关县', + value: 610522, + }, + { + children: [], + label: '大荔县', + value: 610523, + }, + { + children: [], + label: '合阳县', + value: 610524, + }, + { + children: [], + label: '澄城县', + value: 610525, + }, + { + children: [], + label: '蒲城县', + value: 610526, + }, + { + children: [], + label: '白水县', + value: 610527, + }, + { + children: [], + label: '富平县', + value: 610528, + }, + { + children: [], + label: '韩城市', + value: 610581, + }, + { + children: [], + label: '华阴市', + value: 610582, + }, + ], + label: '渭南市', + value: 610500, + }, + { + children: [ + { + children: [], + label: '宝塔区', + value: 610602, + }, + { + children: [], + label: '安塞区', + value: 610603, + }, + { + children: [], + label: '延长县', + value: 610621, + }, + { + children: [], + label: '延川县', + value: 610622, + }, + { + children: [], + label: '子长县', + value: 610623, + }, + { + children: [], + label: '志丹县', + value: 610625, + }, + { + children: [], + label: '吴起县', + value: 610626, + }, + { + children: [], + label: '甘泉县', + value: 610627, + }, + { + children: [], + label: '富县', + value: 610628, + }, + { + children: [], + label: '洛川县', + value: 610629, + }, + { + children: [], + label: '宜川县', + value: 610630, + }, + { + children: [], + label: '黄龙县', + value: 610631, + }, + { + children: [], + label: '黄陵县', + value: 610632, + }, + ], + label: '延安市', + value: 610600, + }, + { + children: [ + { + children: [], + label: '汉台区', + value: 610702, + }, + { + children: [], + label: '南郑区', + value: 610703, + }, + { + children: [], + label: '城固县', + value: 610722, + }, + { + children: [], + label: '洋县', + value: 610723, + }, + { + children: [], + label: '西乡县', + value: 610724, + }, + { + children: [], + label: '勉县', + value: 610725, + }, + { + children: [], + label: '宁强县', + value: 610726, + }, + { + children: [], + label: '略阳县', + value: 610727, + }, + { + children: [], + label: '镇巴县', + value: 610728, + }, + { + children: [], + label: '留坝县', + value: 610729, + }, + { + children: [], + label: '佛坪县', + value: 610730, + }, + ], + label: '汉中市', + value: 610700, + }, + { + children: [ + { + children: [], + label: '榆阳区', + value: 610802, + }, + { + children: [], + label: '横山区', + value: 610803, + }, + { + children: [], + label: '府谷县', + value: 610822, + }, + { + children: [], + label: '靖边县', + value: 610824, + }, + { + children: [], + label: '定边县', + value: 610825, + }, + { + children: [], + label: '绥德县', + value: 610826, + }, + { + children: [], + label: '米脂县', + value: 610827, + }, + { + children: [], + label: '佳县', + value: 610828, + }, + { + children: [], + label: '吴堡县', + value: 610829, + }, + { + children: [], + label: '清涧县', + value: 610830, + }, + { + children: [], + label: '子洲县', + value: 610831, + }, + { + children: [], + label: '神木市', + value: 610881, + }, + ], + label: '榆林市', + value: 610800, + }, + { + children: [ + { + children: [], + label: '汉滨区', + value: 610902, + }, + { + children: [], + label: '汉阴县', + value: 610921, + }, + { + children: [], + label: '石泉县', + value: 610922, + }, + { + children: [], + label: '宁陕县', + value: 610923, + }, + { + children: [], + label: '紫阳县', + value: 610924, + }, + { + children: [], + label: '岚皋县', + value: 610925, + }, + { + children: [], + label: '平利县', + value: 610926, + }, + { + children: [], + label: '镇坪县', + value: 610927, + }, + { + children: [], + label: '旬阳县', + value: 610928, + }, + { + children: [], + label: '白河县', + value: 610929, + }, + ], + label: '安康市', + value: 610900, + }, + { + children: [ + { + children: [], + label: '商州区', + value: 611002, + }, + { + children: [], + label: '洛南县', + value: 611021, + }, + { + children: [], + label: '丹凤县', + value: 611022, + }, + { + children: [], + label: '商南县', + value: 611023, + }, + { + children: [], + label: '山阳县', + value: 611024, + }, + { + children: [], + label: '镇安县', + value: 611025, + }, + { + children: [], + label: '柞水县', + value: 611026, + }, + ], + label: '商洛市', + value: 611000, + }, + ], + label: '陕西省', + value: 610000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '城关区', + value: 620102, + }, + { + children: [], + label: '七里河区', + value: 620103, + }, + { + children: [], + label: '西固区', + value: 620104, + }, + { + children: [], + label: '安宁区', + value: 620105, + }, + { + children: [], + label: '红古区', + value: 620111, + }, + { + children: [], + label: '永登县', + value: 620121, + }, + { + children: [], + label: '皋兰县', + value: 620122, + }, + { + children: [], + label: '榆中县', + value: 620123, + }, + ], + label: '兰州市', + value: 620100, + }, + { + children: [], + label: '嘉峪关市', + value: 620200, + }, + { + children: [ + { + children: [], + label: '金川区', + value: 620302, + }, + { + children: [], + label: '永昌县', + value: 620321, + }, + ], + label: '金昌市', + value: 620300, + }, + { + children: [ + { + children: [], + label: '白银区', + value: 620402, + }, + { + children: [], + label: '平川区', + value: 620403, + }, + { + children: [], + label: '靖远县', + value: 620421, + }, + { + children: [], + label: '会宁县', + value: 620422, + }, + { + children: [], + label: '景泰县', + value: 620423, + }, + ], + label: '白银市', + value: 620400, + }, + { + children: [ + { + children: [], + label: '秦州区', + value: 620502, + }, + { + children: [], + label: '麦积区', + value: 620503, + }, + { + children: [], + label: '清水县', + value: 620521, + }, + { + children: [], + label: '秦安县', + value: 620522, + }, + { + children: [], + label: '甘谷县', + value: 620523, + }, + { + children: [], + label: '武山县', + value: 620524, + }, + { + children: [], + label: '张家川回族自治县', + value: 620525, + }, + ], + label: '天水市', + value: 620500, + }, + { + children: [ + { + children: [], + label: '凉州区', + value: 620602, + }, + { + children: [], + label: '民勤县', + value: 620621, + }, + { + children: [], + label: '古浪县', + value: 620622, + }, + { + children: [], + label: '天祝藏族自治县', + value: 620623, + }, + ], + label: '武威市', + value: 620600, + }, + { + children: [ + { + children: [], + label: '甘州区', + value: 620702, + }, + { + children: [], + label: '肃南裕固族自治县', + value: 620721, + }, + { + children: [], + label: '民乐县', + value: 620722, + }, + { + children: [], + label: '临泽县', + value: 620723, + }, + { + children: [], + label: '高台县', + value: 620724, + }, + { + children: [], + label: '山丹县', + value: 620725, + }, + ], + label: '张掖市', + value: 620700, + }, + { + children: [ + { + children: [], + label: '崆峒区', + value: 620802, + }, + { + children: [], + label: '泾川县', + value: 620821, + }, + { + children: [], + label: '灵台县', + value: 620822, + }, + { + children: [], + label: '崇信县', + value: 620823, + }, + { + children: [], + label: '庄浪县', + value: 620825, + }, + { + children: [], + label: '静宁县', + value: 620826, + }, + { + children: [], + label: '华亭市', + value: 620881, + }, + ], + label: '平凉市', + value: 620800, + }, + { + children: [ + { + children: [], + label: '肃州区', + value: 620902, + }, + { + children: [], + label: '金塔县', + value: 620921, + }, + { + children: [], + label: '瓜州县', + value: 620922, + }, + { + children: [], + label: '肃北蒙古族自治县', + value: 620923, + }, + { + children: [], + label: '阿克塞哈萨克族自治县', + value: 620924, + }, + { + children: [], + label: '玉门市', + value: 620981, + }, + { + children: [], + label: '敦煌市', + value: 620982, + }, + ], + label: '酒泉市', + value: 620900, + }, + { + children: [ + { + children: [], + label: '西峰区', + value: 621002, + }, + { + children: [], + label: '庆城县', + value: 621021, + }, + { + children: [], + label: '环县', + value: 621022, + }, + { + children: [], + label: '华池县', + value: 621023, + }, + { + children: [], + label: '合水县', + value: 621024, + }, + { + children: [], + label: '正宁县', + value: 621025, + }, + { + children: [], + label: '宁县', + value: 621026, + }, + { + children: [], + label: '镇原县', + value: 621027, + }, + ], + label: '庆阳市', + value: 621000, + }, + { + children: [ + { + children: [], + label: '安定区', + value: 621102, + }, + { + children: [], + label: '通渭县', + value: 621121, + }, + { + children: [], + label: '陇西县', + value: 621122, + }, + { + children: [], + label: '渭源县', + value: 621123, + }, + { + children: [], + label: '临洮县', + value: 621124, + }, + { + children: [], + label: '漳县', + value: 621125, + }, + { + children: [], + label: '岷县', + value: 621126, + }, + ], + label: '定西市', + value: 621100, + }, + { + children: [ + { + children: [], + label: '武都区', + value: 621202, + }, + { + children: [], + label: '成县', + value: 621221, + }, + { + children: [], + label: '文县', + value: 621222, + }, + { + children: [], + label: '宕昌县', + value: 621223, + }, + { + children: [], + label: '康县', + value: 621224, + }, + { + children: [], + label: '西和县', + value: 621225, + }, + { + children: [], + label: '礼县', + value: 621226, + }, + { + children: [], + label: '徽县', + value: 621227, + }, + { + children: [], + label: '两当县', + value: 621228, + }, + ], + label: '陇南市', + value: 621200, + }, + { + children: [ + { + children: [], + label: '临夏市', + value: 622901, + }, + { + children: [], + label: '临夏县', + value: 622921, + }, + { + children: [], + label: '康乐县', + value: 622922, + }, + { + children: [], + label: '永靖县', + value: 622923, + }, + { + children: [], + label: '广河县', + value: 622924, + }, + { + children: [], + label: '和政县', + value: 622925, + }, + { + children: [], + label: '东乡族自治县', + value: 622926, + }, + { + children: [], + label: '积石山保安族东乡族撒拉族自治县', + value: 622927, + }, + ], + label: '临夏回族自治州', + value: 622900, + }, + { + children: [ + { + children: [], + label: '合作市', + value: 623001, + }, + { + children: [], + label: '临潭县', + value: 623021, + }, + { + children: [], + label: '卓尼县', + value: 623022, + }, + { + children: [], + label: '舟曲县', + value: 623023, + }, + { + children: [], + label: '迭部县', + value: 623024, + }, + { + children: [], + label: '玛曲县', + value: 623025, + }, + { + children: [], + label: '碌曲县', + value: 623026, + }, + { + children: [], + label: '夏河县', + value: 623027, + }, + ], + label: '甘南藏族自治州', + value: 623000, + }, + ], + label: '甘肃省', + value: 620000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '城东区', + value: 630102, + }, + { + children: [], + label: '城中区', + value: 630103, + }, + { + children: [], + label: '城西区', + value: 630104, + }, + { + children: [], + label: '城北区', + value: 630105, + }, + { + children: [], + label: '大通回族土族自治县', + value: 630121, + }, + { + children: [], + label: '湟中县', + value: 630122, + }, + { + children: [], + label: '湟源县', + value: 630123, + }, + ], + label: '西宁市', + value: 630100, + }, + { + children: [ + { + children: [], + label: '乐都区', + value: 630202, + }, + { + children: [], + label: '平安区', + value: 630203, + }, + { + children: [], + label: '民和回族土族自治县', + value: 630222, + }, + { + children: [], + label: '互助土族自治县', + value: 630223, + }, + { + children: [], + label: '化隆回族自治县', + value: 630224, + }, + { + children: [], + label: '循化撒拉族自治县', + value: 630225, + }, + ], + label: '海东市', + value: 630200, + }, + { + children: [ + { + children: [], + label: '门源回族自治县', + value: 632221, + }, + { + children: [], + label: '祁连县', + value: 632222, + }, + { + children: [], + label: '海晏县', + value: 632223, + }, + { + children: [], + label: '刚察县', + value: 632224, + }, + ], + label: '海北藏族自治州', + value: 632200, + }, + { + children: [ + { + children: [], + label: '同仁县', + value: 632321, + }, + { + children: [], + label: '尖扎县', + value: 632322, + }, + { + children: [], + label: '泽库县', + value: 632323, + }, + { + children: [], + label: '河南蒙古族自治县', + value: 632324, + }, + ], + label: '黄南藏族自治州', + value: 632300, + }, + { + children: [ + { + children: [], + label: '共和县', + value: 632521, + }, + { + children: [], + label: '同德县', + value: 632522, + }, + { + children: [], + label: '贵德县', + value: 632523, + }, + { + children: [], + label: '兴海县', + value: 632524, + }, + { + children: [], + label: '贵南县', + value: 632525, + }, + ], + label: '海南藏族自治州', + value: 632500, + }, + { + children: [ + { + children: [], + label: '玛沁县', + value: 632621, + }, + { + children: [], + label: '班玛县', + value: 632622, + }, + { + children: [], + label: '甘德县', + value: 632623, + }, + { + children: [], + label: '达日县', + value: 632624, + }, + { + children: [], + label: '久治县', + value: 632625, + }, + { + children: [], + label: '玛多县', + value: 632626, + }, + ], + label: '果洛藏族自治州', + value: 632600, + }, + { + children: [ + { + children: [], + label: '玉树市', + value: 632701, + }, + { + children: [], + label: '杂多县', + value: 632722, + }, + { + children: [], + label: '称多县', + value: 632723, + }, + { + children: [], + label: '治多县', + value: 632724, + }, + { + children: [], + label: '囊谦县', + value: 632725, + }, + { + children: [], + label: '曲麻莱县', + value: 632726, + }, + ], + label: '玉树藏族自治州', + value: 632700, + }, + { + children: [ + { + children: [], + label: '格尔木市', + value: 632801, + }, + { + children: [], + label: '德令哈市', + value: 632802, + }, + { + children: [], + label: '茫崖市', + value: 632803, + }, + { + children: [], + label: '乌兰县', + value: 632821, + }, + { + children: [], + label: '都兰县', + value: 632822, + }, + { + children: [], + label: '天峻县', + value: 632823, + }, + { + children: [], + label: '海西蒙古族藏族自治州直辖', + value: 632824, + }, + ], + label: '海西蒙古族藏族自治州', + value: 632800, + }, + ], + label: '青海省', + value: 630000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '兴庆区', + value: 640104, + }, + { + children: [], + label: '西夏区', + value: 640105, + }, + { + children: [], + label: '金凤区', + value: 640106, + }, + { + children: [], + label: '永宁县', + value: 640121, + }, + { + children: [], + label: '贺兰县', + value: 640122, + }, + { + children: [], + label: '灵武市', + value: 640181, + }, + ], + label: '银川市', + value: 640100, + }, + { + children: [ + { + children: [], + label: '大武口区', + value: 640202, + }, + { + children: [], + label: '惠农区', + value: 640205, + }, + { + children: [], + label: '平罗县', + value: 640221, + }, + ], + label: '石嘴山市', + value: 640200, + }, + { + children: [ + { + children: [], + label: '利通区', + value: 640302, + }, + { + children: [], + label: '红寺堡区', + value: 640303, + }, + { + children: [], + label: '盐池县', + value: 640323, + }, + { + children: [], + label: '同心县', + value: 640324, + }, + { + children: [], + label: '青铜峡市', + value: 640381, + }, + ], + label: '吴忠市', + value: 640300, + }, + { + children: [ + { + children: [], + label: '原州区', + value: 640402, + }, + { + children: [], + label: '西吉县', + value: 640422, + }, + { + children: [], + label: '隆德县', + value: 640423, + }, + { + children: [], + label: '泾源县', + value: 640424, + }, + { + children: [], + label: '彭阳县', + value: 640425, + }, + ], + label: '固原市', + value: 640400, + }, + { + children: [ + { + children: [], + label: '沙坡头区', + value: 640502, + }, + { + children: [], + label: '中宁县', + value: 640521, + }, + { + children: [], + label: '海原县', + value: 640522, + }, + ], + label: '中卫市', + value: 640500, + }, + ], + label: '宁夏回族自治区', + value: 640000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '天山区', + value: 650102, + }, + { + children: [], + label: '沙依巴克区', + value: 650103, + }, + { + children: [], + label: '新市区', + value: 650104, + }, + { + children: [], + label: '水磨沟区', + value: 650105, + }, + { + children: [], + label: '头屯河区', + value: 650106, + }, + { + children: [], + label: '达坂城区', + value: 650107, + }, + { + children: [], + label: '米东区', + value: 650109, + }, + { + children: [], + label: '乌鲁木齐县', + value: 650121, + }, + ], + label: '乌鲁木齐市', + value: 650100, + }, + { + children: [ + { + children: [], + label: '独山子区', + value: 650202, + }, + { + children: [], + label: '克拉玛依区', + value: 650203, + }, + { + children: [], + label: '白碱滩区', + value: 650204, + }, + { + children: [], + label: '乌尔禾区', + value: 650205, + }, + ], + label: '克拉玛依市', + value: 650200, + }, + { + children: [ + { + children: [], + label: '高昌区', + value: 650402, + }, + { + children: [], + label: '鄯善县', + value: 650421, + }, + { + children: [], + label: '托克逊县', + value: 650422, + }, + ], + label: '吐鲁番市', + value: 650400, + }, + { + children: [ + { + children: [], + label: '伊州区', + value: 650502, + }, + { + children: [], + label: '巴里坤哈萨克自治县', + value: 650521, + }, + { + children: [], + label: '伊吾县', + value: 650522, + }, + ], + label: '哈密市', + value: 650500, + }, + { + children: [ + { + children: [], + label: '昌吉市', + value: 652301, + }, + { + children: [], + label: '阜康市', + value: 652302, + }, + { + children: [], + label: '呼图壁县', + value: 652323, + }, + { + children: [], + label: '玛纳斯县', + value: 652324, + }, + { + children: [], + label: '奇台县', + value: 652325, + }, + { + children: [], + label: '吉木萨尔县', + value: 652327, + }, + { + children: [], + label: '木垒哈萨克自治县', + value: 652328, + }, + ], + label: '昌吉回族自治州', + value: 652300, + }, + { + children: [ + { + children: [], + label: '博乐市', + value: 652701, + }, + { + children: [], + label: '阿拉山口市', + value: 652702, + }, + { + children: [], + label: '精河县', + value: 652722, + }, + { + children: [], + label: '温泉县', + value: 652723, + }, + ], + label: '博尔塔拉蒙古自治州', + value: 652700, + }, + { + children: [ + { + children: [], + label: '库尔勒市', + value: 652801, + }, + { + children: [], + label: '轮台县', + value: 652822, + }, + { + children: [], + label: '尉犁县', + value: 652823, + }, + { + children: [], + label: '若羌县', + value: 652824, + }, + { + children: [], + label: '且末县', + value: 652825, + }, + { + children: [], + label: '焉耆回族自治县', + value: 652826, + }, + { + children: [], + label: '和静县', + value: 652827, + }, + { + children: [], + label: '和硕县', + value: 652828, + }, + { + children: [], + label: '博湖县', + value: 652829, + }, + ], + label: '巴音郭楞蒙古自治州', + value: 652800, + }, + { + children: [ + { + children: [], + label: '阿克苏市', + value: 652901, + }, + { + children: [], + label: '温宿县', + value: 652922, + }, + { + children: [], + label: '库车县', + value: 652923, + }, + { + children: [], + label: '沙雅县', + value: 652924, + }, + { + children: [], + label: '新和县', + value: 652925, + }, + { + children: [], + label: '拜城县', + value: 652926, + }, + { + children: [], + label: '乌什县', + value: 652927, + }, + { + children: [], + label: '阿瓦提县', + value: 652928, + }, + { + children: [], + label: '柯坪县', + value: 652929, + }, + ], + label: '阿克苏地区', + value: 652900, + }, + { + children: [ + { + children: [], + label: '阿图什市', + value: 653001, + }, + { + children: [], + label: '阿克陶县', + value: 653022, + }, + { + children: [], + label: '阿合奇县', + value: 653023, + }, + { + children: [], + label: '乌恰县', + value: 653024, + }, + ], + label: '克孜勒苏柯尔克孜自治州', + value: 653000, + }, + { + children: [ + { + children: [], + label: '喀什市', + value: 653101, + }, + { + children: [], + label: '疏附县', + value: 653121, + }, + { + children: [], + label: '疏勒县', + value: 653122, + }, + { + children: [], + label: '英吉沙县', + value: 653123, + }, + { + children: [], + label: '泽普县', + value: 653124, + }, + { + children: [], + label: '莎车县', + value: 653125, + }, + { + children: [], + label: '叶城县', + value: 653126, + }, + { + children: [], + label: '麦盖提县', + value: 653127, + }, + { + children: [], + label: '岳普湖县', + value: 653128, + }, + { + children: [], + label: '伽师县', + value: 653129, + }, + { + children: [], + label: '巴楚县', + value: 653130, + }, + { + children: [], + label: '塔什库尔干塔吉克自治县', + value: 653131, + }, + ], + label: '喀什地区', + value: 653100, + }, + { + children: [ + { + children: [], + label: '和田市', + value: 653201, + }, + { + children: [], + label: '和田县', + value: 653221, + }, + { + children: [], + label: '墨玉县', + value: 653222, + }, + { + children: [], + label: '皮山县', + value: 653223, + }, + { + children: [], + label: '洛浦县', + value: 653224, + }, + { + children: [], + label: '策勒县', + value: 653225, + }, + { + children: [], + label: '于田县', + value: 653226, + }, + { + children: [], + label: '民丰县', + value: 653227, + }, + ], + label: '和田地区', + value: 653200, + }, + { + children: [ + { + children: [], + label: '伊宁市', + value: 654002, + }, + { + children: [], + label: '奎屯市', + value: 654003, + }, + { + children: [], + label: '霍尔果斯市', + value: 654004, + }, + { + children: [], + label: '伊宁县', + value: 654021, + }, + { + children: [], + label: '察布查尔锡伯自治县', + value: 654022, + }, + { + children: [], + label: '霍城县', + value: 654023, + }, + { + children: [], + label: '巩留县', + value: 654024, + }, + { + children: [], + label: '新源县', + value: 654025, + }, + { + children: [], + label: '昭苏县', + value: 654026, + }, + { + children: [], + label: '特克斯县', + value: 654027, + }, + { + children: [], + label: '尼勒克县', + value: 654028, + }, + ], + label: '伊犁哈萨克自治州', + value: 654000, + }, + { + children: [ + { + children: [], + label: '塔城市', + value: 654201, + }, + { + children: [], + label: '乌苏市', + value: 654202, + }, + { + children: [], + label: '额敏县', + value: 654221, + }, + { + children: [], + label: '沙湾县', + value: 654223, + }, + { + children: [], + label: '托里县', + value: 654224, + }, + { + children: [], + label: '裕民县', + value: 654225, + }, + { + children: [], + label: '和布克赛尔蒙古自治县', + value: 654226, + }, + ], + label: '塔城地区', + value: 654200, + }, + { + children: [ + { + children: [], + label: '阿勒泰市', + value: 654301, + }, + { + children: [], + label: '布尔津县', + value: 654321, + }, + { + children: [], + label: '富蕴县', + value: 654322, + }, + { + children: [], + label: '福海县', + value: 654323, + }, + { + children: [], + label: '哈巴河县', + value: 654324, + }, + { + children: [], + label: '青河县', + value: 654325, + }, + { + children: [], + label: '吉木乃县', + value: 654326, + }, + ], + label: '阿勒泰地区', + value: 654300, + }, + { + children: [], + label: '石河子市', + value: 659001, + }, + { + children: [], + label: '阿拉尔市', + value: 659002, + }, + { + children: [], + label: '图木舒克市', + value: 659003, + }, + { + children: [], + label: '五家渠市', + value: 659004, + }, + { + children: [], + label: '北屯市', + value: 659005, + }, + { + children: [], + label: '铁门关市', + value: 659006, + }, + { + children: [], + label: '双河市', + value: 659007, + }, + { + children: [], + label: '可克达拉市', + value: 659008, + }, + { + children: [], + label: '昆玉市', + value: 659009, + }, + ], + label: '新疆维吾尔自治区', + value: 650000, + }, + { + children: [ + { + children: [ + { + children: [], + label: '北投区', + value: 710101, + }, + { + children: [], + label: '松山区', + value: 710102, + }, + { + children: [], + label: '大同区', + value: 710103, + }, + { + children: [], + label: '文山区', + value: 710104, + }, + { + children: [], + label: '信义区', + value: 710105, + }, + { + children: [], + label: '内湖区', + value: 710106, + }, + { + children: [], + label: '中正区', + value: 710107, + }, + { + children: [], + label: '万华区', + value: 710108, + }, + { + children: [], + label: '中山区', + value: 710109, + }, + { + children: [], + label: '士林区', + value: 710110, + }, + { + children: [], + label: '南港区', + value: 710111, + }, + { + children: [], + label: '大安区', + value: 710112, + }, + ], + label: '台北市', + value: 710100, + }, + { + children: [ + { + children: [], + label: '小港区', + value: 710201, + }, + { + children: [], + label: '左营区', + value: 710202, + }, + { + children: [], + label: '大寮区', + value: 710203, + }, + { + children: [], + label: '那玛夏区', + value: 710204, + }, + { + children: [], + label: '旗津区', + value: 710205, + }, + { + children: [], + label: '弥陀区', + value: 710206, + }, + { + children: [], + label: '燕巢区', + value: 710207, + }, + { + children: [], + label: '大树区', + value: 710208, + }, + { + children: [], + label: '阿莲区', + value: 710209, + }, + { + children: [], + label: '楠梓区', + value: 710210, + }, + { + children: [], + label: '鸟松区', + value: 710211, + }, + { + children: [], + label: '苓雅区', + value: 710212, + }, + { + children: [], + label: '桥头区', + value: 710213, + }, + { + children: [], + label: '梓官区', + value: 710214, + }, + { + children: [], + label: '美浓区', + value: 710215, + }, + { + children: [], + label: '仁武区', + value: 710216, + }, + { + children: [], + label: '凤山区', + value: 710217, + }, + { + children: [], + label: '甲仙区', + value: 710218, + }, + { + children: [], + label: '茄萣区', + value: 710219, + }, + { + children: [], + label: '大社区', + value: 710220, + }, + { + children: [], + label: '前镇区', + value: 710221, + }, + { + children: [], + label: '茂林区', + value: 710222, + }, + { + children: [], + label: '湖内区', + value: 710223, + }, + { + children: [], + label: '六龟区', + value: 710224, + }, + { + children: [], + label: '林园区', + value: 710225, + }, + { + children: [], + label: '内门区', + value: 710226, + }, + { + children: [], + label: '鼓山区', + value: 710227, + }, + { + children: [], + label: '杉林区', + value: 710228, + }, + { + children: [], + label: '三民区', + value: 710229, + }, + { + children: [], + label: '前金区', + value: 710230, + }, + { + children: [], + label: '冈山区', + value: 710231, + }, + { + children: [], + label: '田寮区', + value: 710232, + }, + { + children: [], + label: '桃源区', + value: 710233, + }, + { + children: [], + label: '盐埕区', + value: 710234, + }, + { + children: [], + label: '旗山区', + value: 710235, + }, + { + children: [], + label: '永安区', + value: 710236, + }, + { + children: [], + label: '路竹区', + value: 710237, + }, + { + children: [], + label: '新兴区', + value: 710238, + }, + ], + label: '高雄市', + value: 710200, + }, + { + children: [ + { + children: [], + label: '八里区', + value: 710301, + }, + { + children: [], + label: '三峡区', + value: 710302, + }, + { + children: [], + label: '新庄区', + value: 710303, + }, + { + children: [], + label: '坪林区', + value: 710304, + }, + { + children: [], + label: '莺歌区', + value: 710305, + }, + { + children: [], + label: '汐止区', + value: 710306, + }, + { + children: [], + label: '深坑区', + value: 710307, + }, + { + children: [], + label: '芦洲区', + value: 710308, + }, + { + children: [], + label: '三芝区', + value: 710309, + }, + { + children: [], + label: '三重区', + value: 710310, + }, + { + children: [], + label: '平溪区', + value: 710311, + }, + { + children: [], + label: '中和区', + value: 710312, + }, + { + children: [], + label: '永和区', + value: 710313, + }, + { + children: [], + label: '泰山区', + value: 710314, + }, + { + children: [], + label: '土城区', + value: 710315, + }, + { + children: [], + label: '石碇区', + value: 710316, + }, + { + children: [], + label: '五股区', + value: 710317, + }, + { + children: [], + label: '林口区', + value: 710318, + }, + { + children: [], + label: '双溪区', + value: 710319, + }, + { + children: [], + label: '树林区', + value: 710320, + }, + { + children: [], + label: '板桥区', + value: 710321, + }, + { + children: [], + label: '新店区', + value: 710322, + }, + { + children: [], + label: '乌来区', + value: 710323, + }, + { + children: [], + label: '贡寮区', + value: 710324, + }, + { + children: [], + label: '金山区', + value: 710325, + }, + { + children: [], + label: '万里区', + value: 710326, + }, + { + children: [], + label: '淡水区', + value: 710327, + }, + { + children: [], + label: '瑞芳区', + value: 710328, + }, + { + children: [], + label: '石门区', + value: 710329, + }, + ], + label: '新北市', + value: 710300, + }, + { + children: [ + { + children: [], + label: '东区', + value: 710401, + }, + { + children: [], + label: '新社区', + value: 710402, + }, + { + children: [], + label: '中区', + value: 710403, + }, + { + children: [], + label: '南屯区', + value: 710404, + }, + { + children: [], + label: '神冈区', + value: 710405, + }, + { + children: [], + label: '沙鹿区', + value: 710406, + }, + { + children: [], + label: '丰原区', + value: 710407, + }, + { + children: [], + label: '大里区', + value: 710408, + }, + { + children: [], + label: '龙井区', + value: 710409, + }, + { + children: [], + label: '西区', + value: 710410, + }, + { + children: [], + label: '南区', + value: 710411, + }, + { + children: [], + label: '西屯区', + value: 710412, + }, + { + children: [], + label: '太平区', + value: 710413, + }, + { + children: [], + label: '北屯区', + value: 710414, + }, + { + children: [], + label: '大雅区', + value: 710415, + }, + { + children: [], + label: '石冈区', + value: 710416, + }, + { + children: [], + label: '北区', + value: 710417, + }, + { + children: [], + label: '大甲区', + value: 710418, + }, + { + children: [], + label: '梧栖区', + value: 710419, + }, + { + children: [], + label: '东势区', + value: 710420, + }, + { + children: [], + label: '和平区', + value: 710421, + }, + { + children: [], + label: '雾峰区', + value: 710422, + }, + { + children: [], + label: '乌日区', + value: 710423, + }, + { + children: [], + label: '后里区', + value: 710424, + }, + { + children: [], + label: '潭子区', + value: 710425, + }, + { + children: [], + label: '大肚区', + value: 710426, + }, + { + children: [], + label: '外埔区', + value: 710427, + }, + { + children: [], + label: '清水区', + value: 710428, + }, + { + children: [], + label: '大安区', + value: 710429, + }, + ], + label: '台中市', + value: 710400, + }, + { + children: [ + { + children: [], + label: '安定区', + value: 710501, + }, + { + children: [], + label: '大内区', + value: 710502, + }, + { + children: [], + label: '东山区', + value: 710503, + }, + { + children: [], + label: '下营区', + value: 710504, + }, + { + children: [], + label: '山上区', + value: 710505, + }, + { + children: [], + label: '永康区', + value: 710506, + }, + { + children: [], + label: '新营区', + value: 710507, + }, + { + children: [], + label: '白河区', + value: 710508, + }, + { + children: [], + label: '盐水区', + value: 710509, + }, + { + children: [], + label: '归仁区', + value: 710510, + }, + { + children: [], + label: '龙崎区', + value: 710511, + }, + { + children: [], + label: '关庙区', + value: 710512, + }, + { + children: [], + label: '仁德区', + value: 710513, + }, + { + children: [], + label: '学甲区', + value: 710514, + }, + { + children: [], + label: '善化区', + value: 710515, + }, + { + children: [], + label: '新市区', + value: 710516, + }, + { + children: [], + label: '佳里区', + value: 710517, + }, + { + children: [], + label: '新化区', + value: 710518, + }, + { + children: [], + label: '西港区', + value: 710519, + }, + { + children: [], + label: '麻豆区', + value: 710520, + }, + { + children: [], + label: '安南区', + value: 710521, + }, + { + children: [], + label: '后壁区', + value: 710522, + }, + { + children: [], + label: '柳营区', + value: 710523, + }, + { + children: [], + label: '玉井区', + value: 710524, + }, + { + children: [], + label: '官田区', + value: 710525, + }, + { + children: [], + label: '东区', + value: 710526, + }, + { + children: [], + label: '六甲区', + value: 710527, + }, + { + children: [], + label: '中西区', + value: 710528, + }, + { + children: [], + label: '北区', + value: 710529, + }, + { + children: [], + label: '楠西区', + value: 710530, + }, + { + children: [], + label: '南化区', + value: 710531, + }, + { + children: [], + label: '左镇区', + value: 710532, + }, + { + children: [], + label: '南区', + value: 710533, + }, + { + children: [], + label: '安平区', + value: 710534, + }, + { + children: [], + label: '北门区', + value: 710535, + }, + { + children: [], + label: '七股区', + value: 710536, + }, + { + children: [], + label: '将军区', + value: 710537, + }, + ], + label: '台南市', + value: 710500, + }, + { + children: [ + { + children: [], + label: '平镇市', + value: 710601, + }, + { + children: [], + label: '杨梅市', + value: 710602, + }, + { + children: [], + label: '八德市', + value: 710603, + }, + { + children: [], + label: '桃园区', + value: 710604, + }, + { + children: [], + label: '龟山乡', + value: 710605, + }, + { + children: [], + label: '复兴乡', + value: 710606, + }, + { + children: [], + label: '芦竹乡', + value: 710607, + }, + { + children: [], + label: '观音乡', + value: 710608, + }, + { + children: [], + label: '龙潭乡', + value: 710609, + }, + { + children: [], + label: '大溪镇', + value: 710610, + }, + { + children: [], + label: '大园乡', + value: 710611, + }, + { + children: [], + label: '新屋乡', + value: 710612, + }, + { + children: [], + label: '中坜市', + value: 710613, + }, + ], + label: '桃园市', + value: 710600, + }, + { + children: [], + label: '基隆市', + value: 719001, + }, + { + children: [], + label: '新竹市', + value: 719002, + }, + { + children: [], + label: '嘉义市', + value: 719003, + }, + { + children: [], + label: '新竹县', + value: 719004, + }, + { + children: [], + label: '宜兰县', + value: 719005, + }, + { + children: [], + label: '苗栗县', + value: 719006, + }, + { + children: [], + label: '彰化县', + value: 719007, + }, + { + children: [], + label: '云林县', + value: 719008, + }, + { + children: [], + label: '南投县', + value: 719009, + }, + { + children: [], + label: '嘉义县', + value: 719010, + }, + { + children: [], + label: '屏东县', + value: 719011, + }, + { + children: [], + label: '台东县', + value: 719012, + }, + { + children: [], + label: '花莲县', + value: 719013, + }, + { + children: [], + label: '澎湖县', + value: 719014, + }, + ], + label: '台湾省', + value: 710000, + }, + { + children: [ + { + children: [], + label: '中西区', + value: 810101, + }, + { + children: [], + label: '东区', + value: 810102, + }, + { + children: [], + label: '九龙城区', + value: 810103, + }, + { + children: [], + label: '观塘区', + value: 810104, + }, + { + children: [], + label: '南区', + value: 810105, + }, + { + children: [], + label: '深水埗区', + value: 810106, + }, + { + children: [], + label: '湾仔区', + value: 810107, + }, + { + children: [], + label: '黄大仙区', + value: 810108, + }, + { + children: [], + label: '油尖旺区', + value: 810109, + }, + { + children: [], + label: '离岛区', + value: 810110, + }, + { + children: [], + label: '葵青区', + value: 810111, + }, + { + children: [], + label: '北区', + value: 810112, + }, + { + children: [], + label: '西贡区', + value: 810113, + }, + { + children: [], + label: '沙田区', + value: 810114, + }, + { + children: [], + label: '屯门区', + value: 810115, + }, + { + children: [], + label: '大埔区', + value: 810116, + }, + { + children: [], + label: '荃湾区', + value: 810117, + }, + { + children: [], + label: '元朗区', + value: 810118, + }, + ], + label: '香港', + value: 810000, + }, + { + children: [ + { + children: [], + label: '花王堂区', + value: 820001, + }, + { + children: [], + label: '望德堂区', + value: 820002, + }, + { + children: [], + label: '风顺堂区', + value: 820003, + }, + { + children: [], + label: '圣方济各堂区', + value: 820004, + }, + { + children: [], + label: '嘉模堂区', + value: 820005, + }, + { + children: [], + label: '大堂区', + value: 820006, + }, + { + children: [], + label: '路氹填海区', + value: 820007, + }, + { + children: [], + label: '花地玛堂区', + value: 820008, + }, + { + children: [], + label: '澳门特别行政区直辖', + value: 820010, + }, + ], + label: '澳门', + value: 820000, + }, +]; diff --git a/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/province-city.ts b/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/province-city.ts new file mode 100644 index 00000000..50ba58d1 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/province-city.ts @@ -0,0 +1,1727 @@ +export const PROVINCE_CITY = [ + { + children: [ + { + value: 110100, + label: '北京', + }, + ], + value: 110000, + label: '北京市', + }, + { + children: [ + { + value: 120100, + label: '天津', + }, + ], + value: 120000, + label: '天津市', + }, + { + children: [ + { + value: 130100, + label: '石家庄', + }, + { + value: 130200, + label: '唐山', + }, + { + value: 130300, + label: '秦皇岛', + }, + { + value: 130400, + label: '邯郸', + }, + { + value: 130500, + label: '邢台', + }, + { + value: 130600, + label: '保定', + }, + { + value: 130700, + label: '张家口', + }, + { + value: 130800, + label: '承德', + }, + { + value: 130900, + label: '沧州', + }, + { + value: 131000, + label: '廊坊', + }, + { + value: 131100, + label: '衡水', + }, + ], + value: 130000, + label: '河北省', + }, + { + children: [ + { + value: 140100, + label: '太原', + }, + { + value: 140200, + label: '大同', + }, + { + value: 140300, + label: '阳泉', + }, + { + value: 140400, + label: '长治', + }, + { + value: 140500, + label: '晋城', + }, + { + value: 140600, + label: '朔州', + }, + { + value: 140700, + label: '晋中', + }, + { + value: 140800, + label: '运城', + }, + { + value: 140900, + label: '忻州', + }, + { + value: 141000, + label: '临汾', + }, + { + value: 141100, + label: '吕梁', + }, + ], + value: 140000, + label: '山西省', + }, + { + children: [ + { + value: 150100, + label: '呼和浩特', + }, + { + value: 150200, + label: '包头', + }, + { + value: 150300, + label: '乌海', + }, + { + value: 150400, + label: '赤峰', + }, + { + value: 150500, + label: '通辽', + }, + { + value: 150600, + label: '鄂尔多斯', + }, + { + value: 150700, + label: '呼伦贝尔', + }, + { + value: 150800, + label: '巴彦淖尔', + }, + { + value: 150900, + label: '乌兰察布', + }, + { + value: 152200, + label: '兴安盟', + }, + { + value: 152500, + label: '锡林郭勒盟', + }, + { + value: 152900, + label: '阿拉善盟', + }, + ], + value: 150000, + label: '内蒙古自治区', + }, + { + children: [ + { + value: 210100, + label: '沈阳', + }, + { + value: 210200, + label: '大连', + }, + { + value: 210300, + label: '鞍山', + }, + { + value: 210400, + label: '抚顺', + }, + { + value: 210500, + label: '本溪', + }, + { + value: 210600, + label: '丹东', + }, + { + value: 210700, + label: '锦州', + }, + { + value: 210800, + label: '营口', + }, + { + value: 210900, + label: '阜新', + }, + { + value: 211000, + label: '辽阳', + }, + { + value: 211100, + label: '盘锦', + }, + { + value: 211200, + label: '铁岭', + }, + { + value: 211300, + label: '朝阳', + }, + { + value: 211400, + label: '葫芦岛', + }, + ], + value: 210000, + label: '辽宁省', + }, + { + children: [ + { + value: 220100, + label: '长春', + }, + { + value: 220200, + label: '吉林', + }, + { + value: 220300, + label: '四平', + }, + { + value: 220400, + label: '辽源', + }, + { + value: 220500, + label: '通化', + }, + { + value: 220600, + label: '白山', + }, + { + value: 220700, + label: '松原', + }, + { + value: 220800, + label: '白城', + }, + { + value: 222400, + label: '延边', + }, + ], + value: 220000, + label: '吉林省', + }, + { + children: [ + { + value: 230100, + label: '哈尔滨', + }, + { + value: 230200, + label: '齐齐哈尔', + }, + { + value: 230300, + label: '鸡西', + }, + { + value: 230400, + label: '鹤岗', + }, + { + value: 230500, + label: '双鸭山', + }, + { + value: 230600, + label: '大庆', + }, + { + value: 230700, + label: '伊春', + }, + { + value: 230800, + label: '佳木斯', + }, + { + value: 230900, + label: '七台河', + }, + { + value: 231000, + label: '牡丹江', + }, + { + value: 231100, + label: '黑河', + }, + { + value: 231200, + label: '绥化', + }, + { + value: 232700, + label: '大兴安岭地区', + }, + ], + value: 230000, + label: '黑龙江省', + }, + { + children: [ + { + value: 310100, + label: '上海', + }, + ], + value: 310000, + label: '上海市', + }, + { + children: [ + { + value: 320100, + label: '南京', + }, + { + value: 320200, + label: '无锡', + }, + { + value: 320300, + label: '徐州', + }, + { + value: 320400, + label: '常州', + }, + { + value: 320500, + label: '苏州', + }, + { + value: 320600, + label: '南通', + }, + { + value: 320700, + label: '连云港', + }, + { + value: 320800, + label: '淮安', + }, + { + value: 320900, + label: '盐城', + }, + { + value: 321000, + label: '扬州', + }, + { + value: 321100, + label: '镇江', + }, + { + value: 321200, + label: '泰州', + }, + { + value: 321300, + label: '宿迁', + }, + ], + value: 320000, + label: '江苏省', + }, + { + children: [ + { + value: 330100, + label: '杭州', + }, + { + value: 330200, + label: '宁波', + }, + { + value: 330300, + label: '温州', + }, + { + value: 330400, + label: '嘉兴', + }, + { + value: 330500, + label: '湖州', + }, + { + value: 330600, + label: '绍兴', + }, + { + value: 330700, + label: '金华', + }, + { + value: 330800, + label: '衢州', + }, + { + value: 330900, + label: '舟山', + }, + { + value: 331000, + label: '台州', + }, + { + value: 331100, + label: '丽水', + }, + ], + value: 330000, + label: '浙江省', + }, + { + children: [ + { + value: 340100, + label: '合肥', + }, + { + value: 340200, + label: '芜湖', + }, + { + value: 340300, + label: '蚌埠', + }, + { + value: 340400, + label: '淮南', + }, + { + value: 340500, + label: '马鞍山', + }, + { + value: 340600, + label: '淮北', + }, + { + value: 340700, + label: '铜陵', + }, + { + value: 340800, + label: '安庆', + }, + { + value: 341000, + label: '黄山', + }, + { + value: 341100, + label: '滁州', + }, + { + value: 341200, + label: '阜阳', + }, + { + value: 341300, + label: '宿州', + }, + { + value: 341500, + label: '六安', + }, + { + value: 341600, + label: '亳州', + }, + { + value: 341700, + label: '池州', + }, + { + value: 341800, + label: '宣城', + }, + ], + value: 340000, + label: '安徽省', + }, + { + children: [ + { + value: 350100, + label: '福州', + }, + { + value: 350200, + label: '厦门', + }, + { + value: 350300, + label: '莆田', + }, + { + value: 350400, + label: '三明', + }, + { + value: 350500, + label: '泉州', + }, + { + value: 350600, + label: '漳州', + }, + { + value: 350700, + label: '南平', + }, + { + value: 350800, + label: '龙岩', + }, + { + value: 350900, + label: '宁德', + }, + ], + value: 350000, + label: '福建省', + }, + { + children: [ + { + value: 360100, + label: '南昌', + }, + { + value: 360200, + label: '景德镇', + }, + { + value: 360300, + label: '萍乡', + }, + { + value: 360400, + label: '九江', + }, + { + value: 360500, + label: '新余', + }, + { + value: 360600, + label: '鹰潭', + }, + { + value: 360700, + label: '赣州', + }, + { + value: 360800, + label: '吉安', + }, + { + value: 360900, + label: '宜春', + }, + { + value: 361000, + label: '抚州', + }, + { + value: 361100, + label: '上饶', + }, + ], + value: 360000, + label: '江西省', + }, + { + children: [ + { + value: 370100, + label: '济南', + }, + { + value: 370200, + label: '青岛', + }, + { + value: 370300, + label: '淄博', + }, + { + value: 370400, + label: '枣庄', + }, + { + value: 370500, + label: '东营', + }, + { + value: 370600, + label: '烟台', + }, + { + value: 370700, + label: '潍坊', + }, + { + value: 370800, + label: '济宁', + }, + { + value: 370900, + label: '泰安', + }, + { + value: 371000, + label: '威海', + }, + { + value: 371100, + label: '日照', + }, + { + value: 371300, + label: '临沂', + }, + { + value: 371400, + label: '德州', + }, + { + value: 371500, + label: '聊城', + }, + { + value: 371600, + label: '滨州', + }, + { + value: 371700, + label: '菏泽', + }, + { + value: 1072447, + label: '莱芜', + }, + ], + value: 370000, + label: '山东省', + }, + { + children: [ + { + value: 410100, + label: '郑州', + }, + { + value: 410200, + label: '开封', + }, + { + value: 410300, + label: '洛阳', + }, + { + value: 410400, + label: '平顶山', + }, + { + value: 410500, + label: '安阳', + }, + { + value: 410600, + label: '鹤壁', + }, + { + value: 410700, + label: '新乡', + }, + { + value: 410800, + label: '焦作', + }, + { + value: 410900, + label: '濮阳', + }, + { + value: 411000, + label: '许昌', + }, + { + value: 411100, + label: '漯河', + }, + { + value: 411200, + label: '三门峡', + }, + { + value: 411300, + label: '南阳', + }, + { + value: 411400, + label: '商丘', + }, + { + value: 411500, + label: '信阳', + }, + { + value: 411600, + label: '周口', + }, + { + value: 411700, + label: '驻马店', + }, + { + value: 419001, + label: '济源', + }, + ], + value: 410000, + label: '河南省', + }, + { + children: [ + { + value: 420100, + label: '武汉', + }, + { + value: 420200, + label: '黄石', + }, + { + value: 420300, + label: '十堰', + }, + { + value: 420500, + label: '宜昌', + }, + { + value: 420600, + label: '襄阳', + }, + { + value: 420700, + label: '鄂州', + }, + { + value: 420800, + label: '荆门', + }, + { + value: 420900, + label: '孝感', + }, + { + value: 421000, + label: '荆州', + }, + { + value: 421100, + label: '黄冈', + }, + { + value: 421200, + label: '咸宁', + }, + { + value: 421300, + label: '随州', + }, + { + value: 422800, + label: '恩施', + }, + { + value: 1072452, + label: '潜江', + }, + { + value: 1072453, + label: '仙桃', + }, + { + value: 1072457, + label: '大冶', + }, + { + value: 1072458, + label: '天门', + }, + { + value: 1072460, + label: '神农架', + }, + ], + value: 420000, + label: '湖北省', + }, + { + children: [ + { + value: 430100, + label: '长沙', + }, + { + value: 430200, + label: '株洲', + }, + { + value: 430300, + label: '湘潭', + }, + { + value: 430400, + label: '衡阳', + }, + { + value: 430500, + label: '邵阳', + }, + { + value: 430600, + label: '岳阳', + }, + { + value: 430700, + label: '常德', + }, + { + value: 430800, + label: '张家界', + }, + { + value: 430900, + label: '益阳', + }, + { + value: 431000, + label: '郴州', + }, + { + value: 431100, + label: '永州', + }, + { + value: 431200, + label: '怀化', + }, + { + value: 431300, + label: '娄底', + }, + { + value: 433100, + label: '湘西', + }, + ], + value: 430000, + label: '湖南省', + }, + { + children: [ + { + value: 440100, + label: '广州', + }, + { + value: 440200, + label: '韶关', + }, + { + value: 440300, + label: '深圳', + }, + { + value: 440400, + label: '珠海', + }, + { + value: 440500, + label: '汕头', + }, + { + value: 440600, + label: '佛山', + }, + { + value: 440700, + label: '江门', + }, + { + value: 440800, + label: '湛江', + }, + { + value: 440900, + label: '茂名', + }, + { + value: 441200, + label: '肇庆', + }, + { + value: 441300, + label: '惠州', + }, + { + value: 441400, + label: '梅州', + }, + { + value: 441500, + label: '汕尾', + }, + { + value: 441600, + label: '河源', + }, + { + value: 441700, + label: '阳江', + }, + { + value: 441800, + label: '清远', + }, + { + value: 441900, + label: '东莞', + }, + { + value: 442000, + label: '中山', + }, + { + value: 445100, + label: '潮州', + }, + { + value: 445200, + label: '揭阳', + }, + { + value: 445300, + label: '云浮', + }, + ], + value: 440000, + label: '广东省', + }, + { + children: [ + { + value: 450100, + label: '南宁', + }, + { + value: 450200, + label: '柳州', + }, + { + value: 450300, + label: '桂林', + }, + { + value: 450400, + label: '梧州', + }, + { + value: 450500, + label: '北海', + }, + { + value: 450600, + label: '防城港', + }, + { + value: 450700, + label: '钦州', + }, + { + value: 450800, + label: '贵港', + }, + { + value: 450900, + label: '玉林', + }, + { + value: 451000, + label: '百色', + }, + { + value: 451100, + label: '贺州', + }, + { + value: 451200, + label: '河池', + }, + { + value: 451300, + label: '来宾', + }, + { + value: 451400, + label: '崇左', + }, + ], + value: 450000, + label: '广西壮族自治区', + }, + { + children: [ + { + value: 460100, + label: '海口', + }, + { + value: 460200, + label: '三亚', + }, + { + value: 460300, + label: '三沙', + }, + { + value: 460400, + label: '儋州', + }, + { + value: 1072449, + label: '文昌', + }, + ], + value: 460000, + label: '海南省', + }, + { + children: [ + { + value: 500100, + label: '重庆', + }, + ], + value: 500000, + label: '重庆市', + }, + { + children: [ + { + value: 510100, + label: '成都', + }, + { + value: 510300, + label: '自贡', + }, + { + value: 510400, + label: '攀枝花', + }, + { + value: 510500, + label: '泸州', + }, + { + value: 510600, + label: '德阳', + }, + { + value: 510700, + label: '绵阳', + }, + { + value: 510800, + label: '广元', + }, + { + value: 510900, + label: '遂宁', + }, + { + value: 511000, + label: '内江', + }, + { + value: 511100, + label: '乐山', + }, + { + value: 511300, + label: '南充', + }, + { + value: 511400, + label: '眉山', + }, + { + value: 511500, + label: '宜宾', + }, + { + value: 511600, + label: '广安', + }, + { + value: 511700, + label: '达州', + }, + { + value: 511800, + label: '雅安', + }, + { + value: 511900, + label: '巴中', + }, + { + value: 512000, + label: '资阳', + }, + { + value: 513200, + label: '阿坝', + }, + { + value: 513300, + label: '甘孜', + }, + { + value: 513400, + label: '凉山', + }, + { + value: 1072456, + label: '西昌', + }, + ], + value: 510000, + label: '四川省', + }, + { + children: [ + { + value: 520100, + label: '贵阳', + }, + { + value: 520200, + label: '六盘水', + }, + { + value: 520300, + label: '遵义', + }, + { + value: 520400, + label: '安顺', + }, + { + value: 520500, + label: '毕节', + }, + { + value: 520600, + label: '铜仁', + }, + { + value: 522300, + label: '黔西南', + }, + { + value: 522600, + label: '黔东南', + }, + { + value: 522700, + label: '黔南', + }, + ], + value: 520000, + label: '贵州省', + }, + { + children: [ + { + value: 530100, + label: '昆明', + }, + { + value: 530300, + label: '曲靖', + }, + { + value: 530400, + label: '玉溪', + }, + { + value: 530500, + label: '保山', + }, + { + value: 530600, + label: '昭通', + }, + { + value: 530700, + label: '丽江', + }, + { + value: 530800, + label: '普洱', + }, + { + value: 530900, + label: '临沧', + }, + { + value: 532300, + label: '楚雄彝族自治州', + }, + { + value: 532500, + label: '红河哈尼族彝族自治州', + }, + { + value: 532600, + label: '文山壮族苗族自治州', + }, + { + value: 532800, + label: '西双版纳傣族自治州', + }, + { + value: 532900, + label: '大理', + }, + { + value: 533100, + label: '德宏傣族景颇族自治州', + }, + { + value: 533300, + label: '怒江傈僳族自治州', + }, + { + value: 533400, + label: '迪庆藏族自治州', + }, + ], + value: 530000, + label: '云南省', + }, + { + children: [ + { + value: 540100, + label: '拉萨', + }, + { + value: 540200, + label: '日喀则', + }, + { + value: 540300, + label: '昌都', + }, + { + value: 540400, + label: '林芝', + }, + { + value: 540500, + label: '山南', + }, + { + value: 540600, + label: '那曲', + }, + { + value: 542500, + label: '阿里', + }, + ], + value: 540000, + label: '西藏自治区', + }, + { + children: [ + { + value: 610100, + label: '西安', + }, + { + value: 610200, + label: '铜川', + }, + { + value: 610300, + label: '宝鸡', + }, + { + value: 610400, + label: '咸阳', + }, + { + value: 610500, + label: '渭南', + }, + { + value: 610600, + label: '延安', + }, + { + value: 610700, + label: '汉中', + }, + { + value: 610800, + label: '榆林', + }, + { + value: 610900, + label: '安康', + }, + { + value: 611000, + label: '商洛', + }, + { + value: 1072448, + label: '杨凌', + }, + ], + value: 610000, + label: '陕西省', + }, + { + children: [ + { + value: 620100, + label: '兰州', + }, + { + value: 620200, + label: '嘉峪关', + }, + { + value: 620300, + label: '金昌', + }, + { + value: 620400, + label: '白银', + }, + { + value: 620500, + label: '天水', + }, + { + value: 620600, + label: '武威', + }, + { + value: 620700, + label: '张掖', + }, + { + value: 620800, + label: '平凉', + }, + { + value: 620900, + label: '酒泉', + }, + { + value: 621000, + label: '庆阳', + }, + { + value: 621100, + label: '定西', + }, + { + value: 621200, + label: '陇南', + }, + { + value: 622900, + label: '临夏回族自治州', + }, + { + value: 623000, + label: '甘南藏族自治州', + }, + ], + value: 620000, + label: '甘肃省', + }, + { + children: [ + { + value: 630100, + label: '西宁', + }, + { + value: 630200, + label: '海东', + }, + { + value: 632200, + label: '海北', + }, + { + value: 632300, + label: '黄南', + }, + { + value: 632500, + label: '海南', + }, + { + value: 632600, + label: '果洛', + }, + { + value: 632700, + label: '玉树', + }, + { + value: 632800, + label: '海西', + }, + ], + value: 630000, + label: '青海省', + }, + { + children: [ + { + value: 640100, + label: '银川', + }, + { + value: 640200, + label: '石嘴山', + }, + { + value: 640300, + label: '吴忠', + }, + { + value: 640400, + label: '固原', + }, + { + value: 640500, + label: '中卫', + }, + ], + value: 640000, + label: '宁夏回族自治区', + }, + { + children: [ + { + value: 650100, + label: '乌鲁木齐', + }, + { + value: 650200, + label: '克拉玛依', + }, + { + value: 650400, + label: '吐鲁番', + }, + { + value: 650500, + label: '哈密', + }, + { + value: 652300, + label: '昌吉', + }, + { + value: 652700, + label: '博尔塔拉', + }, + { + value: 652800, + label: '巴音郭楞', + }, + { + value: 652900, + label: '阿克苏', + }, + { + value: 653000, + label: '克孜勒苏柯尔克孜', + }, + { + value: 653100, + label: '喀什地区', + }, + { + value: 653200, + label: '和田', + }, + { + value: 654000, + label: '伊犁', + }, + { + value: 654200, + label: '塔城', + }, + { + value: 654300, + label: '阿勒泰', + }, + { + value: 1072450, + label: '阿拉尔', + }, + { + value: 1072454, + label: '铁门关', + }, + { + value: 1072455, + label: '五家渠', + }, + { + value: 1072459, + label: '石河子', + }, + ], + value: 650000, + label: '新疆维吾尔自治区', + }, + { + children: [ + { + value: 8345963, + label: '台北', + }, + { + value: 8345964, + label: '高雄', + }, + ], + value: 710000, + label: '台湾省', + }, + { + children: [ + { + value: 810001, + label: '中西区', + }, + { + value: 810002, + label: '湾仔区', + }, + { + value: 810003, + label: '东区', + }, + { + value: 810004, + label: '南区', + }, + { + value: 810005, + label: '油尖旺区', + }, + { + value: 810006, + label: '深水埗区', + }, + { + value: 810007, + label: '九龙城区', + }, + { + value: 810008, + label: '黄大仙区', + }, + { + value: 810009, + label: '观塘区', + }, + { + value: 810010, + label: '荃湾区', + }, + { + value: 810011, + label: '屯门区', + }, + { + value: 810012, + label: '元朗区', + }, + { + value: 810013, + label: '北区', + }, + { + value: 810014, + label: '大埔区', + }, + { + value: 810015, + label: '西贡区', + }, + { + value: 810016, + label: '沙田区', + }, + { + value: 810017, + label: '葵青区', + }, + { + value: 810018, + label: '离岛区', + }, + ], + value: 810000, + label: '香港特别行政区', + }, + { + children: [ + { + value: 820001, + label: '花地玛堂区', + }, + { + value: 820002, + label: '花王堂区', + }, + { + value: 820003, + label: '望德堂区', + }, + { + value: 820004, + label: '大堂区', + }, + { + value: 820005, + label: '风顺堂区', + }, + { + value: 820006, + label: '嘉模堂区', + }, + { + value: 820007, + label: '路凼填海区', + }, + { + value: 820008, + label: '圣方济各堂区', + }, + ], + value: 820000, + label: '澳门特别行政区', + }, + { + children: [], + value: 900000, + label: '外国', + }, +]; diff --git a/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/smart-area-option.ts b/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/smart-area-option.ts new file mode 100644 index 00000000..02e1ffa5 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/smart-area-cascader/smart-area-option.ts @@ -0,0 +1,14 @@ +/* + * @Description:地区类型 + * @Author: zhuoda + * @Date: 2021-08-18 + * @LastEditTime: 2021-08-18 + * @LastEditors: zhuoda + */ + +export interface SmartAreaOption { + value: number; + label: string; + disabled?: boolean; + children?: SmartAreaOption[]; +} diff --git a/admin-web/typescript-ant-design-vue/src/components/smart-boolean-select/index.vue b/admin-web/typescript-ant-design-vue/src/components/smart-boolean-select/index.vue new file mode 100644 index 00000000..39926aa0 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/smart-boolean-select/index.vue @@ -0,0 +1,73 @@ + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/smart-enum-select/index.vue b/admin-web/typescript-ant-design-vue/src/components/smart-enum-select/index.vue new file mode 100644 index 00000000..a9728d2c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/smart-enum-select/index.vue @@ -0,0 +1,71 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/components/smart-loading/index.ts b/admin-web/typescript-ant-design-vue/src/components/smart-loading/index.ts new file mode 100644 index 00000000..452d9871 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/smart-loading/index.ts @@ -0,0 +1,21 @@ +import {useSpinStore} from "/@/store/modules/system/spin"; + +interface ISmartLoading { + + show(): void; + + hide(): void; + +} + + +export const SmartLoading: ISmartLoading = { + + show: () => { + useSpinStore().show(); + }, + + hide: () => { + useSpinStore().hide(); + } +}; \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/src/components/smart-table-operator/index.vue b/admin-web/typescript-ant-design-vue/src/components/smart-table-operator/index.vue new file mode 100644 index 00000000..d94867ca --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/smart-table-operator/index.vue @@ -0,0 +1,60 @@ + + + \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/src/components/upload/index.vue b/admin-web/typescript-ant-design-vue/src/components/upload/index.vue new file mode 100644 index 00000000..43e8f6b3 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/components/upload/index.vue @@ -0,0 +1,160 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/config/app-config.ts b/admin-web/typescript-ant-design-vue/src/config/app-config.ts new file mode 100644 index 00000000..a9144055 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/config/app-config.ts @@ -0,0 +1,38 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-03 10:27:11 + * @LastEditTime: 2021-08-25 17:01:33 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/config/app-config.ts + */ +import { AppConfig } from '/@/types/config'; + +/** + * 应用默认配置 + */ + +export const appDefaultConfig: AppConfig = { + // i18n 语言选择 + languageType: 'zh_CN', + // 布局: side 或者 side-expand + layout: 'side-expand', + // 主题 + theme: 'dark', + // 手机模式最大宽度 768px,如果少于768px,则手机自适应 + mobileMaxWidth: 768, + // 侧边菜单宽度 , 默认为256px + sideMenuWidth: 256, + // 标签页 + multiPageTagFlag: true, + // 标签页缓存, keep-alive, true 开启缓存; false 不开启 + multiPageTagKeepAliveFlag: true, + // 固定头部状态栏,true:固定,false:不固定 + headerFixedFlag: true, + // 固定侧边栏,true:固定,false:不固定 + sideBarFixedFlag: true, + // 隐藏设置,true:隐藏,false:不隐藏 + hideSettingFlag: false, + // 首页页面Name + homePageName: 'Home', +}; diff --git a/admin-web/typescript-ant-design-vue/src/config/project-config.ts b/admin-web/typescript-ant-design-vue/src/config/project-config.ts new file mode 100644 index 00000000..641ab8b9 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/config/project-config.ts @@ -0,0 +1,27 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-03 10:27:11 + * @LastEditTime: 2021-09-01 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/config/project-config.ts + */ +import { ProjectConfig } from '/@/types/config'; +import moment from 'moment'; + +/** + * 项目默认配置 + */ + +export const projectDefaultConfig: ProjectConfig = { + // 项目名称 + projectName: 'SmartAdmin', + // 版权信息 + copyright: 'Copyright ©2015-' + moment().format('YYYY') + '版权所有: 1024创新实验室 ', + // 点击版权的跳转 + copyrightUrl: 'http://www.1024lab.net', + // 版本: 1.0.0 + version: '2.0.0-beta', + // build时间戳 + buildTime: moment().format('YYYY-MM-DD HH:mm:ss'), +}; diff --git a/admin-web/typescript-ant-design-vue/src/constants/business/category.ts b/admin-web/typescript-ant-design-vue/src/constants/business/category.ts new file mode 100644 index 00000000..829de63c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/constants/business/category.ts @@ -0,0 +1,22 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-12 16:46:21 + * @LastEditTime: 2021-09-01 21:58:45 + * @LastEditors: zhuoda + */ +// 分类类型 +export const CATEGORY_TYPE_ENUM = { + GOODS: { + value: 1, + desc: '商品', + }, + DEMO: { + value: 2, + desc: '演示分类', + }, +}; + +export default { + CATEGORY_TYPE_ENUM, +}; diff --git a/admin-web/typescript-ant-design-vue/src/constants/business/file.ts b/admin-web/typescript-ant-design-vue/src/constants/business/file.ts new file mode 100644 index 00000000..f986e223 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/constants/business/file.ts @@ -0,0 +1,30 @@ +/* + * @Description: + * @version: + * @Author: zhuoda + * @Date: 2021-08-18 14:31:29 + * @LastEditors: zhuoda + * @LastEditTime: 2021-08-18 14:33:30 + */ +// 文件上传类型 +export const FILE_FOLDER_TYPE_ENUM = { + COMMON: { + value: 1, + desc: '通用文件夹', + }, + PIC: { + value: 2, + desc: '轮播图', + }, + CONTRACT: { + value: 3, + desc: '合同', + }, + FOLLOW_UP: { + value: 4, + desc: '跟进', + }, +}; +export default { + FILE_FOLDER_TYPE_ENUM, +}; diff --git a/admin-web/typescript-ant-design-vue/src/constants/business/goods.ts b/admin-web/typescript-ant-design-vue/src/constants/business/goods.ts new file mode 100644 index 00000000..aed4d37a --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/constants/business/goods.ts @@ -0,0 +1,23 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-11 + * @LastEditTime: 2021-09-01 22:31:37 + * @LastEditors: zhuoda + */ +import { SmartEnum } from '/@/types/smart-enum'; + +// 商品分类 +export const GOODS_TYPE_ENUM: SmartEnum = { + BOOK: { + value: 1, + desc: '图书', + }, + COURSE: { + value: 2, + desc: '课程', + }, +}; +export default { + GOODS_TYPE_ENUM, +}; diff --git a/admin-web/typescript-ant-design-vue/src/constants/common.ts b/admin-web/typescript-ant-design-vue/src/constants/common.ts new file mode 100644 index 00000000..556cbefc --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/constants/common.ts @@ -0,0 +1,38 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-03 + * @LastEditTime: 2021-08-27 + * @LastEditors: zhuoda + */ +import { SmartEnum } from '/@/types/smart-enum'; + +export const PAGE_SIZE: number = 15; + +export const PAGE_SIZE_OPTIONS: string[] = ['10', '15', '25', '35', '45', '55', '100', '150', '200', '300', '500']; + +export const FLAG_NUMBER_ENUM: SmartEnum = { + TRUE: { + value: 1, + desc: '是', + }, + FALSE: { + value: 0, + desc: '否', + }, +}; + +export const GenderEnum: SmartEnum = { + UNKNOWN: { + value: 0, + desc: '未知', + }, + MAN: { + value: 1, + desc: '男', + }, + WOMAN: { + value: 2, + desc: '女', + }, +}; diff --git a/admin-web/typescript-ant-design-vue/src/constants/index.ts b/admin-web/typescript-ant-design-vue/src/constants/index.ts new file mode 100644 index 00000000..0a71ed3f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/constants/index.ts @@ -0,0 +1,22 @@ +/* + * @Description: + * @version: + * @Author: zhuoda + * @Date: 2021-08-11 18:14:13 + * @LastEditors: zhuoda + * @LastEditTime: 2021-09-01 20:55:07 + */ +import menu from './system/menu/menu-enum'; +import goods from './business/goods'; +import category from './business/category'; +import { FLAG_NUMBER_ENUM, GenderEnum } from './common'; +import file from './business/file'; + +export default { + FLAG_NUMBER_ENUM, + GenderEnum, + ...menu, + ...goods, + ...category, + ...file +}; diff --git a/admin-web/typescript-ant-design-vue/src/constants/regular.ts b/admin-web/typescript-ant-design-vue/src/constants/regular.ts new file mode 100644 index 00000000..f2d59181 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/constants/regular.ts @@ -0,0 +1,26 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-17 + * @LastEditTime: 2021-08-26 + * @LastEditors: zhuoda + */ +export const regular = { + phone: /^(13|14|15|16|17|18|19)\d{9}$/, + qq: /^[1-9]\d{3,}$/, + linkUrl: + /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/, + // eslint-disable-next-line no-useless-escape + isNumber: /(^[\-1-9][1-9]*(.[1-9]+)?)$/, // 判断是否为数字,除了0 外 + isLandlineOrPhone: /^((0\d{2,3}-\d{7,8})|(1[3584]\d{9}))$/, // 验证 座机 或者手机 + account: /^[a-z0-9]{3,16}$/, // 请输入3-16位(小写字母|数字)的账号 + mobileAccount: /^[a-z0-9]{6,16}$/, // 请输入6-16位(小写字母|数字)的账号(和移动端保持一致) + accountDesc: '请输入3-16位(小写字母|数字)的账号', + pwd: /^[A-Za-z0-9._]{6,16}$/, // 请输入6-16位(大小写字母|数字|小数点|下划线)的密码 + pwdDesc: '请输入6-16位(大小写字母|数字|小数点|下划线)的密码', + delBlankSpace: /\s+/g, // 删除空格 + isPdfReg: new RegExp(/\.(pdf|PDF)/), + isElseFileReg: new RegExp(/\.(doc|docx|xls|xlsx|txt|ppt|pptx|pps|ppxs)/), + isIdentityCard: /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X|x)$/, // 验证身份证号 + isChinese: /^[\u4e00-\u9fa5]+$/gi, // 验证是否汉字 +}; diff --git a/admin-web/typescript-ant-design-vue/src/constants/system/employee.ts b/admin-web/typescript-ant-design-vue/src/constants/system/employee.ts new file mode 100644 index 00000000..2a14e183 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/constants/system/employee.ts @@ -0,0 +1,28 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-16 15:12:42 + * @LastEditTime: 2021-08-27 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/constants/system/employee.ts + */ +import { SmartEnum } from '/@/types/smart-enum'; + +export const GENDER_ENUM: SmartEnum = { + UNKNOWN: { + value: 0, + desc: '未知', + }, + MAN: { + value: 1, + desc: '男', + }, + WOMAN: { + value: 2, + desc: '女', + }, +}; + +export default { + GENDER_ENUM, +}; diff --git a/admin-web/typescript-ant-design-vue/src/constants/system/local-storage-key.ts b/admin-web/typescript-ant-design-vue/src/constants/system/local-storage-key.ts new file mode 100644 index 00000000..c66921b4 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/constants/system/local-storage-key.ts @@ -0,0 +1,25 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-09 08:58:11 + * @LastEditTime: 2021-08-18 20:13:28 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/constants/system/local-storage-key.ts + */ +/** + * key前缀 + */ +const KEY_PREFIX:string = 'crm_'; +/** + * localStorageKey集合 + */ +export default { + // 用户信息 + USER_INFO: `${KEY_PREFIX}user_info`, + // 用户菜单路由 + USER_MENU: `${KEY_PREFIX}user_menu`, + // 用户权限点 + USER_POINTS:`${KEY_PREFIX}user_points`, + // 用户的tag列表 + USER_TAG_NAV:`${KEY_PREFIX}user_tag_nav`, +} diff --git a/admin-web/typescript-ant-design-vue/src/constants/system/menu/menu-enum.ts b/admin-web/typescript-ant-design-vue/src/constants/system/menu/menu-enum.ts new file mode 100644 index 00000000..f84a981f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/constants/system/menu/menu-enum.ts @@ -0,0 +1,25 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-03 + * @LastEditTime: 2021-08-28 15:09:06 + * @LastEditors: zhuoda + */ +export const MENU_TYPE_ENUM = { + CATALOG: { + value: 1, + desc: '目录', + }, + MENU: { + value: 2, + desc: '菜单', + }, + POINTS: { + value: 3, + desc: '功能点', + }, +}; + +export default { + MENU_TYPE_ENUM, +}; diff --git a/admin-web/typescript-ant-design-vue/src/i18n/index.ts b/admin-web/typescript-ant-design-vue/src/i18n/index.ts new file mode 100644 index 00000000..88d0e15c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/index.ts @@ -0,0 +1,19 @@ +import {LanguageType} from "/@/types/config"; + +// i18n 选项 +interface I18nSelectOption { + text: String, + value: LanguageType +} + +// 语言选择数组 +export const i18nList: I18nSelectOption[] = [ + { + text: '简体中文', + value: 'zh_CN', + }, + { + text: 'English', + value: 'en', + }, +] \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/account.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/account.js new file mode 100644 index 00000000..65a4774b --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/account.js @@ -0,0 +1,5 @@ +import settings from './account/settings' + +export default { + ...settings + } diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/account/settings.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/account/settings.js new file mode 100644 index 00000000..74ec4302 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/account/settings.js @@ -0,0 +1,62 @@ +export default { + 'account.settings.menuMap.basic': 'Basic Settings', + 'account.settings.menuMap.security': 'Security Settings', + 'account.settings.menuMap.custom': 'Custom Settings', + 'account.settings.menuMap.binding': 'Account Binding', + 'account.settings.menuMap.notification': 'New Message Notification', + 'account.settings.basic.avatar': 'Avatar', + 'account.settings.basic.change-avatar': 'Change avatar', + 'account.settings.basic.email': 'Email', + 'account.settings.basic.email-message': 'Please input your email!', + 'account.settings.basic.nickname': 'Nickname', + 'account.settings.basic.nickname-message': 'Please input your Nickname!', + 'account.settings.basic.profile': 'Personal profile', + 'account.settings.basic.profile-message': 'Please input your personal profile!', + 'account.settings.basic.profile-placeholder': 'Brief introduction to yourself', + 'account.settings.basic.country': 'Country/Region', + 'account.settings.basic.country-message': 'Please input your country!', + 'account.settings.basic.geographic': 'Province or city', + 'account.settings.basic.geographic-message': 'Please input your geographic info!', + 'account.settings.basic.address': 'Street Address', + 'account.settings.basic.address-message': 'Please input your address!', + 'account.settings.basic.phone': 'Phone Number', + 'account.settings.basic.phone-message': 'Please input your phone!', + 'account.settings.basic.update': 'Update Information', + 'account.settings.basic.update.success': 'Update basic information successfully', + 'account.settings.security.strong': 'Strong', + 'account.settings.security.medium': 'Medium', + 'account.settings.security.weak': 'Weak', + 'account.settings.security.password': 'Account Password', + 'account.settings.security.password-description': 'Current password strength:', + 'account.settings.security.phone': 'Security Phone', + 'account.settings.security.phone-description': 'Bound phone:', + 'account.settings.security.question': 'Security Question', + 'account.settings.security.question-description': + 'The security question is not set, and the security policy can effectively protect the account security', + 'account.settings.security.email': 'Backup Email', + 'account.settings.security.email-description': 'Bound Email:', + 'account.settings.security.mfa': 'MFA Device', + 'account.settings.security.mfa-description': + 'Unbound MFA device, after binding, can be confirmed twice', + 'account.settings.security.modify': 'Modify', + 'account.settings.security.set': 'Set', + 'account.settings.security.bind': 'Bind', + 'account.settings.binding.taobao': 'Binding Taobao', + 'account.settings.binding.taobao-description': 'Currently unbound Taobao account', + 'account.settings.binding.alipay': 'Binding Alipay', + 'account.settings.binding.alipay-description': 'Currently unbound Alipay account', + 'account.settings.binding.dingding': 'Binding DingTalk', + 'account.settings.binding.dingding-description': 'Currently unbound DingTalk account', + 'account.settings.binding.bind': 'Bind', + 'account.settings.notification.password': 'Account Password', + 'account.settings.notification.password-description': + 'Messages from other users will be notified in the form of a station letter', + 'account.settings.notification.messages': 'System Messages', + 'account.settings.notification.messages-description': + 'System messages will be notified in the form of a station letter', + 'account.settings.notification.todo': 'To-do Notification', + 'account.settings.notification.todo-description': + 'The to-do list will be notified in the form of a letter from the station', + 'account.settings.settings.open': 'Open', + 'account.settings.settings.close': 'Close' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/dashboard.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/dashboard.js new file mode 100644 index 00000000..9d408927 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/dashboard.js @@ -0,0 +1,5 @@ +import analysis from './dashboard/analysis' + +export default { + ...analysis + } diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/dashboard/analysis.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/dashboard/analysis.js new file mode 100644 index 00000000..6738d12b --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/dashboard/analysis.js @@ -0,0 +1,36 @@ +export default { + 'dashboard.analysis.test': 'Gongzhuan No.{no} shop', + 'dashboard.analysis.introduce': 'Introduce', + 'dashboard.analysis.total-sales': 'Total Sales', + 'dashboard.analysis.day-sales': 'Daily Sales', + 'dashboard.analysis.visits': 'Visits', + 'dashboard.analysis.visits-trend': 'Visits Trend', + 'dashboard.analysis.visits-ranking': 'Visits Ranking', + 'dashboard.analysis.day-visits': 'Daily Visits', + 'dashboard.analysis.week': 'WoW Change', + 'dashboard.analysis.day': 'DoD Change', + 'dashboard.analysis.payments': 'Payments', + 'dashboard.analysis.conversion-rate': 'Conversion Rate', + 'dashboard.analysis.operational-effect': 'Operational Effect', + 'dashboard.analysis.sales-trend': 'Stores Sales Trend', + 'dashboard.analysis.sales-ranking': 'Sales Ranking', + 'dashboard.analysis.all-year': 'All Year', + 'dashboard.analysis.all-month': 'All Month', + 'dashboard.analysis.all-week': 'All Week', + 'dashboard.analysis.all-day': 'All day', + 'dashboard.analysis.search-users': 'Search Users', + 'dashboard.analysis.per-capita-search': 'Per Capita Search', + 'dashboard.analysis.online-top-search': 'Online Top Search', + 'dashboard.analysis.the-proportion-of-sales': 'The Proportion Of Sales', + 'dashboard.analysis.dropdown-option-one': 'Operation one', + 'dashboard.analysis.dropdown-option-two': 'Operation two', + 'dashboard.analysis.channel.all': 'ALL', + 'dashboard.analysis.channel.online': 'Online', + 'dashboard.analysis.channel.stores': 'Stores', + 'dashboard.analysis.sales': 'Sales', + 'dashboard.analysis.traffic': 'Traffic', + 'dashboard.analysis.table.rank': 'Rank', + 'dashboard.analysis.table.search-keyword': 'Keyword', + 'dashboard.analysis.table.users': 'Users', + 'dashboard.analysis.table.weekly-range': 'Weekly Range' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/form.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/form.js new file mode 100644 index 00000000..d004e527 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/form.js @@ -0,0 +1,5 @@ +import basicForm from './form/basicForm' + +export default { + ...basicForm + } diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/form/basicForm.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/form/basicForm.js new file mode 100644 index 00000000..3ef4bc0b --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/form/basicForm.js @@ -0,0 +1,61 @@ +export default { + 'form.basic-form.basic.title': 'Basic form', + 'form.basic-form.basic.description': + 'Form pages are used to collect or verify information to users, and basic forms are common in scenarios where there are fewer data items.', + 'form.basic-form.title.label': 'Title', + 'form.basic-form.title.placeholder': 'Give the target a name', + 'form.basic-form.title.required': 'Please enter a title', + 'form.basic-form.date.label': 'Start and end date', + 'form.basic-form.placeholder.start': 'Start date', + 'form.basic-form.placeholder.end': 'End date', + 'form.basic-form.date.required': 'Please select the start and end date', + 'form.basic-form.goal.label': 'Goal description', + 'form.basic-form.goal.placeholder': 'Please enter your work goals', + 'form.basic-form.goal.required': 'Please enter a description of the goal', + 'form.basic-form.standard.label': 'Metrics', + 'form.basic-form.standard.placeholder': 'Please enter a metric', + 'form.basic-form.standard.required': 'Please enter a metric', + 'form.basic-form.client.label': 'Client', + 'form.basic-form.label.tooltip': 'Target service object', + 'form.basic-form.client.placeholder': + 'Please describe your customer service, internal customers directly @ Name / job number', + 'form.basic-form.client.required': 'Please describe the customers you serve', + 'form.basic-form.invites.label': 'Inviting critics', + 'form.basic-form.invites.placeholder': + 'Please direct @ Name / job number, you can invite up to 5 people', + 'form.basic-form.weight.label': 'Weight', + 'form.basic-form.weight.placeholder': 'Please enter weight', + 'form.basic-form.public.label': 'Target disclosure', + 'form.basic-form.label.help': 'Customers and invitees are shared by default', + 'form.basic-form.radio.public': 'Public', + 'form.basic-form.radio.partially-public': 'Partially public', + 'form.basic-form.radio.private': 'Private', + 'form.basic-form.publicUsers.placeholder': 'Open to', + 'form.basic-form.option.A': 'Colleague A', + 'form.basic-form.option.B': 'Colleague B', + 'form.basic-form.option.C': 'Colleague C', + 'form.basic-form.email.required': 'Please enter your email!', + 'form.basic-form.email.wrong-format': 'The email address is in the wrong format!', + 'form.basic-form.userName.required': 'Please enter your userName!', + 'form.basic-form.password.required': 'Please enter your password!', + 'form.basic-form.password.twice': 'The passwords entered twice do not match!', + 'form.basic-form.strength.msg': + "Please enter at least 6 characters and don't use passwords that are easy to guess.", + 'form.basic-form.strength.strong': 'Strength: strong', + 'form.basic-form.strength.medium': 'Strength: medium', + 'form.basic-form.strength.short': 'Strength: too short', + 'form.basic-form.confirm-password.required': 'Please confirm your password!', + 'form.basic-form.phone-number.required': 'Please enter your phone number!', + 'form.basic-form.phone-number.wrong-format': 'Malformed phone number!', + 'form.basic-form.verification-code.required': 'Please enter the verification code!', + 'form.basic-form.form.get-captcha': 'Get Captcha', + 'form.basic-form.captcha.second': 'sec', + 'form.basic-form.form.optional': ' (optional) ', + 'form.basic-form.form.submit': 'Submit', + 'form.basic-form.form.save': 'Save', + 'form.basic-form.email.placeholder': 'Email', + 'form.basic-form.password.placeholder': 'Password', + 'form.basic-form.confirm-password.placeholder': 'Confirm password', + 'form.basic-form.phone-number.placeholder': 'Phone number', + 'form.basic-form.verification-code.placeholder': 'Verification code' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/global.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/global.js new file mode 100644 index 00000000..1b0a940e --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/global.js @@ -0,0 +1,6 @@ +export default { + submit: 'Submit', + save: 'Save', + 'submit.ok': 'Submit successfully', + 'save.ok': 'Saved successfully' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/index.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/index.js new file mode 100644 index 00000000..120b786e --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/index.js @@ -0,0 +1,35 @@ +import antdEnUS from 'ant-design-vue/es/locale-provider/en_US' +import momentEU from 'moment/locale/eu' +import global from './global' + +import menu from './menu' +import setting from './setting' +import user from './user' + +import dashboard from './dashboard' +import form from './form' +import result from './result' +import account from './account' + +const components = { + antLocale: antdEnUS, + momentName: 'eu', + momentLocale: momentEU +} + +export default { + message: '-', + + 'layouts.usermenu.dialog.title': 'Message', + 'layouts.usermenu.dialog.content': 'Are you sure you would like to logout?', + 'layouts.userLayout.title': 'Ant Design is the most influential web design specification in Xihu district', + ...components, + ...global, + ...menu, + ...setting, + ...user, + ...dashboard, + ...form, + ...result, + ...account +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/menu.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/menu.js new file mode 100644 index 00000000..b3d73eae --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/menu.js @@ -0,0 +1,39 @@ +export default { + 'menu.welcome': 'Welcome', + 'menu.home': 'Home', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': 'Analysis', + 'menu.dashboard.monitor': 'Monitor', + 'menu.dashboard.workplace': 'Workplace', + 'menu.form': 'Form', + 'menu.form.basic-form': 'Basic Form', + 'menu.form.step-form': 'Step Form', + 'menu.form.step-form.info': 'Step Form(write transfer information)', + 'menu.form.step-form.confirm': 'Step Form(confirm transfer information)', + 'menu.form.step-form.result': 'Step Form(finished)', + 'menu.form.advanced-form': 'Advanced Form', + 'menu.list': 'List', + 'menu.list.table-list': 'Search Table', + 'menu.list.basic-list': 'Basic List', + 'menu.list.card-list': 'Card List', + 'menu.list.search-list': 'Search List', + 'menu.list.search-list.articles': 'Search List(articles)', + 'menu.list.search-list.projects': 'Search List(projects)', + 'menu.list.search-list.applications': 'Search List(applications)', + 'menu.profile': 'Profile', + 'menu.profile.basic': 'Basic Profile', + 'menu.profile.advanced': 'Advanced Profile', + 'menu.result': 'Result', + 'menu.result.success': 'Success', + 'menu.result.fail': 'Fail', + 'menu.exception': 'Exception', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'Trigger', + 'menu.account': 'Account', + 'menu.account.center': 'Account Center', + 'menu.account.settings': 'Account Settings', + 'menu.account.trigger': 'Trigger Error', + 'menu.account.logout': 'Logout' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result.js new file mode 100644 index 00000000..75d3a4d6 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result.js @@ -0,0 +1,7 @@ +import success from './result/success' +import fail from './result/fail' + +export default { + ...success, + ...fail + } diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result/fail.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result/fail.js new file mode 100644 index 00000000..168909c3 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result/fail.js @@ -0,0 +1,11 @@ +export default { + 'result.fail.error.title': 'Submission Failed', + 'result.fail.error.description': + 'Please check and modify the following information before resubmitting.', + 'result.fail.error.hint-title': 'The content you submitted has the following error:', + 'result.fail.error.hint-text1': 'Your account has been frozen', + 'result.fail.error.hint-btn1': 'Thaw immediately', + 'result.fail.error.hint-text2': 'Your account is not yet eligible to apply', + 'result.fail.error.hint-btn2': 'Upgrade immediately', + 'result.fail.error.btn-text': 'Return to modify' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result/success.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result/success.js new file mode 100644 index 00000000..fad6c1d2 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/result/success.js @@ -0,0 +1,19 @@ +export default { + 'result.success.title': 'Submission Success', + 'result.success.description': + 'The submission results page is used to feed back the results of a series of operational tasks. If it is a simple operation, use the Message global prompt feedback. This text area can show a simple supplementary explanation. If there is a similar requirement for displaying “documents”, the following gray area can present more complicated content.', + 'result.success.operate-title': 'Project Name', + 'result.success.operate-id': 'Project ID', + 'result.success.principal': 'Principal', + 'result.success.operate-time': 'Effective time', + 'result.success.step1-title': 'Create project', + 'result.success.step1-operator': 'Qu Lili', + 'result.success.step2-title': 'Departmental preliminary review', + 'result.success.step2-operator': 'Zhou Maomao', + 'result.success.step2-extra': 'Urge', + 'result.success.step3-title': 'Financial review', + 'result.success.step4-title': 'Finish', + 'result.success.btn-return': 'Back List', + 'result.success.btn-project': 'View Project', + 'result.success.btn-print': 'Print' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/setting.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/setting.js new file mode 100644 index 00000000..f42ce9fe --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/setting.js @@ -0,0 +1,29 @@ +export default { + 'app.setting.pagestyle': 'Page style setting', + 'app.setting.pagestyle.light': 'Light style', + 'app.setting.pagestyle.dark': 'Dark style', + 'app.setting.pagestyle.realdark': 'RealDark style', + 'app.setting.themecolor': 'Theme Color', + 'app.setting.navigationmode': 'Navigation Mode', + 'app.setting.content-width': 'Content Width', + 'app.setting.fixedheader': 'Fixed Header', + 'app.setting.fixedsidebar': 'Fixed Sidebar', + 'app.setting.sidemenu': 'Side Menu Layout', + 'app.setting.topmenu': 'Top Menu Layout', + 'app.setting.content-width.fixed': 'Fixed', + 'app.setting.content-width.fluid': 'Fluid', + 'app.setting.othersettings': 'Other Settings', + 'app.setting.weakmode': 'Weak Mode', + 'app.setting.copy': 'Copy Setting', + 'app.setting.loading': 'Loading theme', + 'app.setting.copyinfo': 'copy success,please replace defaultSettings in src/config/defaultSettings.js', + 'app.setting.production.hint': 'Setting panel shows in development environment only, please manually modify', + 'app.setting.themecolor.daybreak': 'Daybreak Blue', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.geekblue': 'Geek Blue', + 'app.setting.themecolor.purple': 'Golden Purple' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/user.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/user.js new file mode 100644 index 00000000..561210ce --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/en-US/user.js @@ -0,0 +1,45 @@ +export default { + 'user.login.userName': 'userName', + 'user.login.password': 'password', + 'user.login.username.placeholder': 'Account: admin', + 'user.login.password.placeholder': 'password: admin or ant.design', + 'user.login.message-invalid-credentials': + 'Invalid username or password(admin/ant.design)', + 'user.login.message-invalid-verification-code': 'Invalid verification code', + 'user.login.tab-login-credentials': 'Credentials', + 'user.login.tab-login-mobile': 'Mobile number', + 'user.login.mobile.placeholder': 'Mobile number', + 'user.login.mobile.verification-code.placeholder': 'Verification code', + 'user.login.remember-me': 'Remember me', + 'user.login.forgot-password': 'Forgot your password?', + 'user.login.sign-in-with': 'Sign in with', + 'user.login.signup': 'Sign up', + 'user.login.login': 'Login', + 'user.register.register': 'Register', + 'user.register.email.placeholder': 'Email', + 'user.register.password.placeholder': 'Password ', + 'user.register.password.popover-message': 'Please enter at least 6 characters. Please do not use passwords that are easy to guess. ', + 'user.register.confirm-password.placeholder': 'Confirm password', + 'user.register.get-verification-code': 'Get code', + 'user.register.sign-in': 'Already have an account?', + 'user.register-result.msg': 'Account:registered at {email}', + 'user.register-result.activation-email': + 'The activation email has been sent to your email address and is valid for 24 hours. Please log in to the email in time and click on the link in the email to activate the account.', + 'user.register-result.back-home': 'Back to home', + 'user.register-result.view-mailbox': 'View mailbox', + 'user.email.required': 'Please enter your email!', + 'user.email.wrong-format': 'The email address is in the wrong format!', + 'user.userName.required': 'Please enter account name or email address', + 'user.password.required': 'Please enter your password!', + 'user.password.twice.msg': 'The passwords entered twice do not match!', + 'user.password.strength.msg': + 'The password is not strong enough', + 'user.password.strength.strong': 'Strength: strong', + 'user.password.strength.medium': 'Strength: medium', + 'user.password.strength.low': 'Strength: low', + 'user.password.strength.short': 'Strength: too short', + 'user.confirm-password.required': 'Please confirm your password!', + 'user.phone-number.required': 'Please enter your phone number!', + 'user.phone-number.wrong-format': 'Please enter a valid phone number', + 'user.verification-code.required': 'Please enter the verification code!' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/account.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/account.js new file mode 100644 index 00000000..65a4774b --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/account.js @@ -0,0 +1,5 @@ +import settings from './account/settings' + +export default { + ...settings + } diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/account/settings.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/account/settings.js new file mode 100644 index 00000000..c6c2eac1 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/account/settings.js @@ -0,0 +1,57 @@ +export default { + 'account.settings.menuMap.basic': '基本设置', + 'account.settings.menuMap.security': '安全设置', + 'account.settings.menuMap.custom': '个性化', + 'account.settings.menuMap.binding': '账号绑定', + 'account.settings.menuMap.notification': '新消息通知', + 'account.settings.basic.avatar': '头像', + 'account.settings.basic.change-avatar': '更换头像', + 'account.settings.basic.email': '邮箱', + 'account.settings.basic.email-message': '请输入您的邮箱!', + 'account.settings.basic.nickname': '昵称', + 'account.settings.basic.nickname-message': '请输入您的昵称!', + 'account.settings.basic.profile': '个人简介', + 'account.settings.basic.profile-message': '请输入个人简介!', + 'account.settings.basic.profile-placeholder': '个人简介', + 'account.settings.basic.country': '国家/地区', + 'account.settings.basic.country-message': '请输入您的国家或地区!', + 'account.settings.basic.geographic': '所在省市', + 'account.settings.basic.geographic-message': '请输入您的所在省市!', + 'account.settings.basic.address': '街道地址', + 'account.settings.basic.address-message': '请输入您的街道地址!', + 'account.settings.basic.phone': '联系电话', + 'account.settings.basic.phone-message': '请输入您的联系电话!', + 'account.settings.basic.update': '更新基本信息', + 'account.settings.basic.update.success': '更新基本信息成功', + 'account.settings.security.strong': '强', + 'account.settings.security.medium': '中', + 'account.settings.security.weak': '弱', + 'account.settings.security.password': '账户密码', + 'account.settings.security.password-description': '当前密码强度:', + 'account.settings.security.phone': '密保手机', + 'account.settings.security.phone-description': '已绑定手机:', + 'account.settings.security.question': '密保问题', + 'account.settings.security.question-description': '未设置密保问题,密保问题可有效保护账户安全', + 'account.settings.security.email': '备用邮箱', + 'account.settings.security.email-description': '已绑定邮箱:', + 'account.settings.security.mfa': 'MFA 设备', + 'account.settings.security.mfa-description': '未绑定 MFA 设备,绑定后,可以进行二次确认', + 'account.settings.security.modify': '修改', + 'account.settings.security.set': '设置', + 'account.settings.security.bind': '绑定', + 'account.settings.binding.taobao': '绑定淘宝', + 'account.settings.binding.taobao-description': '当前未绑定淘宝账号', + 'account.settings.binding.alipay': '绑定支付宝', + 'account.settings.binding.alipay-description': '当前未绑定支付宝账号', + 'account.settings.binding.dingding': '绑定钉钉', + 'account.settings.binding.dingding-description': '当前未绑定钉钉账号', + 'account.settings.binding.bind': '绑定', + 'account.settings.notification.password': '账户密码', + 'account.settings.notification.password-description': '其他用户的消息将以站内信的形式通知', + 'account.settings.notification.messages': '系统消息', + 'account.settings.notification.messages-description': '系统消息将以站内信的形式通知', + 'account.settings.notification.todo': '待办任务', + 'account.settings.notification.todo-description': '待办任务将以站内信的形式通知', + 'account.settings.settings.open': '开', + 'account.settings.settings.close': '关' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/dashboard.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/dashboard.js new file mode 100644 index 00000000..9d408927 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/dashboard.js @@ -0,0 +1,5 @@ +import analysis from './dashboard/analysis' + +export default { + ...analysis + } diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/dashboard/analysis.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/dashboard/analysis.js new file mode 100644 index 00000000..b34f6a6d --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/dashboard/analysis.js @@ -0,0 +1,36 @@ +export default { + 'dashboard.analysis.test': '工专路 {no} 号店', + 'dashboard.analysis.introduce': '指标说明', + 'dashboard.analysis.total-sales': '总销售额', + 'dashboard.analysis.day-sales': '日均销售额¥', + 'dashboard.analysis.visits': '访问量', + 'dashboard.analysis.visits-trend': '访问量趋势', + 'dashboard.analysis.visits-ranking': '门店访问量排名', + 'dashboard.analysis.day-visits': '日访问量', + 'dashboard.analysis.week': '周同比', + 'dashboard.analysis.day': '日同比', + 'dashboard.analysis.payments': '支付笔数', + 'dashboard.analysis.conversion-rate': '转化率', + 'dashboard.analysis.operational-effect': '运营活动效果', + 'dashboard.analysis.sales-trend': '销售趋势', + 'dashboard.analysis.sales-ranking': '门店销售额排名', + 'dashboard.analysis.all-year': '全年', + 'dashboard.analysis.all-month': '本月', + 'dashboard.analysis.all-week': '本周', + 'dashboard.analysis.all-day': '今日', + 'dashboard.analysis.search-users': '搜索用户数', + 'dashboard.analysis.per-capita-search': '人均搜索次数', + 'dashboard.analysis.online-top-search': '线上热门搜索', + 'dashboard.analysis.the-proportion-of-sales': '销售额类别占比', + 'dashboard.analysis.dropdown-option-one': '操作一', + 'dashboard.analysis.dropdown-option-two': '操作二', + 'dashboard.analysis.channel.all': '全部渠道', + 'dashboard.analysis.channel.online': '线上', + 'dashboard.analysis.channel.stores': '门店', + 'dashboard.analysis.sales': '销售额', + 'dashboard.analysis.traffic': '客流量', + 'dashboard.analysis.table.rank': '排名', + 'dashboard.analysis.table.search-keyword': '搜索关键词', + 'dashboard.analysis.table.users': '用户数', + 'dashboard.analysis.table.weekly-range': '周涨幅' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/form.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/form.js new file mode 100644 index 00000000..d004e527 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/form.js @@ -0,0 +1,5 @@ +import basicForm from './form/basicForm' + +export default { + ...basicForm + } diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/form/basicForm.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/form/basicForm.js new file mode 100644 index 00000000..7941075e --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/form/basicForm.js @@ -0,0 +1,58 @@ +export default { + 'form.basic-form.basic.title': '基础表单', + 'form.basic-form.basic.description': + '表单页用于向用户收集或验证信息,基础表单常见于数据项较少的表单场景。', + 'form.basic-form.title.label': '标题', + 'form.basic-form.title.placeholder': '给目标起个名字', + 'form.basic-form.title.required': '请输入标题', + 'form.basic-form.date.label': '起止日期', + 'form.basic-form.placeholder.start': '开始日期', + 'form.basic-form.placeholder.end': '结束日期', + 'form.basic-form.date.required': '请选择起止日期', + 'form.basic-form.goal.label': '目标描述', + 'form.basic-form.goal.placeholder': '请输入你的阶段性工作目标', + 'form.basic-form.goal.required': '请输入目标描述', + 'form.basic-form.standard.label': '衡量标准', + 'form.basic-form.standard.placeholder': '请输入衡量标准', + 'form.basic-form.standard.required': '请输入衡量标准', + 'form.basic-form.client.label': '客户', + 'form.basic-form.client.required': '请描述你服务的客户', + 'form.basic-form.label.tooltip': '目标的服务对象', + 'form.basic-form.client.placeholder': '请描述你服务的客户,内部客户直接 @姓名/工号', + 'form.basic-form.invites.label': '邀评人', + 'form.basic-form.invites.placeholder': '请直接 @姓名/工号,最多可邀请 5 人', + 'form.basic-form.weight.label': '权重', + 'form.basic-form.weight.placeholder': '请输入', + 'form.basic-form.public.label': '目标公开', + 'form.basic-form.label.help': '客户、邀评人默认被分享', + 'form.basic-form.radio.public': '公开', + 'form.basic-form.radio.partially-public': '部分公开', + 'form.basic-form.radio.private': '不公开', + 'form.basic-form.publicUsers.placeholder': '公开给', + 'form.basic-form.option.A': '同事一', + 'form.basic-form.option.B': '同事二', + 'form.basic-form.option.C': '同事三', + 'form.basic-form.email.required': '请输入邮箱地址!', + 'form.basic-form.email.wrong-format': '邮箱地址格式错误!', + 'form.basic-form.userName.required': '请输入用户名!', + 'form.basic-form.password.required': '请输入密码!', + 'form.basic-form.password.twice': '两次输入的密码不匹配!', + 'form.basic-form.strength.msg': '请至少输入 6 个字符。请不要使用容易被猜到的密码。', + 'form.basic-form.strength.strong': '强度:强', + 'form.basic-form.strength.medium': '强度:中', + 'form.basic-form.strength.short': '强度:太短', + 'form.basic-form.confirm-password.required': '请确认密码!', + 'form.basic-form.phone-number.required': '请输入手机号!', + 'form.basic-form.phone-number.wrong-format': '手机号格式错误!', + 'form.basic-form.verification-code.required': '请输入验证码!', + 'form.basic-form.form.get-captcha': '获取验证码', + 'form.basic-form.captcha.second': '秒', + 'form.basic-form.form.optional': '(选填)', + 'form.basic-form.form.submit': '提交', + 'form.basic-form.form.save': '保存', + 'form.basic-form.email.placeholder': '邮箱', + 'form.basic-form.password.placeholder': '至少6位密码,区分大小写', + 'form.basic-form.confirm-password.placeholder': '确认密码', + 'form.basic-form.phone-number.placeholder': '手机号', + 'form.basic-form.verification-code.placeholder': '验证码' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/global.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/global.js new file mode 100644 index 00000000..d4a32d6c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/global.js @@ -0,0 +1,6 @@ +export default { + submit: '提交', + save: '保存', + 'submit.ok': '提交成功', + 'save.ok': '保存成功' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/index.ts b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/index.ts new file mode 100644 index 00000000..6997b1a2 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/index.ts @@ -0,0 +1,34 @@ +import antd from 'ant-design-vue/es/locale-provider/zh_CN' +import momentCN from 'moment/locale/zh-cn' +import global from './zh-CN/global' + +import menu from './zh-CN/menu' +import setting from './zh-CN/setting' +import user from './zh-CN/user' +import dashboard from './zh-CN/dashboard' +import form from './zh-CN/form' +import result from './zh-CN/result' +import account from './zh-CN/account' + +const components = { + antLocale: antd, + momentName: 'zh-cn', + momentLocale: momentCN +} + +export default { + message: '-', + + 'layouts.usermenu.dialog.title': '信息', + 'layouts.usermenu.dialog.content': '您确定要注销吗?', + 'layouts.userLayout.title': 'Ant Design 是西湖区最具影响力的 Web 设计规范', + ...components, + ...global, + ...menu, + ...setting, + ...user, + ...dashboard, + ...form, + ...result, + ...account +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/menu.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/menu.js new file mode 100644 index 00000000..8900c44c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/menu.js @@ -0,0 +1,39 @@ +export default { + 'menu.welcome': '欢迎', + 'menu.home': '主页', + 'menu.dashboard': '仪表盘', + 'menu.dashboard.analysis': '分析页', + 'menu.dashboard.monitor': '监控页', + 'menu.dashboard.workplace': '工作台', + 'menu.form': '表单页', + 'menu.form.basic-form': '基础表单', + 'menu.form.step-form': '分步表单', + 'menu.form.step-form.info': '分步表单(填写转账信息)', + 'menu.form.step-form.confirm': '分步表单(确认转账信息)', + 'menu.form.step-form.result': '分步表单(完成)', + 'menu.form.advanced-form': '高级表单', + 'menu.list': '列表页', + 'menu.list.table-list': '查询表格', + 'menu.list.basic-list': '标准列表', + 'menu.list.card-list': '卡片列表', + 'menu.list.search-list': '搜索列表', + 'menu.list.search-list.articles': '搜索列表(文章)', + 'menu.list.search-list.projects': '搜索列表(项目)', + 'menu.list.search-list.applications': '搜索列表(应用)', + 'menu.profile': '详情页', + 'menu.profile.basic': '基础详情页', + 'menu.profile.advanced': '高级详情页', + 'menu.result': '结果页', + 'menu.result.success': '成功页', + 'menu.result.fail': '失败页', + 'menu.exception': '异常页', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': '触发错误', + 'menu.account': '个人页', + 'menu.account.center': '个人中心', + 'menu.account.settings': '个人设置', + 'menu.account.trigger': '触发报错', + 'menu.account.logout': '退出登录' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result.js new file mode 100644 index 00000000..75d3a4d6 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result.js @@ -0,0 +1,7 @@ +import success from './result/success' +import fail from './result/fail' + +export default { + ...success, + ...fail + } diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result/fail.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result/fail.js new file mode 100644 index 00000000..a9279e10 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result/fail.js @@ -0,0 +1,10 @@ +export default { + 'result.fail.error.title': '提交失败', + 'result.fail.error.description': '请核对并修改以下信息后,再重新提交。', + 'result.fail.error.hint-title': '您提交的内容有如下错误:', + 'result.fail.error.hint-text1': '您的账户已被冻结', + 'result.fail.error.hint-btn1': '立即解冻', + 'result.fail.error.hint-text2': '您的账户还不具备申请资格', + 'result.fail.error.hint-btn2': '立即升级', + 'result.fail.error.btn-text': '返回修改' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result/success.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result/success.js new file mode 100644 index 00000000..bd18f9fb --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/result/success.js @@ -0,0 +1,19 @@ +export default { + 'result.success.title': '提交成功', + 'result.success.description': + '提交结果页用于反馈一系列操作任务的处理结果, 如果仅是简单操作,使用 Message 全局提示反馈即可。 本文字区域可以展示简单的补充说明,如果有类似展示 “单据”的需求,下面这个灰色区域可以呈现比较复杂的内容。', + 'result.success.operate-title': '项目名称', + 'result.success.operate-id': '项目 ID', + 'result.success.principal': '负责人', + 'result.success.operate-time': '生效时间', + 'result.success.step1-title': '创建项目', + 'result.success.step1-operator': '曲丽丽', + 'result.success.step2-title': '部门初审', + 'result.success.step2-operator': '周毛毛', + 'result.success.step2-extra': '催一下', + 'result.success.step3-title': '财务复核', + 'result.success.step4-title': '完成', + 'result.success.btn-return': '返回列表', + 'result.success.btn-project': '查看项目', + 'result.success.btn-print': '打印' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/setting.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/setting.js new file mode 100644 index 00000000..0166d0b2 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/setting.js @@ -0,0 +1,29 @@ +export default { + 'app.setting.pagestyle': '整体风格设置', + 'app.setting.pagestyle.light': '亮色菜单风格', + 'app.setting.pagestyle.dark': '暗色菜单风格', + 'app.setting.pagestyle.realdark': '暗黑模式', + 'app.setting.themecolor': '主题色', + 'app.setting.navigationmode': '导航模式', + 'app.setting.content-width': '内容区域宽度', + 'app.setting.fixedheader': '固定 Header', + 'app.setting.fixedsidebar': '固定侧边栏', + 'app.setting.sidemenu': '侧边菜单布局', + 'app.setting.topmenu': '顶部菜单布局', + 'app.setting.content-width.fixed': 'Fixed', + 'app.setting.content-width.fluid': 'Fluid', + 'app.setting.othersettings': '其他设置', + 'app.setting.weakmode': '色弱模式', + 'app.setting.copy': '拷贝设置', + 'app.setting.loading': '加载主题中', + 'app.setting.copyinfo': '拷贝设置成功 src/config/defaultSettings.js', + 'app.setting.production.hint': '配置栏只在开发环境用于预览,生产环境不会展现,请拷贝后手动修改配置文件', + 'app.setting.themecolor.daybreak': '拂晓蓝', + 'app.setting.themecolor.dust': '薄暮', + 'app.setting.themecolor.volcano': '火山', + 'app.setting.themecolor.sunset': '日暮', + 'app.setting.themecolor.cyan': '明青', + 'app.setting.themecolor.green': '极光绿', + 'app.setting.themecolor.geekblue': '极客蓝', + 'app.setting.themecolor.purple': '酱紫' +} diff --git a/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/user.js b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/user.js new file mode 100644 index 00000000..37731d9e --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/i18n/lang/zh-CN/user.js @@ -0,0 +1,43 @@ +export default { + 'user.login.userName': '用户名', + 'user.login.password': '密码', + 'user.login.username.placeholder': '账户: admin', + 'user.login.password.placeholder': '密码: admin or ant.design', + 'user.login.message-invalid-credentials': '账户或密码错误(admin/ant.design)', + 'user.login.message-invalid-verification-code': '验证码错误', + 'user.login.tab-login-credentials': '账户密码登录', + 'user.login.tab-login-mobile': '手机号登录', + 'user.login.mobile.placeholder': '手机号', + 'user.login.mobile.verification-code.placeholder': '验证码', + 'user.login.remember-me': '自动登录', + 'user.login.forgot-password': '忘记密码', + 'user.login.sign-in-with': '其他登录方式', + 'user.login.signup': '注册账户', + 'user.login.login': '登录', + 'user.register.register': '注册', + 'user.register.email.placeholder': '邮箱', + 'user.register.password.placeholder': '请至少输入 6 个字符。请不要使用容易被猜到的密码。', + 'user.register.password.popover-message': '请至少输入 6 个字符。请不要使用容易被猜到的密码。', + 'user.register.confirm-password.placeholder': '确认密码', + 'user.register.get-verification-code': '获取验证码', + 'user.register.sign-in': '使用已有账户登录', + 'user.register-result.msg': '你的账户:{email} 注册成功', + 'user.register-result.activation-email': + '激活邮件已发送到你的邮箱中,邮件有效期为24小时。请及时登录邮箱,点击邮件中的链接激活帐户。', + 'user.register-result.back-home': '返回首页', + 'user.register-result.view-mailbox': '查看邮箱', + 'user.email.required': '请输入邮箱地址!', + 'user.email.wrong-format': '邮箱地址格式错误!', + 'user.userName.required': '请输入帐户名或邮箱地址', + 'user.password.required': '请输入密码!', + 'user.password.twice.msg': '两次输入的密码不匹配!', + 'user.password.strength.msg': '密码强度不够 ', + 'user.password.strength.strong': '强度:强', + 'user.password.strength.medium': '强度:中', + 'user.password.strength.low': '强度:低', + 'user.password.strength.short': '强度:太短', + 'user.confirm-password.required': '请确认密码!', + 'user.phone-number.required': '请输入正确的手机号', + 'user.phone-number.wrong-format': '手机号格式错误!', + 'user.verification-code.required': '请输入验证码!' +} diff --git a/admin-web/typescript-ant-design-vue/src/layout/components/smart-footer/index.vue b/admin-web/typescript-ant-design-vue/src/layout/components/smart-footer/index.vue new file mode 100644 index 00000000..6fda25b8 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/components/smart-footer/index.vue @@ -0,0 +1,44 @@ + + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/header-avatar.vue b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/header-avatar.vue new file mode 100644 index 00000000..6a8fd5b4 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/header-avatar.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/header-notice.vue b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/header-notice.vue new file mode 100644 index 00000000..e2ce02aa --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/header-notice.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/i18n-selector.vue b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/i18n-selector.vue new file mode 100644 index 00000000..39b9c6ad --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/i18n-selector.vue @@ -0,0 +1,39 @@ + + + \ No newline at end of file diff --git a/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/index.vue b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/index.vue new file mode 100644 index 00000000..a8d36b11 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header-user-space/index.vue @@ -0,0 +1,47 @@ + + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-avatar.vue b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-avatar.vue new file mode 100644 index 00000000..b5ea6878 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-avatar.vue @@ -0,0 +1,73 @@ + + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-notice.vue b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-notice.vue new file mode 100644 index 00000000..e8dd2f6f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-notice.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-search.vue b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-search.vue new file mode 100644 index 00000000..650268b8 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/components/header-search.vue @@ -0,0 +1,91 @@ + + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/index.less b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/index.less new file mode 100644 index 00000000..b68320f1 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/index.less @@ -0,0 +1,92 @@ +.admin-header { + padding: 0; + z-index: 2; + box-shadow: @shadow-down; + position: relative; + background: @base-bg-color; + .head-menu { + height: 64px; + line-height: 64px; + vertical-align: middle; + box-shadow: none; + } + &.dark { + background: @header-bg-color-dark; + color: white; + } + &.night { + .head-menu { + background: @base-bg-color; + } + } + .admin-header-wide { + padding-left: 24px; + &.head.fixed { + max-width: 1400px; + margin: auto; + padding-left: 0; + } + &.side { + padding-right: 12px; + } + .logo { + height: 64px; + line-height: 58px; + vertical-align: top; + display: inline-block; + padding: 0 12px 0 24px; + cursor: pointer; + font-size: 20px; + color: inherit; + &.pc { + padding: 0 12px 0 0; + } + img { + vertical-align: middle; + } + h1 { + color: inherit; + display: inline-block; + font-size: 16px; + } + } + .trigger { + font-size: 20px; + line-height: 64px; + padding: 0 24px; + cursor: pointer; + transition: color 0.3s; + &:hover { + color: @primary-color; + } + } + .admin-header-menu { + display: inline-block; + } + .admin-header-right { + float: right; + display: flex; + color: inherit; + .header-item { + color: inherit; + padding: 0 12px; + cursor: pointer; + align-self: center; + a { + color: inherit; + i { + font-size: 16px; + } + } + } + each(@theme-list, { + &.@{value} .header-item{ + &:hover{ + @class: ~'hover-bg-color-@{value}'; + background-color: @@class; + } + } + }); + } + } +} diff --git a/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/index.vue b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/index.vue new file mode 100644 index 00000000..c2ac6b07 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/components/smart-header/index.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/layout/components/smart-page-tag/index.vue b/admin-web/typescript-ant-design-vue/src/layout/components/smart-page-tag/index.vue new file mode 100644 index 00000000..462e9352 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/components/smart-page-tag/index.vue @@ -0,0 +1,236 @@ + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/layout/smart-layout.vue b/admin-web/typescript-ant-design-vue/src/layout/smart-layout.vue new file mode 100644 index 00000000..a10814f2 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/smart-layout.vue @@ -0,0 +1,23 @@ + + + diff --git a/admin-web/typescript-ant-design-vue/src/layout/smart-parent-view.vue b/admin-web/typescript-ant-design-vue/src/layout/smart-parent-view.vue new file mode 100644 index 00000000..7bf61489 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/smart-parent-view.vue @@ -0,0 +1,3 @@ + diff --git a/admin-web/typescript-ant-design-vue/src/layout/smart-side-expand-layout.vue b/admin-web/typescript-ant-design-vue/src/layout/smart-side-expand-layout.vue new file mode 100644 index 00000000..74b8b42a --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/smart-side-expand-layout.vue @@ -0,0 +1,160 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/layout/smart-side-layout.vue b/admin-web/typescript-ant-design-vue/src/layout/smart-side-layout.vue new file mode 100644 index 00000000..44a552d5 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/layout/smart-side-layout.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/admin-web/typescript-ant-design-vue/src/lib/axios.ts b/admin-web/typescript-ant-design-vue/src/lib/axios.ts new file mode 100644 index 00000000..5c318004 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/lib/axios.ts @@ -0,0 +1,116 @@ +import axios, { AxiosRequestConfig } from 'axios'; +import { useUserStore } from '/@/store/modules/system/user'; +import { message } from 'ant-design-vue'; +import { clearAllCoolies } from '/@/utils/cookie-util'; +import { smartSentry } from '/@/lib/smart-sentry'; + +const TOKEN_HEADER: string = 'x-access-token'; + +const smartAxios = axios.create({ + baseURL: import.meta.env.VITE_APP_API_URL, +}); + +// ================================= 请求拦截器 ================================= + +smartAxios.interceptors.request.use( + (config) => { + // 在发送请求之前消息头加入token token + const token = useUserStore().getToken; + if (token) { + config.headers[TOKEN_HEADER] = token; + } else { + delete config.headers[TOKEN_HEADER]; + } + return config; + }, + (error) => { + // 对请求错误做些什么 + return Promise.reject(error); + } +); + +// ================================= 响应拦截器 ================================= + +// 添加响应拦截器 +smartAxios.interceptors.response.use( + (response) => { + // 对响应数据做点什么 + const res = response.data; + if (res.code && res.code !== 1) { + // `token` 过期或者账号已在别处登录 + if (res.code === 1001) { + message.error('您没有登录,请重新登录'); + //TODO 跳转到登录页面 + setTimeout(() => { + clearAllCoolies(); + location.href = '/'; + }); + return Promise.reject(response); + } + message.error(res.msg); + return Promise.reject(response); + } else { + return Promise.resolve(res); + } + }, + (error) => { + // 对响应错误做点什么 + if (error.message.indexOf('timeout') != -1) { + message.error('网络超时'); + } else if (error.message == 'Network Error') { + message.error('网络连接错误'); + } + return Promise.reject(error); + } +); + +// ================================= 对外提供请求方法:通用请求,get, post, 下载download等 ================================= + +/** + * 通用请求封装 + * @param config + */ +export const request = (config: AxiosRequestConfig): Promise => { + return smartAxios.request(config); +}; + +/** + * post请求 + */ +export const postRequest = (url: string, data: any): Promise => { + return request({ data, url, method: 'post' }); +}; + +/** + * get请求 + */ +export const getRequest = (url: string, params?: any): Promise => { + return request({ url, method: 'get', params }); +}; + +/** + * 下载 + */ +export const download = function (fileName: string, url: string, params?: any): void { + request({ + method: 'get', + url: url, + params: params, + responseType: 'blob', + }) + .then((data) => { + if (!data) { + return; + } + let url = window.URL.createObjectURL(new Blob([data])); + let link = document.createElement('a'); + link.style.display = 'none'; + link.href = url; + link.setAttribute('download', fileName); + document.body.appendChild(link); + link.click(); + }) + .catch((error) => { + smartSentry.captureException(error); + }); +}; diff --git a/admin-web/typescript-ant-design-vue/src/lib/smart-sentry.ts b/admin-web/typescript-ant-design-vue/src/lib/smart-sentry.ts new file mode 100644 index 00000000..d9573b2c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/lib/smart-sentry.ts @@ -0,0 +1,22 @@ +/* + * @Description:报错收集 + * @Author: zhuoda + * @Date: 2021-08-27 + * @LastEditTime: 2021-08-27 + * @LastEditors: zhuoda + */ + +// import * as Sentry from '@sentry/browser'; +export const smartSentry = { + /** + * sentry 主动上报 + * @param {error} error 错误信息 + */ + captureException: (error: any) => { + if (error.config && error.data && error && error.headers && error.request && error.status) { + return; + } + // Sentry.captureException(error); + console.log(error); + }, +}; diff --git a/admin-web/typescript-ant-design-vue/src/lib/smart-wartermark.ts b/admin-web/typescript-ant-design-vue/src/lib/smart-wartermark.ts new file mode 100644 index 00000000..dcbda0e5 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/lib/smart-wartermark.ts @@ -0,0 +1,93 @@ +/* + * @Description:水印 + * @Author: zhuoda + * @Date: 2021-08-28 + * @LastEditTime: 2021-08-31 + * @LastEditors: zhuoda + */ + +import moment from 'moment'; + +/** + * 水印DOM id + */ +const WATER_MARK_DOM_ID = 'smart_admin_water_mark'; +let smartAdminWaterMarkIntervalId: NodeJS.Timer | null = null; + +/** + * + * 因为modal的z-index为1000,所以为了modal的黑色背景隐藏掉,z-index为 999 + * + * @param id + * @param str + * @param watermarkId + * @returns + */ + +function setWatermark(id: string, str: string): void { + //删掉之前的水印 + if (document.getElementById(WATER_MARK_DOM_ID) !== null) { + document.getElementById(WATER_MARK_DOM_ID)?.remove(); + } + + str = str + ' ' + moment().format('YYYY-MM-DD HH:mm'); + + //创建一个画布 + const can = document.createElement('canvas'); + //设置画布的长宽 + can.width = 400; + can.height = 200; + + const cans: any = can.getContext('2d'); + //旋转角度 + cans.rotate((-15 * Math.PI) / 150); + cans.font = '16px Microsoft JhengHei'; + //设置填充绘画的颜色、渐变或者模式 + cans.fillStyle = 'rgba(190, 190, 190, 0.30)'; + //设置文本内容的当前对齐方式 + cans.textAlign = 'left'; + //设置在绘制文本时使用的当前文本基线 + cans.textBaseline = 'Middle'; + //在画布上绘制填色的文本(输出的文本,开始绘制文本的X坐标位置,开始绘制文本的Y坐标位置) + cans.fillText(str, can.width / 8, can.height / 2); + const div = document.createElement('div'); + div.id = WATER_MARK_DOM_ID; + div.style.pointerEvents = 'none'; + div.style.top = '80px'; + div.style.left = '0px'; + div.style.position = 'absolute'; + div.style.zIndex = '999'; + div.style.width = '100%'; + div.style.height = '100%'; + div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat'; + document.getElementById(id)?.appendChild(div); +} + +const watermark = { + // 该方法只允许调用一次 + set: function (id: string, str: string): void { + // 如果存在水印,则不允许再调用了 + if (document.getElementById(WATER_MARK_DOM_ID) !== null) { + alert('已经添加过全局水印了,请不要再重复添加!'); + return; + } + + setWatermark(id, str); + smartAdminWaterMarkIntervalId = setInterval(() => { + setWatermark(id, str); + }, 60000); + + window.onresize = () => { + setWatermark(id, str); + }; + }, + // 清空水印 + clear: function () { + document.getElementById(WATER_MARK_DOM_ID)?.remove(); + window.removeEventListener('resize', setWatermark); + if (smartAdminWaterMarkIntervalId) { + clearInterval(smartAdminWaterMarkIntervalId); + } + }, +}; +export default watermark; diff --git a/admin-web/typescript-ant-design-vue/src/main.ts b/admin-web/typescript-ant-design-vue/src/main.ts new file mode 100644 index 00000000..cc0c8ddb --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/main.ts @@ -0,0 +1,34 @@ +/* + * @Description: 主方法 + * @Author: zhuoda + * @Date: 2021-08-03 + * @LastEditTime: 2021-08-27 + * @LastEditors: zhuoda + */ +import { createApp } from 'vue'; +import { router } from '/@/router/index'; +import { store } from '/@/store/index'; +import Antd from 'ant-design-vue'; +import './theme/index.less'; +import constantsInfo from '/@/constants/index'; +import smartEnumPlugin from '/@/plugins/smart-enums-plugin'; +import * as antIcons from '@ant-design/icons-vue'; +import lodash from 'lodash'; +import moment from 'moment'; +import 'moment/dist/locale/zh-cn'; +import App from './App.vue'; + +moment.locale('zh-cn'); + +let vueApp = createApp(App); +let app = vueApp.use(router).use(store).use(Antd).use(smartEnumPlugin, constantsInfo); + +// 注册图标组件 +Object.keys(antIcons).forEach((key) => { + app.component(key, antIcons[key as keyof typeof antIcons]); +}); +//全局 +app.config.globalProperties.$antIcons = antIcons; +app.config.globalProperties.$lodash = lodash; +//挂载 +app.mount('#app'); diff --git a/admin-web/typescript-ant-design-vue/src/plugins/smart-enums-plugin.ts b/admin-web/typescript-ant-design-vue/src/plugins/smart-enums-plugin.ts new file mode 100644 index 00000000..cc8e897e --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/plugins/smart-enums-plugin.ts @@ -0,0 +1,77 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-03 + * @LastEditTime: 2021-08-27 + * @LastEditors: zhuoda + */ +import _ from 'lodash'; +import { App } from 'vue'; +import { FLAG_NUMBER_ENUM } from '../constants/common'; +import { SmartEnum, SmartEnumWrapper, SmartEnumItem, SmartEnumPlugin } from '/@/types/smart-enum'; + +export default { + install: (app: App, smartEnumWrapper: SmartEnumWrapper): void => { + const smartEnumPlugin = {} as SmartEnumPlugin; + /** + * 根据枚举值获取描述 + * @param {*} constantName 枚举名 + * @param {*} value 枚举值 + * @returns + */ + smartEnumPlugin.getDescByValue = function (constantName: string, value: any): string { + if (!smartEnumWrapper || !Object.prototype.hasOwnProperty.call(smartEnumWrapper, constantName)) { + return ''; + } + // boolean类型需要做特殊处理 + if (constantName === 'FLAG_NUMBER_ENUM' && !_.isUndefined(value) && typeof value === 'boolean') { + value = value ? FLAG_NUMBER_ENUM.TRUE.value : FLAG_NUMBER_ENUM.FALSE.value; + } + + let smartEnum: SmartEnum = smartEnumWrapper[constantName]; + for (let item in smartEnum) { + if (smartEnum[item].value === value) { + return smartEnum[item].desc; + } + } + return ''; + }; + /** + * 根据枚举名获取对应的描述键值对[{value:desc}] + * @param {*} constantName 枚举名 + * @returns + */ + smartEnumPlugin.getValueDescList = function (constantName: string): SmartEnumItem[] { + if (!Object.prototype.hasOwnProperty.call(smartEnumWrapper, constantName)) { + return []; + } + const result: SmartEnumItem[] = []; + let targetSmartEnum = smartEnumWrapper[constantName]; + for (let item in targetSmartEnum) { + result.push(targetSmartEnum[item] as any); + } + return result; + }; + + /** + * 根据枚举名获取对应的value描述键值对{value:desc} + * @param {*} constantName 枚举名 + * @returns + */ + smartEnumPlugin.getValueDesc = function (constantName: string): { [key: string]: string } { + if (!Object.prototype.hasOwnProperty.call(smartEnumWrapper, constantName)) { + return {}; + } + let smartEnum = smartEnumWrapper[constantName]; + let result = {} as { [key: string]: string }; + for (let item in smartEnum) { + let key: string = smartEnum[item].value + ''; + result[key] = smartEnum[item].desc; + } + return result; + }; + + app.config.globalProperties.$smartEnumPlugin = smartEnumPlugin; + app.provide('smartEnumPlugin', smartEnumPlugin); + }, +}; diff --git a/admin-web/typescript-ant-design-vue/src/router/index.ts b/admin-web/typescript-ant-design-vue/src/router/index.ts new file mode 100644 index 00000000..84528cf4 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/router/index.ts @@ -0,0 +1,145 @@ +import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'; +import { routerArray } from './routers'; +import nProgress from 'nprogress'; +import 'nprogress/nprogress.css'; +import { clearAllCoolies, getTokenFromCookie } from '/@/utils/cookie-util'; +import { useUserStore } from '/@/store/modules/system/user'; +import { MenuTreeVo } from '/@/api/system/menu/model/menu-tree-vo'; +import _ from 'lodash'; +import SmartLayout from '/@/layout/smart-layout.vue'; +import SmartParentView from '/@/layout/smart-parent-view.vue'; +import { MENU_TYPE_ENUM } from '/@/constants/system/menu/menu-enum'; + +const LOGIN_PAGE_NAME = 'Login'; + +export const router = createRouter({ + history: createWebHashHistory(), + routes: routerArray, + strict: true, + scrollBehavior: () => ({ left: 0, top: 0 }), +}); + +// ----------------------- 路由加载前 ----------------------- +router.beforeEach(async (to, from, next) => { + console.log(from.path); + + nProgress.configure({ showSpinner: false }); + if (to.meta.title) { + nProgress.start(); + } + + // 公共页面,任何时候都可以跳转 + if (to.path === '/login' || to.path === '/403' || to.path === '/404') { + next(); + nProgress.done(); + return; + } + + // 非公共页面,就需要验证token了 + const token = getTokenFromCookie(); + if (!token) { + // 跳转到 登录页面 + clearAllCoolies(); + nProgress.done(); + next({ + name: LOGIN_PAGE_NAME, + }); + return; + } + + + // 设置tagNav + useUserStore().setTagNav(to, from); + + let serverRoutes = router.getRoutes().filter((e) => e.meta.fromServer); + if (!_.isEmpty(serverRoutes)) { + next(); + return; + } + + // 判断是否获取有用户菜单 + let menuTree = useUserStore().getMenuTree || []; + if (!_.isEmpty(menuTree)) { + let routeList = buildRoutes(menuTree, 1, []); + routeList.forEach((e) => { + router.addRoute(e); + }); + } + next({ ...to, replace: true }); +}); + +// ----------------------- 路由加载后 ----------------------- +router.afterEach(() => { + nProgress.done(); +}); + +// ----------------------- 构建router对象 ----------------------- +function buildRoutes(menuList: Array, level: number, parentMenuList: Array>): Array { + const resList: Array = []; + // 获取所有vue组件 + const modules = import.meta.glob('../views/**/**.vue'); + for (let e of menuList) { + if (level == 1) { + parentMenuList = []; + } + // @ts-ignore + let menuIdStr = e.menuId.toString(); + let route: RouteRecordRaw = { + // @ts-ignore + path: e.path.startsWith('/') ? e.path : `/${e.path}`, + // 使用menuId作为name唯一标识 + name: menuIdStr, + meta: { + // 菜单展示 + title: e.menuName, + // 菜单图标展示 + icon: e.icon, + // 是否在菜单隐藏 + hideInMenu: !e.visibleFlag, + // 页面是否keep-alive缓存 + noKeepAlive: e.cacheFlag, + // 菜单类型 由于router.getRoutes()会把所有路由全部返回(目录以及菜单) 需要一个标识过滤出目录类型 + menuType: e.menuType, + // 是否来自服务器 用于在beforeEach中判断router是否已经加载了来自服务器的路由 以此跳过重复addRoute + fromServer: true, + // 上级菜单目录唯一标识集合 用于a-menu展开菜单目录 + parentMenuList: parentMenuList, + }, + component: level == 1 ? SmartLayout : SmartParentView, + }; + if (e.menuType == MENU_TYPE_ENUM.MENU.value) { + let componentPath = e.component && e.component.startsWith('/') ? e.component : '/' + e.component; + let relativePath = `../views${componentPath}`; + // eslint-disable-next-line no-prototype-builtins + if (modules.hasOwnProperty(relativePath)) { + route.component = modules[relativePath]; + } + } + if (!_.isEmpty(e.children)) { + // 递归 + parentMenuList.push({ name: menuIdStr, title: e.menuName }); + route.children = buildRoutes(e.children || [], level + 1, parentMenuList); + } + // 如果当前是一级且是菜单 需要在外面包一层虚拟路由承载SmartLayout + if (level == 1 && e.menuType == MENU_TYPE_ENUM.MENU.value) { + if (!route.meta) { + continue; + } + route.meta.parentMenuList.push({ name: menuIdStr, title: e.menuName }); + let virtualRoute: RouteRecordRaw = { + // @ts-ignore + // path: e.path.startsWith('/') ? e.path : `/${e.path}`, + path: `/virtual-${menuIdStr}`, + // 使用menuId作为name唯一标识 + name: `virtual${menuIdStr}`, + meta: {}, + component: SmartLayout, + children: [route], + }; + resList.push(virtualRoute); + continue; + } + resList.push(route); + } + return resList; +} diff --git a/admin-web/typescript-ant-design-vue/src/router/routers.ts b/admin-web/typescript-ant-design-vue/src/router/routers.ts new file mode 100644 index 00000000..acb64a3c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/router/routers.ts @@ -0,0 +1,9 @@ +import {loginRouters} from './system/login'; +import {homeRouters} from './system/home'; +import type {RouteRecordRaw} from "vue-router"; + +export const routerArray: RouteRecordRaw[] = [ + ...loginRouters, + ...homeRouters, + +] diff --git a/admin-web/typescript-ant-design-vue/src/router/system/home.ts b/admin-web/typescript-ant-design-vue/src/router/system/home.ts new file mode 100644 index 00000000..430bb942 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/router/system/home.ts @@ -0,0 +1,38 @@ +/* + * @Description: + * @version: + * @Author: zhuoda + * @Date: 2021-08-20 15:06:57 + * @LastEditors: zhuoda + * @LastEditTime: 2021-08-25 21:02:29 + */ +import { RouteRecordRaw } from 'vue-router'; +import SmartLayout from '/@/layout/smart-layout.vue'; +import { MENU_TYPE_ENUM } from '/@/constants/system/menu/menu-enum'; + +export const homeRouters: Array = [ + { + path: '/', + name: '_home', + redirect: '/home', + component: SmartLayout, + meta: { + title: '首页', + menuType: MENU_TYPE_ENUM.CATALOG.value, + icon: 'HomeOutlined', + }, + children: [ + { + path: '/home', + name: 'Home', + meta: { + title: '首页', + menuType: MENU_TYPE_ENUM.MENU.value, + icon: 'HomeOutlined', + parentMenuList: [{ name: '_home', title: '首页' }], + }, + component: () => import('/@/views/system/home/index.vue'), + }, + ], + }, +]; diff --git a/admin-web/typescript-ant-design-vue/src/router/system/login.ts b/admin-web/typescript-ant-design-vue/src/router/system/login.ts new file mode 100644 index 00000000..8993d593 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/router/system/login.ts @@ -0,0 +1,20 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-03 + * @LastEditTime: 2021-08-30 17:51:22 + * @LastEditors: zhuoda + */ +import { RouteRecordRaw } from 'vue-router'; + +export const loginRouters: Array = [ + { + path: '/login', + name: 'Login', + component: () => import('/@/views/system/login/login.vue'), + meta: { + title: '登录', + hideInMenu: true, + }, + }, +]; diff --git a/admin-web/typescript-ant-design-vue/src/shims-vue.d.ts b/admin-web/typescript-ant-design-vue/src/shims-vue.d.ts new file mode 100644 index 00000000..0b350f62 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/shims-vue.d.ts @@ -0,0 +1,27 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-03 + * @LastEditTime: 2021-08-27 + * @LastEditors: zhuoda + */ +import { SmartEnumPlugin } from '/@/types/smart-enum'; +import * as lodash from 'lodash'; + +declare module '*.vue' { + import { Component } from 'vue'; + const component: Component; + export default component; +} + +// 对vue进行类型补充说明 +declare module '@vue/runtime-core' { + interface ComponentCustomProperties { + // 常量插件 + $smartEnumPlugin: SmartEnumPlugin; + // 常量图标 + $antIcons: Object; + // lodash工具类 + $lodash: lodash; + } +} diff --git a/admin-web/typescript-ant-design-vue/src/store/index.ts b/admin-web/typescript-ant-design-vue/src/store/index.ts new file mode 100644 index 00000000..12443cd0 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/store/index.ts @@ -0,0 +1,3 @@ +import { createPinia } from 'pinia'; + +export const store = createPinia(); diff --git a/admin-web/typescript-ant-design-vue/src/store/modules/model/UserTagNav.ts b/admin-web/typescript-ant-design-vue/src/store/modules/model/UserTagNav.ts new file mode 100644 index 00000000..4de99944 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/store/modules/model/UserTagNav.ts @@ -0,0 +1,36 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-09 17:11:01 + * @LastEditTime: 2021-08-19 17:53:36 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/store/modules/model/UserTagNav.ts + */ + +import { LocationQueryRaw } from 'vue-router'; + +/** + * 用户的tag列表 + */ +export interface UserTagNav { + /** + * 菜单名称-ID + */ + menuName: string; + /** + * 菜单标题 + */ + menuTitle: string; + /** + * 菜单请求参数 + */ + menuQuery?: LocationQueryRaw; + /** + * 从哪个菜单过来的 + */ + fromMenuName?: string; + /** + * 从哪个菜单过来的 请求参数 + */ + fromMenuQuery?: LocationQueryRaw; +} diff --git a/admin-web/typescript-ant-design-vue/src/store/modules/system/app-config.ts b/admin-web/typescript-ant-design-vue/src/store/modules/system/app-config.ts new file mode 100644 index 00000000..faa56f9f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/store/modules/system/app-config.ts @@ -0,0 +1,52 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-03 + * @LastEditTime: 2021-08-27 + * @LastEditors: zhuoda + */ +import { defineStore } from 'pinia'; +import { AppConfig } from '/@/types/config'; +import { appDefaultConfig } from '/@/config/app-config'; + +/** + * app 所有状态 + */ +interface AppConfigState extends AppConfig { + currentScreenWidth: number; // 当前屏幕宽度 + isMobile: boolean; // 是否为手机端模式; 是:true, 不是 false +} + +export const useAppConfigStore = defineStore({ + id: 'appConfig', + state: (): AppConfigState => ({ + //当前屏幕宽度 + currentScreenWidth: document.body.clientWidth, + // 是否为手机端模式,默认不是 + isMobile: false, + // 读取config下的默认配置 + ...appDefaultConfig, + }), + getters: { + /** + * 只有在头部header 固定的时候,才会把标签固定 + * @param state + */ + getPageTagFixedFlag(state): Boolean { + return state.headerFixedFlag; + }, + }, + + actions: { + // 更新当前屏幕宽度 + setCurrentScreenWidth(clientWidth: number): void { + this.currentScreenWidth = clientWidth; + // 如果当前宽度小于设置的手机最大宽度,则为手机css适配模式 + this.isMobile = this.currentScreenWidth < this.mobileMaxWidth; + }, + // 更新语言 + setLanguage(language: string): void { + console.log(language); + }, + }, +}); diff --git a/admin-web/typescript-ant-design-vue/src/store/modules/system/project-config.ts b/admin-web/typescript-ant-design-vue/src/store/modules/system/project-config.ts new file mode 100644 index 00000000..6b7c4d27 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/store/modules/system/project-config.ts @@ -0,0 +1,13 @@ +import {defineStore} from 'pinia'; +import {ProjectConfig} from "/@/types/config"; +import {projectDefaultConfig} from "/@/config/project-config"; + + +export const useProjectConfigStore = defineStore({ + id: 'projectConfig', + state: (): ProjectConfig => ({ + ...projectDefaultConfig + }), + getters: {}, + actions: {}, +}); diff --git a/admin-web/typescript-ant-design-vue/src/store/modules/system/role.ts b/admin-web/typescript-ant-design-vue/src/store/modules/system/role.ts new file mode 100644 index 00000000..54aeef4e --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/store/modules/system/role.ts @@ -0,0 +1,98 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-28 14:28:18 + * @LastEditTime: 2021-08-28 16:37:27 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/store/modules/system/role.ts + */ +import _ from 'lodash'; +import { defineStore } from 'pinia'; +import { MenuSimpleTreeVo } from '/@/api/system/menu/model/menu-simple-tree-vo'; + +export const useRoleStore = defineStore({ + id: 'role', + state: (): { + checkedData: number[]; + treeMap: Map; + } => ({ + checkedData: [], + treeMap: new Map(), + }), + + actions: { + // 初始化权限树选中数据 + initCheckedData(data: number[]) { + this.checkedData = [...new Set(data)]; + }, + // 选中 + addCheckedData(data: number) { + if (this.checkedData.some((e) => e == data)) { + return; + } + this.checkedData.push(data); + }, + // 选中本级以及子级 + addCheckedDataAndChildren(data: MenuSimpleTreeVo) { + let findIndex = this.checkedData.findIndex((val) => val == data.menuId); + if (data.menuId && findIndex == -1) { + this.addCheckedData(data.menuId); + } + if (data.children) { + data.children.forEach((item) => { + this.addCheckedDataAndChildren(item); + }); + } + }, + // 取消选中 + deleteCheckedData(index: number) { + this.checkedData.splice(index, 1); + }, + // 取消选中本级以及子级 + deleteCheckedDataAndChildren(data: MenuSimpleTreeVo) { + let findIndex = this.checkedData.findIndex((val) => val == data.menuId); + if (findIndex != -1) { + this.deleteCheckedData(findIndex); + } + if (data.children) { + data.children.forEach((item) => { + this.deleteCheckedDataAndChildren(item); + }); + } + }, + // 初始化权限树对象 + initTreeMap(tree: MenuSimpleTreeVo[]) { + for (let treeElement of tree) { + if (!treeElement.menuId) { + continue; + } + this.treeMap.set(treeElement.menuId, treeElement); + if (treeElement.children && !_.isEmpty(treeElement.children)) { + this.initTreeMap(treeElement.children); + } + } + }, + // 选中上一级 + selectUpperLevel(module: MenuSimpleTreeVo) { + // 拿到上级key + let parentId = module.parentId; + if (!parentId) { + return; + } + // 从权限树对象 获取该父级对象 + let parentModule = this.treeMap.get(parentId); + if (!parentModule) { + return; + } + // 选中父级 + let parentIndex = this.checkedData.findIndex((e) => parentModule?.menuId === e); + if (parentModule.menuId && parentIndex == -1) { + this.addCheckedData(parentModule.menuId); + } + // 如果上级还有上级 则进行递归 + if (parentModule.parentId) { + this.selectUpperLevel(parentModule); + } + }, + }, +}); diff --git a/admin-web/typescript-ant-design-vue/src/store/modules/system/spin.ts b/admin-web/typescript-ant-design-vue/src/store/modules/system/spin.ts new file mode 100644 index 00000000..a2230608 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/store/modules/system/spin.ts @@ -0,0 +1,17 @@ +import {defineStore} from "pinia"; + +export const useSpinStore = defineStore({ + id: "spin", + state: () => ({ + loading: false + }), + + actions: { + hide(): void { + this.loading = false; + }, + show(): void { + this.loading = true; + } + } +}); diff --git a/admin-web/typescript-ant-design-vue/src/store/modules/system/user.ts b/admin-web/typescript-ant-design-vue/src/store/modules/system/user.ts new file mode 100644 index 00000000..5322efda --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/store/modules/system/user.ts @@ -0,0 +1,160 @@ +import { defineStore } from 'pinia'; +import { UserState } from '/@/types/user'; +import { getTokenFromCookie } from '/@/utils/cookie-util'; +import localKey from '/@/constants/system/local-storage-key'; +import { localSave, localRead } from '/@/utils/local-util'; +import { RouteLocationNormalized, RouteLocationNormalizedLoaded, Router } from 'vue-router'; +import { UserTagNav } from '/@/store/modules/model/UserTagNav'; +import _ from 'lodash'; +import { appDefaultConfig } from '/@/config/app-config'; +import { MenuTreeVo } from '/@/api/system/menu/model/menu-tree-vo'; +import { EmployeeLoginVo } from '/@/api/system/login/model/employee-login-vo'; +import { localClear } from "/@/utils/local-util"; + +export const useUserStore = defineStore({ + id: 'userStore', + state: (): UserState => ({ + token: '', + pointsList: [], + menuTree: [], + tagNav: [], + userInfo: {}, + }), + getters: { + getToken(state: UserState): string | undefined { + if (state.token) { + return state.token; + } + return getTokenFromCookie(); + }, + getUserInfo(state: UserState): EmployeeLoginVo { + if (_.isEmpty(state.userInfo)) { + let localUserInfo = localRead(localKey.USER_INFO) || ''; + state.userInfo = localUserInfo ? JSON.parse(localUserInfo) : {}; + } + return state.userInfo; + }, + getMenuTree(state: UserState): Array | undefined { + if (_.isEmpty(state.menuTree)) { + let localUserMenu = localRead(localKey.USER_MENU) || ''; + state.menuTree = localUserMenu ? JSON.parse(localUserMenu) : []; + } + return state.menuTree; + }, + getPointList(state: UserState): Array | undefined { + if (_.isEmpty(state.pointsList)) { + let localUserPoints = localRead(localKey.USER_POINTS) || ''; + state.pointsList = localUserPoints ? JSON.parse(localUserPoints) : []; + } + return state.pointsList; + }, + getTagNav(state: UserState): Array | undefined { + if (_.isEmpty(state.tagNav)) { + let localTagNav = localRead(localKey.USER_TAG_NAV) || ''; + state.tagNav = localTagNav ? JSON.parse(localTagNav) : []; + } + let tagNavList = _.cloneDeep(state.tagNav) || []; + tagNavList.unshift({ + menuName: appDefaultConfig.homePageName, + menuTitle: '首页', + }); + return tagNavList; + }, + }, + + actions: { + logout(){ + this.token = ''; + this.pointsList = []; + this.menuTree = []; + this.tagNav = []; + this.userInfo = {}; + localClear(); + }, + setUserSession(data: EmployeeLoginVo): void { + this.token = data.token; + this.pointsList = data.pointsList; + this.menuTree = data.menuTree; + this.userInfo = data; + this.setUserMenu(data); + localSave(localKey.USER_INFO, JSON.stringify(data)); + }, + setUserMenu(data: EmployeeLoginVo): void { + this.pointsList = []; + this.menuTree = []; + localSave(localKey.USER_MENU, JSON.stringify(data.menuTree)); + localSave(localKey.USER_POINTS, JSON.stringify(data.pointsList)); + }, + setToken(token: string): void { + this.token = token; + }, + setTagNav(route: RouteLocationNormalized, from: RouteLocationNormalized) { + if (_.isEmpty(this.getTagNav)) this.tagNav = []; + // name唯一标识 + let name = route.name; + if (!name || name == appDefaultConfig.homePageName) { + return; + } + let findTag = (this.tagNav || []).find((e) => e.menuName == name); + if (findTag) { + // @ts-ignore + findTag.fromMenuName = from.name; + findTag.fromMenuQuery = from.query; + } else { + // @ts-ignore + this.tagNav.push({ + // @ts-ignore + menuName: name, + // @ts-ignore + menuTitle: route.meta.title, + menuQuery: route.query, + // @ts-ignore + fromMenuName: from.name, + fromMenuQuery: from.query, + }); + } + localSave(localKey.USER_TAG_NAV, JSON.stringify(this.tagNav)); + }, + closeTagNav(menuName: string | null, closeAll: boolean) { + if (_.isEmpty(this.getTagNav)) return; + if (closeAll && !menuName) { + this.tagNav = []; + } else { + let findIndex = (this.tagNav || []).findIndex((e) => e.menuName == menuName); + if (closeAll) { + if (findIndex == -1) { + this.tagNav = []; + } else { + let tagNavElement = (this.tagNav || [])[findIndex]; + this.tagNav = [tagNavElement]; + } + } else { + (this.tagNav || []).splice(findIndex, 1); + } + } + localSave(localKey.USER_TAG_NAV, JSON.stringify(this.tagNav)); + }, + closePage(route: RouteLocationNormalizedLoaded, router: Router, path?: string) { + if (!this.getTagNav || _.isEmpty(this.getTagNav)) return; + if (path) { + router.push({ path }); + } else { + // 寻找tagNav + let index = this.getTagNav.findIndex((e) => e.menuName == route.name); + if (index == -1) { + router.push({ name: appDefaultConfig.homePageName }); + } else { + let tagNav = this.getTagNav[index]; + if (tagNav.fromMenuName && this.getTagNav.some((e) => e.menuName == tagNav.fromMenuName)) { + router.push({ name: tagNav.fromMenuName, query: tagNav.fromMenuQuery }); + } else { + // 查询左侧tag + let leftTagNav = this.getTagNav[index - 1]; + router.push({ name: leftTagNav.menuName, query: leftTagNav.menuQuery }); + } + } + } + this.closeTagNav(route.name, false); + }, + }, +}); diff --git a/admin-web/typescript-ant-design-vue/src/theme/index.less b/admin-web/typescript-ant-design-vue/src/theme/index.less new file mode 100644 index 00000000..490510ec --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/theme/index.less @@ -0,0 +1,87 @@ +@import '~ant-design-vue/dist/antd.less'; +@import './smart-admin.less'; + +@gray-1: #ffffff; +@gray-2: #fafafa; +@gray-3: #f5f5f5; +@gray-4: #f0f0f0; +@gray-5: #d9d9d9; +@gray-6: #bfbfbf; +@gray-7: #8c8c8c; +@gray-8: #595959; +@gray-9: #434343; +@gray-10: #262626; +@gray-11: #1f1f1f; +@gray-12: #141414; +@gray-13: #000000; + +@title-color: @heading-color; + +@layout-bg-color: @layout-body-background; +@base-bg-color: @body-background; +@hover-bg-color: rgba(0, 0, 0, 0.025); +@border-color: @border-color-split; + +@hover-bg-color-light: @hover-bg-color; +@hover-bg-color-dark: @primary-7; +@hover-bg-color-night: rgba(255, 255, 255, 0.025); +@header-bg-color-dark: @layout-header-background; + +@header-light-bg-hover-color: #f6f6f6; +@header-height: 80px; +@header-user-height: 40px; +@page-tag-height: 40px; + +@shadow-down: @shadow-1-down; +@shadow-up: @shadow-1-up; +@shadow-left: @shadow-1-left; +@shadow-right: @shadow-1-right; + +@theme-list: light, dark, night; + +/********************************** 基础样式 **********************************/ +* { + margin: 0; + padding: 0; + box-sizing: border-box; + outline: none !important; +} + +html, +body { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: transparent; + background-color: #f8f8f8; + font-size: 14px; + position: relative; +} + +#app { + width: 100%; + height: 100%; +} + +/********************************** ant design table **********************************/ +.ant-table-tbody :deep(.smart-table-striped) { + background-color: #fafafa; +} + +/********************************** ant design form **********************************/ +.ant-form-inline .ant-form-item-with-help { + margin-bottom: 0px !important; +} + +/********************************** ant design spin **********************************/ +.ant-spin-nested-loading { + width: 100%; + height: 100%; +} + +.ant-spin-container { + width: 100%; + height: 100%; +} diff --git a/admin-web/typescript-ant-design-vue/src/theme/smart-admin.less b/admin-web/typescript-ant-design-vue/src/theme/smart-admin.less new file mode 100644 index 00000000..10ac0af9 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/theme/smart-admin.less @@ -0,0 +1,84 @@ +/********************************** 滚动条 **********************************/ +.smart-scroll { + scrollbar-color: @primary-color @primary-2; + scrollbar-width: thin; + -ms-overflow-style: none; + position: relative; + &::-webkit-scrollbar { + width: 3px; + height: 1px; + } + &::-webkit-scrollbar-thumb { + border-radius: 3px; + background: @primary-color; + } + &::-webkit-scrollbar-track { + border-radius: 3px; + background: @primary-3; + } +} +/********************************** 宽度 **********************************/ +.smart-width-100 { + width: 100%; +} + +/********************************** 左间距 **********************************/ +.smart-margin-left5 { + margin-left: 5px; +} + +.smart-margin-left10 { + margin-left: 10px; +} + +.smart-margin-left15 { + margin-left: 15px; +} + +.smart-margin-left20 { + margin-left: 20px; +} + +/******************************** 上间距 ********************************/ +.smart-margin-top5 { + margin-top: 5px; +} + +.smart-margin-top10 { + margin-top: 10px; +} + +/******************************** 查询表格样式 ********************************/ +.smart-query-form { + background-color: #ffffff; + padding: 5px 10px; + margin-bottom: 10px; +} + +.smart-query-form-row:not(:first-child) { + margin-top: 8px; +} + +.smart-query-form-row .smart-query-form-item { + margin-right: 8px; + margin-top: 5px; + margin-bottom: 5px; +} + +.smart-query-table-page { + margin-top: 10px; + display: flex; + justify-content: flex-end; +} + +.smart-table-btn-block { + margin-bottom: 15px; + display: flex; + flex-direction: row; + justify-content: space-between; + .smart-table-operate-block { + .ant-btn { + margin-right: 12px; + } + } +} diff --git a/admin-web/typescript-ant-design-vue/src/types/config.d.ts b/admin-web/typescript-ant-design-vue/src/types/config.d.ts new file mode 100644 index 00000000..29331054 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/types/config.d.ts @@ -0,0 +1,65 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-03 + * @LastEditTime: 2021-09-01 + * @LastEditors: zhuoda + */ +/** + * 语言 i18n + */ +export type LanguageType = 'zh_CN' | 'en' | 'ru' | 'ja' | 'ko'; + +/** + * 四种布局: 左侧、左侧展开、顶部、混合 + */ +export type LayoutType = 'side' | 'side-expand' | 'top' | 'mix'; + +/** + * 主题: 亮色,暗色,夜色 + */ +export type ThemeType = 'light' | 'dark'; + +/** + * 项目信息配置 + */ +export interface ProjectConfig { + // 项目名称, eg : SmartAdmin + projectName: String; + // 版权信息 'Copyright © 2015-2021 1024lab.net 1024创新实验室版权所有' + copyright: String; + // 点击版权的跳转 'http://1024lab.net' + copyrightUrl: String; + // 版本: 2.0.0 + version: String; + // build时间戳 + buildTime: String; +} + +/** + * 应用信息配置 + */ +export interface AppConfig { + // i18n 语言选择 + languageType: LanguageType; + // 布局 + layout: string; + // 主题 + theme: ThemeType; + // 手机模式最大宽度 768px,如果少于768px,则手机自适应 + mobileMaxWidth: number; + // 侧边菜单宽度 , 默认为256px + sideMenuWidth: number; + // 标签页 + multiPageTagFlag: boolean; + // 标签页缓存, keep-alive, true 开启缓存; false 不开启 + multiPageTagKeepAliveFlag: boolean; + // 固定头部状态栏,true:固定,false:不固定 + headerFixedFlag: boolean; + // 固定侧边栏,true:固定,false:不固定 + sideBarFixedFlag: boolean; + // 隐藏设置,true:隐藏,false:不隐藏 + hideSettingFlag: false; + // 首页页面Name + homePageName: string; +} diff --git a/admin-web/typescript-ant-design-vue/src/types/env.d.ts b/admin-web/typescript-ant-design-vue/src/types/env.d.ts new file mode 100644 index 00000000..665ab3fe --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/types/env.d.ts @@ -0,0 +1,18 @@ +/* + * @Description: + * @Author: zhuoda + * @Date: 2021-08-03 + * @LastEditTime: 2021-08-26 + * @LastEditors: zhuoda + */ +/** + * 不同环境下的配置信息 + */ +interface ImportMetaEnv { + // 后端接口地址 + VITE_APP_API_URL: string; + // 项目标题 + VITE_APP_PROJECT_TITLE: string; + // 项目环境:dev, sit, pre, prod + VITE_APP_PROFILE: string; +} diff --git a/admin-web/typescript-ant-design-vue/src/types/smart-enum.d.ts b/admin-web/typescript-ant-design-vue/src/types/smart-enum.d.ts new file mode 100644 index 00000000..963b68c8 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/types/smart-enum.d.ts @@ -0,0 +1,28 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-18 16:58:28 + * @LastEditTime: 2021-08-26 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/types/base.d.ts + */ +export interface SmartEnumWrapper { + [key: string]: SmartEnum; +} + +export interface SmartEnum { + [key: string]: SmartEnumItem; +} + +interface SmartEnumItem { + value: T; + desc: string; +} + +interface SmartEnumPlugin { + getDescByValue(constantName: string, value: string | number | undefined): string; + + getValueDescList(constantName: string): SmartEnumItem[]; + + getValueDesc(constantName: string): { [key: string]: string }; +} diff --git a/admin-web/typescript-ant-design-vue/src/types/user.d.ts b/admin-web/typescript-ant-design-vue/src/types/user.d.ts new file mode 100644 index 00000000..26425784 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/types/user.d.ts @@ -0,0 +1,44 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-03 10:27:11 + * @LastEditTime: 2021-08-18 20:14:20 + * @LastEditors: zhuoda + * @Description: + * @FilePath: /smart-admin/src/types/user.d.ts + */ +import { MenuTreeVo } from '@/api/system/login/login-model.ts'; +import { UserTagNav } from '/@/store/modules/model/UserTagNav'; +import { EmployeeLoginVo } from '/@/api/system/login/model/employee-login-vo'; + +export interface UserState { + /** + * @description: token + * @param {*} + * @return {*} + */ + token?: string; + /** + * @description: 用户信息 + * @param {*} + * @return {*} + */ + userInfo: EmployeeLoginVo; + /** + * @description: 功能点权限列表 + * @param {*} + * @return {*} + */ + pointsList?: Array; + /** + * @description: 菜单树 + * @param {*} + * @return {*} + */ + menuTree?: Array; + /** + * @description: tag列表 + * @param {*} + * @return {*} + */ + tagNav?: Array; +} diff --git a/admin-web/typescript-ant-design-vue/src/utils/cookie-util.ts b/admin-web/typescript-ant-design-vue/src/utils/cookie-util.ts new file mode 100644 index 00000000..828d7ef4 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/utils/cookie-util.ts @@ -0,0 +1,27 @@ +/* + * @Description + * @Author: zhuoda + * @Date: 2021-08-03 + * @LastEditTime: 2021-08-27 + * @LastEditors: zhuoda + */ +import Cookies from 'js-cookie'; + +export const COOKIE_TOKEN_KEY = 'user_token'; + +export const clearAllCoolies = (): void => { + Cookies.remove(COOKIE_TOKEN_KEY); +}; + +export const getTokenFromCookie = (): string | undefined => { + return Cookies.get(COOKIE_TOKEN_KEY); +}; + +/** + * 7 天后cookie过期 + * + * @param token + */ +export const saveTokenToCookie = (token: string): void => { + Cookies.set(COOKIE_TOKEN_KEY, token, { expires: 7 }); +}; diff --git a/admin-web/typescript-ant-design-vue/src/utils/local-util.ts b/admin-web/typescript-ant-design-vue/src/utils/local-util.ts new file mode 100644 index 00000000..28ef30f5 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/utils/local-util.ts @@ -0,0 +1,16 @@ +/** + * localStorage存取 + * @param key + * @param value + */ +export const localSave = (key: string, value: string) => { + localStorage.setItem(key, value); +}; + +export const localRead = (key: string): string | null => { + return localStorage.getItem(key) || ''; +}; + +export const localClear = (): void => { + localStorage.clear(); +}; diff --git a/admin-web/typescript-ant-design-vue/src/views/business/goods/components/goods-operate-modal.vue b/admin-web/typescript-ant-design-vue/src/views/business/goods/components/goods-operate-modal.vue new file mode 100644 index 00000000..42f5dd0f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/business/goods/components/goods-operate-modal.vue @@ -0,0 +1,167 @@ + + diff --git a/admin-web/typescript-ant-design-vue/src/views/business/goods/goods-list.vue b/admin-web/typescript-ant-design-vue/src/views/business/goods/goods-list.vue new file mode 100644 index 00000000..e2d4bf4d --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/business/goods/goods-list.vue @@ -0,0 +1,243 @@ + + diff --git a/admin-web/typescript-ant-design-vue/src/views/business/setting/components/category-operate-modal.vue b/admin-web/typescript-ant-design-vue/src/views/business/setting/components/category-operate-modal.vue new file mode 100644 index 00000000..07047761 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/business/setting/components/category-operate-modal.vue @@ -0,0 +1,116 @@ + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/business/setting/components/category-tree-table.vue b/admin-web/typescript-ant-design-vue/src/views/business/setting/components/category-tree-table.vue new file mode 100644 index 00000000..c2b26c84 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/business/setting/components/category-tree-table.vue @@ -0,0 +1,156 @@ + + diff --git a/admin-web/typescript-ant-design-vue/src/views/business/setting/demo-setting.vue b/admin-web/typescript-ant-design-vue/src/views/business/setting/demo-setting.vue new file mode 100644 index 00000000..88b28afd --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/business/setting/demo-setting.vue @@ -0,0 +1,11 @@ + + diff --git a/admin-web/typescript-ant-design-vue/src/views/business/setting/goods-setting.vue b/admin-web/typescript-ant-design-vue/src/views/business/setting/goods-setting.vue new file mode 100644 index 00000000..944a1b2f --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/business/setting/goods-setting.vue @@ -0,0 +1,11 @@ + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/child-department-list/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/child-department-list/index.vue new file mode 100644 index 00000000..85d4c637 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/child-department-list/index.vue @@ -0,0 +1,59 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/department-tree/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/department-tree/index.vue new file mode 100644 index 00000000..0d156bdd --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/department-tree/index.vue @@ -0,0 +1,268 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/employee-list/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/employee-list/index.vue new file mode 100644 index 00000000..3b01b79b --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/employee-list/index.vue @@ -0,0 +1,308 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/operate-department-modal/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/operate-department-modal/index.vue new file mode 100644 index 00000000..d6464109 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/operate-department-modal/index.vue @@ -0,0 +1,146 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/operate-employee-modal/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/operate-employee-modal/index.vue new file mode 100644 index 00000000..1db0126a --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/operate-employee-modal/index.vue @@ -0,0 +1,227 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/update-employee-department-modal/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/update-employee-department-modal/index.vue new file mode 100644 index 00000000..39df21c7 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/components/update-employee-department-modal/index.vue @@ -0,0 +1,96 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/department/department-mitt.ts b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/department-mitt.ts new file mode 100644 index 00000000..5c5a8493 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/department-mitt.ts @@ -0,0 +1,13 @@ +/* + * @Author: zhuoda + * @Date: 2021-08-13 17:55:09 + * @LastEditTime: 2021-08-13 18:01:32 + * @LastEditors: zhuoda + * @Description: eventBus + * @FilePath: /smart-admin/src/views/system/employee/department/department-mitt.ts + */ +import mitt from "mitt" +type Events = { + selectTree: number; + }; +export default mitt(); diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/department/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/index.vue new file mode 100644 index 00000000..8fae29b7 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/department/index.vue @@ -0,0 +1,73 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/operate-role-modal/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/operate-role-modal/index.vue new file mode 100644 index 00000000..918fe68b --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/operate-role-modal/index.vue @@ -0,0 +1,119 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-data-scope/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-data-scope/index.vue new file mode 100644 index 00000000..5f906e81 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-data-scope/index.vue @@ -0,0 +1,150 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-employee-list/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-employee-list/index.vue new file mode 100644 index 00000000..52742173 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-employee-list/index.vue @@ -0,0 +1,226 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-list/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-list/index.vue new file mode 100644 index 00000000..cde488d2 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-list/index.vue @@ -0,0 +1,108 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-setting/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-setting/index.vue new file mode 100644 index 00000000..44f5aa7e --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-setting/index.vue @@ -0,0 +1,50 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/index.less b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/index.less new file mode 100644 index 00000000..1dbad70d --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/index.less @@ -0,0 +1,78 @@ +:deep(.ant-checkbox-group) { + width: 100%; +} +.tree-header { + display: flex; + align-items: center; + justify-content: space-between; + margin: 20px 0; +} +.col-desc { + margin: 20px 0; + font-size: 15px; + color: #95a5a6; + padding: 0 20px; +} +.button-style { + margin: 20px 0 20px 0; + padding-left: 20px; + text-align: right; +} +.check-right { + margin-right: 20px; +} +.row-border { + border: 1px solid #f0f0f0; +} +.col-border { + line-height: 50px; + padding-left: 20px; + border-right: 1px solid #f0f0f0; +} +.col-left { + line-height: 50px; + padding-left: 40px; + border-right: 1px solid #f0f0f0; +} +.col-right { + padding-left: 20px; + border-right: 1px solid #f0f0f0; +} +.checked-box { + padding: 0 15px; + :deep(ul li::marker) { + content: ''; + } + :deep(ul) { + padding: 0; + margin: 0; + + li { + list-style: none; + padding: 0; + margin: 10px 0; + + .menu { + border-bottom: 1px solid rgb(240, 240, 240); + display: flex; + align-items: center; + line-height: 40px; + } + + .point { + display: flex; + align-items: center; + + .point-label { + flex: 1; + padding-left: 40px; + border-left: 1px rgb(240, 240, 240) solid; + } + } + + .checked-box-label { + min-width: 150px; + } + } + } +} diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/index.vue new file mode 100644 index 00000000..256d7310 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/index.vue @@ -0,0 +1,79 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-checkbox.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-checkbox.vue new file mode 100644 index 00000000..149ab80d --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-checkbox.vue @@ -0,0 +1,54 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-menu.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-menu.vue new file mode 100644 index 00000000..c533ea7b --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-menu.vue @@ -0,0 +1,71 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-point.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-point.vue new file mode 100644 index 00000000..8314cbcf --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/components/role-tree/role-tree-point.vue @@ -0,0 +1,43 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/employee/role/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/index.vue new file mode 100644 index 00000000..e9e9235e --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/employee/role/index.vue @@ -0,0 +1,53 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/home/components/gauge.vue b/admin-web/typescript-ant-design-vue/src/views/system/home/components/gauge.vue new file mode 100644 index 00000000..58aa84da --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/home/components/gauge.vue @@ -0,0 +1,117 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/home/index.less b/admin-web/typescript-ant-design-vue/src/views/system/home/index.less new file mode 100644 index 00000000..a4ff1b59 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/home/index.less @@ -0,0 +1,68 @@ +:deep(.ant-col) { + margin-bottom: 24px; +} +.no-footer { + :deep(.ant-card-body) { + padding-bottom: 0; + } +} +.content { + height: 150px; + + &.large { + height: 360px; + } + + &.statistice { + display: flex; + flex-direction: column; + justify-content: space-between; + } + &.app { + display: flex; + align-items: center; + padding-bottom: 24px; + .app-qr { + display: flex; + align-items: center; + flex-direction: column; + margin-right: 40px; + > img { + height: 120px; + } + > span { + font-size: 14px; + } + } + } + + &.gauge { + display: flex; + align-items: center; + } + + &.wait-handle { + padding-bottom: 24px; + overflow-y: auto; + >p { + font-size: 18px; + } + :deep(.ant-tag){ + padding: 1px 8px; + font-size: 15px; + } + } + + .count { + font-size: 30px; + font-weight: 700; + margin-bottom: 10px; + } +} +.footer { + width: 100%; + border-top: 1px solid #e9e9e9; + padding: 10px 0; + background: #fff; + z-index: 1; +} diff --git a/admin-web/typescript-ant-design-vue/src/views/system/home/index.vue b/admin-web/typescript-ant-design-vue/src/views/system/home/index.vue new file mode 100644 index 00000000..50114d06 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/home/index.vue @@ -0,0 +1,258 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/login/login.less b/admin-web/typescript-ant-design-vue/src/views/system/login/login.less new file mode 100644 index 00000000..f071d84e --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/login/login.less @@ -0,0 +1,152 @@ +.login-container { + width: 100%; + height: 100%; + background: url(/images/login-bg.png) no-repeat center; + background-size: cover; + + .logo-box { + margin: auto; + width: 60%; + .logo { + width: 180px; + height: 40px; + align-self: start; + margin-top: 54px; + } + } + + .login-box { + display: flex; + align-items: center; + justify-content: space-between; + margin: auto; + width: 60%; + height: calc(100% - 94px); + } + + .box-item { + &.login { + background: #ffffff; + border-radius: 6px; + padding: 60px 42px; + position: relative; + width: 434px; + height: 540px; + box-shadow: 0px 8px 16px 2px rgba(15, 65, 249, 0.04); + } + .login-qr { + position: absolute; + top: 0; + right: 0; + width: 66px; + height: 66px; + } + .welcome { + margin-top: 44px; + font-size: 42px; + font-weight: bold; + color: #ffffff; + p { + margin-bottom: 0; + } + .desc { + font-size: 14px; + font-weight: 500; + margin: 5px 0 0; + } + } + .login-person { + .img-box { + width: 312px; + height: 312px; + text-align: center; + line-height: 312px; + > img { + width: 290px; + height: 257px; + opacity: 1; + } + } + + .qr-desc { + margin-top: 3px; + font-size: 14px; + text-align: center; + color: #ffffff; + opacity: 0.3; + } + } + .login-title { + font-size: 30px; + font-weight: 700; + text-align: center; + color: #1e1e1e; + } + .login-form { + margin-top: 37px; + } + .ant-input, + .ant-input-affix-wrapper { + height: 44px; + border: 1px solid #ededed; + border-radius: 4px; + } + + .eye-box { + position: absolute; + right: 15px; + top: 10px; + .eye-icon { + width: 20px; + height: 20px; + cursor: pointer; + } + } + .btn { + width: 350px; + height: 50px; + background: #1890ff; + border-radius: 4px; + font-size: 16px; + font-weight: 700; + text-align: center; + color: #ffffff; + line-height: 50px; + cursor: pointer; + } + } + + .more { + margin-top: 50px; + .title-box { + display: flex; + align-items: center; + justify-content: center; + > p { + margin-bottom: 0; + } + } + .line { + width: 114px; + height: 1px; + background: #e6e6e6; + } + .title { + font-size: 14px; + font-weight: 500; + color: #a1aebe; + margin: 0 19px; + } + .login-type { + padding: 0 50px; + margin-top: 25px; + display: flex; + align-items: center; + justify-content: space-between; + > img { + width: 22px; + height: 22px; + } + } + } +} diff --git a/admin-web/typescript-ant-design-vue/src/views/system/login/login.vue b/admin-web/typescript-ant-design-vue/src/views/system/login/login.vue new file mode 100644 index 00000000..f2730970 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/login/login.vue @@ -0,0 +1,128 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/menu/components/menu-operate-modal.vue b/admin-web/typescript-ant-design-vue/src/views/system/menu/components/menu-operate-modal.vue new file mode 100644 index 00000000..f24fe39d --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/menu/components/menu-operate-modal.vue @@ -0,0 +1,280 @@ + + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/menu/components/menu-tree-select.vue b/admin-web/typescript-ant-design-vue/src/views/system/menu/components/menu-tree-select.vue new file mode 100644 index 00000000..25b56d75 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/menu/components/menu-tree-select.vue @@ -0,0 +1,73 @@ + + + diff --git a/admin-web/typescript-ant-design-vue/src/views/system/menu/menu-list-table-columns.ts b/admin-web/typescript-ant-design-vue/src/views/system/menu/menu-list-table-columns.ts new file mode 100644 index 00000000..ee35fa04 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/menu/menu-list-table-columns.ts @@ -0,0 +1,72 @@ +/* + * @Description:表格列 + * @Author: zhuoda + * @Date: 2021-08-26 + * @LastEditTime: 2021-09-01 20:59:53 + * @LastEditors: zhuoda + */ + +import { reactive } from 'vue'; +export const columns = reactive([ + { + title: '名称', + dataIndex: 'menuName', + key: 'ID', + }, + { + title: '类型', + dataIndex: 'menuType', + slots: { customRender: 'type' }, + }, + { + title: '图标', + dataIndex: 'icon', + slots: { customRender: 'icon' }, + width: 50, + }, + { + title: '组件', + dataIndex: 'component', + ellipsis: true, + }, + { + title: '路由', + dataIndex: 'path', + ellipsis: true, + }, + { + title: '权限', + dataIndex: 'perms', + ellipsis: true, + }, + { + title: '外链', + dataIndex: 'frameFlag', + slots: { customRender: 'frameFlag' }, + }, + { + title: '缓存', + dataIndex: 'cacheFlag', + slots: { customRender: 'cacheFlag' }, + }, + { + title: '禁用', + dataIndex: 'disabledFlag', + slots: { customRender: 'disabledFlag' }, + }, + { + title: '顺序', + dataIndex: 'sort', + }, + { + title: '创建时间', + dataIndex: 'createTime', + width: 150, + }, + { + title: '操作', + dataIndex: 'menuId', + slots: { customRender: 'operate' }, + width: 150, + }, +]); diff --git a/admin-web/typescript-ant-design-vue/src/views/system/menu/menu-list.vue b/admin-web/typescript-ant-design-vue/src/views/system/menu/menu-list.vue new file mode 100644 index 00000000..b7da553c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/views/system/menu/menu-list.vue @@ -0,0 +1,402 @@ + + diff --git a/admin-web/typescript-ant-design-vue/src/vite-env.d.ts b/admin-web/typescript-ant-design-vue/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/admin-web/typescript-ant-design-vue/tsconfig.json b/admin-web/typescript-ant-design-vue/tsconfig.json new file mode 100644 index 00000000..30aadf2c --- /dev/null +++ b/admin-web/typescript-ant-design-vue/tsconfig.json @@ -0,0 +1,42 @@ +/* 具体查看 https://aka.ms/tsconfig.json 网址配置 */ +/* 中文网址 https://www.staging-typescript.org/zh/tsconfig 网址配置 */ + +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "jsx": "preserve", + "baseUrl": ".", + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "experimentalDecorators": true, + "lib": ["esnext", "dom"], + "types": ["vite/client","node"], + "typeRoots": ["./node_modules/@types/", "./types"], + "skipLibCheck": true, + "paths": { + "/@/*": ["src/*"] + } + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.vue", + "tests/**/*.ts", + "src/utils/path.js", + "types/**/*.d.ts", + "types/**/*.ts", + "types/global.d.ts", + "types/shims-tsx.d.ts", + "types/shims-vue.d.ts", + "mock/asyncRoutes.ts" + ], + "exclude": ["node_modules", "dist", "**/*.js"] +} diff --git a/admin-web/typescript-ant-design-vue/vite.config.ts b/admin-web/typescript-ant-design-vue/vite.config.ts new file mode 100644 index 00000000..f65172d5 --- /dev/null +++ b/admin-web/typescript-ant-design-vue/vite.config.ts @@ -0,0 +1,70 @@ +/* + * @Description: vite配置 + * @Author: zhuoda + * @Date: 2021-08-03 + * @LastEditTime: 2021-08-27 + * @LastEditors: zhuoda + */ +import { resolve } from 'path'; +import vue from '@vitejs/plugin-vue'; + +const pathResolve = (dir: string): any => { + return resolve(__dirname, '.', dir); +}; + +export default { + base: process.env.NODE_ENV === 'production' ? '/manages/' : '/', + root: process.cwd(), + resolve: { + alias: [ + // 国际化替换 + { + find: 'vue-i18n', + replacement: 'vue-i18n/dist/vue-i18n.cjs.js', + }, + // 绝对路径重命名:/@/xxxx => src/xxxx + { + find: /\/@\//, + replacement: pathResolve('src') + '/', + }, + { + find: /^~/, + replacement: '', + }, + ], + }, + // 服务端渲染 + server: { + host: '0.0.0.0', + port: 8081, + }, + plugins: [vue()], + optimizeDeps: { + include: ['ant-design-vue/es/locale/zh_CN', 'moment/dist/locale/zh-cn', 'ant-design-vue/es/locale/en_US', 'moment/dist/locale/eu'], + exclude: ['vue-demi'], + }, + build: { + terserOptions: { + compress: { + keep_infinity: true, + drop_console: true, + }, + }, + brotliSize: false, + chunkSizeWarningLimit: 2000, + }, + css: { + preprocessorOptions: { + less: { + modifyVars: { + hack: `true; @import (reference) "${resolve('/@/theme/index.less')}";`, + }, + javascriptEnabled: true, + }, + }, + }, + define: { + __INTLIFY_PROD_DEVTOOLS__: false, + 'process.env': process.env, + }, +}; diff --git a/smart-admin-h5/.browserslistrc b/smart-admin-h5/.browserslistrc deleted file mode 100644 index d6471a38..00000000 --- a/smart-admin-h5/.browserslistrc +++ /dev/null @@ -1,2 +0,0 @@ -> 1% -last 2 versions diff --git a/smart-admin-h5/.editorconfig b/smart-admin-h5/.editorconfig deleted file mode 100644 index 4881e66d..00000000 --- a/smart-admin-h5/.editorconfig +++ /dev/null @@ -1,15 +0,0 @@ -root = true - -[*] -# 字符 -charset = utf-8 -# 空格 -indent_style = space -# 2个空格缩进 -indent_size = 2 -# 换行符 -end_of_line = lf -# 文件的最后插入一个空行 -insert_final_newline = true -# 删除行尾的空格 -trim_trailing_whitespace = true diff --git a/smart-admin-h5/.env.development b/smart-admin-h5/.env.development deleted file mode 100644 index b698907c..00000000 --- a/smart-admin-h5/.env.development +++ /dev/null @@ -1,3 +0,0 @@ -NODE_ENV = development -VUE_APP_ENV = dev -VUE_APP_URL = http://127.0.0.1:10086/smart-admin-api diff --git a/smart-admin-h5/.env.local b/smart-admin-h5/.env.local deleted file mode 100644 index 6d07d04c..00000000 --- a/smart-admin-h5/.env.local +++ /dev/null @@ -1,3 +0,0 @@ -NODE_ENV = development -VUE_APP_ENV = local -VUE_APP_URL = http://127.0.0.1:10086/smart-admin-api diff --git a/smart-admin-h5/.env.pre b/smart-admin-h5/.env.pre deleted file mode 100644 index 80c46b0e..00000000 --- a/smart-admin-h5/.env.pre +++ /dev/null @@ -1,3 +0,0 @@ -NODE_ENV = production -VUE_APP_ENV = pre -VUE_APP_URL = http://smartadmin.1024lab.net/smart-admin-api diff --git a/smart-admin-h5/.env.prod b/smart-admin-h5/.env.prod deleted file mode 100644 index 0e1616d4..00000000 --- a/smart-admin-h5/.env.prod +++ /dev/null @@ -1,3 +0,0 @@ -NODE_ENV = production -VUE_APP_ENV = prod -VUE_APP_URL = http://smartadmin.1024lab.net/smart-admin-api diff --git a/smart-admin-h5/.env.sit b/smart-admin-h5/.env.sit deleted file mode 100644 index 411bc968..00000000 --- a/smart-admin-h5/.env.sit +++ /dev/null @@ -1,3 +0,0 @@ -NODE_ENV = production -VUE_APP_ENV = sit -VUE_APP_URL = http://smartadmin.1024lab.net/smart-admin-api diff --git a/smart-admin-h5/.eslintignore b/smart-admin-h5/.eslintignore deleted file mode 100644 index 7c435adc..00000000 --- a/smart-admin-h5/.eslintignore +++ /dev/null @@ -1,7 +0,0 @@ - -# 忽略项目中某些文件的提交代码规范 - -build/*.js -src/assets -public -dist diff --git a/smart-admin-h5/.eslintrc.js b/smart-admin-h5/.eslintrc.js deleted file mode 100644 index 27350869..00000000 --- a/smart-admin-h5/.eslintrc.js +++ /dev/null @@ -1,232 +0,0 @@ -module.exports = { - root: true, - env: { - node: true - }, - extends: [ - 'plugin:vue/essential', - 'eslint:recommended' - ], - parserOptions: { - parser: 'babel-eslint' - }, - rules: { - // 具体请看 https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/max-attributes-per-line.md - 'vue/max-attributes-per-line': [ - 2, - { - singleline: 10, - multiline: { - max: 1, - allowFirstLine: false - } - } - ], - // 在单行元素的内容前后需要换行符 - 'vue/singleline-html-element-content-newline': 'off', - // 在多行元素的内容之前和之后需要换行符 - 'vue/multiline-html-element-content-newline': 'off', - // JS/JSX中的组件名应该 大写驼峰 命名法 - 'vue/name-property-casing': ['error', 'PascalCase'], - // 给v-for设置键值,与key结合使用,可以高效的更新虚拟DOM - "vue/require-v-for-key": 1, - 'vue/no-v-html': 'off', - // 在对象中强制使用getter/setter - 'accessor-pairs': 2, - // 在箭头函数之前/之后需要空格 - 'arrow-spacing': [ - 2, - { - before: true, - after: true - } - ], - // 在打开块之后和关闭块之前,禁止或强制执行块内部的空格 - 'block-spacing': [2, 'always'], - // 需要大括号样式 - 'brace-style': [ - 2, - '1tbs', - { - allowSingleLine: true - } - ], - // 需要驼峰命名 - camelcase: [ - 0, - { - properties: 'always' - } - ], - // 要求或禁止使用尾随逗号;最后一个属性是不需要逗号 - 'comma-dangle': [2, 'never'], - // 强制逗号旁边的间距: 左右一个空格 - 'comma-spacing': [ - 2, - { - before: false, - after: true - } - ], - // 逗号风格 - 'comma-style': [2, 'last'], - // 构建方法中使用super方法 - 'constructor-super': 2, - curly: [2, 'multi-line'], - // 在dot之前和之后强制换行 - 'dot-location': [2, 'property'], - // 在文件末尾要求或禁止换行 - 'eol-last': 2, - // 是否使用全等 - eqeqeq: ['error', 'always', { null: 'ignore' }], - // 在生成器函数中强制执行*周围的间距 - 'generator-star-spacing': [2, { - 'before': true, - 'after': true - }], - // 强制执行回调错误处理 - 'handle-callback-err': [1, '^(err|error)$'], - // 强制执行一致的缩进 - 'indent': [2, 2, { - 'SwitchCase': 1 - }], - // 强制在JSX文件中一致使用单引号 - 'jsx-quotes': [2, 'prefer-single'], - // 在对象属性中强制键和值之间的一致间距 - 'key-spacing': [2, { - 'beforeColon': false, - 'afterColon': true - }], - // 关键字前后强制执行一致的间距 - 'keyword-spacing': [2, { - 'before': true, - 'after': true - }], - // 要求构造函数名称以大写字母开头 - 'new-cap': [2, { - 'newIsCap': true, - 'capIsNew': false - }], - 'new-parens': 2, // 调用不带参数的函数时需要括号 - 'no-array-constructor': 2, // 禁止阵列构建器 - 'no-caller': 2, // 禁止使用来电者/被叫者 - 'no-console': 'off', // 不允许使用控制台 - 'no-class-assign': 2, // 禁止修改类声明的变量 - 'no-cond-assign': 2, // 在条件语句中禁止赋值运算符 - 'no-const-assign': 2, // 禁止修改使用const声明的变量 - 'no-control-regex': 0, // 禁止正则表达式中的控制字符 - 'no-delete-var': 2, // 禁止删除变量 - 'no-dupe-args': 2, // 在函数定义中禁止重复参数 - 'no-dupe-class-members': 2, // 禁止在类成员中重复名称 - 'no-dupe-keys': 2, // 禁止对象重复声明属性 - 'no-duplicate-case': 2, // 规则禁止重复案例标签 - 'no-empty-character-class': 2, // 禁止在正则表达式中使用空字符类 - 'no-empty-pattern': 2, // 不允许空的解构模式 - 'no-eval': 2, // 禁止使用eval() - 'no-ex-assign': 2, // 禁止在catch子句中重新分配异常 - 'no-extend-native': 2, // 禁止扩展原生对象 - 'no-extra-bind': 2, // 禁止不必要的功能绑定 - 'no-extra-boolean-cast': 2, // 禁止不必要的布尔类型转换 - 'no-extra-parens': [2, 'functions'], // 禁止不必要的括号 - 'no-fallthrough': 2, // 禁止太多陈述描述 - 'no-floating-decimal': 2, // 禁止浮动小数 - 'no-func-assign': 2, // 禁止重新分配函数声明 - 'no-implied-eval': 2, - 'no-inner-declarations': [2, 'functions'], // 禁止嵌套块中的变量或函数声明 - 'no-invalid-regexp': 2, // 禁止在RegExp中使用无效的正则表达式字符串 - 'no-irregular-whitespace': 2, // 不允许不规则的空白 - 'no-iterator': 2, // 禁止迭代器 - 'no-label-var': 2, // 禁止变量名称的标签 - 'no-labels': [2, { - 'allowLoop': false, - 'allowSwitch': false - }], - 'no-lone-blocks': 2, // 禁止不必要的嵌套块 - 'no-mixed-spaces-and-tabs': 2, // 禁止使用混合空格和制表符进行缩进 - 'no-multi-spaces': 2, // 禁止多个空格 - 'no-multi-str': 2, // 禁止多行字符串 - 'no-multiple-empty-lines': [2, { // 禁止多个空行 - 'max': 1 - }], - 'no-native-reassign': 2, - 'no-negated-in-lhs': 2, - 'no-new-object': 2, - 'no-new-require': 2, - 'no-new-symbol': 2, - 'no-new-wrappers': 2, - 'no-obj-calls': 2, - 'no-octal': 2, - 'no-octal-escape': 2, - 'no-path-concat': 2, - 'no-proto': 2, - 'no-redeclare': 2, - 'no-regex-spaces': 2, - 'no-return-assign': [2, 'except-parens'], - 'no-self-assign': 2, - 'no-self-compare': 2, - 'no-sequences': 2, - 'no-shadow-restricted-names': 2, - 'no-spaced-func': 2, - 'no-sparse-arrays': 2, - 'no-this-before-super': 2, - 'no-throw-literal': 2, - 'no-trailing-spaces': 2, - 'no-undef': 0, - 'no-undef-init': 2, - 'no-unexpected-multiline': 2, - 'no-unmodified-loop-condition': 2, // 禁止未修改的循环条件 - 'no-unneeded-ternary': [2, { // 当存在更简单的替代方案时,不允许三元运算符 - 'defaultAssignment': false - }], - 'no-unreachable': 2, // 返回,抛出,继续和中断语句后禁止无法访问的代码 - 'no-unsafe-finally': 2, // 禁止finally块中的控制流语句 - 'no-unused-vars': [2, { // 禁止使用未声明的变量 - 'vars': 'all', - 'args': 'none' - }], - 'no-useless-call': 2, // 禁止不必要的call()和apply()方法 - 'no-useless-computed-key': 2, // 禁止在对象上使用不必要的计算属性键 - 'no-useless-constructor': 2, // 禁止不必要的构造方法 - 'no-useless-escape': 0, // 禁止不必要的转义用法 - 'no-whitespace-before-property': 2, // 在属性之前禁止空格 - 'no-with': 2, - 'one-var': [2, { - 'initialized': 'never' - }], - 'operator-linebreak': [2, 'after', { // 为维护强制执行一致的换行方式 - 'overrides': { - '?': 'before', - ':': 'before' - } - }], - 'padded-blocks': [2, 'never'], // 在块内要求或禁止填充 - 'quotes': [2, 'single', { - 'avoidEscape': true, - 'allowTemplateLiterals': true - }], - semi: ["error", "always"], - 'space-before-blocks': [2, 'always'], // 不要存在多余的块空间 - 'space-before-function-paren': [2, 'never'], - 'space-in-parens': [2, 'never'], - 'space-infix-ops': 2, - 'space-unary-ops': [2, { - 'words': true, - 'nonwords': false - }], - 'spaced-comment': [2, 'always', { - 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] - }], - 'template-curly-spacing': [2, 'never'], - 'use-isnan': 2, - 'valid-typeof': 2, - 'wrap-iife': [2, 'any'], - 'yield-star-spacing': [2, 'both'], - 'yoda': [2, 'never'], - 'prefer-const': 1, - 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, - 'object-curly-spacing': [2, 'always', { - objectsInObjects: false - }], - 'array-bracket-spacing': [2, 'never'] - } -} diff --git a/smart-admin-h5/.gitignore b/smart-admin-h5/.gitignore deleted file mode 100644 index 24d694ca..00000000 --- a/smart-admin-h5/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -node_modules -/dist - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Editor directories and files -.DS_Store -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? - -package-lock.json -yarn.lock - -build/env.js diff --git a/smart-admin-h5/.postcssrc.js b/smart-admin-h5/.postcssrc.js deleted file mode 100644 index e2783a57..00000000 --- a/smart-admin-h5/.postcssrc.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - plugins: { - autoprefixer: { - overrideBrowserslist: ['Android 4.1', 'iOS 7.1', 'Chrome > 31', 'ff > 31', 'ie >= 8'] - }, - 'postcss-pxtorem': { - rootValue: 37.5, - propList: ['*'], - } - } -} diff --git a/smart-admin-h5/.prettierrc.js b/smart-admin-h5/.prettierrc.js deleted file mode 100644 index c19422ec..00000000 --- a/smart-admin-h5/.prettierrc.js +++ /dev/null @@ -1,31 +0,0 @@ -module.exports = { - // 缩进字节数 - tabWidth: 2, - // 使用单引号代替双引号 - singleQuote: true, - // 在对象或数组最后一个元素后面是否加逗号(在ES5中加尾逗号) - trailingComma: 'none', - // 句尾添加分号 - semi: true, - // 默认值。因为使用了一些折行敏感型的渲染器(如GitHub comment)而按照markdown文本样式进行折行 - proseWrap: 'always', - // (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号 - arrowParens: 'avoid', - // 在对象,数组括号与文字之间加空格 "{ foo: bar }" - bracketSpacing: true, - // 在jsx中把'>' 是否单独放一行 - jsxBracketSameLine: false, - // 缩进不使用tab,使用空格 - useTabs: false, - // 不让prettier使用eslint的代码格式进行校验 - eslintIntegration: true, - overrides: [ - { - files: '.prettierrc', - options: { - parser: 'json' - } - } - ], - endOfLine: 'auto' -} diff --git a/smart-admin-h5/.sentryclirc b/smart-admin-h5/.sentryclirc deleted file mode 100644 index b6f61dbd..00000000 --- a/smart-admin-h5/.sentryclirc +++ /dev/null @@ -1,7 +0,0 @@ -[defaults] -url = https://sentry.1024lab.net/ -org = 1024lab-sentry -project = smart-admin-h5 - -[auth] -token = 8dflijsldjkasdo3u49230948pkjdasoia8023jl3k4jr29o81029i40534p545ke diff --git a/smart-admin-h5/README.md b/smart-admin-h5/README.md deleted file mode 100644 index c5f8fa10..00000000 --- a/smart-admin-h5/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# SmartAdmin-H5 - -#### 介绍 -SmartAdmin-H5 是SmartAdmin 平台的移动端web项目 diff --git a/smart-admin-h5/babel.config.js b/smart-admin-h5/babel.config.js deleted file mode 100644 index 58b18fe8..00000000 --- a/smart-admin-h5/babel.config.js +++ /dev/null @@ -1,16 +0,0 @@ - -module.exports = { - presets: [['@vue/cli-plugin-babel/preset', {useBuiltIns: 'usage', corejs: 3}]], - plugins:[ - // vant-ui 按需引入,详情:https://github.com/ElementUI/babel-plugin-component - // [ - // 'import', - // { - // libraryName: 'vant', - // libraryDirectory: 'es', - // style: true - // }, - // 'vant' - // ] - ] -}; diff --git a/smart-admin-h5/package.json b/smart-admin-h5/package.json deleted file mode 100644 index cd09ecb3..00000000 --- a/smart-admin-h5/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "smart-admin-h5", - "version": "1.0.0", - "description": "基于vue和vant的h5模板", - "author": "zhuoluodada@qq.com", - "private": true, - "scripts": { - "local": "vue-cli-service serve --open --mode local", - "dev": "vue-cli-service serve --open", - "build": "vue-cli-service build", - "build:sit": "vue-cli-service build --mode sit", - "build:pre": "vue-cli-service build --mode pre", - "build:prod": "vue-cli-service build --mode prod", - "stage": "vue-cli-service build --mode staging", - "lint": "vue-cli-service lint" - }, - "dependencies": { - "@sentry/browser": "^5.13.2", - "@sentry/integrations": "^5.13.2", - "axios": "^0.19.2", - "core-js": "^3.6.5", - "fastclick": "^1.0.6", - "js-cookie": "^2.2.1", - "lib-flexible": "^0.3.2", - "lodash": "^4.17.20", - "moment": "^2.29.0", - "nprogress": "^0.2.0", - "regenerator-runtime": "^0.13.5", - "vant": "^2.11.1", - "vue": "^2.6.12", - "vue-enum": "^1.0.5", - "vue-loading-overlay": "^3.4.2", - "vue-router": "^3.4.0", - "vuex": "^3.6.0" - }, - "devDependencies": { - "@sentry/webpack-plugin": "^1.11.1", - "@vue/cli-plugin-babel": "~4.5.0", - "@vue/cli-plugin-eslint": "~4.5.0", - "@vue/cli-plugin-router": "~4.5.0", - "@vue/cli-plugin-vuex": "~4.5.0", - "@vue/cli-service": "~4.5.0", - "babel-eslint": "^10.1.0", - "babel-plugin-import": "^1.13.0", - "babel-plugin-transform-remove-console": "^6.9.4", - "compression-webpack-plugin": "^3.1.0", - "eslint": "^6.7.2", - "eslint-plugin-vue": "^6.2.2", - "node-sass": "^4.14.1", - "postcss-pxtorem": "^5.1.1", - "sass": "^1.3.0", - "sass-loader": "^9.0.3", - "script-ext-html-webpack-plugin": "^2.1.5", - "uglifyjs-webpack-plugin": "^2.2.0", - "vue-template-compiler": "^2.6.12", - "webpack-bundle-analyzer": "^4.2.0" - } -} diff --git a/smart-admin-h5/public/index.html b/smart-admin-h5/public/index.html deleted file mode 100644 index 5f5a1f86..00000000 --- a/smart-admin-h5/public/index.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - <% if (process.env.NODE_ENV === 'production') { %> - <% for(var css of htmlWebpackPlugin.options.cdn.css) { %> - - - <% } %> <% for(var js of htmlWebpackPlugin.options.cdn.js) { %> - - - <% } %> <% } %> - - - - <% if (process.env.NODE_ENV === 'development') { %> - - <% } %> - - - - - - <%= htmlWebpackPlugin.options.title %> - - - - - -
- - - diff --git a/smart-admin-h5/src/App.vue b/smart-admin-h5/src/App.vue deleted file mode 100644 index f3b5bda4..00000000 --- a/smart-admin-h5/src/App.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/smart-admin-h5/src/api/employee.js b/smart-admin-h5/src/api/employee.js deleted file mode 100644 index 76f30459..00000000 --- a/smart-admin-h5/src/api/employee.js +++ /dev/null @@ -1,43 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; -export const employeeApi = { - // 员工管理查询 - getEmployeeList: (data) => { - return postAxios('admin/employee/query', data); - }, - // 添加员工 - addEmployee: (data) => { - return postAxios('admin/employee/add', data); - }, - // 更新员工信息 - updateEmployee: (data) => { - return postAxios('admin/employee/update', data); - }, - // 禁用启用单个员工 - updateStatus: (employeeId, status) => { - return getAxios('admin/employee/updateStatus/' + employeeId + '/' + status); - }, - // 批量禁用 - updateStatusBatch: (data) => { - return postAxios('admin/employee/batchUpdateStatus', data); - }, - // 单个员工角色授权 - updateRoles: (data) => { - return postAxios('admin/employee/updateRoles', data); - }, - // 修改密码 - updatePwd: (data) => { - return postAxios('admin/employee/updatePwd', data); - }, - // 重置密码 - resetPassword: (employeeId) => { - return getAxios('admin/employee/resetPasswd/' + employeeId); - }, - // 通过部门id获取当前部门的人员&没有部门的人 - getListEmployeeByDeptId: (departmentId) => { - return getAxios('admin/employee/listEmployeeByDeptId/' + departmentId); - }, - // 删除员工 - deleteEmployee: (employeeId) => { - return postAxios('admin/employee/delete/' + employeeId); - } -}; diff --git a/smart-admin-h5/src/api/file.js b/smart-admin-h5/src/api/file.js deleted file mode 100644 index 2bc1a85a..00000000 --- a/smart-admin-h5/src/api/file.js +++ /dev/null @@ -1,14 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; -import config from '@/config'; -import Cookies from '@/lib/cookie'; -const baseUrl = config.baseUrl.apiUrl; - -export const fileApi = { - // 文件上传 - fileUpload: (folder, data) => { - const url = baseUrl + '/common/file/upload/' + folder + '?x-access-token=' + Cookies.getToken(); - return postAxios(url, data, { - headers: { 'Content-Type': 'multipart/form-data' } - }); - } -}; diff --git a/smart-admin-h5/src/api/login.js b/smart-admin-h5/src/api/login.js deleted file mode 100644 index aad9ae16..00000000 --- a/smart-admin-h5/src/api/login.js +++ /dev/null @@ -1,10 +0,0 @@ -import { getAxios, postAxios } from '@/lib/http'; - -export const loginApi = { - login: (data) => { - return postAxios('/session/login', data); - }, - logout: (token) => { - return getAxios(`/session/logOut?x-access-token=${token}`); - } -}; diff --git a/smart-admin-h5/src/api/system-config.js b/smart-admin-h5/src/api/system-config.js deleted file mode 100644 index a9384d21..00000000 --- a/smart-admin-h5/src/api/system-config.js +++ /dev/null @@ -1,31 +0,0 @@ -// 系统参数API -import { - postAxios, - getAxios -} from '@/lib/http'; -export const systemConfigApi = { - // 查询系统参数列表 - getSystemConfigList: (data) => { - return postAxios('/admin/systemConfig/getListPage', data); - }, - // 添加系统参数 - addSystemConfig: (data) => { - return postAxios('/admin/systemConfig/add', data); - }, - // 更新单条系统参数 - updateSystemConfig: (data) => { - return postAxios('/admin/systemConfig/update', data); - }, - // 通过key获取对应的信息 - getConfigListByKey: (key) => { - return getAxios(`/admin/systemConfig/selectByKey?configKey=${key}`); - }, - // 根据分组查询所有系统配置 - getListByGroup: (group) => { - return getAxios(`/admin/systemConfig/getListByGroup?group=${group}`); - }, - // 获取系统版本信息 - getCodeVersion: () => { - return getAxios('/admin/codeVersion'); - } -}; diff --git a/smart-admin-h5/src/api/user.js b/smart-admin-h5/src/api/user.js deleted file mode 100644 index 7d2b2a83..00000000 --- a/smart-admin-h5/src/api/user.js +++ /dev/null @@ -1,7 +0,0 @@ -import { getAxios } from '@/lib/http'; - -export const userApi = { - getSession: () => { - return getAxios('/session/get'); - } -}; diff --git a/smart-admin-h5/src/assets/css/index.scss b/smart-admin-h5/src/assets/css/index.scss deleted file mode 100644 index 27597440..00000000 --- a/smart-admin-h5/src/assets/css/index.scss +++ /dev/null @@ -1,5 +0,0 @@ -$text-color: #323233; -$border-color: #ebedf0; -$active-color: #f2f3f5; -$background-color: #f7f8fa; -$background-color-light: #fafafa; diff --git a/smart-admin-h5/src/components/employee/department-employee-selector.vue b/smart-admin-h5/src/components/employee/department-employee-selector.vue deleted file mode 100644 index 7889136a..00000000 --- a/smart-admin-h5/src/components/employee/department-employee-selector.vue +++ /dev/null @@ -1,121 +0,0 @@ -/** -* @description:department-employee-selector -* @author: zhuoda -* @date: 2020/10/30 13:56 -*/ - - - - - - diff --git a/smart-admin-h5/src/components/form/select-picker/SmartEnumSelectPicker.vue b/smart-admin-h5/src/components/form/select-picker/SmartEnumSelectPicker.vue deleted file mode 100644 index 976211d1..00000000 --- a/smart-admin-h5/src/components/form/select-picker/SmartEnumSelectPicker.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - diff --git a/smart-admin-h5/src/components/form/select-picker/SmartSelectPicker b/smart-admin-h5/src/components/form/select-picker/SmartSelectPicker deleted file mode 100644 index c15bf200..00000000 --- a/smart-admin-h5/src/components/form/select-picker/SmartSelectPicker +++ /dev/null @@ -1,59 +0,0 @@ - - - - - diff --git a/smart-admin-h5/src/components/mixin/session-mixin.js b/smart-admin-h5/src/components/mixin/session-mixin.js deleted file mode 100644 index 94026bb0..00000000 --- a/smart-admin-h5/src/components/mixin/session-mixin.js +++ /dev/null @@ -1,25 +0,0 @@ -import cookie from '@/lib/cookie'; -import { userApi } from 'api/user'; - -/** - * 此 mixin为登录以后的页面用的,因为所有的有效路由(排除登录、注册、404,500 这个几个特殊页面)都会走 App.vue里的router - * @author zhuoda - */ -export default { - created: function() { - const token = cookie.getToken(); - // 如果登录过,获取token - if (token && !this.$store.state.user.isHaveGotSessionInfo) { - (async() => { - try { - console.debug(' request session info '); - const res = await userApi.getSession(); - const loginInfo = res.data; - this.$store.commit('user/updateSession', loginInfo); - } catch (e) { - this.$smartSentry.captureException(e); - } - })(); - } - } -}; diff --git a/smart-admin-h5/src/components/van-bar/BackNavBar.vue b/smart-admin-h5/src/components/van-bar/BackNavBar.vue deleted file mode 100644 index bca0b99e..00000000 --- a/smart-admin-h5/src/components/van-bar/BackNavBar.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/smart-admin-h5/src/components/van-bar/RouterNavBar.vue b/smart-admin-h5/src/components/van-bar/RouterNavBar.vue deleted file mode 100644 index 355a57d6..00000000 --- a/smart-admin-h5/src/components/van-bar/RouterNavBar.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/smart-admin-h5/src/config/index.js b/smart-admin-h5/src/config/index.js deleted file mode 100644 index dafb4212..00000000 --- a/smart-admin-h5/src/config/index.js +++ /dev/null @@ -1,46 +0,0 @@ -console.log('project api url : ', process.env.VUE_APP_URL); - -const isProductionEnv = ['production'].includes(process.env.NODE_ENV); - -module.exports = { - // 配置显示在浏览器标签的title - title: 'Smart-Admin-H5', - // token在Cookie中存储的天数,默认7天 - cookieExpires: 7, - /** - * @description api请求基础路径 - */ - baseUrl: { - apiUrl: process.env.VUE_APP_URL, - erpApiUrl: process.env.VUE_APP_ERP_URL, - webSocketUrl: process.env.VUE_APP_SOCKET_URL - }, - /** - * 打包后静态资源地址;如果是走cdn的话,可以配置如下: - * publicPath: isProd ? 'https://cdn.1024lab.net/static/smart-h5/' : '/' - */ - publicPath: isProductionEnv ? '/manage-h5/' : '/', - - // ==================== cdn 相关 begin ==================== - cdn: { - cdnResource: { - css: [], - js: [ - 'https://cdn.bootcss.com/vue/2.6.11/vue.min.js', - 'https://cdn.bootcss.com/vue-router/3.2.0/vue-router.min.js', - 'https://cdn.bootcdn.net/ajax/libs/vuex/3.5.1/vuex.min.js', - 'https://cdn.bootcss.com/axios/0.19.2/axios.min.js', - 'https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.20/lodash.min.js' - ] - }, - // 指定资源加载cdn - externals: { - vue: 'Vue', - 'vue-router': 'VueRouter', - vuex: 'Vuex', - axios: 'axios', - lodash: '_' - } - } - // ==================== cdn 相关 end ==================== -}; diff --git a/smart-admin-h5/src/constants/area.js b/smart-admin-h5/src/constants/area.js deleted file mode 100644 index 26e2ca99..00000000 --- a/smart-admin-h5/src/constants/area.js +++ /dev/null @@ -1,4047 +0,0 @@ -export default { - province_list: { - 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: '台湾省', - 810000: '香港特别行政区', - 820000: '澳门特别行政区', - 900000: '海外' - }, - city_list: { - 110100: '北京市', - 120100: '天津市', - 130100: '石家庄市', - 130200: '唐山市', - 130300: '秦皇岛市', - 130400: '邯郸市', - 130500: '邢台市', - 130600: '保定市', - 130700: '张家口市', - 130800: '承德市', - 130900: '沧州市', - 131000: '廊坊市', - 131100: '衡水市', - 140100: '太原市', - 140200: '大同市', - 140300: '阳泉市', - 140400: '长治市', - 140500: '晋城市', - 140600: '朔州市', - 140700: '晋中市', - 140800: '运城市', - 140900: '忻州市', - 141000: '临汾市', - 141100: '吕梁市', - 150100: '呼和浩特市', - 150200: '包头市', - 150300: '乌海市', - 150400: '赤峰市', - 150500: '通辽市', - 150600: '鄂尔多斯市', - 150700: '呼伦贝尔市', - 150800: '巴彦淖尔市', - 150900: '乌兰察布市', - 152200: '兴安盟', - 152500: '锡林郭勒盟', - 152900: '阿拉善盟', - 210100: '沈阳市', - 210200: '大连市', - 210300: '鞍山市', - 210400: '抚顺市', - 210500: '本溪市', - 210600: '丹东市', - 210700: '锦州市', - 210800: '营口市', - 210900: '阜新市', - 211000: '辽阳市', - 211100: '盘锦市', - 211200: '铁岭市', - 211300: '朝阳市', - 211400: '葫芦岛市', - 220100: '长春市', - 220200: '吉林市', - 220300: '四平市', - 220400: '辽源市', - 220500: '通化市', - 220600: '白山市', - 220700: '松原市', - 220800: '白城市', - 222400: '延边朝鲜族自治州', - 230100: '哈尔滨市', - 230200: '齐齐哈尔市', - 230300: '鸡西市', - 230400: '鹤岗市', - 230500: '双鸭山市', - 230600: '大庆市', - 230700: '伊春市', - 230800: '佳木斯市', - 230900: '七台河市', - 231000: '牡丹江市', - 231100: '黑河市', - 231200: '绥化市', - 232700: '大兴安岭地区', - 310100: '上海市', - 320100: '南京市', - 320200: '无锡市', - 320300: '徐州市', - 320400: '常州市', - 320500: '苏州市', - 320600: '南通市', - 320700: '连云港市', - 320800: '淮安市', - 320900: '盐城市', - 321000: '扬州市', - 321100: '镇江市', - 321200: '泰州市', - 321300: '宿迁市', - 330100: '杭州市', - 330200: '宁波市', - 330300: '温州市', - 330400: '嘉兴市', - 330500: '湖州市', - 330600: '绍兴市', - 330700: '金华市', - 330800: '衢州市', - 330900: '舟山市', - 331000: '台州市', - 331100: '丽水市', - 340100: '合肥市', - 340200: '芜湖市', - 340300: '蚌埠市', - 340400: '淮南市', - 340500: '马鞍山市', - 340600: '淮北市', - 340700: '铜陵市', - 340800: '安庆市', - 341000: '黄山市', - 341100: '滁州市', - 341200: '阜阳市', - 341300: '宿州市', - 341500: '六安市', - 341600: '亳州市', - 341700: '池州市', - 341800: '宣城市', - 350100: '福州市', - 350200: '厦门市', - 350300: '莆田市', - 350400: '三明市', - 350500: '泉州市', - 350600: '漳州市', - 350700: '南平市', - 350800: '龙岩市', - 350900: '宁德市', - 360100: '南昌市', - 360200: '景德镇市', - 360300: '萍乡市', - 360400: '九江市', - 360500: '新余市', - 360600: '鹰潭市', - 360700: '赣州市', - 360800: '吉安市', - 360900: '宜春市', - 361000: '抚州市', - 361100: '上饶市', - 370100: '济南市', - 370200: '青岛市', - 370300: '淄博市', - 370400: '枣庄市', - 370500: '东营市', - 370600: '烟台市', - 370700: '潍坊市', - 370800: '济宁市', - 370900: '泰安市', - 371000: '威海市', - 371100: '日照市', - 371300: '临沂市', - 371400: '德州市', - 371500: '聊城市', - 371600: '滨州市', - 371700: '菏泽市', - 410100: '郑州市', - 410200: '开封市', - 410300: '洛阳市', - 410400: '平顶山市', - 410500: '安阳市', - 410600: '鹤壁市', - 410700: '新乡市', - 410800: '焦作市', - 410900: '濮阳市', - 411000: '许昌市', - 411100: '漯河市', - 411200: '三门峡市', - 411300: '南阳市', - 411400: '商丘市', - 411500: '信阳市', - 411600: '周口市', - 411700: '驻马店市', - 419000: '省直辖县', - 420100: '武汉市', - 420200: '黄石市', - 420300: '十堰市', - 420500: '宜昌市', - 420600: '襄阳市', - 420700: '鄂州市', - 420800: '荆门市', - 420900: '孝感市', - 421000: '荆州市', - 421100: '黄冈市', - 421200: '咸宁市', - 421300: '随州市', - 422800: '恩施土家族苗族自治州', - 429000: '省直辖县', - 430100: '长沙市', - 430200: '株洲市', - 430300: '湘潭市', - 430400: '衡阳市', - 430500: '邵阳市', - 430600: '岳阳市', - 430700: '常德市', - 430800: '张家界市', - 430900: '益阳市', - 431000: '郴州市', - 431100: '永州市', - 431200: '怀化市', - 431300: '娄底市', - 433100: '湘西土家族苗族自治州', - 440100: '广州市', - 440200: '韶关市', - 440300: '深圳市', - 440400: '珠海市', - 440500: '汕头市', - 440600: '佛山市', - 440700: '江门市', - 440800: '湛江市', - 440900: '茂名市', - 441200: '肇庆市', - 441300: '惠州市', - 441400: '梅州市', - 441500: '汕尾市', - 441600: '河源市', - 441700: '阳江市', - 441800: '清远市', - 441900: '东莞市', - 442000: '中山市', - 445100: '潮州市', - 445200: '揭阳市', - 445300: '云浮市', - 450100: '南宁市', - 450200: '柳州市', - 450300: '桂林市', - 450400: '梧州市', - 450500: '北海市', - 450600: '防城港市', - 450700: '钦州市', - 450800: '贵港市', - 450900: '玉林市', - 451000: '百色市', - 451100: '贺州市', - 451200: '河池市', - 451300: '来宾市', - 451400: '崇左市', - 460100: '海口市', - 460200: '三亚市', - 460300: '三沙市', - 460400: '儋州市', - 469000: '省直辖县', - 500100: '重庆市', - 500200: '县', - 510100: '成都市', - 510300: '自贡市', - 510400: '攀枝花市', - 510500: '泸州市', - 510600: '德阳市', - 510700: '绵阳市', - 510800: '广元市', - 510900: '遂宁市', - 511000: '内江市', - 511100: '乐山市', - 511300: '南充市', - 511400: '眉山市', - 511500: '宜宾市', - 511600: '广安市', - 511700: '达州市', - 511800: '雅安市', - 511900: '巴中市', - 512000: '资阳市', - 513200: '阿坝藏族羌族自治州', - 513300: '甘孜藏族自治州', - 513400: '凉山彝族自治州', - 520100: '贵阳市', - 520200: '六盘水市', - 520300: '遵义市', - 520400: '安顺市', - 520500: '毕节市', - 520600: '铜仁市', - 522300: '黔西南布依族苗族自治州', - 522600: '黔东南苗族侗族自治州', - 522700: '黔南布依族苗族自治州', - 530100: '昆明市', - 530300: '曲靖市', - 530400: '玉溪市', - 530500: '保山市', - 530600: '昭通市', - 530700: '丽江市', - 530800: '普洱市', - 530900: '临沧市', - 532300: '楚雄彝族自治州', - 532500: '红河哈尼族彝族自治州', - 532600: '文山壮族苗族自治州', - 532800: '西双版纳傣族自治州', - 532900: '大理白族自治州', - 533100: '德宏傣族景颇族自治州', - 533300: '怒江傈僳族自治州', - 533400: '迪庆藏族自治州', - 540100: '拉萨市', - 540200: '日喀则市', - 540300: '昌都市', - 540400: '林芝市', - 540500: '山南市', - 540600: '那曲市', - 542500: '阿里地区', - 610100: '西安市', - 610200: '铜川市', - 610300: '宝鸡市', - 610400: '咸阳市', - 610500: '渭南市', - 610600: '延安市', - 610700: '汉中市', - 610800: '榆林市', - 610900: '安康市', - 611000: '商洛市', - 620100: '兰州市', - 620200: '嘉峪关市', - 620300: '金昌市', - 620400: '白银市', - 620500: '天水市', - 620600: '武威市', - 620700: '张掖市', - 620800: '平凉市', - 620900: '酒泉市', - 621000: '庆阳市', - 621100: '定西市', - 621200: '陇南市', - 622900: '临夏回族自治州', - 623000: '甘南藏族自治州', - 630100: '西宁市', - 630200: '海东市', - 632200: '海北藏族自治州', - 632300: '黄南藏族自治州', - 632500: '海南藏族自治州', - 632600: '果洛藏族自治州', - 632700: '玉树藏族自治州', - 632800: '海西蒙古族藏族自治州', - 640100: '银川市', - 640200: '石嘴山市', - 640300: '吴忠市', - 640400: '固原市', - 640500: '中卫市', - 650100: '乌鲁木齐市', - 650200: '克拉玛依市', - 650400: '吐鲁番市', - 650500: '哈密市', - 652300: '昌吉回族自治州', - 652700: '博尔塔拉蒙古自治州', - 652800: '巴音郭楞蒙古自治州', - 652900: '阿克苏地区', - 653000: '克孜勒苏柯尔克孜自治州', - 653100: '喀什地区', - 653200: '和田地区', - 654000: '伊犁哈萨克自治州', - 654200: '塔城地区', - 654300: '阿勒泰地区', - 659000: '自治区直辖县级行政区划', - 710100: '台北市', - 710200: '高雄市', - 710300: '台南市', - 710400: '台中市', - 710500: '金门县', - 710600: '南投县', - 710700: '基隆市', - 710800: '新竹市', - 710900: '嘉义市', - 711100: '新北市', - 711200: '宜兰县', - 711300: '新竹县', - 711400: '桃园县', - 711500: '苗栗县', - 711700: '彰化县', - 711900: '嘉义县', - 712100: '云林县', - 712400: '屏东县', - 712500: '台东县', - 712600: '花莲县', - 712700: '澎湖县', - 712800: '连江县', - 810100: '香港岛', - 810200: '九龙', - 810300: '新界', - 820100: '澳门半岛', - 820200: '离岛', - 900400: '阿富汗', - 900800: '阿尔巴尼亚', - 901000: '南极洲', - 901200: '阿尔及利亚', - 901600: '美属萨摩亚', - 902000: '安道尔', - 902400: '安哥拉', - 902800: '安提瓜和巴布达', - 903100: '阿塞拜疆', - 903200: '阿根廷', - 903600: '澳大利亚', - 904000: '奥地利', - 904400: '巴哈马', - 904800: '巴林', - 905000: '孟加拉', - 905100: '亚美尼亚', - 905200: '巴巴多斯', - 905600: '比利时', - 906000: '百慕大', - 906400: '不丹', - 906800: '玻利维亚', - 907000: '波黑', - 907200: '博茨瓦纳', - 907400: '布韦岛', - 907600: '巴西', - 908400: '伯利兹', - 908600: '英属印度洋领地', - 909000: '所罗门群岛', - 909200: '英属维尔京群岛', - 909600: '文莱', - 910000: '保加利亚', - 910400: '缅甸', - 910800: '布隆迪', - 911200: '白俄罗斯', - 911600: '柬埔寨', - 912000: '喀麦隆', - 912400: '加拿大', - 913200: '佛得角', - 913600: '开曼群岛', - 914000: '中非', - 914400: '斯里兰卡', - 914800: '乍得', - 915200: '智利', - 916200: '圣诞岛', - 916600: '科科斯群岛', - 917000: '哥伦比亚', - 917400: '科摩罗', - 917500: '马约特', - 917800: '刚果(布)', - 918000: '刚果(金)', - 918400: '库克群岛', - 918800: '哥斯达黎加', - 919100: '克罗地亚', - 919200: '古巴', - 919600: '塞浦路斯', - 920300: '捷克', - 920400: '贝宁', - 920800: '丹麦', - 921200: '多米尼克', - 921400: '多米尼加', - 921800: '厄瓜多尔', - 922200: '萨尔瓦多', - 922600: '赤道几内亚', - 923100: '埃塞俄比亚', - 923200: '厄立特里亚', - 923300: '爱沙尼亚', - 923400: '法罗群岛', - 923800: '马尔维纳斯群岛( 福克兰)', - 923900: '南乔治亚岛和南桑威奇群岛', - 924200: '斐济群岛', - 924600: '芬兰', - 924800: '奥兰群岛', - 925000: '法国', - 925400: '法属圭亚那', - 925800: '法属波利尼西亚', - 926000: '法属南部领地', - 926200: '吉布提', - 926600: '加蓬', - 926800: '格鲁吉亚', - 927000: '冈比亚', - 927500: '巴勒斯坦', - 927600: '德国', - 928800: '加纳', - 929200: '直布罗陀', - 929600: '基里巴斯', - 930000: '希腊', - 930400: '格陵兰', - 930800: '格林纳达', - 931200: '瓜德罗普', - 931600: '关岛', - 932000: '危地马拉', - 932400: '几内亚', - 932800: '圭亚那', - 933200: '海地', - 933400: '赫德岛和麦克唐纳群岛', - 933600: '梵蒂冈', - 934000: '洪都拉斯', - 934800: '匈牙利', - 935200: '冰岛', - 935600: '印度', - 936000: '印尼', - 936400: '伊朗', - 936800: '伊拉克', - 937200: '爱尔兰', - 937600: '以色列', - 938000: '意大利', - 938400: '科特迪瓦', - 938800: '牙买加', - 939200: '日本', - 939800: '哈萨克斯坦', - 940000: '约旦', - 940400: '肯尼亚', - 940800: '朝鲜 北朝鲜', - 941000: '韩国', - 941400: '科威特', - 941700: '吉尔吉斯斯坦', - 941800: '老挝', - 942200: '黎巴嫩', - 942600: '莱索托', - 942800: '拉脱维亚', - 943000: '利比里亚', - 943400: '利比亚', - 943800: '列支敦士登', - 944000: '立陶宛', - 944200: '卢森堡', - 945000: '马达加斯加', - 945400: '马拉维', - 945800: '马来西亚', - 946200: '马尔代夫', - 946600: '马里', - 947000: '马耳他', - 947400: '马提尼克', - 947800: '毛里塔尼亚', - 948000: '毛里求斯', - 948400: '墨西哥', - 949200: '摩纳哥', - 949600: '蒙古国', - 949800: '摩尔多瓦', - 949900: '黑山', - 950000: '蒙塞拉特岛', - 950400: '摩洛哥', - 950800: '莫桑比克', - 951200: '阿曼', - 951600: '纳米比亚', - 952000: '瑙鲁', - 952400: '尼泊尔', - 952800: '荷兰', - 953300: '阿鲁巴', - 953500: '荷兰加勒比区', - 954000: '新喀里多尼亚', - 954800: '瓦努阿图', - 955400: '新西兰', - 955800: '尼加拉瓜', - 956200: '尼日尔', - 956600: '尼日利亚', - 957000: '纽埃', - 957400: '诺福克岛', - 957800: '挪威', - 958000: '北马里亚纳群岛', - 958100: '美国本土外小岛屿', - 958300: '密克罗尼西亚联邦', - 958400: '马绍尔群岛', - 958500: '帕劳', - 958600: '巴基斯坦', - 959100: '巴拿马', - 959800: '巴布亚新几内亚', - 960000: '巴拉圭', - 960400: '秘鲁', - 960800: '菲律宾', - 961200: '皮特凯恩群岛', - 961600: '波兰', - 962000: '葡萄牙', - 962400: '几内亚比绍', - 962600: '东帝汶', - 963000: '波多黎各', - 963400: '卡塔尔', - 963800: '留尼汪', - 964200: '罗马尼亚', - 964300: '俄罗斯', - 964600: '卢旺达', - 965200: '圣巴泰勒米岛', - 965400: '圣赫勒拿', - 965900: '圣基茨和尼维斯', - 966000: '安圭拉', - 966200: '圣卢西亚', - 966300: '法属圣马丁', - 966600: '圣皮埃尔和密克隆', - 967000: '圣文森特和格林纳丁斯', - 967400: '圣马力诺', - 967800: '圣多美和普林西比', - 968200: '沙特阿拉伯', - 968600: '塞内加尔', - 968800: '塞尔维亚', - 969000: '塞舌尔', - 969400: '塞拉利昂', - 970200: '新加坡', - 970300: '斯洛伐克', - 970400: '越南', - 970500: '斯洛文尼亚', - 970600: '索马里', - 971000: '南非', - 971600: '津巴布韦', - 972400: '西班牙', - 972800: '南苏丹', - 972900: '苏丹', - 973200: '西撒哈拉', - 974000: '苏里南', - 974400: '斯瓦尔巴群岛和 扬马延岛', - 974800: '斯威士兰', - 975200: '瑞典', - 975600: '瑞士', - 976000: '叙利亚', - 976200: '塔吉克斯坦', - 976400: '泰国', - 976800: '多哥', - 977200: '托克劳', - 977600: '汤加', - 978000: '特立尼达和多巴哥', - 978400: '阿联酋', - 978800: '突尼斯', - 979200: '土耳其', - 979500: '土库曼斯坦', - 979600: '特克斯和凯科斯群岛', - 979800: '图瓦卢', - 980000: '乌干达', - 980400: '乌克兰', - 980700: '马其顿', - 981800: '埃及', - 982600: '英国', - 983100: '根西岛', - 983200: '泽西岛', - 983300: '马恩岛', - 983400: '坦桑尼亚', - 984000: '美国', - 985000: '美属维尔京群岛', - 985400: '布基纳法索', - 985800: '乌拉圭', - 986000: '乌兹别克斯坦', - 986200: '委内瑞拉', - 987600: '瓦利斯和富图纳', - 988200: '萨摩亚', - 988700: '也门', - 989400: '赞比亚' - }, - county_list: { - 110101: '东城区', - 110102: '西城区', - 110105: '朝阳区', - 110106: '丰台区', - 110107: '石景山区', - 110108: '海淀区', - 110109: '门头沟区', - 110111: '房山区', - 110112: '通州区', - 110113: '顺义区', - 110114: '昌平区', - 110115: '大兴区', - 110116: '怀柔区', - 110117: '平谷区', - 110118: '密云区', - 110119: '延庆区', - 120101: '和平区', - 120102: '河东区', - 120103: '河西区', - 120104: '南开区', - 120105: '河北区', - 120106: '红桥区', - 120110: '东丽区', - 120111: '西青区', - 120112: '津南区', - 120113: '北辰区', - 120114: '武清区', - 120115: '宝坻区', - 120116: '滨海新区', - 120117: '宁河区', - 120118: '静海区', - 120119: '蓟州区', - 130102: '长安区', - 130104: '桥西区', - 130105: '新华区', - 130107: '井陉矿区', - 130108: '裕华区', - 130109: '藁城区', - 130110: '鹿泉区', - 130111: '栾城区', - 130121: '井陉县', - 130123: '正定县', - 130125: '行唐县', - 130126: '灵寿县', - 130127: '高邑县', - 130128: '深泽县', - 130129: '赞皇县', - 130130: '无极县', - 130131: '平山县', - 130132: '元氏县', - 130133: '赵县', - 130181: '辛集市', - 130183: '晋州市', - 130184: '新乐市', - 130202: '路南区', - 130203: '路北区', - 130204: '古冶区', - 130205: '开平区', - 130207: '丰南区', - 130208: '丰润区', - 130209: '曹妃甸区', - 130224: '滦南县', - 130225: '乐亭县', - 130227: '迁西县', - 130229: '玉田县', - 130281: '遵化市', - 130283: '迁安市', - 130284: '滦州市', - 130302: '海港区', - 130303: '山海关区', - 130304: '北戴河区', - 130306: '抚宁区', - 130321: '青龙满族自治县', - 130322: '昌黎县', - 130324: '卢龙县', - 130390: '经济技术开发区', - 130402: '邯山区', - 130403: '丛台区', - 130404: '复兴区', - 130406: '峰峰矿区', - 130407: '肥乡区', - 130408: '永年区', - 130423: '临漳县', - 130424: '成安县', - 130425: '大名县', - 130426: '涉县', - 130427: '磁县', - 130430: '邱县', - 130431: '鸡泽县', - 130432: '广平县', - 130433: '馆陶县', - 130434: '魏县', - 130435: '曲周县', - 130481: '武安市', - 130502: '桥东区', - 130503: '桥西区', - 130521: '邢台县', - 130522: '临城县', - 130523: '内丘县', - 130524: '柏乡县', - 130525: '隆尧县', - 130526: '任县', - 130527: '南和县', - 130528: '宁晋县', - 130529: '巨鹿县', - 130530: '新河县', - 130531: '广宗县', - 130532: '平乡县', - 130533: '威县', - 130534: '清河县', - 130535: '临西县', - 130581: '南宫市', - 130582: '沙河市', - 130602: '竞秀区', - 130606: '莲池区', - 130607: '满城区', - 130608: '清苑区', - 130609: '徐水区', - 130623: '涞水县', - 130624: '阜平县', - 130626: '定兴县', - 130627: '唐县', - 130628: '高阳县', - 130629: '容城县', - 130630: '涞源县', - 130631: '望都县', - 130632: '安新县', - 130633: '易县', - 130634: '曲阳县', - 130635: '蠡县', - 130636: '顺平县', - 130637: '博野县', - 130638: '雄县', - 130681: '涿州市', - 130682: '定州市', - 130683: '安国市', - 130684: '高碑店市', - 130702: '桥东区', - 130703: '桥西区', - 130705: '宣化区', - 130706: '下花园区', - 130708: '万全区', - 130709: '崇礼区', - 130722: '张北县', - 130723: '康保县', - 130724: '沽源县', - 130725: '尚义县', - 130726: '蔚县', - 130727: '阳原县', - 130728: '怀安县', - 130730: '怀来县', - 130731: '涿鹿县', - 130732: '赤城县', - 130802: '双桥区', - 130803: '双滦区', - 130804: '鹰手营子矿区', - 130821: '承德县', - 130822: '兴隆县', - 130824: '滦平县', - 130825: '隆化县', - 130826: '丰宁满族自治县', - 130827: '宽城满族自治县', - 130828: '围场满族蒙古族自治县', - 130881: '平泉市', - 130902: '新华区', - 130903: '运河区', - 130921: '沧县', - 130922: '青县', - 130923: '东光县', - 130924: '海兴县', - 130925: '盐山县', - 130926: '肃宁县', - 130927: '南皮县', - 130928: '吴桥县', - 130929: '献县', - 130930: '孟村回族自治县', - 130981: '泊头市', - 130982: '任丘市', - 130983: '黄骅市', - 130984: '河间市', - 131002: '安次区', - 131003: '广阳区', - 131022: '固安县', - 131023: '永清县', - 131024: '香河县', - 131025: '大城县', - 131026: '文安县', - 131028: '大厂回族自治县', - 131081: '霸州市', - 131082: '三河市', - 131090: '开发区', - 131102: '桃城区', - 131103: '冀州区', - 131121: '枣强县', - 131122: '武邑县', - 131123: '武强县', - 131124: '饶阳县', - 131125: '安平县', - 131126: '故城县', - 131127: '景县', - 131128: '阜城县', - 131182: '深州市', - 140105: '小店区', - 140106: '迎泽区', - 140107: '杏花岭区', - 140108: '尖草坪区', - 140109: '万柏林区', - 140110: '晋源区', - 140121: '清徐县', - 140122: '阳曲县', - 140123: '娄烦县', - 140181: '古交市', - 140212: '新荣区', - 140213: '平城区', - 140214: '云冈区', - 140215: '云州区', - 140221: '阳高县', - 140222: '天镇县', - 140223: '广灵县', - 140224: '灵丘县', - 140225: '浑源县', - 140226: '左云县', - 140302: '城区', - 140303: '矿区', - 140311: '郊区', - 140321: '平定县', - 140322: '盂县', - 140403: '潞州区', - 140404: '上党区', - 140405: '屯留区', - 140406: '潞城区', - 140423: '襄垣县', - 140425: '平顺县', - 140426: '黎城县', - 140427: '壶关县', - 140428: '长子县', - 140429: '武乡县', - 140430: '沁县', - 140431: '沁源县', - 140502: '城区', - 140521: '沁水县', - 140522: '阳城县', - 140524: '陵川县', - 140525: '泽州县', - 140581: '高平市', - 140602: '朔城区', - 140603: '平鲁区', - 140621: '山阴县', - 140622: '应县', - 140623: '右玉县', - 140681: '怀仁市', - 140702: '榆次区', - 140721: '榆社县', - 140722: '左权县', - 140723: '和顺县', - 140724: '昔阳县', - 140725: '寿阳县', - 140726: '太谷县', - 140727: '祁县', - 140728: '平遥县', - 140729: '灵石县', - 140781: '介休市', - 140802: '盐湖区', - 140821: '临猗县', - 140822: '万荣县', - 140823: '闻喜县', - 140824: '稷山县', - 140825: '新绛县', - 140826: '绛县', - 140827: '垣曲县', - 140828: '夏县', - 140829: '平陆县', - 140830: '芮城县', - 140881: '永济市', - 140882: '河津市', - 140902: '忻府区', - 140921: '定襄县', - 140922: '五台县', - 140923: '代县', - 140924: '繁峙县', - 140925: '宁武县', - 140926: '静乐县', - 140927: '神池县', - 140928: '五寨县', - 140929: '岢岚县', - 140930: '河曲县', - 140931: '保德县', - 140932: '偏关县', - 140981: '原平市', - 141002: '尧都区', - 141021: '曲沃县', - 141022: '翼城县', - 141023: '襄汾县', - 141024: '洪洞县', - 141025: '古县', - 141026: '安泽县', - 141027: '浮山县', - 141028: '吉县', - 141029: '乡宁县', - 141030: '大宁县', - 141031: '隰县', - 141032: '永和县', - 141033: '蒲县', - 141034: '汾西县', - 141081: '侯马市', - 141082: '霍州市', - 141102: '离石区', - 141121: '文水县', - 141122: '交城县', - 141123: '兴县', - 141124: '临县', - 141125: '柳林县', - 141126: '石楼县', - 141127: '岚县', - 141128: '方山县', - 141129: '中阳县', - 141130: '交口县', - 141181: '孝义市', - 141182: '汾阳市', - 150102: '新城区', - 150103: '回民区', - 150104: '玉泉区', - 150105: '赛罕区', - 150121: '土默特左旗', - 150122: '托克托县', - 150123: '和林格尔县', - 150124: '清水河县', - 150125: '武川县', - 150202: '东河区', - 150203: '昆都仑区', - 150204: '青山区', - 150205: '石拐区', - 150206: '白云鄂博矿区', - 150207: '九原区', - 150221: '土默特右旗', - 150222: '固阳县', - 150223: '达尔罕茂明安联合旗', - 150302: '海勃湾区', - 150303: '海南区', - 150304: '乌达区', - 150402: '红山区', - 150403: '元宝山区', - 150404: '松山区', - 150421: '阿鲁科尔沁旗', - 150422: '巴林左旗', - 150423: '巴林右旗', - 150424: '林西县', - 150425: '克什克腾旗', - 150426: '翁牛特旗', - 150428: '喀喇沁旗', - 150429: '宁城县', - 150430: '敖汉旗', - 150502: '科尔沁区', - 150521: '科尔沁左翼中旗', - 150522: '科尔沁左翼后旗', - 150523: '开鲁县', - 150524: '库伦旗', - 150525: '奈曼旗', - 150526: '扎鲁特旗', - 150581: '霍林郭勒市', - 150602: '东胜区', - 150603: '康巴什区', - 150621: '达拉特旗', - 150622: '准格尔旗', - 150623: '鄂托克前旗', - 150624: '鄂托克旗', - 150625: '杭锦旗', - 150626: '乌审旗', - 150627: '伊金霍洛旗', - 150702: '海拉尔区', - 150703: '扎赉诺尔区', - 150721: '阿荣旗', - 150722: '莫力达瓦达斡尔族自治旗', - 150723: '鄂伦春自治旗', - 150724: '鄂温克族自治旗', - 150725: '陈巴尔虎旗', - 150726: '新巴尔虎左旗', - 150727: '新巴尔虎右旗', - 150781: '满洲里市', - 150782: '牙克石市', - 150783: '扎兰屯市', - 150784: '额尔古纳市', - 150785: '根河市', - 150802: '临河区', - 150821: '五原县', - 150822: '磴口县', - 150823: '乌拉特前旗', - 150824: '乌拉特中旗', - 150825: '乌拉特后旗', - 150826: '杭锦后旗', - 150902: '集宁区', - 150921: '卓资县', - 150922: '化德县', - 150923: '商都县', - 150924: '兴和县', - 150925: '凉城县', - 150926: '察哈尔右翼前旗', - 150927: '察哈尔右翼中旗', - 150928: '察哈尔右翼后旗', - 150929: '四子王旗', - 150981: '丰镇市', - 152201: '乌兰浩特市', - 152202: '阿尔山市', - 152221: '科尔沁右翼前旗', - 152222: '科尔沁右翼中旗', - 152223: '扎赉特旗', - 152224: '突泉县', - 152501: '二连浩特市', - 152502: '锡林浩特市', - 152522: '阿巴嘎旗', - 152523: '苏尼特左旗', - 152524: '苏尼特右旗', - 152525: '东乌珠穆沁旗', - 152526: '西乌珠穆沁旗', - 152527: '太仆寺旗', - 152528: '镶黄旗', - 152529: '正镶白旗', - 152530: '正蓝旗', - 152531: '多伦县', - 152921: '阿拉善左旗', - 152922: '阿拉善右旗', - 152923: '额济纳旗', - 210102: '和平区', - 210103: '沈河区', - 210104: '大东区', - 210105: '皇姑区', - 210106: '铁西区', - 210111: '苏家屯区', - 210112: '浑南区', - 210113: '沈北新区', - 210114: '于洪区', - 210115: '辽中区', - 210123: '康平县', - 210124: '法库县', - 210181: '新民市', - 210190: '经济技术开发区', - 210202: '中山区', - 210203: '西岗区', - 210204: '沙河口区', - 210211: '甘井子区', - 210212: '旅顺口区', - 210213: '金州区', - 210214: '普兰店区', - 210224: '长海县', - 210281: '瓦房店市', - 210283: '庄河市', - 210302: '铁东区', - 210303: '铁西区', - 210304: '立山区', - 210311: '千山区', - 210321: '台安县', - 210323: '岫岩满族自治县', - 210381: '海城市', - 210390: '高新区', - 210402: '新抚区', - 210403: '东洲区', - 210404: '望花区', - 210411: '顺城区', - 210421: '抚顺县', - 210422: '新宾满族自治县', - 210423: '清原满族自治县', - 210502: '平山区', - 210503: '溪湖区', - 210504: '明山区', - 210505: '南芬区', - 210521: '本溪满族自治县', - 210522: '桓仁满族自治县', - 210602: '元宝区', - 210603: '振兴区', - 210604: '振安区', - 210624: '宽甸满族自治县', - 210681: '东港市', - 210682: '凤城市', - 210702: '古塔区', - 210703: '凌河区', - 210711: '太和区', - 210726: '黑山县', - 210727: '义县', - 210781: '凌海市', - 210782: '北镇市', - 210793: '经济技术开发区', - 210802: '站前区', - 210803: '西市区', - 210804: '鲅鱼圈区', - 210811: '老边区', - 210881: '盖州市', - 210882: '大石桥市', - 210902: '海州区', - 210903: '新邱区', - 210904: '太平区', - 210905: '清河门区', - 210911: '细河区', - 210921: '阜新蒙古族自治县', - 210922: '彰武县', - 211002: '白塔区', - 211003: '文圣区', - 211004: '宏伟区', - 211005: '弓长岭区', - 211011: '太子河区', - 211021: '辽阳县', - 211081: '灯塔市', - 211102: '双台子区', - 211103: '兴隆台区', - 211104: '大洼区', - 211122: '盘山县', - 211202: '银州区', - 211204: '清河区', - 211221: '铁岭县', - 211223: '西丰县', - 211224: '昌图县', - 211281: '调兵山市', - 211282: '开原市', - 211302: '双塔区', - 211303: '龙城区', - 211321: '朝阳县', - 211322: '建平县', - 211324: '喀喇沁左翼蒙古族自治县', - 211381: '北票市', - 211382: '凌源市', - 211402: '连山区', - 211403: '龙港区', - 211404: '南票区', - 211421: '绥中县', - 211422: '建昌县', - 211481: '兴城市', - 220102: '南关区', - 220103: '宽城区', - 220104: '朝阳区', - 220105: '二道区', - 220106: '绿园区', - 220112: '双阳区', - 220113: '九台区', - 220122: '农安县', - 220182: '榆树市', - 220183: '德惠市', - 220192: '经济技术开发区', - 220202: '昌邑区', - 220203: '龙潭区', - 220204: '船营区', - 220211: '丰满区', - 220221: '永吉县', - 220281: '蛟河市', - 220282: '桦甸市', - 220283: '舒兰市', - 220284: '磐石市', - 220302: '铁西区', - 220303: '铁东区', - 220322: '梨树县', - 220323: '伊通满族自治县', - 220381: '公主岭市', - 220382: '双辽市', - 220402: '龙山区', - 220403: '西安区', - 220421: '东丰县', - 220422: '东辽县', - 220502: '东昌区', - 220503: '二道江区', - 220521: '通化县', - 220523: '辉南县', - 220524: '柳河县', - 220581: '梅河口市', - 220582: '集安市', - 220602: '浑江区', - 220605: '江源区', - 220621: '抚松县', - 220622: '靖宇县', - 220623: '长白朝鲜族自治县', - 220681: '临江市', - 220702: '宁江区', - 220721: '前郭尔罗斯蒙古族自治县', - 220722: '长岭县', - 220723: '乾安县', - 220781: '扶余市', - 220802: '洮北区', - 220821: '镇赉县', - 220822: '通榆县', - 220881: '洮南市', - 220882: '大安市', - 222401: '延吉市', - 222402: '图们市', - 222403: '敦化市', - 222404: '珲春市', - 222405: '龙井市', - 222406: '和龙市', - 222424: '汪清县', - 222426: '安图县', - 230102: '道里区', - 230103: '南岗区', - 230104: '道外区', - 230108: '平房区', - 230109: '松北区', - 230110: '香坊区', - 230111: '呼兰区', - 230112: '阿城区', - 230113: '双城区', - 230123: '依兰县', - 230124: '方正县', - 230125: '宾县', - 230126: '巴彦县', - 230127: '木兰县', - 230128: '通河县', - 230129: '延寿县', - 230183: '尚志市', - 230184: '五常市', - 230202: '龙沙区', - 230203: '建华区', - 230204: '铁锋区', - 230205: '昂昂溪区', - 230206: '富拉尔基区', - 230207: '碾子山区', - 230208: '梅里斯达斡尔族区', - 230221: '龙江县', - 230223: '依安县', - 230224: '泰来县', - 230225: '甘南县', - 230227: '富裕县', - 230229: '克山县', - 230230: '克东县', - 230231: '拜泉县', - 230281: '讷河市', - 230302: '鸡冠区', - 230303: '恒山区', - 230304: '滴道区', - 230305: '梨树区', - 230306: '城子河区', - 230307: '麻山区', - 230321: '鸡东县', - 230381: '虎林市', - 230382: '密山市', - 230402: '向阳区', - 230403: '工农区', - 230404: '南山区', - 230405: '兴安区', - 230406: '东山区', - 230407: '兴山区', - 230421: '萝北县', - 230422: '绥滨县', - 230502: '尖山区', - 230503: '岭东区', - 230505: '四方台区', - 230506: '宝山区', - 230521: '集贤县', - 230522: '友谊县', - 230523: '宝清县', - 230524: '饶河县', - 230602: '萨尔图区', - 230603: '龙凤区', - 230604: '让胡路区', - 230605: '红岗区', - 230606: '大同区', - 230621: '肇州县', - 230622: '肇源县', - 230623: '林甸县', - 230624: '杜尔伯特蒙古族自治县', - 230702: '伊春区', - 230703: '南岔区', - 230704: '友好区', - 230705: '西林区', - 230706: '翠峦区', - 230707: '新青区', - 230708: '美溪区', - 230709: '金山屯区', - 230710: '五营区', - 230711: '乌马河区', - 230712: '汤旺河区', - 230713: '带岭区', - 230714: '乌伊岭区', - 230715: '红星区', - 230716: '上甘岭区', - 230722: '嘉荫县', - 230781: '铁力市', - 230803: '向阳区', - 230804: '前进区', - 230805: '东风区', - 230811: '郊区', - 230822: '桦南县', - 230826: '桦川县', - 230828: '汤原县', - 230881: '同江市', - 230882: '富锦市', - 230883: '抚远市', - 230902: '新兴区', - 230903: '桃山区', - 230904: '茄子河区', - 230921: '勃利县', - 231002: '东安区', - 231003: '阳明区', - 231004: '爱民区', - 231005: '西安区', - 231025: '林口县', - 231081: '绥芬河市', - 231083: '海林市', - 231084: '宁安市', - 231085: '穆棱市', - 231086: '东宁市', - 231102: '爱辉区', - 231121: '嫩江县', - 231123: '逊克县', - 231124: '孙吴县', - 231181: '北安市', - 231182: '五大连池市', - 231202: '北林区', - 231221: '望奎县', - 231222: '兰西县', - 231223: '青冈县', - 231224: '庆安县', - 231225: '明水县', - 231226: '绥棱县', - 231281: '安达市', - 231282: '肇东市', - 231283: '海伦市', - 232701: '漠河市', - 232721: '呼玛县', - 232722: '塔河县', - 232790: '松岭区', - 232791: '呼中区', - 232792: '加格达奇区', - 232793: '新林区', - 310101: '黄浦区', - 310104: '徐汇区', - 310105: '长宁区', - 310106: '静安区', - 310107: '普陀区', - 310109: '虹口区', - 310110: '杨浦区', - 310112: '闵行区', - 310113: '宝山区', - 310114: '嘉定区', - 310115: '浦东新区', - 310116: '金山区', - 310117: '松江区', - 310118: '青浦区', - 310120: '奉贤区', - 310151: '崇明区', - 320102: '玄武区', - 320104: '秦淮区', - 320105: '建邺区', - 320106: '鼓楼区', - 320111: '浦口区', - 320113: '栖霞区', - 320114: '雨花台区', - 320115: '江宁区', - 320116: '六合区', - 320117: '溧水区', - 320118: '高淳区', - 320205: '锡山区', - 320206: '惠山区', - 320211: '滨湖区', - 320213: '梁溪区', - 320214: '新吴区', - 320281: '江阴市', - 320282: '宜兴市', - 320302: '鼓楼区', - 320303: '云龙区', - 320305: '贾汪区', - 320311: '泉山区', - 320312: '铜山区', - 320321: '丰县', - 320322: '沛县', - 320324: '睢宁县', - 320381: '新沂市', - 320382: '邳州市', - 320391: '工业园区', - 320402: '天宁区', - 320404: '钟楼区', - 320411: '新北区', - 320412: '武进区', - 320413: '金坛区', - 320481: '溧阳市', - 320505: '虎丘区', - 320506: '吴中区', - 320507: '相城区', - 320508: '姑苏区', - 320509: '吴江区', - 320581: '常熟市', - 320582: '张家港市', - 320583: '昆山市', - 320585: '太仓市', - 320590: '工业园区', - 320591: '高新区', - 320602: '崇川区', - 320611: '港闸区', - 320612: '通州区', - 320623: '如东县', - 320681: '启东市', - 320682: '如皋市', - 320684: '海门市', - 320685: '海安市', - 320691: '高新区', - 320703: '连云区', - 320706: '海州区', - 320707: '赣榆区', - 320722: '东海县', - 320723: '灌云县', - 320724: '灌南县', - 320803: '淮安区', - 320804: '淮阴区', - 320812: '清江浦区', - 320813: '洪泽区', - 320826: '涟水县', - 320830: '盱眙县', - 320831: '金湖县', - 320890: '经济开发区', - 320902: '亭湖区', - 320903: '盐都区', - 320904: '大丰区', - 320921: '响水县', - 320922: '滨海县', - 320923: '阜宁县', - 320924: '射阳县', - 320925: '建湖县', - 320981: '东台市', - 321002: '广陵区', - 321003: '邗江区', - 321012: '江都区', - 321023: '宝应县', - 321081: '仪征市', - 321084: '高邮市', - 321090: '经济开发区', - 321102: '京口区', - 321111: '润州区', - 321112: '丹徒区', - 321181: '丹阳市', - 321182: '扬中市', - 321183: '句容市', - 321202: '海陵区', - 321203: '高港区', - 321204: '姜堰区', - 321281: '兴化市', - 321282: '靖江市', - 321283: '泰兴市', - 321302: '宿城区', - 321311: '宿豫区', - 321322: '沭阳县', - 321323: '泗阳县', - 321324: '泗洪县', - 330102: '上城区', - 330103: '下城区', - 330104: '江干区', - 330105: '拱墅区', - 330106: '西湖区', - 330108: '滨江区', - 330109: '萧山区', - 330110: '余杭区', - 330111: '富阳区', - 330112: '临安区', - 330122: '桐庐县', - 330127: '淳安县', - 330182: '建德市', - 330203: '海曙区', - 330205: '江北区', - 330206: '北仑区', - 330211: '镇海区', - 330212: '鄞州区', - 330213: '奉化区', - 330225: '象山县', - 330226: '宁海县', - 330281: '余姚市', - 330282: '慈溪市', - 330302: '鹿城区', - 330303: '龙湾区', - 330304: '瓯海区', - 330305: '洞头区', - 330324: '永嘉县', - 330326: '平阳县', - 330327: '苍南县', - 330328: '文成县', - 330329: '泰顺县', - 330381: '瑞安市', - 330382: '乐清市', - 330402: '南湖区', - 330411: '秀洲区', - 330421: '嘉善县', - 330424: '海盐县', - 330481: '海宁市', - 330482: '平湖市', - 330483: '桐乡市', - 330502: '吴兴区', - 330503: '南浔区', - 330521: '德清县', - 330522: '长兴县', - 330523: '安吉县', - 330602: '越城区', - 330603: '柯桥区', - 330604: '上虞区', - 330624: '新昌县', - 330681: '诸暨市', - 330683: '嵊州市', - 330702: '婺城区', - 330703: '金东区', - 330723: '武义县', - 330726: '浦江县', - 330727: '磐安县', - 330781: '兰溪市', - 330782: '义乌市', - 330783: '东阳市', - 330784: '永康市', - 330802: '柯城区', - 330803: '衢江区', - 330822: '常山县', - 330824: '开化县', - 330825: '龙游县', - 330881: '江山市', - 330902: '定海区', - 330903: '普陀区', - 330921: '岱山县', - 330922: '嵊泗县', - 331002: '椒江区', - 331003: '黄岩区', - 331004: '路桥区', - 331022: '三门县', - 331023: '天台县', - 331024: '仙居县', - 331081: '温岭市', - 331082: '临海市', - 331083: '玉环市', - 331102: '莲都区', - 331121: '青田县', - 331122: '缙云县', - 331123: '遂昌县', - 331124: '松阳县', - 331125: '云和县', - 331126: '庆元县', - 331127: '景宁畲族自治县', - 331181: '龙泉市', - 340102: '瑶海区', - 340103: '庐阳区', - 340104: '蜀山区', - 340111: '包河区', - 340121: '长丰县', - 340122: '肥东县', - 340123: '肥西县', - 340124: '庐江县', - 340181: '巢湖市', - 340190: '高新技术开发区', - 340191: '经济技术开发区', - 340202: '镜湖区', - 340203: '弋江区', - 340207: '鸠江区', - 340208: '三山区', - 340221: '芜湖县', - 340222: '繁昌县', - 340223: '南陵县', - 340225: '无为县', - 340302: '龙子湖区', - 340303: '蚌山区', - 340304: '禹会区', - 340311: '淮上区', - 340321: '怀远县', - 340322: '五河县', - 340323: '固镇县', - 340402: '大通区', - 340403: '田家庵区', - 340404: '谢家集区', - 340405: '八公山区', - 340406: '潘集区', - 340421: '凤台县', - 340422: '寿县', - 340503: '花山区', - 340504: '雨山区', - 340506: '博望区', - 340521: '当涂县', - 340522: '含山县', - 340523: '和县', - 340602: '杜集区', - 340603: '相山区', - 340604: '烈山区', - 340621: '濉溪县', - 340705: '铜官区', - 340706: '义安区', - 340711: '郊区', - 340722: '枞阳县', - 340802: '迎江区', - 340803: '大观区', - 340811: '宜秀区', - 340822: '怀宁县', - 340824: '潜山县', - 340825: '太湖县', - 340826: '宿松县', - 340827: '望江县', - 340828: '岳西县', - 340881: '桐城市', - 341002: '屯溪区', - 341003: '黄山区', - 341004: '徽州区', - 341021: '歙县', - 341022: '休宁县', - 341023: '黟县', - 341024: '祁门县', - 341102: '琅琊区', - 341103: '南谯区', - 341122: '来安县', - 341124: '全椒县', - 341125: '定远县', - 341126: '凤阳县', - 341181: '天长市', - 341182: '明光市', - 341202: '颍州区', - 341203: '颍东区', - 341204: '颍泉区', - 341221: '临泉县', - 341222: '太和县', - 341225: '阜南县', - 341226: '颍上县', - 341282: '界首市', - 341302: '埇桥区', - 341321: '砀山县', - 341322: '萧县', - 341323: '灵璧县', - 341324: '泗县', - 341390: '经济开发区', - 341502: '金安区', - 341503: '裕安区', - 341504: '叶集区', - 341522: '霍邱县', - 341523: '舒城县', - 341524: '金寨县', - 341525: '霍山县', - 341602: '谯城区', - 341621: '涡阳县', - 341622: '蒙城县', - 341623: '利辛县', - 341702: '贵池区', - 341721: '东至县', - 341722: '石台县', - 341723: '青阳县', - 341802: '宣州区', - 341821: '郎溪县', - 341822: '广德县', - 341823: '泾县', - 341824: '绩溪县', - 341825: '旌德县', - 341881: '宁国市', - 350102: '鼓楼区', - 350103: '台江区', - 350104: '仓山区', - 350105: '马尾区', - 350111: '晋安区', - 350112: '长乐区', - 350121: '闽侯县', - 350122: '连江县', - 350123: '罗源县', - 350124: '闽清县', - 350125: '永泰县', - 350128: '平潭县', - 350181: '福清市', - 350203: '思明区', - 350205: '海沧区', - 350206: '湖里区', - 350211: '集美区', - 350212: '同安区', - 350213: '翔安区', - 350302: '城厢区', - 350303: '涵江区', - 350304: '荔城区', - 350305: '秀屿区', - 350322: '仙游县', - 350402: '梅列区', - 350403: '三元区', - 350421: '明溪县', - 350423: '清流县', - 350424: '宁化县', - 350425: '大田县', - 350426: '尤溪县', - 350427: '沙县', - 350428: '将乐县', - 350429: '泰宁县', - 350430: '建宁县', - 350481: '永安市', - 350502: '鲤城区', - 350503: '丰泽区', - 350504: '洛江区', - 350505: '泉港区', - 350521: '惠安县', - 350524: '安溪县', - 350525: '永春县', - 350526: '德化县', - 350527: '金门县', - 350581: '石狮市', - 350582: '晋江市', - 350583: '南安市', - 350602: '芗城区', - 350603: '龙文区', - 350622: '云霄县', - 350623: '漳浦县', - 350624: '诏安县', - 350625: '长泰县', - 350626: '东山县', - 350627: '南靖县', - 350628: '平和县', - 350629: '华安县', - 350681: '龙海市', - 350702: '延平区', - 350703: '建阳区', - 350721: '顺昌县', - 350722: '浦城县', - 350723: '光泽县', - 350724: '松溪县', - 350725: '政和县', - 350781: '邵武市', - 350782: '武夷山市', - 350783: '建瓯市', - 350802: '新罗区', - 350803: '永定区', - 350821: '长汀县', - 350823: '上杭县', - 350824: '武平县', - 350825: '连城县', - 350881: '漳平市', - 350902: '蕉城区', - 350921: '霞浦县', - 350922: '古田县', - 350923: '屏南县', - 350924: '寿宁县', - 350925: '周宁县', - 350926: '柘荣县', - 350981: '福安市', - 350982: '福鼎市', - 360102: '东湖区', - 360103: '西湖区', - 360104: '青云谱区', - 360105: '湾里区', - 360111: '青山湖区', - 360112: '新建区', - 360121: '南昌县', - 360123: '安义县', - 360124: '进贤县', - 360190: '经济技术开发区', - 360192: '高新区', - 360202: '昌江区', - 360203: '珠山区', - 360222: '浮梁县', - 360281: '乐平市', - 360302: '安源区', - 360313: '湘东区', - 360321: '莲花县', - 360322: '上栗县', - 360323: '芦溪县', - 360402: '濂溪区', - 360403: '浔阳区', - 360404: '柴桑区', - 360423: '武宁县', - 360424: '修水县', - 360425: '永修县', - 360426: '德安县', - 360428: '都昌县', - 360429: '湖口县', - 360430: '彭泽县', - 360481: '瑞昌市', - 360482: '共青城市', - 360483: '庐山市', - 360490: '经济技术开发区', - 360502: '渝水区', - 360521: '分宜县', - 360602: '月湖区', - 360603: '余江区', - 360681: '贵溪市', - 360702: '章贡区', - 360703: '南康区', - 360704: '赣县区', - 360722: '信丰县', - 360723: '大余县', - 360724: '上犹县', - 360725: '崇义县', - 360726: '安远县', - 360727: '龙南县', - 360728: '定南县', - 360729: '全南县', - 360730: '宁都县', - 360731: '于都县', - 360732: '兴国县', - 360733: '会昌县', - 360734: '寻乌县', - 360735: '石城县', - 360781: '瑞金市', - 360802: '吉州区', - 360803: '青原区', - 360821: '吉安县', - 360822: '吉水县', - 360823: '峡江县', - 360824: '新干县', - 360825: '永丰县', - 360826: '泰和县', - 360827: '遂川县', - 360828: '万安县', - 360829: '安福县', - 360830: '永新县', - 360881: '井冈山市', - 360902: '袁州区', - 360921: '奉新县', - 360922: '万载县', - 360923: '上高县', - 360924: '宜丰县', - 360925: '靖安县', - 360926: '铜鼓县', - 360981: '丰城市', - 360982: '樟树市', - 360983: '高安市', - 361002: '临川区', - 361003: '东乡区', - 361021: '南城县', - 361022: '黎川县', - 361023: '南丰县', - 361024: '崇仁县', - 361025: '乐安县', - 361026: '宜黄县', - 361027: '金溪县', - 361028: '资溪县', - 361030: '广昌县', - 361102: '信州区', - 361103: '广丰区', - 361121: '上饶县', - 361123: '玉山县', - 361124: '铅山县', - 361125: '横峰县', - 361126: '弋阳县', - 361127: '余干县', - 361128: '鄱阳县', - 361129: '万年县', - 361130: '婺源县', - 361181: '德兴市', - 370102: '历下区', - 370103: '市中区', - 370104: '槐荫区', - 370105: '天桥区', - 370112: '历城区', - 370113: '长清区', - 370114: '章丘区', - 370115: '济阳区', - 370116: '莱芜区', - 370117: '钢城区', - 370124: '平阴县', - 370126: '商河县', - 370190: '高新区', - 370202: '市南区', - 370203: '市北区', - 370211: '黄岛区', - 370212: '崂山区', - 370213: '李沧区', - 370214: '城阳区', - 370215: '即墨区', - 370281: '胶州市', - 370283: '平度市', - 370285: '莱西市', - 370290: '开发区', - 370302: '淄川区', - 370303: '张店区', - 370304: '博山区', - 370305: '临淄区', - 370306: '周村区', - 370321: '桓台县', - 370322: '高青县', - 370323: '沂源县', - 370402: '市中区', - 370403: '薛城区', - 370404: '峄城区', - 370405: '台儿庄区', - 370406: '山亭区', - 370481: '滕州市', - 370502: '东营区', - 370503: '河口区', - 370505: '垦利区', - 370522: '利津县', - 370523: '广饶县', - 370602: '芝罘区', - 370611: '福山区', - 370612: '牟平区', - 370613: '莱山区', - 370634: '长岛县', - 370681: '龙口市', - 370682: '莱阳市', - 370683: '莱州市', - 370684: '蓬莱市', - 370685: '招远市', - 370686: '栖霞市', - 370687: '海阳市', - 370690: '开发区', - 370702: '潍城区', - 370703: '寒亭区', - 370704: '坊子区', - 370705: '奎文区', - 370724: '临朐县', - 370725: '昌乐县', - 370781: '青州市', - 370782: '诸城市', - 370783: '寿光市', - 370784: '安丘市', - 370785: '高密市', - 370786: '昌邑市', - 370790: '开发区', - 370791: '高新区', - 370811: '任城区', - 370812: '兖州区', - 370826: '微山县', - 370827: '鱼台县', - 370828: '金乡县', - 370829: '嘉祥县', - 370830: '汶上县', - 370831: '泗水县', - 370832: '梁山县', - 370881: '曲阜市', - 370883: '邹城市', - 370890: '高新区', - 370902: '泰山区', - 370911: '岱岳区', - 370921: '宁阳县', - 370923: '东平县', - 370982: '新泰市', - 370983: '肥城市', - 371002: '环翠区', - 371003: '文登区', - 371082: '荣成市', - 371083: '乳山市', - 371091: '经济技术开发区', - 371102: '东港区', - 371103: '岚山区', - 371121: '五莲县', - 371122: '莒县', - 371302: '兰山区', - 371311: '罗庄区', - 371312: '河东区', - 371321: '沂南县', - 371322: '郯城县', - 371323: '沂水县', - 371324: '兰陵县', - 371325: '费县', - 371326: '平邑县', - 371327: '莒南县', - 371328: '蒙阴县', - 371329: '临沭县', - 371402: '德城区', - 371403: '陵城区', - 371422: '宁津县', - 371423: '庆云县', - 371424: '临邑县', - 371425: '齐河县', - 371426: '平原县', - 371427: '夏津县', - 371428: '武城县', - 371481: '乐陵市', - 371482: '禹城市', - 371502: '东昌府区', - 371521: '阳谷县', - 371522: '莘县', - 371523: '茌平县', - 371524: '东阿县', - 371525: '冠县', - 371526: '高唐县', - 371581: '临清市', - 371602: '滨城区', - 371603: '沾化区', - 371621: '惠民县', - 371622: '阳信县', - 371623: '无棣县', - 371625: '博兴县', - 371681: '邹平市', - 371702: '牡丹区', - 371703: '定陶区', - 371721: '曹县', - 371722: '单县', - 371723: '成武县', - 371724: '巨野县', - 371725: '郓城县', - 371726: '鄄城县', - 371728: '东明县', - 410102: '中原区', - 410103: '二七区', - 410104: '管城回族区', - 410105: '金水区', - 410106: '上街区', - 410108: '惠济区', - 410122: '中牟县', - 410181: '巩义市', - 410182: '荥阳市', - 410183: '新密市', - 410184: '新郑市', - 410185: '登封市', - 410190: '高新技术开发区', - 410191: '经济技术开发区', - 410202: '龙亭区', - 410203: '顺河回族区', - 410204: '鼓楼区', - 410205: '禹王台区', - 410212: '祥符区', - 410221: '杞县', - 410222: '通许县', - 410223: '尉氏县', - 410225: '兰考县', - 410302: '老城区', - 410303: '西工区', - 410304: '瀍河回族区', - 410305: '涧西区', - 410306: '吉利区', - 410311: '洛龙区', - 410322: '孟津县', - 410323: '新安县', - 410324: '栾川县', - 410325: '嵩县', - 410326: '汝阳县', - 410327: '宜阳县', - 410328: '洛宁县', - 410329: '伊川县', - 410381: '偃师市', - 410402: '新华区', - 410403: '卫东区', - 410404: '石龙区', - 410411: '湛河区', - 410421: '宝丰县', - 410422: '叶县', - 410423: '鲁山县', - 410425: '郏县', - 410481: '舞钢市', - 410482: '汝州市', - 410502: '文峰区', - 410503: '北关区', - 410505: '殷都区', - 410506: '龙安区', - 410522: '安阳县', - 410523: '汤阴县', - 410526: '滑县', - 410527: '内黄县', - 410581: '林州市', - 410590: '开发区', - 410602: '鹤山区', - 410603: '山城区', - 410611: '淇滨区', - 410621: '浚县', - 410622: '淇县', - 410702: '红旗区', - 410703: '卫滨区', - 410704: '凤泉区', - 410711: '牧野区', - 410721: '新乡县', - 410724: '获嘉县', - 410725: '原阳县', - 410726: '延津县', - 410727: '封丘县', - 410728: '长垣县', - 410781: '卫辉市', - 410782: '辉县市', - 410802: '解放区', - 410803: '中站区', - 410804: '马村区', - 410811: '山阳区', - 410821: '修武县', - 410822: '博爱县', - 410823: '武陟县', - 410825: '温县', - 410882: '沁阳市', - 410883: '孟州市', - 410902: '华龙区', - 410922: '清丰县', - 410923: '南乐县', - 410926: '范县', - 410927: '台前县', - 410928: '濮阳县', - 411002: '魏都区', - 411003: '建安区', - 411024: '鄢陵县', - 411025: '襄城县', - 411081: '禹州市', - 411082: '长葛市', - 411102: '源汇区', - 411103: '郾城区', - 411104: '召陵区', - 411121: '舞阳县', - 411122: '临颍县', - 411202: '湖滨区', - 411203: '陕州区', - 411221: '渑池县', - 411224: '卢氏县', - 411281: '义马市', - 411282: '灵宝市', - 411302: '宛城区', - 411303: '卧龙区', - 411321: '南召县', - 411322: '方城县', - 411323: '西峡县', - 411324: '镇平县', - 411325: '内乡县', - 411326: '淅川县', - 411327: '社旗县', - 411328: '唐河县', - 411329: '新野县', - 411330: '桐柏县', - 411381: '邓州市', - 411402: '梁园区', - 411403: '睢阳区', - 411421: '民权县', - 411422: '睢县', - 411423: '宁陵县', - 411424: '柘城县', - 411425: '虞城县', - 411426: '夏邑县', - 411481: '永城市', - 411502: '浉河区', - 411503: '平桥区', - 411521: '罗山县', - 411522: '光山县', - 411523: '新县', - 411524: '商城县', - 411525: '固始县', - 411526: '潢川县', - 411527: '淮滨县', - 411528: '息县', - 411602: '川汇区', - 411621: '扶沟县', - 411622: '西华县', - 411623: '商水县', - 411624: '沈丘县', - 411625: '郸城县', - 411626: '淮阳县', - 411627: '太康县', - 411628: '鹿邑县', - 411681: '项城市', - 411690: '经济开发区', - 411702: '驿城区', - 411721: '西平县', - 411722: '上蔡县', - 411723: '平舆县', - 411724: '正阳县', - 411725: '确山县', - 411726: '泌阳县', - 411727: '汝南县', - 411728: '遂平县', - 411729: '新蔡县', - 419001: '济源市', - 420102: '江岸区', - 420103: '江汉区', - 420104: '硚口区', - 420105: '汉阳区', - 420106: '武昌区', - 420107: '青山区', - 420111: '洪山区', - 420112: '东西湖区', - 420113: '汉南区', - 420114: '蔡甸区', - 420115: '江夏区', - 420116: '黄陂区', - 420117: '新洲区', - 420202: '黄石港区', - 420203: '西塞山区', - 420204: '下陆区', - 420205: '铁山区', - 420222: '阳新县', - 420281: '大冶市', - 420302: '茅箭区', - 420303: '张湾区', - 420304: '郧阳区', - 420322: '郧西县', - 420323: '竹山县', - 420324: '竹溪县', - 420325: '房县', - 420381: '丹江口市', - 420502: '西陵区', - 420503: '伍家岗区', - 420504: '点军区', - 420505: '猇亭区', - 420506: '夷陵区', - 420525: '远安县', - 420526: '兴山县', - 420527: '秭归县', - 420528: '长阳土家族自治县', - 420529: '五峰土家族自治县', - 420581: '宜都市', - 420582: '当阳市', - 420583: '枝江市', - 420590: '经济开发区', - 420602: '襄城区', - 420606: '樊城区', - 420607: '襄州区', - 420624: '南漳县', - 420625: '谷城县', - 420626: '保康县', - 420682: '老河口市', - 420683: '枣阳市', - 420684: '宜城市', - 420702: '梁子湖区', - 420703: '华容区', - 420704: '鄂城区', - 420802: '东宝区', - 420804: '掇刀区', - 420822: '沙洋县', - 420881: '钟祥市', - 420882: '京山市', - 420902: '孝南区', - 420921: '孝昌县', - 420922: '大悟县', - 420923: '云梦县', - 420981: '应城市', - 420982: '安陆市', - 420984: '汉川市', - 421002: '沙市区', - 421003: '荆州区', - 421022: '公安县', - 421023: '监利县', - 421024: '江陵县', - 421081: '石首市', - 421083: '洪湖市', - 421087: '松滋市', - 421102: '黄州区', - 421121: '团风县', - 421122: '红安县', - 421123: '罗田县', - 421124: '英山县', - 421125: '浠水县', - 421126: '蕲春县', - 421127: '黄梅县', - 421181: '麻城市', - 421182: '武穴市', - 421202: '咸安区', - 421221: '嘉鱼县', - 421222: '通城县', - 421223: '崇阳县', - 421224: '通山县', - 421281: '赤壁市', - 421303: '曾都区', - 421321: '随县', - 421381: '广水市', - 422801: '恩施市', - 422802: '利川市', - 422822: '建始县', - 422823: '巴东县', - 422825: '宣恩县', - 422826: '咸丰县', - 422827: '来凤县', - 422828: '鹤峰县', - 429004: '仙桃市', - 429005: '潜江市', - 429006: '天门市', - 429021: '神农架林区', - 430102: '芙蓉区', - 430103: '天心区', - 430104: '岳麓区', - 430105: '开福区', - 430111: '雨花区', - 430112: '望城区', - 430121: '长沙县', - 430181: '浏阳市', - 430182: '宁乡市', - 430202: '荷塘区', - 430203: '芦淞区', - 430204: '石峰区', - 430211: '天元区', - 430212: '渌口区', - 430223: '攸县', - 430224: '茶陵县', - 430225: '炎陵县', - 430281: '醴陵市', - 430302: '雨湖区', - 430304: '岳塘区', - 430321: '湘潭县', - 430381: '湘乡市', - 430382: '韶山市', - 430405: '珠晖区', - 430406: '雁峰区', - 430407: '石鼓区', - 430408: '蒸湘区', - 430412: '南岳区', - 430421: '衡阳县', - 430422: '衡南县', - 430423: '衡山县', - 430424: '衡东县', - 430426: '祁东县', - 430481: '耒阳市', - 430482: '常宁市', - 430502: '双清区', - 430503: '大祥区', - 430511: '北塔区', - 430521: '邵东县', - 430522: '新邵县', - 430523: '邵阳县', - 430524: '隆回县', - 430525: '洞口县', - 430527: '绥宁县', - 430528: '新宁县', - 430529: '城步苗族自治县', - 430581: '武冈市', - 430602: '岳阳楼区', - 430603: '云溪区', - 430611: '君山区', - 430621: '岳阳县', - 430623: '华容县', - 430624: '湘阴县', - 430626: '平江县', - 430681: '汨罗市', - 430682: '临湘市', - 430702: '武陵区', - 430703: '鼎城区', - 430721: '安乡县', - 430722: '汉寿县', - 430723: '澧县', - 430724: '临澧县', - 430725: '桃源县', - 430726: '石门县', - 430781: '津市市', - 430802: '永定区', - 430811: '武陵源区', - 430821: '慈利县', - 430822: '桑植县', - 430902: '资阳区', - 430903: '赫山区', - 430921: '南县', - 430922: '桃江县', - 430923: '安化县', - 430981: '沅江市', - 431002: '北湖区', - 431003: '苏仙区', - 431021: '桂阳县', - 431022: '宜章县', - 431023: '永兴县', - 431024: '嘉禾县', - 431025: '临武县', - 431026: '汝城县', - 431027: '桂东县', - 431028: '安仁县', - 431081: '资兴市', - 431102: '零陵区', - 431103: '冷水滩区', - 431121: '祁阳县', - 431122: '东安县', - 431123: '双牌县', - 431124: '道县', - 431125: '江永县', - 431126: '宁远县', - 431127: '蓝山县', - 431128: '新田县', - 431129: '江华瑶族自治县', - 431202: '鹤城区', - 431221: '中方县', - 431222: '沅陵县', - 431223: '辰溪县', - 431224: '溆浦县', - 431225: '会同县', - 431226: '麻阳苗族自治县', - 431227: '新晃侗族自治县', - 431228: '芷江侗族自治县', - 431229: '靖州苗族侗族自治县', - 431230: '通道侗族自治县', - 431281: '洪江市', - 431302: '娄星区', - 431321: '双峰县', - 431322: '新化县', - 431381: '冷水江市', - 431382: '涟源市', - 433101: '吉首市', - 433122: '泸溪县', - 433123: '凤凰县', - 433124: '花垣县', - 433125: '保靖县', - 433126: '古丈县', - 433127: '永顺县', - 433130: '龙山县', - 440103: '荔湾区', - 440104: '越秀区', - 440105: '海珠区', - 440106: '天河区', - 440111: '白云区', - 440112: '黄埔区', - 440113: '番禺区', - 440114: '花都区', - 440115: '南沙区', - 440117: '从化区', - 440118: '增城区', - 440203: '武江区', - 440204: '浈江区', - 440205: '曲江区', - 440222: '始兴县', - 440224: '仁化县', - 440229: '翁源县', - 440232: '乳源瑶族自治县', - 440233: '新丰县', - 440281: '乐昌市', - 440282: '南雄市', - 440303: '罗湖区', - 440304: '福田区', - 440305: '南山区', - 440306: '宝安区', - 440307: '龙岗区', - 440308: '盐田区', - 440309: '龙华区', - 440310: '坪山区', - 440311: '光明区', - 440402: '香洲区', - 440403: '斗门区', - 440404: '金湾区', - 440507: '龙湖区', - 440511: '金平区', - 440512: '濠江区', - 440513: '潮阳区', - 440514: '潮南区', - 440515: '澄海区', - 440523: '南澳县', - 440604: '禅城区', - 440605: '南海区', - 440606: '顺德区', - 440607: '三水区', - 440608: '高明区', - 440703: '蓬江区', - 440704: '江海区', - 440705: '新会区', - 440781: '台山市', - 440783: '开平市', - 440784: '鹤山市', - 440785: '恩平市', - 440802: '赤坎区', - 440803: '霞山区', - 440804: '坡头区', - 440811: '麻章区', - 440823: '遂溪县', - 440825: '徐闻县', - 440881: '廉江市', - 440882: '雷州市', - 440883: '吴川市', - 440890: '经济技术开发区', - 440902: '茂南区', - 440904: '电白区', - 440981: '高州市', - 440982: '化州市', - 440983: '信宜市', - 441202: '端州区', - 441203: '鼎湖区', - 441204: '高要区', - 441223: '广宁县', - 441224: '怀集县', - 441225: '封开县', - 441226: '德庆县', - 441284: '四会市', - 441302: '惠城区', - 441303: '惠阳区', - 441322: '博罗县', - 441323: '惠东县', - 441324: '龙门县', - 441402: '梅江区', - 441403: '梅县区', - 441422: '大埔县', - 441423: '丰顺县', - 441424: '五华县', - 441426: '平远县', - 441427: '蕉岭县', - 441481: '兴宁市', - 441502: '城区', - 441521: '海丰县', - 441523: '陆河县', - 441581: '陆丰市', - 441602: '源城区', - 441621: '紫金县', - 441622: '龙川县', - 441623: '连平县', - 441624: '和平县', - 441625: '东源县', - 441702: '江城区', - 441704: '阳东区', - 441721: '阳西县', - 441781: '阳春市', - 441802: '清城区', - 441803: '清新区', - 441821: '佛冈县', - 441823: '阳山县', - 441825: '连山壮族瑶族自治县', - 441826: '连南瑶族自治县', - 441881: '英德市', - 441882: '连州市', - 441901: '中堂镇', - 441903: '南城街道办事处', - 441904: '长安镇', - 441905: '东坑镇', - 441906: '樟木头镇', - 441907: '莞城街道办事处', - 441908: '石龙镇', - 441909: '桥头镇', - 441910: '万江街道办事处', - 441911: '麻涌镇', - 441912: '虎门镇', - 441913: '谢岗镇', - 441914: '石碣镇', - 441915: '茶山镇', - 441916: '东城街道办事处', - 441917: '洪梅镇', - 441918: '道滘镇', - 441919: '高埗镇', - 441920: '企石镇', - 441921: '凤岗镇', - 441922: '大岭山镇', - 441923: '松山湖管委会', - 441924: '清溪镇', - 441925: '望牛墩镇', - 441926: '厚街镇', - 441927: '常平镇', - 441928: '寮步镇', - 441929: '石排镇', - 441930: '横沥镇', - 441931: '塘厦镇', - 441932: '黄江镇', - 441933: '大朗镇', - 441934: '东莞港', - 441935: '东莞生态园', - 441990: '沙田镇', - 442001: '南头镇', - 442002: '神湾镇', - 442003: '东凤镇', - 442004: '五桂山街道办事处', - 442005: '黄圃镇', - 442006: '小榄镇', - 442007: '石岐区街道办事处', - 442008: '横栏镇', - 442009: '三角镇', - 442010: '三乡镇', - 442011: '港口镇', - 442012: '沙溪镇', - 442013: '板芙镇', - 442015: '东升镇', - 442016: '阜沙镇', - 442017: '民众镇', - 442018: '东区街道办事处', - 442019: '火炬开发区街道办事处', - 442020: '西区街道办事处', - 442021: '南区街道办事处', - 442022: '古镇镇', - 442023: '坦洲镇', - 442024: '大涌镇', - 442025: '南朗镇', - 445102: '湘桥区', - 445103: '潮安区', - 445122: '饶平县', - 445202: '榕城区', - 445203: '揭东区', - 445222: '揭西县', - 445224: '惠来县', - 445281: '普宁市', - 445302: '云城区', - 445303: '云安区', - 445321: '新兴县', - 445322: '郁南县', - 445381: '罗定市', - 450102: '兴宁区', - 450103: '青秀区', - 450105: '江南区', - 450107: '西乡塘区', - 450108: '良庆区', - 450109: '邕宁区', - 450110: '武鸣区', - 450123: '隆安县', - 450124: '马山县', - 450125: '上林县', - 450126: '宾阳县', - 450127: '横县', - 450202: '城中区', - 450203: '鱼峰区', - 450204: '柳南区', - 450205: '柳北区', - 450206: '柳江区', - 450222: '柳城县', - 450223: '鹿寨县', - 450224: '融安县', - 450225: '融水苗族自治县', - 450226: '三江侗族自治县', - 450302: '秀峰区', - 450303: '叠彩区', - 450304: '象山区', - 450305: '七星区', - 450311: '雁山区', - 450312: '临桂区', - 450321: '阳朔县', - 450323: '灵川县', - 450324: '全州县', - 450325: '兴安县', - 450326: '永福县', - 450327: '灌阳县', - 450328: '龙胜各族自治县', - 450329: '资源县', - 450330: '平乐县', - 450332: '恭城瑶族自治县', - 450381: '荔浦市', - 450403: '万秀区', - 450405: '长洲区', - 450406: '龙圩区', - 450421: '苍梧县', - 450422: '藤县', - 450423: '蒙山县', - 450481: '岑溪市', - 450502: '海城区', - 450503: '银海区', - 450512: '铁山港区', - 450521: '合浦县', - 450602: '港口区', - 450603: '防城区', - 450621: '上思县', - 450681: '东兴市', - 450702: '钦南区', - 450703: '钦北区', - 450721: '灵山县', - 450722: '浦北县', - 450802: '港北区', - 450803: '港南区', - 450804: '覃塘区', - 450821: '平南县', - 450881: '桂平市', - 450902: '玉州区', - 450903: '福绵区', - 450921: '容县', - 450922: '陆川县', - 450923: '博白县', - 450924: '兴业县', - 450981: '北流市', - 451002: '右江区', - 451021: '田阳县', - 451022: '田东县', - 451023: '平果县', - 451024: '德保县', - 451026: '那坡县', - 451027: '凌云县', - 451028: '乐业县', - 451029: '田林县', - 451030: '西林县', - 451031: '隆林各族自治县', - 451081: '靖西市', - 451102: '八步区', - 451103: '平桂区', - 451121: '昭平县', - 451122: '钟山县', - 451123: '富川瑶族自治县', - 451202: '金城江区', - 451203: '宜州区', - 451221: '南丹县', - 451222: '天峨县', - 451223: '凤山县', - 451224: '东兰县', - 451225: '罗城仫佬族自治县', - 451226: '环江毛南族自治县', - 451227: '巴马瑶族自治县', - 451228: '都安瑶族自治县', - 451229: '大化瑶族自治县', - 451302: '兴宾区', - 451321: '忻城县', - 451322: '象州县', - 451323: '武宣县', - 451324: '金秀瑶族自治县', - 451381: '合山市', - 451402: '江州区', - 451421: '扶绥县', - 451422: '宁明县', - 451423: '龙州县', - 451424: '大新县', - 451425: '天等县', - 451481: '凭祥市', - 460105: '秀英区', - 460106: '龙华区', - 460107: '琼山区', - 460108: '美兰区', - 460202: '海棠区', - 460203: '吉阳区', - 460204: '天涯区', - 460205: '崖州区', - 460321: '西沙群岛', - 460322: '南沙群岛', - 460323: '中沙群岛的岛礁及其海域', - 460401: '那大镇', - 460402: '和庆镇', - 460403: '南丰镇', - 460404: '大成镇', - 460405: '雅星镇', - 460406: '兰洋镇', - 460407: '光村镇', - 460408: '木棠镇', - 460409: '海头镇', - 460410: '峨蔓镇', - 460411: '王五镇', - 460412: '白马井镇', - 460413: '中和镇', - 460414: '排浦镇', - 460415: '东成镇', - 460416: '新州镇', - 460417: '洋浦经济开发区', - 460418: '华南热作学院', - 469001: '五指山市', - 469002: '琼海市', - 469005: '文昌市', - 469006: '万宁市', - 469007: '东方市', - 469021: '定安县', - 469022: '屯昌县', - 469023: '澄迈县', - 469024: '临高县', - 469025: '白沙黎族自治县', - 469026: '昌江黎族自治县', - 469027: '乐东黎族自治县', - 469028: '陵水黎族自治县', - 469029: '保亭黎族苗族自治县', - 469030: '琼中黎族苗族自治县', - 500101: '万州区', - 500102: '涪陵区', - 500103: '渝中区', - 500104: '大渡口区', - 500105: '江北区', - 500106: '沙坪坝区', - 500107: '九龙坡区', - 500108: '南岸区', - 500109: '北碚区', - 500110: '綦江区', - 500111: '大足区', - 500112: '渝北区', - 500113: '巴南区', - 500114: '黔江区', - 500115: '长寿区', - 500116: '江津区', - 500117: '合川区', - 500118: '永川区', - 500119: '南川区', - 500120: '璧山区', - 500151: '铜梁区', - 500152: '潼南区', - 500153: '荣昌区', - 500154: '开州区', - 500155: '梁平区', - 500156: '武隆区', - 500229: '城口县', - 500230: '丰都县', - 500231: '垫江县', - 500233: '忠县', - 500235: '云阳县', - 500236: '奉节县', - 500237: '巫山县', - 500238: '巫溪县', - 500240: '石柱土家族自治县', - 500241: '秀山土家族苗族自治县', - 500242: '酉阳土家族苗族自治县', - 500243: '彭水苗族土家族自治县', - 510104: '锦江区', - 510105: '青羊区', - 510106: '金牛区', - 510107: '武侯区', - 510108: '成华区', - 510112: '龙泉驿区', - 510113: '青白江区', - 510114: '新都区', - 510115: '温江区', - 510116: '双流区', - 510117: '郫都区', - 510121: '金堂县', - 510129: '大邑县', - 510131: '蒲江县', - 510132: '新津县', - 510181: '都江堰市', - 510182: '彭州市', - 510183: '邛崃市', - 510184: '崇州市', - 510185: '简阳市', - 510191: '高新区', - 510302: '自流井区', - 510303: '贡井区', - 510304: '大安区', - 510311: '沿滩区', - 510321: '荣县', - 510322: '富顺县', - 510402: '东区', - 510403: '西区', - 510411: '仁和区', - 510421: '米易县', - 510422: '盐边县', - 510502: '江阳区', - 510503: '纳溪区', - 510504: '龙马潭区', - 510521: '泸县', - 510522: '合江县', - 510524: '叙永县', - 510525: '古蔺县', - 510603: '旌阳区', - 510604: '罗江区', - 510623: '中江县', - 510681: '广汉市', - 510682: '什邡市', - 510683: '绵竹市', - 510703: '涪城区', - 510704: '游仙区', - 510705: '安州区', - 510722: '三台县', - 510723: '盐亭县', - 510725: '梓潼县', - 510726: '北川羌族自治县', - 510727: '平武县', - 510781: '江油市', - 510791: '高新区', - 510802: '利州区', - 510811: '昭化区', - 510812: '朝天区', - 510821: '旺苍县', - 510822: '青川县', - 510823: '剑阁县', - 510824: '苍溪县', - 510903: '船山区', - 510904: '安居区', - 510921: '蓬溪县', - 510922: '射洪县', - 510923: '大英县', - 511002: '市中区', - 511011: '东兴区', - 511024: '威远县', - 511025: '资中县', - 511083: '隆昌市', - 511102: '市中区', - 511111: '沙湾区', - 511112: '五通桥区', - 511113: '金口河区', - 511123: '犍为县', - 511124: '井研县', - 511126: '夹江县', - 511129: '沐川县', - 511132: '峨边彝族自治县', - 511133: '马边彝族自治县', - 511181: '峨眉山市', - 511302: '顺庆区', - 511303: '高坪区', - 511304: '嘉陵区', - 511321: '南部县', - 511322: '营山县', - 511323: '蓬安县', - 511324: '仪陇县', - 511325: '西充县', - 511381: '阆中市', - 511402: '东坡区', - 511403: '彭山区', - 511421: '仁寿县', - 511423: '洪雅县', - 511424: '丹棱县', - 511425: '青神县', - 511502: '翠屏区', - 511503: '南溪区', - 511504: '叙州区', - 511523: '江安县', - 511524: '长宁县', - 511525: '高县', - 511526: '珙县', - 511527: '筠连县', - 511528: '兴文县', - 511529: '屏山县', - 511602: '广安区', - 511603: '前锋区', - 511621: '岳池县', - 511622: '武胜县', - 511623: '邻水县', - 511681: '华蓥市', - 511702: '通川区', - 511703: '达川区', - 511722: '宣汉县', - 511723: '开江县', - 511724: '大竹县', - 511725: '渠县', - 511781: '万源市', - 511802: '雨城区', - 511803: '名山区', - 511822: '荥经县', - 511823: '汉源县', - 511824: '石棉县', - 511825: '天全县', - 511826: '芦山县', - 511827: '宝兴县', - 511902: '巴州区', - 511903: '恩阳区', - 511921: '通江县', - 511922: '南江县', - 511923: '平昌县', - 512002: '雁江区', - 512021: '安岳县', - 512022: '乐至县', - 513201: '马尔康市', - 513221: '汶川县', - 513222: '理县', - 513223: '茂县', - 513224: '松潘县', - 513225: '九寨沟县', - 513226: '金川县', - 513227: '小金县', - 513228: '黑水县', - 513230: '壤塘县', - 513231: '阿坝县', - 513232: '若尔盖县', - 513233: '红原县', - 513301: '康定市', - 513322: '泸定县', - 513323: '丹巴县', - 513324: '九龙县', - 513325: '雅江县', - 513326: '道孚县', - 513327: '炉霍县', - 513328: '甘孜县', - 513329: '新龙县', - 513330: '德格县', - 513331: '白玉县', - 513332: '石渠县', - 513333: '色达县', - 513334: '理塘县', - 513335: '巴塘县', - 513336: '乡城县', - 513337: '稻城县', - 513338: '得荣县', - 513401: '西昌市', - 513422: '木里藏族自治县', - 513423: '盐源县', - 513424: '德昌县', - 513425: '会理县', - 513426: '会东县', - 513427: '宁南县', - 513428: '普格县', - 513429: '布拖县', - 513430: '金阳县', - 513431: '昭觉县', - 513432: '喜德县', - 513433: '冕宁县', - 513434: '越西县', - 513435: '甘洛县', - 513436: '美姑县', - 513437: '雷波县', - 520102: '南明区', - 520103: '云岩区', - 520111: '花溪区', - 520112: '乌当区', - 520113: '白云区', - 520115: '观山湖区', - 520121: '开阳县', - 520122: '息烽县', - 520123: '修文县', - 520181: '清镇市', - 520201: '钟山区', - 520203: '六枝特区', - 520221: '水城县', - 520281: '盘州市', - 520302: '红花岗区', - 520303: '汇川区', - 520304: '播州区', - 520322: '桐梓县', - 520323: '绥阳县', - 520324: '正安县', - 520325: '道真仡佬族苗族自治县', - 520326: '务川仡佬族苗族自治县', - 520327: '凤冈县', - 520328: '湄潭县', - 520329: '余庆县', - 520330: '习水县', - 520381: '赤水市', - 520382: '仁怀市', - 520402: '西秀区', - 520403: '平坝区', - 520422: '普定县', - 520423: '镇宁布依族苗族自治县', - 520424: '关岭布依族苗族自治县', - 520425: '紫云苗族布依族自治县', - 520502: '七星关区', - 520521: '大方县', - 520522: '黔西县', - 520523: '金沙县', - 520524: '织金县', - 520525: '纳雍县', - 520526: '威宁彝族回族苗族自治县', - 520527: '赫章县', - 520602: '碧江区', - 520603: '万山区', - 520621: '江口县', - 520622: '玉屏侗族自治县', - 520623: '石阡县', - 520624: '思南县', - 520625: '印江土家族苗族自治县', - 520626: '德江县', - 520627: '沿河土家族自治县', - 520628: '松桃苗族自治县', - 522301: '兴义市', - 522302: '兴仁市', - 522323: '普安县', - 522324: '晴隆县', - 522325: '贞丰县', - 522326: '望谟县', - 522327: '册亨县', - 522328: '安龙县', - 522601: '凯里市', - 522622: '黄平县', - 522623: '施秉县', - 522624: '三穗县', - 522625: '镇远县', - 522626: '岑巩县', - 522627: '天柱县', - 522628: '锦屏县', - 522629: '剑河县', - 522630: '台江县', - 522631: '黎平县', - 522632: '榕江县', - 522633: '从江县', - 522634: '雷山县', - 522635: '麻江县', - 522636: '丹寨县', - 522701: '都匀市', - 522702: '福泉市', - 522722: '荔波县', - 522723: '贵定县', - 522725: '瓮安县', - 522726: '独山县', - 522727: '平塘县', - 522728: '罗甸县', - 522729: '长顺县', - 522730: '龙里县', - 522731: '惠水县', - 522732: '三都水族自治县', - 530102: '五华区', - 530103: '盘龙区', - 530111: '官渡区', - 530112: '西山区', - 530113: '东川区', - 530114: '呈贡区', - 530115: '晋宁区', - 530124: '富民县', - 530125: '宜良县', - 530126: '石林彝族自治县', - 530127: '嵩明县', - 530128: '禄劝彝族苗族自治县', - 530129: '寻甸回族彝族自治县', - 530181: '安宁市', - 530302: '麒麟区', - 530303: '沾益区', - 530304: '马龙区', - 530322: '陆良县', - 530323: '师宗县', - 530324: '罗平县', - 530325: '富源县', - 530326: '会泽县', - 530381: '宣威市', - 530402: '红塔区', - 530403: '江川区', - 530422: '澄江县', - 530423: '通海县', - 530424: '华宁县', - 530425: '易门县', - 530426: '峨山彝族自治县', - 530427: '新平彝族傣族自治县', - 530428: '元江哈尼族彝族傣族自治县', - 530502: '隆阳区', - 530521: '施甸县', - 530523: '龙陵县', - 530524: '昌宁县', - 530581: '腾冲市', - 530602: '昭阳区', - 530621: '鲁甸县', - 530622: '巧家县', - 530623: '盐津县', - 530624: '大关县', - 530625: '永善县', - 530626: '绥江县', - 530627: '镇雄县', - 530628: '彝良县', - 530629: '威信县', - 530681: '水富市', - 530702: '古城区', - 530721: '玉龙纳西族自治县', - 530722: '永胜县', - 530723: '华坪县', - 530724: '宁蒗彝族自治县', - 530802: '思茅区', - 530821: '宁洱哈尼族彝族自治县', - 530822: '墨江哈尼族自治县', - 530823: '景东彝族自治县', - 530824: '景谷傣族彝族自治县', - 530825: '镇沅彝族哈尼族拉祜族自治县', - 530826: '江城哈尼族彝族自治县', - 530827: '孟连傣族拉祜族佤族自治县', - 530828: '澜沧拉祜族自治县', - 530829: '西盟佤族自治县', - 530902: '临翔区', - 530921: '凤庆县', - 530922: '云县', - 530923: '永德县', - 530924: '镇康县', - 530925: '双江拉祜族佤族布朗族傣族自治县', - 530926: '耿马傣族佤族自治县', - 530927: '沧源佤族自治县', - 532301: '楚雄市', - 532322: '双柏县', - 532323: '牟定县', - 532324: '南华县', - 532325: '姚安县', - 532326: '大姚县', - 532327: '永仁县', - 532328: '元谋县', - 532329: '武定县', - 532331: '禄丰县', - 532501: '个旧市', - 532502: '开远市', - 532503: '蒙自市', - 532504: '弥勒市', - 532523: '屏边苗族自治县', - 532524: '建水县', - 532525: '石屏县', - 532527: '泸西县', - 532528: '元阳县', - 532529: '红河县', - 532530: '金平苗族瑶族傣族自治县', - 532531: '绿春县', - 532532: '河口瑶族自治县', - 532601: '文山市', - 532622: '砚山县', - 532623: '西畴县', - 532624: '麻栗坡县', - 532625: '马关县', - 532626: '丘北县', - 532627: '广南县', - 532628: '富宁县', - 532801: '景洪市', - 532822: '勐海县', - 532823: '勐腊县', - 532901: '大理市', - 532922: '漾濞彝族自治县', - 532923: '祥云县', - 532924: '宾川县', - 532925: '弥渡县', - 532926: '南涧彝族自治县', - 532927: '巍山彝族回族自治县', - 532928: '永平县', - 532929: '云龙县', - 532930: '洱源县', - 532931: '剑川县', - 532932: '鹤庆县', - 533102: '瑞丽市', - 533103: '芒市', - 533122: '梁河县', - 533123: '盈江县', - 533124: '陇川县', - 533301: '泸水市', - 533323: '福贡县', - 533324: '贡山独龙族怒族自治县', - 533325: '兰坪白族普米族自治县', - 533401: '香格里拉市', - 533422: '德钦县', - 533423: '维西傈僳族自治县', - 540102: '城关区', - 540103: '堆龙德庆区', - 540104: '达孜区', - 540121: '林周县', - 540122: '当雄县', - 540123: '尼木县', - 540124: '曲水县', - 540127: '墨竹工卡县', - 540202: '桑珠孜区', - 540221: '南木林县', - 540222: '江孜县', - 540223: '定日县', - 540224: '萨迦县', - 540225: '拉孜县', - 540226: '昂仁县', - 540227: '谢通门县', - 540228: '白朗县', - 540229: '仁布县', - 540230: '康马县', - 540231: '定结县', - 540232: '仲巴县', - 540233: '亚东县', - 540234: '吉隆县', - 540235: '聂拉木县', - 540236: '萨嘎县', - 540237: '岗巴县', - 540302: '卡若区', - 540321: '江达县', - 540322: '贡觉县', - 540323: '类乌齐县', - 540324: '丁青县', - 540325: '察雅县', - 540326: '八宿县', - 540327: '左贡县', - 540328: '芒康县', - 540329: '洛隆县', - 540330: '边坝县', - 540402: '巴宜区', - 540421: '工布江达县', - 540422: '米林县', - 540423: '墨脱县', - 540424: '波密县', - 540425: '察隅县', - 540426: '朗县', - 540502: '乃东区', - 540521: '扎囊县', - 540522: '贡嘎县', - 540523: '桑日县', - 540524: '琼结县', - 540525: '曲松县', - 540526: '措美县', - 540527: '洛扎县', - 540528: '加查县', - 540529: '隆子县', - 540530: '错那县', - 540531: '浪卡子县', - 540602: '色尼区', - 540621: '嘉黎县', - 540622: '比如县', - 540623: '聂荣县', - 540624: '安多县', - 540625: '申扎县', - 540626: '索县', - 540627: '班戈县', - 540628: '巴青县', - 540629: '尼玛县', - 540630: '双湖县', - 542521: '普兰县', - 542522: '札达县', - 542523: '噶尔县', - 542524: '日土县', - 542525: '革吉县', - 542526: '改则县', - 542527: '措勤县', - 610102: '新城区', - 610103: '碑林区', - 610104: '莲湖区', - 610111: '灞桥区', - 610112: '未央区', - 610113: '雁塔区', - 610114: '阎良区', - 610115: '临潼区', - 610116: '长安区', - 610117: '高陵区', - 610118: '鄠邑区', - 610122: '蓝田县', - 610124: '周至县', - 610202: '王益区', - 610203: '印台区', - 610204: '耀州区', - 610222: '宜君县', - 610302: '渭滨区', - 610303: '金台区', - 610304: '陈仓区', - 610322: '凤翔县', - 610323: '岐山县', - 610324: '扶风县', - 610326: '眉县', - 610327: '陇县', - 610328: '千阳县', - 610329: '麟游县', - 610330: '凤县', - 610331: '太白县', - 610402: '秦都区', - 610403: '杨陵区', - 610404: '渭城区', - 610422: '三原县', - 610423: '泾阳县', - 610424: '乾县', - 610425: '礼泉县', - 610426: '永寿县', - 610428: '长武县', - 610429: '旬邑县', - 610430: '淳化县', - 610431: '武功县', - 610481: '兴平市', - 610482: '彬州市', - 610502: '临渭区', - 610503: '华州区', - 610522: '潼关县', - 610523: '大荔县', - 610524: '合阳县', - 610525: '澄城县', - 610526: '蒲城县', - 610527: '白水县', - 610528: '富平县', - 610581: '韩城市', - 610582: '华阴市', - 610602: '宝塔区', - 610603: '安塞区', - 610621: '延长县', - 610622: '延川县', - 610623: '子长县', - 610625: '志丹县', - 610626: '吴起县', - 610627: '甘泉县', - 610628: '富县', - 610629: '洛川县', - 610630: '宜川县', - 610631: '黄龙县', - 610632: '黄陵县', - 610702: '汉台区', - 610703: '南郑区', - 610722: '城固县', - 610723: '洋县', - 610724: '西乡县', - 610725: '勉县', - 610726: '宁强县', - 610727: '略阳县', - 610728: '镇巴县', - 610729: '留坝县', - 610730: '佛坪县', - 610802: '榆阳区', - 610803: '横山区', - 610822: '府谷县', - 610824: '靖边县', - 610825: '定边县', - 610826: '绥德县', - 610827: '米脂县', - 610828: '佳县', - 610829: '吴堡县', - 610830: '清涧县', - 610831: '子洲县', - 610881: '神木市', - 610902: '汉滨区', - 610921: '汉阴县', - 610922: '石泉县', - 610923: '宁陕县', - 610924: '紫阳县', - 610925: '岚皋县', - 610926: '平利县', - 610927: '镇坪县', - 610928: '旬阳县', - 610929: '白河县', - 611002: '商州区', - 611021: '洛南县', - 611022: '丹凤县', - 611023: '商南县', - 611024: '山阳县', - 611025: '镇安县', - 611026: '柞水县', - 620102: '城关区', - 620103: '七里河区', - 620104: '西固区', - 620105: '安宁区', - 620111: '红古区', - 620121: '永登县', - 620122: '皋兰县', - 620123: '榆中县', - 620201: '市辖区', - 620290: '雄关区', - 620291: '长城区', - 620292: '镜铁区', - 620293: '新城镇', - 620294: '峪泉镇', - 620295: '文殊镇', - 620302: '金川区', - 620321: '永昌县', - 620402: '白银区', - 620403: '平川区', - 620421: '靖远县', - 620422: '会宁县', - 620423: '景泰县', - 620502: '秦州区', - 620503: '麦积区', - 620521: '清水县', - 620522: '秦安县', - 620523: '甘谷县', - 620524: '武山县', - 620525: '张家川回族自治县', - 620602: '凉州区', - 620621: '民勤县', - 620622: '古浪县', - 620623: '天祝藏族自治县', - 620702: '甘州区', - 620721: '肃南裕固族自治县', - 620722: '民乐县', - 620723: '临泽县', - 620724: '高台县', - 620725: '山丹县', - 620802: '崆峒区', - 620821: '泾川县', - 620822: '灵台县', - 620823: '崇信县', - 620825: '庄浪县', - 620826: '静宁县', - 620881: '华亭市', - 620902: '肃州区', - 620921: '金塔县', - 620922: '瓜州县', - 620923: '肃北蒙古族自治县', - 620924: '阿克塞哈萨克族自治县', - 620981: '玉门市', - 620982: '敦煌市', - 621002: '西峰区', - 621021: '庆城县', - 621022: '环县', - 621023: '华池县', - 621024: '合水县', - 621025: '正宁县', - 621026: '宁县', - 621027: '镇原县', - 621102: '安定区', - 621121: '通渭县', - 621122: '陇西县', - 621123: '渭源县', - 621124: '临洮县', - 621125: '漳县', - 621126: '岷县', - 621202: '武都区', - 621221: '成县', - 621222: '文县', - 621223: '宕昌县', - 621224: '康县', - 621225: '西和县', - 621226: '礼县', - 621227: '徽县', - 621228: '两当县', - 622901: '临夏市', - 622921: '临夏县', - 622922: '康乐县', - 622923: '永靖县', - 622924: '广河县', - 622925: '和政县', - 622926: '东乡族自治县', - 622927: '积石山保安族东乡族撒拉族自治县', - 623001: '合作市', - 623021: '临潭县', - 623022: '卓尼县', - 623023: '舟曲县', - 623024: '迭部县', - 623025: '玛曲县', - 623026: '碌曲县', - 623027: '夏河县', - 630102: '城东区', - 630103: '城中区', - 630104: '城西区', - 630105: '城北区', - 630121: '大通回族土族自治县', - 630122: '湟中县', - 630123: '湟源县', - 630202: '乐都区', - 630203: '平安区', - 630222: '民和回族土族自治县', - 630223: '互助土族自治县', - 630224: '化隆回族自治县', - 630225: '循化撒拉族自治县', - 632221: '门源回族自治县', - 632222: '祁连县', - 632223: '海晏县', - 632224: '刚察县', - 632321: '同仁县', - 632322: '尖扎县', - 632323: '泽库县', - 632324: '河南蒙古族自治县', - 632521: '共和县', - 632522: '同德县', - 632523: '贵德县', - 632524: '兴海县', - 632525: '贵南县', - 632621: '玛沁县', - 632622: '班玛县', - 632623: '甘德县', - 632624: '达日县', - 632625: '久治县', - 632626: '玛多县', - 632701: '玉树市', - 632722: '杂多县', - 632723: '称多县', - 632724: '治多县', - 632725: '囊谦县', - 632726: '曲麻莱县', - 632801: '格尔木市', - 632802: '德令哈市', - 632803: '茫崖市', - 632821: '乌兰县', - 632822: '都兰县', - 632823: '天峻县', - 640104: '兴庆区', - 640105: '西夏区', - 640106: '金凤区', - 640121: '永宁县', - 640122: '贺兰县', - 640181: '灵武市', - 640202: '大武口区', - 640205: '惠农区', - 640221: '平罗县', - 640302: '利通区', - 640303: '红寺堡区', - 640323: '盐池县', - 640324: '同心县', - 640381: '青铜峡市', - 640402: '原州区', - 640422: '西吉县', - 640423: '隆德县', - 640424: '泾源县', - 640425: '彭阳县', - 640502: '沙坡头区', - 640521: '中宁县', - 640522: '海原县', - 650102: '天山区', - 650103: '沙依巴克区', - 650104: '新市区', - 650105: '水磨沟区', - 650106: '头屯河区', - 650107: '达坂城区', - 650109: '米东区', - 650121: '乌鲁木齐县', - 650202: '独山子区', - 650203: '克拉玛依区', - 650204: '白碱滩区', - 650205: '乌尔禾区', - 650402: '高昌区', - 650421: '鄯善县', - 650422: '托克逊县', - 650502: '伊州区', - 650521: '巴里坤哈萨克自治县', - 650522: '伊吾县', - 652301: '昌吉市', - 652302: '阜康市', - 652323: '呼图壁县', - 652324: '玛纳斯县', - 652325: '奇台县', - 652327: '吉木萨尔县', - 652328: '木垒哈萨克自治县', - 652701: '博乐市', - 652702: '阿拉山口市', - 652722: '精河县', - 652723: '温泉县', - 652801: '库尔勒市', - 652822: '轮台县', - 652823: '尉犁县', - 652824: '若羌县', - 652825: '且末县', - 652826: '焉耆回族自治县', - 652827: '和静县', - 652828: '和硕县', - 652829: '博湖县', - 652901: '阿克苏市', - 652922: '温宿县', - 652923: '库车县', - 652924: '沙雅县', - 652925: '新和县', - 652926: '拜城县', - 652927: '乌什县', - 652928: '阿瓦提县', - 652929: '柯坪县', - 653001: '阿图什市', - 653022: '阿克陶县', - 653023: '阿合奇县', - 653024: '乌恰县', - 653101: '喀什市', - 653121: '疏附县', - 653122: '疏勒县', - 653123: '英吉沙县', - 653124: '泽普县', - 653125: '莎车县', - 653126: '叶城县', - 653127: '麦盖提县', - 653128: '岳普湖县', - 653129: '伽师县', - 653130: '巴楚县', - 653131: '塔什库尔干塔吉克自治县', - 653201: '和田市', - 653221: '和田县', - 653222: '墨玉县', - 653223: '皮山县', - 653224: '洛浦县', - 653225: '策勒县', - 653226: '于田县', - 653227: '民丰县', - 654002: '伊宁市', - 654003: '奎屯市', - 654004: '霍尔果斯市', - 654021: '伊宁县', - 654022: '察布查尔锡伯自治县', - 654023: '霍城县', - 654024: '巩留县', - 654025: '新源县', - 654026: '昭苏县', - 654027: '特克斯县', - 654028: '尼勒克县', - 654201: '塔城市', - 654202: '乌苏市', - 654221: '额敏县', - 654223: '沙湾县', - 654224: '托里县', - 654225: '裕民县', - 654226: '和布克赛尔蒙古自治县', - 654301: '阿勒泰市', - 654321: '布尔津县', - 654322: '富蕴县', - 654323: '福海县', - 654324: '哈巴河县', - 654325: '青河县', - 654326: '吉木乃县', - 659001: '石河子市', - 659002: '阿拉尔市', - 659003: '图木舒克市', - 659004: '五家渠市', - 659005: '北屯市', - 659006: '铁门关市', - 659007: '双河市', - 659008: '可克达拉市', - 659009: '昆玉市', - 710101: '中正区', - 710102: '大同区', - 710103: '中山区', - 710104: '松山区', - 710105: '大安区', - 710106: '万华区', - 710107: '信义区', - 710108: '士林区', - 710109: '北投区', - 710110: '内湖区', - 710111: '南港区', - 710112: '文山区', - 710199: '其它区', - 710201: '新兴区', - 710202: '前金区', - 710203: '芩雅区', - 710204: '盐埕区', - 710205: '鼓山区', - 710206: '旗津区', - 710207: '前镇区', - 710208: '三民区', - 710209: '左营区', - 710210: '楠梓区', - 710211: '小港区', - 710241: '苓雅区', - 710242: '仁武区', - 710243: '大社区', - 710244: '冈山区', - 710245: '路竹区', - 710246: '阿莲区', - 710247: '田寮区', - 710248: '燕巢区', - 710249: '桥头区', - 710250: '梓官区', - 710251: '弥陀区', - 710252: '永安区', - 710253: '湖内区', - 710254: '凤山区', - 710255: '大寮区', - 710256: '林园区', - 710257: '鸟松区', - 710258: '大树区', - 710259: '旗山区', - 710260: '美浓区', - 710261: '六龟区', - 710262: '内门区', - 710263: '杉林区', - 710264: '甲仙区', - 710265: '桃源区', - 710266: '那玛夏区', - 710267: '茂林区', - 710268: '茄萣区', - 710299: '其它区', - 710301: '中西区', - 710302: '东区', - 710303: '南区', - 710304: '北区', - 710305: '安平区', - 710306: '安南区', - 710339: '永康区', - 710340: '归仁区', - 710341: '新化区', - 710342: '左镇区', - 710343: '玉井区', - 710344: '楠西区', - 710345: '南化区', - 710346: '仁德区', - 710347: '关庙区', - 710348: '龙崎区', - 710349: '官田区', - 710350: '麻豆区', - 710351: '佳里区', - 710352: '西港区', - 710353: '七股区', - 710354: '将军区', - 710355: '学甲区', - 710356: '北门区', - 710357: '新营区', - 710358: '后壁区', - 710359: '白河区', - 710360: '东山区', - 710361: '六甲区', - 710362: '下营区', - 710363: '柳营区', - 710364: '盐水区', - 710365: '善化区', - 710366: '大内区', - 710367: '山上区', - 710368: '新市区', - 710369: '安定区', - 710399: '其它区', - 710401: '中区', - 710402: '东区', - 710403: '南区', - 710404: '西区', - 710405: '北区', - 710406: '北屯区', - 710407: '西屯区', - 710408: '南屯区', - 710431: '太平区', - 710432: '大里区', - 710433: '雾峰区', - 710434: '乌日区', - 710435: '丰原区', - 710436: '后里区', - 710437: '石冈区', - 710438: '东势区', - 710439: '和平区', - 710440: '新社区', - 710441: '潭子区', - 710442: '大雅区', - 710443: '神冈区', - 710444: '大肚区', - 710445: '沙鹿区', - 710446: '龙井区', - 710447: '梧栖区', - 710448: '清水区', - 710449: '大甲区', - 710450: '外埔区', - 710451: '大安区', - 710499: '其它区', - 710507: '金沙镇', - 710508: '金湖镇', - 710509: '金宁乡', - 710510: '金城镇', - 710511: '烈屿乡', - 710512: '乌坵乡', - 710614: '南投市', - 710615: '中寮乡', - 710616: '草屯镇', - 710617: '国姓乡', - 710618: '埔里镇', - 710619: '仁爱乡', - 710620: '名间乡', - 710621: '集集镇', - 710622: '水里乡', - 710623: '鱼池乡', - 710624: '信义乡', - 710625: '竹山镇', - 710626: '鹿谷乡', - 710701: '仁爱区', - 710702: '信义区', - 710703: '中正区', - 710704: '中山区', - 710705: '安乐区', - 710706: '暖暖区', - 710707: '七堵区', - 710799: '其它区', - 710801: '东区', - 710802: '北区', - 710803: '香山区', - 710899: '其它区', - 710901: '东区', - 710902: '西区', - 710999: '其它区', - 711130: '万里区', - 711132: '板桥区', - 711133: '汐止区', - 711134: '深坑区', - 711135: '石碇区', - 711136: '瑞芳区', - 711137: '平溪区', - 711138: '双溪区', - 711139: '贡寮区', - 711140: '新店区', - 711141: '坪林区', - 711142: '乌来区', - 711143: '永和区', - 711144: '中和区', - 711145: '土城区', - 711146: '三峡区', - 711147: '树林区', - 711148: '莺歌区', - 711149: '三重区', - 711150: '新庄区', - 711151: '泰山区', - 711152: '林口区', - 711153: '芦洲区', - 711154: '五股区', - 711155: '八里区', - 711156: '淡水区', - 711157: '三芝区', - 711158: '石门区', - 711287: '宜兰市', - 711288: '头城镇', - 711289: '礁溪乡', - 711290: '壮围乡', - 711291: '员山乡', - 711292: '罗东镇', - 711293: '三星乡', - 711294: '大同乡', - 711295: '五结乡', - 711296: '冬山乡', - 711297: '苏澳镇', - 711298: '南澳乡', - 711299: '钓鱼台', - 711387: '竹北市', - 711388: '湖口乡', - 711389: '新丰乡', - 711390: '新埔镇', - 711391: '关西镇', - 711392: '芎林乡', - 711393: '宝山乡', - 711394: '竹东镇', - 711395: '五峰乡', - 711396: '横山乡', - 711397: '尖石乡', - 711398: '北埔乡', - 711399: '峨眉乡', - 711414: '中坜区', - 711415: '平镇区', - 711417: '杨梅区', - 711418: '新屋区', - 711419: '观音区', - 711420: '桃园区', - 711421: '龟山区', - 711422: '八德区', - 711423: '大溪区', - 711425: '大园区', - 711426: '芦竹区', - 711487: '中坜市', - 711488: '平镇市', - 711489: '龙潭乡', - 711490: '杨梅市', - 711491: '新屋乡', - 711492: '观音乡', - 711493: '桃园市', - 711494: '龟山乡', - 711495: '八德市', - 711496: '大溪镇', - 711497: '复兴乡', - 711498: '大园乡', - 711499: '芦竹乡', - 711520: '头份市', - 711582: '竹南镇', - 711583: '头份镇', - 711584: '三湾乡', - 711585: '南庄乡', - 711586: '狮潭乡', - 711587: '后龙镇', - 711588: '通霄镇', - 711589: '苑里镇', - 711590: '苗栗市', - 711591: '造桥乡', - 711592: '头屋乡', - 711593: '公馆乡', - 711594: '大湖乡', - 711595: '泰安乡', - 711596: '铜锣乡', - 711597: '三义乡', - 711598: '西湖乡', - 711599: '卓兰镇', - 711736: '员林市', - 711774: '彰化市', - 711775: '芬园乡', - 711776: '花坛乡', - 711777: '秀水乡', - 711778: '鹿港镇', - 711779: '福兴乡', - 711780: '线西乡', - 711781: '和美镇', - 711782: '伸港乡', - 711783: '员林镇', - 711784: '社头乡', - 711785: '永靖乡', - 711786: '埔心乡', - 711787: '溪湖镇', - 711788: '大村乡', - 711789: '埔盐乡', - 711790: '田中镇', - 711791: '北斗镇', - 711792: '田尾乡', - 711793: '埤头乡', - 711794: '溪州乡', - 711795: '竹塘乡', - 711796: '二林镇', - 711797: '大城乡', - 711798: '芳苑乡', - 711799: '二水乡', - 711982: '番路乡', - 711983: '梅山乡', - 711984: '竹崎乡', - 711985: '阿里山乡', - 711986: '中埔乡', - 711987: '大埔乡', - 711988: '水上乡', - 711989: '鹿草乡', - 711990: '太保市', - 711991: '朴子市', - 711992: '东石乡', - 711993: '六脚乡', - 711994: '新港乡', - 711995: '民雄乡', - 711996: '大林镇', - 711997: '溪口乡', - 711998: '义竹乡', - 711999: '布袋镇', - 712180: '斗南镇', - 712181: '大埤乡', - 712182: '虎尾镇', - 712183: '土库镇', - 712184: '褒忠乡', - 712185: '东势乡', - 712186: '台西乡', - 712187: '仑背乡', - 712188: '麦寮乡', - 712189: '斗六市', - 712190: '林内乡', - 712191: '古坑乡', - 712192: '莿桐乡', - 712193: '西螺镇', - 712194: '二仑乡', - 712195: '北港镇', - 712196: '水林乡', - 712197: '口湖乡', - 712198: '四湖乡', - 712199: '元长乡', - 712451: '崁顶乡', - 712467: '屏东市', - 712468: '三地门乡', - 712469: '雾台乡', - 712470: '玛家乡', - 712471: '九如乡', - 712472: '里港乡', - 712473: '高树乡', - 712474: '盐埔乡', - 712475: '长治乡', - 712476: '麟洛乡', - 712477: '竹田乡', - 712478: '内埔乡', - 712479: '万丹乡', - 712480: '潮州镇', - 712481: '泰武乡', - 712482: '来义乡', - 712483: '万峦乡', - 712484: '莰顶乡', - 712485: '新埤乡', - 712486: '南州乡', - 712487: '林边乡', - 712488: '东港镇', - 712489: '琉球乡', - 712490: '佳冬乡', - 712491: '新园乡', - 712492: '枋寮乡', - 712493: '枋山乡', - 712494: '春日乡', - 712495: '狮子乡', - 712496: '车城乡', - 712497: '牡丹乡', - 712498: '恒春镇', - 712499: '满州乡', - 712584: '台东市', - 712585: '绿岛乡', - 712586: '兰屿乡', - 712587: '延平乡', - 712588: '卑南乡', - 712589: '鹿野乡', - 712590: '关山镇', - 712591: '海端乡', - 712592: '池上乡', - 712593: '东河乡', - 712594: '成功镇', - 712595: '长滨乡', - 712596: '金峰乡', - 712597: '大武乡', - 712598: '达仁乡', - 712599: '太麻里乡', - 712686: '花莲市', - 712687: '新城乡', - 712688: '太鲁阁', - 712689: '秀林乡', - 712690: '吉安乡', - 712691: '寿丰乡', - 712692: '凤林镇', - 712693: '光复乡', - 712694: '丰滨乡', - 712695: '瑞穗乡', - 712696: '万荣乡', - 712697: '玉里镇', - 712698: '卓溪乡', - 712699: '富里乡', - 712794: '马公市', - 712795: '西屿乡', - 712796: '望安乡', - 712797: '七美乡', - 712798: '白沙乡', - 712799: '湖西乡', - 712896: '南竿乡', - 712897: '北竿乡', - 712898: '东引乡', - 712899: '莒光乡', - 810101: '中西区', - 810102: '湾仔区', - 810103: '东区', - 810104: '南区', - 810201: '九龙城区', - 810202: '油尖旺区', - 810203: '深水埗区', - 810204: '黄大仙区', - 810205: '观塘区', - 810301: '北区', - 810302: '大埔区', - 810303: '沙田区', - 810304: '西贡区', - 810305: '元朗区', - 810306: '屯门区', - 810307: '荃湾区', - 810308: '葵青区', - 810309: '离岛区', - 820102: '花地玛堂区', - 820103: '花王堂区', - 820104: '望德堂区', - 820105: '大堂区', - 820106: '风顺堂区', - 820202: '嘉模堂区', - 820203: '路氹填海区', - 820204: '圣方济各堂区' - } -}; diff --git a/smart-admin-h5/src/constants/erp/contact-company.js b/smart-admin-h5/src/constants/erp/contact-company.js deleted file mode 100644 index b3730d9b..00000000 --- a/smart-admin-h5/src/constants/erp/contact-company.js +++ /dev/null @@ -1,165 +0,0 @@ -/** - * 往来单位性质 - * @type {{ENTERPRISE: {value: number, desc: string}, PERSONAL: {value: number, desc: string}}} - */ -export const CONTACT_COMPANY_NATURE_ENUM = - { - ENTERPRISE: { - value: 0, - desc: '企业' - }, - PERSONAL: { - value: 1, - desc: '个人' - } - }; -/** - * 往来机构类型 - * @type {{CUSTOMER: {value: number, desc: string}, SUPPLIER: {value: number, desc: string}}} - */ -export const - CONTACT_COMPANY_TYPE_ENUM = - { - CUSTOMER: { - value: 0, - desc: '客户' - }, - SUPPLIER: { - value: 1, - desc: '供应商' - }, - SCHOOL: { - value: 2, - desc: '分校' - }, - COOPERATIVE_ORG: { - value: 3, - desc: '合作机构' - } - }; - -/** - * 付款方式 - * @type {{BANK: {value: number, desc: string}, ZHI_FU_BAO: {value: number, desc: string}, WE_CHAT: {value: number, desc: string}}} - */ -export const - PAYMENT_TYPE_ENUM = - { - BANK: { - value: 0, - desc: '银行卡' - }, - WE_CHAT: { - value: 1, - desc: '微信' - }, - ZHI_FU_BAO: { - value: 2, - desc: '支付宝' - } - }; - -/** - * 往来机构余额类型 - * @type {{RECEIVE_BALANCE: {value: number, desc: string}, PAY_BALANCE: {value: number, desc: string}}} - */ -export const - CONTACT_COMPANY_BALANCE_TYPE = - { - PAY_BALANCE: { - value: 0, - desc: '应付款余额' - }, - RECEIVE_BALANCE: { - value: 1, - desc: '应收款余额' - } - }; - -/** - * 往来单位等级 - * @type {{CORE: {value: number, desc: string}, POTENTIAL: {value: number, desc: string}, BAD: {value: number, desc: string}, GENERAL: {value: number, desc: string}}} - */ -export const CONTACT_COMPANY_GRADE_ENUM = { - CORE: { - value: 1, - desc: '核心', - color: 'green' - }, - POTENTIAL: { - value: 2, - desc: '有潜力', - color: 'cyan' - }, - GENERAL: { - value: 3, - desc: '普通', - color: 'blue' - }, - BAD: { - value: 4, - desc: '较差', - color: 'purple' - } -}; - -/** - * 往来单位等级 - * @type {{OWNER: {value: number, desc: string}, SHARER: {value: number, desc: string}, COMMON: {value: number, desc: string}}} - */ -export const CONTACT_COMPANY_SHARE_TYPE_ENUM = { - OWNER: { - value: 0, - desc: '属于我的' - }, - SHARER: { - value: 1, - desc: '共享的' - }, - COMMON: { - value: 2, - desc: '公共的' - } -}; - -/** - * 往来单位标签 - * @type {{OWNER: {value: number, desc: string}, SHARER: {value: number, desc: string}, COMMON: {value: number, desc: string}}} - */ -export const CONTACT_COMPANY_TAG_ENUM = { - POTENTIAL: { - value: 0, - desc: '潜在', - color: 'green' - }, - INTENTION: { - value: 1, - desc: '意向', - color: 'cyan' - }, - NEGOTIATION: { - value: 2, - desc: '洽谈', - color: 'blue' - }, - DEAL: { - value: 3, - desc: '成交', - color: 'geekblue' - }, - LOSS: { - value: 4, - desc: '流失', - color: 'red' - } -}; - -export default { - CONTACT_COMPANY_NATURE_ENUM, - CONTACT_COMPANY_TYPE_ENUM, - PAYMENT_TYPE_ENUM, - CONTACT_COMPANY_BALANCE_TYPE, - CONTACT_COMPANY_GRADE_ENUM, - CONTACT_COMPANY_SHARE_TYPE_ENUM, - CONTACT_COMPANY_TAG_ENUM -}; diff --git a/smart-admin-h5/src/constants/erp/index.js b/smart-admin-h5/src/constants/erp/index.js deleted file mode 100644 index b14cb861..00000000 --- a/smart-admin-h5/src/constants/erp/index.js +++ /dev/null @@ -1,6 +0,0 @@ -import contactCompany from './contact-company'; - -export default { - ...contactCompany -}; - diff --git a/smart-admin-h5/src/constants/file.js b/smart-admin-h5/src/constants/file.js deleted file mode 100644 index cc72166b..00000000 --- a/smart-admin-h5/src/constants/file.js +++ /dev/null @@ -1,92 +0,0 @@ -export const COMMON_FILE_FOLDER_TYPE_ENUM = { - DISPLAY_PIC: { - value: 1, - desc: '轮播展示图' - }, - RESOURCE_LECTURER: { - value: 2, - desc: '资源-讲师图片' - }, - RESOURCE_FILE: { - value: 3, - desc: '资源-文件资源' - }, - USER_AVATAR: { - value: 4, - desc: '用户头像' - }, - STOCK_BASIC: { - value: 5, - desc: '货物基本信息图片' - }, - PUBLICATION_QR_CODE: { - value: 6, - desc: '出版物二维码图片' - }, - RESOURCE_PAGE_QR_CODE: { - value: 7, - desc: '资源页面链接二维码图片' - }, - FINANCE_RECEIVE_QR_CODE: { - value: 8, - desc: '财务收款二维码' - }, - FINANCE_WX_PAY_CERT: { - value: 9, - desc: '财务-微信支付证书' - }, - GOODS: { - value: 10, - desc: '商品图片-公用文件夹' - }, - EXCEL_EXPORT: { - value: 11, - desc: 'excel导出-私有文件夹' - }, - FINANCE_WAIT_PAYMENT_PAYMENT_PROOF: { - value: 12, - desc: '财务待支付支付凭证' - }, - FEEDBACK: { - value: 99, - desc: '用户反馈图片' - }, - EDITOR: { - value: 100, - desc: '文本编辑器' - }, - EDITOR_IMG: { - value: 100, - desc: '文本编辑器' - }, - INTERNAL_INFORMATION: { - value: 14, - desc: '内部资料' - }, - CRM_USER: { - value: 111, - desc: 'CRM学员跟进附件' - }, - CRM_SCHOOL: { - value: 112, - desc: 'CRM分校跟进附件' - }, - // = =======erp 相关 begin============ - ERP_STOCK_IMG: { - value: 201, - desc: '货物图片' - }, - ERP_CONTACT_COMPANY_RECEIVE_IMAGE: { - value: 210, - desc: '往来单位收款二维码' - }, - ERP_CONTACT_COMPANY_ATTACHMENT: { - value: 211, - desc: '往来单位附件' - } - // = =======erp 相关 end ============ -}; - -export default { - COMMON_FILE_FOLDER_TYPE_ENUM -}; diff --git a/smart-admin-h5/src/constants/index.js b/smart-admin-h5/src/constants/index.js deleted file mode 100644 index 384b7029..00000000 --- a/smart-admin-h5/src/constants/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import school from '@/constants/school'; -import erp from './erp'; - -export default { - ...school, - ...erp -}; diff --git a/smart-admin-h5/src/constants/school.js b/smart-admin-h5/src/constants/school.js deleted file mode 100644 index aa69bd01..00000000 --- a/smart-admin-h5/src/constants/school.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * 分校标签 - */ -export const SCHOOL_TAG_ENUM = { - POTENTIAL: { - value: 0, - desc: '潜在' - }, - INTENTION: { - value: 1, - desc: '意向' - }, - NEGOTIATION: { - value: 2, - desc: '洽谈' - }, - DEAL: { - value: 3, - desc: '成交' - }, - LOSS: { - value: 4, - desc: '流失' - } -}; - -/** - * 分校等级 - */ -export const SCHOOL_GRADE_ENUM = { - CORE: { - value: 1, - desc: '核心' - }, - POTENTIAL: { - value: 2, - desc: '有潜力' - }, - GENERAL: { - value: 3, - desc: '普通' - }, - BAD: { - value: 4, - desc: '较差' - } -}; - -/** - * 共享类型 - */ -export const SCHOOL_SHARE_TYPE_ENUM = { - OWNER: { - value: 0, - desc: '属于我的' - }, - SHARER: { - value: 1, - desc: '共享的' - }, - COMMON: { - value: 2, - desc: '公共的' - } -}; - -export default { - SCHOOL_TAG_ENUM, - SCHOOL_GRADE_ENUM, - SCHOOL_SHARE_TYPE_ENUM -}; diff --git a/smart-admin-h5/src/filters/filter.js b/smart-admin-h5/src/filters/filter.js deleted file mode 100644 index 5bb102f2..00000000 --- a/smart-admin-h5/src/filters/filter.js +++ /dev/null @@ -1,298 +0,0 @@ -import Vue from 'vue'; - -function ellipsis(value, length) { - if (!value) return ''; - if (value.length > length) { - return value.slice(0, length) + '...'; - } - return value; -} - -/** - * 去除空格 type 1-所有空格 2-前后空格 3-前空格 4-后空格 - */ -function trim(value, trim) { - switch (trim) { - case 1: - return value.replace(/\s+/g, ''); - case 2: - return value.replace(/(^\s*)|(\s*$)/g, ''); - case 3: - return value.replace(/(^\s*)/g, ''); - case 4: - return value.replace(/(\s*$)/g, ''); - default: - return value; - } -} - -/** - * 任意格式日期处理 - 使用格式: - {{ '2018-09-14 01:05' | formatDate(yyyy-MM-dd hh:mm:ss) }} - {{ '2018-09-14 01:05' | formatDate(yyyy-MM-dd) }} - {{ '2018-09-14 01:05' | formatDate(MM/dd) }} 等 - - * @param value - * @param fmt - * @returns {*} - */ -function formatDate(value, fmt) { - var date = new Date(value); - var o = { - 'M+': date.getMonth() + 1, // 月份 - 'd+': date.getDate(), // 日 - 'h+': date.getHours(), // 小时 - 'm+': date.getMinutes(), // 分 - 's+': date.getSeconds(), // 秒 - 'w+': date.getDay(), // 星期 - 'q+': Math.floor((date.getMonth() + 3) / 3), // 季度 - 'S': date.getMilliseconds() // 毫秒 - }; - if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)); - for (var k in o) { - if (k === 'w+') { - if (o[k] === 0) { - fmt = fmt.replace('w', '周日'); - } else if (o[k] === 1) { - fmt = fmt.replace('w', '周一'); - } else if (o[k] === 2) { - fmt = fmt.replace('w', '周二'); - } else if (o[k] === 3) { - fmt = fmt.replace('w', '周三'); - } else if (o[k] === 4) { - fmt = fmt.replace('w', '周四'); - } else if (o[k] === 5) { - fmt = fmt.replace('w', '周五'); - } else if (o[k] === 6) { - fmt = fmt.replace('w', '周六'); - } - } else if (new RegExp('(' + k + ')').test(fmt)) { - fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))); - } - } - return fmt; -} - -/** - * 字母大小写切换 - type - 1:首字母大写 - 2:首页母小写 - 3:大小写转换 - 4:全部大写 - 5:全部小写 - * @param str - * @param type - * @returns {string|*} - */ -function changeCase(str, type) { - function ToggleCase(str) { - var itemText = ''; - str.split('').forEach( - function(item) { - if (/^([a-z]+)/.test(item)) { - itemText += item.toUpperCase(); - } else if (/^([A-Z]+)/.test(item)) { - itemText += item.toLowerCase(); - } else { - itemText += item; - } - }); - return itemText; - } - - switch (type) { - case 1: - return str.replace(/\b\w+\b/g, function(word) { - return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase(); - }); - case 2: - return str.replace(/\b\w+\b/g, function(word) { - return word.substring(0, 1).toLowerCase() + word.substring(1).toUpperCase(); - }); - case 3: - return ToggleCase(str); - case 4: - return str.toUpperCase(); - case 5: - return str.toLowerCase(); - default: - return str; - } -} - -/** - * 字符串循环复制,count->次数 - */ -function repeatStr(str, count) { - var text = ''; - for (var i = 0; i < count; i++) { - text += str; - } - return text; -} - -/** - * 字符串替换 - */ -function replaceAll(str, AFindText, ARepText) { - const raRegExp = new RegExp(AFindText, 'g'); - return str.replace(raRegExp, ARepText); -} - -/** - * - * 字符替换*,隐藏手机号或者身份证号等 - replaceStr(字符串,字符格式, 替换方式,替换的字符(默认*)) - ecDo.replaceStr('18819322663',[3,5,3],0) - result:188*****663 - ecDo.replaceStr('asdasdasdaa',[3,5,3],1) - result:***asdas*** - ecDo.replaceStr('1asd88465asdwqe3',[5],0) - result:*****8465asdwqe3 - ecDo.replaceStr('1asd88465asdwqe3',[5],1,'+') - result:"1asd88465as+++++" - * - * @param str - * @param regArr - * @param type - * @param ARepText - * @returns {*} - */ -function replaceStr(str, regArr, type, ARepText) { - var regtext = ''; - var Reg = null; - var replaceText = ARepText || '*'; - // repeatStr是在上面定义过的(字符串循环复制),大家注意哦 - if (regArr.length === 3 && type === 0) { - regtext = '(\\w{' + regArr[0] + '})\\w{' + regArr[1] + '}(\\w{' + regArr[2] + '})'; - Reg = new RegExp(regtext); - var replaceCount = this.repeatStr(replaceText, regArr[1]); - return str.replace(Reg, '$1' + replaceCount + '$2'); - } else if (regArr.length === 3 && type === 1) { - regtext = '\\w{' + regArr[0] + '}(\\w{' + regArr[1] + '})\\w{' + regArr[2] + '}'; - Reg = new RegExp(regtext); - var replaceCount1 = this.repeatStr(replaceText, regArr[0]); - var replaceCount2 = this.repeatStr(replaceText, regArr[2]); - return str.replace(Reg, replaceCount1 + '$1' + replaceCount2); - } else if (regArr.length === 1 && type === 0) { - regtext = '(^\\w{' + regArr[0] + '})'; - Reg = new RegExp(regtext); - var replaceCount = this.repeatStr(replaceText, regArr[0]); - return str.replace(Reg, replaceCount); - } else if (regArr.length === 1 && type === 1) { - regtext = '(\\w{' + regArr[0] + '}$)'; - Reg = new RegExp(regtext); - var replaceCount = this.repeatStr(replaceText, regArr[0]); - return str.replace(Reg, replaceCount); - } -} - -/** - * 格式化处理字符串 - ecDo.formatText('1234asda567asd890') - result:"12,34a,sda,567,asd,890" - ecDo.formatText('1234asda567asd890',4,' ') - result:"1 234a sda5 67as d890" - ecDo.formatText('1234asda567asd890',4,'-') - result:"1-234a-sda5-67as-d890" - - * @param str - * @param size - * @param delimiter - * @returns {*} - */ -function formatText(str, size, delimiter) { - var _size = size || 3; - var _delimiter = delimiter || ','; - var regText = '\\B(?=(\\w{' + _size + '})+(?!\\w))'; - var reg = new RegExp(regText, 'g'); - return str.replace(reg, _delimiter); -} - -/** - * 现金额大写转换函数 - ecDo.upDigit(168752632) - result:"人民币壹亿陆仟捌佰柒拾伍万贰仟陆佰叁拾贰元整" - ecDo.upDigit(1682) - result:"人民币壹仟陆佰捌拾贰元整" - ecDo.upDigit(-1693) - result:"欠人民币壹仟陆佰玖拾叁元整" - * @param n - * @returns {string} - */ -function upDigit(n) { - var fraction = ['角', '分', '厘']; - var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; - var unit = [ - ['元', '万', '亿'], - ['', '拾', '佰', '仟'] - ]; - var head = n < 0 ? '欠人民币' : '人民币'; - n = Math.abs(n); - var s = ''; - for (var i = 0; i < fraction.length; i++) { - s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, ''); - } - s = s || '整'; - n = Math.floor(n); - for (var i = 0; i < unit[0].length && n > 0; i++) { - var p = ''; - for (var j = 0; j < unit[1].length && n > 0; j++) { - p = digit[n % 10] + unit[1][j] + p; - n = Math.floor(n / 10); - } - s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s; - // s = p + unit[0][i] + s; - } - return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整'); -} - -// 保留2位小数 -function toFixed(val, acc) { - let num = parseFloat(val); - if (isNaN(num)) { - num = 0; - } - let accuracy = parseInt(acc); - if (isNaN(accuracy) || accuracy < 0 || accuracy > 10) { - accuracy = 2; - } - return num.toFixed(accuracy); -} - -// 转百分比 -function toPercent(val, acc) { - let num = parseFloat(val); - if (isNaN(num)) { - num = 0; - } - let accuracy = parseInt(acc); - if (isNaN(accuracy) || accuracy < 0 || accuracy > 10) { - accuracy = 2; - } - return (num * 100).toFixed(accuracy) + '%'; -} - -// ------------ enum begin ------------ -function getEnumDescByValue(value, enumName) { - return Vue.prototype.$enum.getDescByValue(enumName, value); -} - -// ------------ enum end ------------ - -export { - trim, - changeCase, - repeatStr, - replaceAll, - replaceStr, - formatText, - upDigit, - toFixed, - formatDate, - toPercent, - getEnumDescByValue, - ellipsis -}; diff --git a/smart-admin-h5/src/filters/index.js b/smart-admin-h5/src/filters/index.js deleted file mode 100644 index 484c0dc0..00000000 --- a/smart-admin-h5/src/filters/index.js +++ /dev/null @@ -1,5 +0,0 @@ -import Vue from 'vue' - -import * as filter from './filter' - -Object.keys(filter).forEach(key => Vue.filter(key, filter[key])) diff --git a/smart-admin-h5/src/lib/cookie.js b/smart-admin-h5/src/lib/cookie.js deleted file mode 100644 index 83386119..00000000 --- a/smart-admin-h5/src/lib/cookie.js +++ /dev/null @@ -1,21 +0,0 @@ -import Cookies from 'js-cookie'; -import config from '@/config'; -const { cookieExpires } = config; -export const TOKEN_KEY = 'token'; - -export default { - setToken: token => { - Cookies.set(TOKEN_KEY, token, { - // token在Cookie中存储的天数,默认1天 - expires: cookieExpires || 7 - }); - }, - getToken: () => { - const token = Cookies.get(TOKEN_KEY); - if (token) return token; - else return null; - }, - clearToken: () => { - Cookies.remove(TOKEN_KEY); - } -}; diff --git a/smart-admin-h5/src/lib/erp-http.js b/smart-admin-h5/src/lib/erp-http.js deleted file mode 100644 index 3f4766f8..00000000 --- a/smart-admin-h5/src/lib/erp-http.js +++ /dev/null @@ -1,65 +0,0 @@ -import Axios from 'axios'; -import config from '@/config'; -import cookie from '@/lib/cookie'; -import { Toast } from 'vant'; - -export const baseUrl = config.baseUrl.erpApiUrl; - -const axios = Axios.create({ - baseURL: baseUrl, - timeout: 30000, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } -}); - -// 添加请求拦截器 -axios.interceptors.request.use( - function(config) { - const token = cookie.getToken(); - if (token) { - config.headers['x-access-token'] = token; - } - return config; - }, - function(error) { - return Promise.reject(error); - } -); - -// 添加响应拦截器 -axios.interceptors.response.use( - res => { - const { data } = res; - if (data && data.code && data.code !== 1) { - if (data.code === 121) { - cookie.clearToken(); - localStorage.clear(); - window.location.href = window.location.pathname + '#/login'; - Toast.fail('未登录,或登录失效,请登录'); - return; - } else if (data.code === 502) { - window.location.href = window.location.pathname + '#/500'; - return; - } else { - Toast.fail(data.msg); - return Promise.reject(res); - } - } - return Promise.resolve(data); - }, - error => { - Toast.fail('服务内部错误'); - return Promise.reject(error); - } -); - -export const postAxios = (url, data, config) => { - return axios.post(url, data, config); -}; - -export const getAxios = (url, data) => { - return axios.get(url, { - params: data - }); -}; diff --git a/smart-admin-h5/src/lib/http.js b/smart-admin-h5/src/lib/http.js deleted file mode 100644 index b4c86937..00000000 --- a/smart-admin-h5/src/lib/http.js +++ /dev/null @@ -1,65 +0,0 @@ -import Axios from 'axios'; -import config from '@/config'; -import cookie from '@/lib/cookie'; -import { Toast } from 'vant'; - -export const baseUrl = config.baseUrl.apiUrl; - -const axios = Axios.create({ - baseURL: baseUrl, - timeout: 30000, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } -}); - -// 添加请求拦截器 -axios.interceptors.request.use( - function(config) { - const token = cookie.getToken(); - if (token) { - config.headers['x-access-token'] = token; - } - return config; - }, - function(error) { - return Promise.reject(error); - } -); - -// 添加响应拦截器 -axios.interceptors.response.use( - res => { - const { data } = res; - if (data && data.code && data.code !== 1) { - if (data.code === 1001) { - cookie.clearToken(); - localStorage.clear(); - window.location.href = window.location.pathname + '#/login'; - Toast.fail('未登录,或登录失效,请登录'); - return; - } else if (data.code === 502) { - window.location.href = window.location.pathname + '#/500'; - return; - } else { - Toast.fail(data.msg); - return Promise.reject(res); - } - } - return Promise.resolve(data); - }, - error => { - Toast.fail('服务内部错误'); - return Promise.reject(error); - } -); - -export const postAxios = (url, data, config) => { - return axios.post(url, data, config); -}; - -export const getAxios = (url, data) => { - return axios.get(url, { - params: data - }); -}; diff --git a/smart-admin-h5/src/lib/local.js b/smart-admin-h5/src/lib/local.js deleted file mode 100644 index c19d7e3d..00000000 --- a/smart-admin-h5/src/lib/local.js +++ /dev/null @@ -1,8 +0,0 @@ -export const localSave = (key, value) => { - localStorage.setItem(key, value); -}; - -export const localRead = key => { - return localStorage.getItem(key) || ''; -}; - diff --git a/smart-admin-h5/src/lib/menu-func.js b/smart-admin-h5/src/lib/menu-func.js deleted file mode 100644 index 914d5379..00000000 --- a/smart-admin-h5/src/lib/menu-func.js +++ /dev/null @@ -1,276 +0,0 @@ -import { forEach, hasOneOf, objEqual } from '@/lib/util'; -import config from '@/config'; -import { localRead, localSave } from '@/lib/local'; -const { title, useI18n } = config; -export const hasChild = item => { - return item.children && item.children.length !== 0; -}; - -/** - * 通过权限过滤菜单 - * @param {Object} map 权限对象 - * @param {Array} menuList 菜单列表 - * @returns {Array} - */ -export const getShowMenu = (map = {}, menuList, access = false) => { - // 判断是否为超级管理员 - if (access) { - return menuList; - } - // 返回的菜单列表 - let result = []; - for (let menuItem of menuList) { - let routerObj = JSON.parse(JSON.stringify(menuItem)); - if ( - map.hasOwnProperty(menuItem.name) && - (menuItem.name !== 'home' && menuItem.name !== '_home') - ) { - // 判断该菜单权限下是否为数组,若为数组,则为功能点权限否则为子菜单 - if (getType(map[routerObj.name]) === 'array') { - let funcPrivilege = localRead('funcPrivilegeInfo') - ? JSON.parse(localRead('funcPrivilegeInfo')) - : {}; - localSave( - 'funcPrivilegeInfo', - JSON.stringify({ - ...funcPrivilege, - [routerObj.name]: map[routerObj.name] - }) - ); - } else if ( - getType(map[routerObj.name]) !== 'array' && - !routerObj.children - ) { - // 判断是否为二级菜单,若是则需要多枚举一层赋值 - let funcPrivilege = localRead('funcPrivilegeInfo') - ? JSON.parse(localRead('funcPrivilegeInfo')) - : {}; - localSave( - 'funcPrivilegeInfo', - JSON.stringify({ - ...funcPrivilege, - [routerObj.name]: map[routerObj.name][routerObj.name] - }) - ); - } else if ( - getType(map[routerObj.name]) !== 'array' && - routerObj.children - ) { - // 循环子菜单权限 - routerObj.children = getShowMenu( - map[routerObj.name], - routerObj.children - ); - } - result.push(routerObj); - } - } - return result; -}; -// 获取数据类型 -export const getType = obj => { - return {}.toString - .call(obj) - .match(/\s([a-zA-Z]+)/)[1] - .toLowerCase(); -}; - -/** - * @description 本地存储和获取标签导航列表 - */ -export const setTagNavListInLocalStorage = list => { - localStorage.tagNaveList = JSON.stringify(list); -}; -/** - * @returns {Array} 其中的每个元素只包含路由原信息中的name, path, meta三项 - */ -export const getTagNavListFromLocalStorage = () => { - const list = localStorage.tagNaveList; - return list ? JSON.parse(list) : []; -}; -export const getBreadCrumbList = (route, homeRoute) => { - let homeItem = { - ...homeRoute, - icon: homeRoute.meta.icon - }; - let routeMatched = route.matched; - if (routeMatched.some(item => item.name === homeRoute.name)) { - return [homeItem]; - } - let res = routeMatched - .filter(item => { - return item.meta === undefined || !item.meta.hideInBread; - }) - .map(item => { - let meta = { - ...item.meta - }; - if (meta.title && typeof meta.title === 'function') { - meta.__titleIsFunction__ = true; - meta.title = meta.title(route); - } - let obj = { - icon: (item.meta && item.meta.icon) || '', - name: item.name, - meta: meta - }; - return obj; - }); - res = res.filter(item => { - return !item.meta.hideInMenu; - }); - return [...res]; -}; -/** - * @param {Array} routers 路由列表数组 - * @description 用于找到路由列表中name为home的对象 - */ -export const getHomeRoute = (routers, homeName = 'Home') => { - let i = -1; - let len = routers.length; - let homeRoute = {}; - while (++i < len) { - let item = routers[i]; - if (item.children && item.children.length) { - let res = getHomeRoute(item.children, homeName); - if (res.name) return res; - } else { - if (item.name === homeName) homeRoute = item; - } - } - return homeRoute; -}; -/** - * @param {Array} list 标签列表 - * @param {String} name 当前关闭的标签的name - */ -export const getNextRoute = (list, route) => { - let res = {}; - if (list.length === 2) { - res = getHomeRoute(list); - } else { - const index = list.findIndex(item => routeEqual(item, route)); - if (index === list.length - 1) res = list[list.length - 2]; - else res = list[index + 1]; - } - return res; -}; - -/** - * 判断打开的标签列表里是否已存在这个新添加的路由对象 - */ -export const routeHasExist = (tagNavList, routeItem) => { - let len = tagNavList.length; - let res = false; - doCustomTimes(len, index => { - if (routeEqual(tagNavList[index], routeItem)) res = true; - }); - return res; -}; -/** - * @param {*} list 现有标签导航列表 - * @param {*} newRoute 新添加的路由原信息对象 - * @description 如果该newRoute已经存在则不再添加 - */ -export const getNewTagList = (list, newRoute) => { - const { name, path, meta, query } = newRoute; - let newList = [...list]; - let index = newList.findIndex(item => item.name === name); - if (index >= 0) { - newList[index] = { name, path, meta, query }; - } else newList.push({ name, path, meta, query }); - return newList; -}; -export const routeEqual = (route1, route2) => { - return route1.name === route2.name; -}; -export const getRouteTitleHandled = route => { - let router = { - ...route - }; - let meta = { - ...route.meta - }; - let title = ''; - if (meta.title) { - if (typeof meta.title === 'function') { - meta.__titleIsFunction__ = true; - title = meta.title(router); - } else title = meta.title; - } - meta.title = title; - router.meta = meta; - return router; -}; -/** - * @param {Number} times 回调函数需要执行的次数 - * @param {Function} callback 回调函数 - */ -export const doCustomTimes = (times, callback) => { - let i = -1; - while (++i < times) { - callback(i); - } -}; -export const showTitle = (item, vm) => { - let { title, __titleIsFunction__ } = item.meta; - if (!title) return; - if (useI18n) { - if (title.includes('{{') && title.includes('}}') && useI18n) { - title = title.replace(/({{[\s\S]+?}})/, (m, str) => - str.replace(/{{([\s\S]*)}}/, (m, _) => vm.$t(_.trim())) - ); - } else if (__titleIsFunction__) title = item.meta.title; - else title = vm.$t(item.name); - } else title = (item.meta && item.meta.title) || item.name; - return title; -}; -/** - * @description 根据当前跳转的路由设置显示在浏览器标签的title - * @param {Object} routeItem 路由对象 - * @param {Object} vm Vue实例 - */ -export const setTitle = (routeItem, vm) => { - const handledRoute = getRouteTitleHandled(routeItem); - const pageTitle = showTitle(handledRoute, vm); - const resTitle = pageTitle ? `${pageTitle} - ${title}` : title; - window.document.title = resTitle; -}; - -export const findNodeUpper = (ele, tag) => { - if (ele.parentNode) { - if (ele.parentNode.tagName === tag.toUpperCase()) { - return ele.parentNode; - } else { - return findNodeUpper(ele.parentNode, tag); - } - } -}; - -export const findNodeUpperByClasses = (ele, classes) => { - let parentNode = ele.parentNode; - if (parentNode) { - let classList = parentNode.classList; - if ( - classList && - classes.every(className => classList.contains(className)) - ) { - return parentNode; - } else { - return findNodeUpperByClasses(parentNode, classes); - } - } -}; - -export const findNodeDownward = (ele, tag) => { - const tagName = tag.toUpperCase(); - if (ele.childNodes.length) { - let i = -1; - let len = ele.childNodes.length; - while (++i < len) { - let child = ele.childNodes[i]; - if (child.tagName === tagName) return child; - else return findNodeDownward(child, tag); - } - } -}; diff --git a/smart-admin-h5/src/lib/printPlugs.js b/smart-admin-h5/src/lib/printPlugs.js deleted file mode 100644 index 9c4295dd..00000000 --- a/smart-admin-h5/src/lib/printPlugs.js +++ /dev/null @@ -1,133 +0,0 @@ -// 打印类属性、方法定义 -/* eslint-disable */ -//第二个参数表明是否要关闭当前窗口 -const Print = function(dom, close, options) { - if (!(this instanceof Print)) return new Print(dom, close, options); - - this.options = this.extend( - { - noPrint: '.no-print' - }, - options - ); - - if (typeof dom === 'string') { - this.dom = document.querySelector(dom); - } else { - this.dom = dom; - } - - this.init(close); -}; -Print.prototype = { - init: function(close) { - var content = this.getStyle() + this.getHtml(); - this.writeIframe(content, close); - }, - extend: function(obj, obj2) { - for (var k in obj2) { - obj[k] = obj2[k]; - } - return obj; - }, - - getStyle: function() { - var str = '', - styles = document.querySelectorAll('style,link'); - for (var i = 0; i < styles.length; i++) { - str += styles[i].outerHTML; - } - str += - ''; - - return str; - }, - - getHtml: function() { - var inputs = document.querySelectorAll('input'); - var textareas = document.querySelectorAll('textarea'); - var selects = document.querySelectorAll('select'); - - for (var k in inputs) { - if (inputs[k].type == 'checkbox' || inputs[k].type == 'radio') { - if (inputs[k].checked == true) { - inputs[k].setAttribute('checked', 'checked'); - } else { - inputs[k].removeAttribute('checked'); - } - } else if (inputs[k].type == 'text') { - inputs[k].setAttribute('value', inputs[k].value); - } - } - - for (var k2 in textareas) { - if (textareas[k2].type == 'textarea') { - textareas[k2].innerHTML = textareas[k2].value; - } - } - - for (var k3 in selects) { - if (selects[k3].type == 'select-one') { - var child = selects[k3].children; - for (var i in child) { - if (child[i].tagName == 'OPTION') { - if (child[i].selected == true) { - child[i].setAttribute('selected', 'selected'); - } else { - child[i].removeAttribute('selected'); - } - } - } - } - } - return this.dom.outerHTML; - }, - - writeIframe: function(content, close) { - var w, - doc, - iframe = document.createElement('iframe'), - f = document.body.appendChild(iframe); - iframe.id = 'myIframe'; - iframe.style = 'position:absolute;'; - - w = f.contentWindow || f.contentDocument; - doc = f.contentDocument || f.contentWindow.document; - doc.open(); - doc.write(content); - doc.close(); - this.toPrint(w, close); - setTimeout(function() { - document.body.removeChild(iframe); - }, 500); - }, - - toPrint: function(frameWindow, close) { - try { - setTimeout(function() { - frameWindow.focus(); - try { - if (!frameWindow.document.execCommand('print', false, null)) { - frameWindow.print(); - } - } catch (e) { - frameWindow.print(); - } - frameWindow.close(); - if (close) { - window.close(); - } - }, 500); - } catch (err) { - console.log('err', err); - } - } -}; -const MyPlugin = {}; -MyPlugin.install = function(Vue, options) { - // 4. 添加实例方法 - Vue.prototype.$print = Print; -}; -export default MyPlugin; diff --git a/smart-admin-h5/src/lib/render-dom.js b/smart-admin-h5/src/lib/render-dom.js deleted file mode 100644 index 1cad207e..00000000 --- a/smart-admin-h5/src/lib/render-dom.js +++ /dev/null @@ -1,10 +0,0 @@ -export default { - name: 'RenderDom', - functional: true, - props: { - render: Function - }, - render: (h, ctx) => { - return ctx.props.render(h); - } -}; diff --git a/smart-admin-h5/src/lib/smart-sentry.js b/smart-admin-h5/src/lib/smart-sentry.js deleted file mode 100644 index 2ccd8f0a..00000000 --- a/smart-admin-h5/src/lib/smart-sentry.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * @Description: - * @Author: hanyu - * @Date: 2020-05-28 12:46:06 - * @LastEditTime: 2020-07-08 09:16:15 - * @LastEditors: hy - */ -// smart sentry -import * as Sentry from '@sentry/browser'; -export default { - /** - * sentry 主动上报 - * @param {error} error 错误信息 - */ - captureException: (error) => { - if (error.config && error.data && error && error.headers && error.request && error.status) { - return; - } - Sentry.captureException(error); - } -}; diff --git a/smart-admin-h5/src/lib/util.js b/smart-admin-h5/src/lib/util.js deleted file mode 100644 index 6a3845b0..00000000 --- a/smart-admin-h5/src/lib/util.js +++ /dev/null @@ -1,515 +0,0 @@ -import moment from 'moment'; -/** - * @param {String} url - * @description 从URL中解析参数 - */ -export const getParams = url => { - const keyValueArr = url.split('?')[1].split('&'); - let paramObj = {}; - keyValueArr.forEach(item => { - const keyValue = item.split('='); - paramObj[keyValue[0]] = keyValue[1]; - }); - return paramObj; -}; - -/** - * @param {Any} obj - * @description 获取数据类型 - */ -export const getType = obj => { - return {}.toString - .call(obj) - .match(/\s([a-zA-Z]+)/)[1] - .toLowerCase(); -}; -// 日期格式 -export const dateFormat = { - YMD: 'YMD', - YMDHM: 'YMDHM', - YMDHMS: 'YMDHMS' -}; -export const forEach = (arr, fn) => { - if (!arr.length || !fn) return; - let i = -1; - let len = arr.length; - while (++i < len) { - let item = arr[i]; - fn(item, i, arr); - } -}; - -/** - * @param {Array} arr1 - * @param {Array} arr2 - * @description 得到两个数组的交集, 两个数组的元素为数值或字符串 - */ -export const getIntersection = (arr1, arr2) => { - let len = Math.min(arr1.length, arr2.length); - let i = -1; - let res = []; - while (++i < len) { - const item = arr2[i]; - if (arr1.indexOf(item) > -1) res.push(item); - } - return res; -}; - -/** - * @param {Array} arr1 - * @param {Array} arr2 - * @description 得到两个数组的并集, 两个数组的元素为数值或字符串 - */ -export const getUnion = (arr1, arr2) => { - return Array.from(new Set([...arr1, ...arr2])); -}; - -/** - * @param {Array} target 目标数组 - * @param {Array} arr 需要查询的数组 - * @description 判断要查询的数组是否至少有一个元素包含在目标数组中 - */ -export const hasOneOf = (targetarr, arr) => { - return targetarr.some(_ => arr.indexOf(_) > -1); -}; - -/** - * @param {String|Number} value 要验证的字符串或数值 - * @param {*} validList 用来验证的列表 - */ -export function oneOf (value, validList) { - for (let i = 0; i < validList.length; i++) { - if (value === validList[i]) { - return true; - } - } - return false; -} - -/** - * @param {Number} timeStamp 判断时间戳格式是否是毫秒 - * @returns {Boolean} - */ -const isMillisecond = timeStamp => { - const timeStr = String(timeStamp); - return timeStr.length > 10; -}; - -/** - * @param {Number} timeStamp 传入的时间戳 - * @param {Number} currentTime 当前时间时间戳 - * @returns {Boolean} 传入的时间戳是否早于当前时间戳 - */ -const isEarly = (timeStamp, currentTime) => { - return timeStamp < currentTime; -}; - -/** - * @param {Number} num 数值 - * @returns {String} 处理后的字符串 - * @description 如果传入的数值小于10,即位数只有1位,则在前面补充0 - */ -const getHandledValue = num => { - return num < 10 ? '0' + num : num; -}; - -/** - * @param {Number} timeStamp 传入的时间戳 - * @param {Number} startType 要返回的时间字符串的格式类型,传入'year'则返回年开头的完整时间 - */ -const getDate = (timeStamp, startType) => { - const d = new Date(timeStamp * 1000); - const year = d.getFullYear(); - const month = getHandledValue(d.getMonth() + 1); - const date = getHandledValue(d.getDate()); - const hours = getHandledValue(d.getHours()); - const minutes = getHandledValue(d.getMinutes()); - const second = getHandledValue(d.getSeconds()); - let resStr = ''; - if (startType === 'year') { - resStr = - year + - '-' + - month + - '-' + - date + - ' ' + - hours + - ':' + - minutes + - ':' + - second; - } - else resStr = month + '-' + date + ' ' + hours + ':' + minutes; - return resStr; -}; - -/** - * @param {String|Number} timeStamp 时间戳 - * @returns {String} 相对时间字符串 - */ -export const getRelativeTime = timeStamp => { - // 判断当前传入的时间戳是秒格式还是毫秒 - const IS_MILLISECOND = isMillisecond(timeStamp); - // 如果是毫秒格式则转为秒格式 - if (IS_MILLISECOND) Math.floor((timeStamp /= 1000)); - // 传入的时间戳可以是数值或字符串类型,这里统一转为数值类型 - timeStamp = Number(timeStamp); - // 获取当前时间时间戳 - const currentTime = Math.floor(Date.parse(new Date()) / 1000); - // 判断传入时间戳是否早于当前时间戳 - const IS_EARLY = isEarly(timeStamp, currentTime); - // 获取两个时间戳差值 - let diff = currentTime - timeStamp; - // 如果IS_EARLY为false则差值取反 - if (!IS_EARLY) diff = -diff; - let resStr = ''; - const dirStr = IS_EARLY ? '前' : '后'; - // 少于等于59秒 - if (diff <= 59) resStr = diff + '秒' + dirStr; - // 多于59秒,少于等于59分钟59秒 - else if (diff > 59 && diff <= 3599) { resStr = Math.floor(diff / 60) + '分钟' + dirStr; } - // 多于59分钟59秒,少于等于23小时59分钟59秒 - else if (diff > 3599 && diff <= 86399) { resStr = Math.floor(diff / 3600) + '小时' + dirStr; } - // 多于23小时59分钟59秒,少于等于29天59分钟59秒 - else if (diff > 86399 && diff <= 2623859) { resStr = Math.floor(diff / 86400) + '天' + dirStr; } - // 多于29天59分钟59秒,少于364天23小时59分钟59秒,且传入的时间戳早于当前 - else if (diff > 2623859 && diff <= 31567859 && IS_EARLY) { resStr = getDate(timeStamp); } - else resStr = getDate(timeStamp, 'year'); - return resStr; -}; - -/** - * @returns {String} 当前浏览器名称 - */ -export const getExplorer = () => { - const ua = window.navigator.userAgent; - const isExplorer = exp => { - return ua.indexOf(exp) > -1; - }; - if (isExplorer('MSIE')) return 'IE'; - else if (isExplorer('Firefox')) return 'Firefox'; - else if (isExplorer('Chrome')) return 'Chrome'; - else if (isExplorer('Opera')) return 'Opera'; - else if (isExplorer('Safari')) return 'Safari'; -}; - -/** - * @description 绑定事件 on(element, event, handler) - */ -export const on = (function () { - if (document.addEventListener) { - return function (element, event, handler) { - if (element && event && handler) { - element.addEventListener(event, handler, false); - } - }; - } else { - return function (element, event, handler) { - if (element && event && handler) { - element.attachEvent('on' + event, handler); - } - }; - } -})(); - -/** - * @description 解绑事件 off(element, event, handler) - */ -export const off = (function () { - if (document.removeEventListener) { - return function (element, event, handler) { - if (element && event) { - element.removeEventListener(event, handler, false); - } - }; - } else { - return function (element, event, handler) { - if (element && event) { - element.detachEvent('on' + event, handler); - } - }; - } -})(); - -/** - * 判断一个对象是否存在key,如果传入第二个参数key,则是判断这个obj对象是否存在key这个属性 - * 如果没有传入key这个参数,则判断obj对象是否有键值对 - */ -export const hasKey = (obj, key) => { - if (key) return key in obj; - else { - let keysArr = Object.keys(obj); - return keysArr.length; - } -}; - -/** - * @param {*} obj1 对象 - * @param {*} obj2 对象 - * @description 判断两个对象是否相等,这两个对象的值只能是数字或字符串 - */ -export const objEqual = (obj1, obj2) => { - const keysArr1 = Object.keys(obj1); - const keysArr2 = Object.keys(obj2); - if (keysArr1.length !== keysArr2.length) return false; - else if (keysArr1.length === 0 && keysArr2.length === 0) return true; - /* eslint-disable-next-line */ else { return !keysArr1.some(key => obj1[key] != obj2[key]); } -}; - -// 相关工具类 -export const utils = { - /** - * @description table实现反选 - * @param {Object} vm Vue实例 - * @param {Array} tableSelectDate 选中的数据 - * @param {Array} allData 所有数据 - * @param {Array} key 数据中的唯一值 - */ - reverseSelect (vm, tableSelectDate, allData, key) { - let copyMess = JSON.parse(JSON.stringify(tableSelectDate)); - // 流程:先全部选中->再部分选中 - vm.handleSelectAll(false); - // 选中的idList - let idList = copyMess.map(item => item[key]); - console.log(idList); - for (let item of allData) { - if (idList.every(id => id !== item.id)) { - vm.$set(item, '_checked', true); - tableSelectDate.push(item); - } else { - vm.$set(item, '_checked', false); - } - } - }, - // 校验字符串是否相同 合同使用 - contrastString (originStr, changeStr) { - let origin = originStr - .replace(/\s*/g, '') - .replace(/"/g, '\'') - .replace(/ /g, '') - .replace(/disabled=\/'\/'/g, 'disabled'); - let change = changeStr - .replace(/\s*/g, '') - .replace(/"/g, '\'') - .replace(/ /g, '') - .replace(/disabled=\/'\/'/g, 'disabled'); - return origin === change; - }, - // 获取当前日期getDateStr(0)、前几天getDateStr(-10)、后几天getDateStr(20) - getDateStr (AddDayCount, format) { - let date = new Date(); - // 获取AddDayCount天后的日期 - date.setDate(date.getDate() + AddDayCount); - return this.getDate(date, format); - }, - getDate (date, format) { - let year = date.getFullYear(); - // day获取当前几号,不足10补0 - let day = date.getDate() > 9 ? date.getDate() : '0' + date.getDate(); - // month获取当前月份的日期,不足10补0 - let month = - date.getMonth() + 1 > 9 - ? date.getMonth() + 1 - : '0' + (date.getMonth() + 1); - // h获取当前小时,不足10补0 - let h = date.getHours() > 9 ? date.getHours() : '0' + date.getHours(); - // s获取当前分钟,不足10补0 - let m = date.getMinutes() > 9 ? date.getMinutes() : '0' + date.getMinutes(); - // s获取当前秒数,不足10补0 - let s = date.getSeconds() > 9 ? date.getSeconds() : '0' + date.getSeconds(); - let resultDate = ''; - if (format === dateFormat.YMD) { - resultDate = year + '-' + month + '-' + day; - } - if (format === dateFormat.YMDHM) { - resultDate = year + '-' + month + '-' + day + ' ' + h + ':' + m; - } - if (format === dateFormat.YMDHMS) { - resultDate = year + '-' + month + '-' + day + ' ' + h + ':' + m + ':' + s; - } - return resultDate; - }, - // 获取周一和周日日期,返回两种格式时间 - getDateWeek () { - let now = new Date(); - let nowTime = now.getTime(); - let day = now.getDay(); - let oneDayLong = 1000 * 60 * 60 * 24; - let MondayTime = nowTime - (day - 1) * oneDayLong; - let SundayTime = nowTime + (7 - day) * oneDayLong; - let monday = new Date(MondayTime); - let sunday = new Date(SundayTime); - return { - // first: this.getDateAll(monday), - // last: this.getDateAll(sunday), - firstDate: monday, - lastDate: sunday - }; - }, - // 获取月初与月末日期,返回两种时间格式 - getDateMonth () { - let dateFirter = new Date(); - let dateLast = new Date(); - dateFirter.setDate(1); - - let currentMonth = dateLast.getMonth(); - let nextMonth = ++currentMonth; - let nextMonthFirstDay = new Date(dateLast.getFullYear(), nextMonth, 1); - let oneDay = 1000 * 60 * 60 * 24; - dateLast = new Date(nextMonthFirstDay - oneDay); - - return { - // first: this.getDateAll(dateFirter), - // last: this.getDateAll(dateLast), - firstDate: dateFirter, - lastDate: dateLast - }; - }, - // 计算天数 - getDayBetweenDate (date) { - date = this.getDate(new Date(date), 'YMD'); - let startTime = Date.parse(new Date(date)); // IE支持“yyyy/MM/dd”格式 - let endTime = Date.parse(this.getDate(new Date(), 'YMD')); - let day = parseInt((endTime - startTime) / (1000 * 60 * 60 * 24)); - return day; - }, - getDateIntervalYear (firstDate, secondDate) { - if (!firstDate || !secondDate) { - return 0; - } - let first = new Date(firstDate); - let second = new Date(secondDate); - let firstYear = first.getFullYear(); - let secondYear = second.getFullYear(); - let intervalYear = secondYear - firstYear; - return intervalYear < 0 ? 0 : intervalYear; - }, - getDateIntervalYearFixed2 (firstDate, secondDate) { - if (!firstDate || !secondDate) { - return 0; - } - // 格式化时间 - let startDate = new Date(this.getDate(new Date(firstDate), 'YMD')); - let endDate = new Date(this.getDate(new Date(secondDate), 'YMD')); - // 得到毫秒值 - let startTime = Date.parse(startDate); - let endTime = Date.parse(endDate); - // 得到差了多少天 - let day = parseInt((endTime - startTime) / (1000 * 60 * 60 * 24)); - if (day <= 0) { - return 0; - } - // 得到差的多少年 保留两位小数 - let resultYear = parseFloat((day / (30 * 12)).toFixed(2)); - return resultYear; - }, - // 数字转化为中文大写 - // 代码如下所示: - convertCurrency (money) { - // 汉字的数字 - let cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; - // 基本单位 - let cnIntRadice = ['', '拾', '佰', '仟']; - // 对应整数部分扩展单位 - let cnIntUnits = ['', '万', '亿', '兆']; - // 对应小数部分单位 - let cnDecUnits = ['角', '分', '毫', '厘']; - // 整数金额时后面跟的字符 - let cnInteger = '整'; - // 整型完以后的单位 - let cnIntLast = '元'; - // 最大处理的数字 - let maxNum = 999999999999999.9999; - // 金额整数部分 - let integerNum; - // 金额小数部分 - let decimalNum; - // 输出的中文金额字符串 - let chineseStr = ''; - // 分离金额后用的数组,预定义 - let parts; - if (money === '') { - return ''; - } - money = parseFloat(money); - if (money >= maxNum) { - // 超出最大处理数字 - return ''; - } - if (money === 0) { - chineseStr = cnNums[0] + cnIntLast + cnInteger; - return chineseStr; - } - // 转换为字符串 - money = money.toString(); - if (money.indexOf('.') === -1) { - integerNum = money; - decimalNum = ''; - } else { - parts = money.split('.'); - integerNum = parts[0]; - decimalNum = parts[1].substr(0, 4); - } - // 获取整型部分转换 - if (parseInt(integerNum, 10) > 0) { - let zeroCount = 0; - let IntLen = integerNum.length; - for (let i = 0; i < IntLen; i++) { - let n = integerNum.substr(i, 1); - let p = IntLen - i - 1; - let q = p / 4; - let m = p % 4; - if (n === '0') { - zeroCount++; - } else { - if (zeroCount > 0) { - chineseStr += cnNums[0]; - } - // 归零 - zeroCount = 0; - chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]; - } - if (m === 0 && zeroCount < 4) { - chineseStr += cnIntUnits[q]; - } - } - chineseStr += cnIntLast; - } - // 小数部分 - if (decimalNum !== '') { - let decLen = decimalNum.length; - for (let i = 0; i < decLen; i++) { - let n = decimalNum.substr(i, 1); - if (n !== '0') { - chineseStr += cnNums[Number(n)] + cnDecUnits[i]; - } - } - } - if (chineseStr === '') { - chineseStr += cnNums[0] + cnIntLast + cnInteger; - } else if (decimalNum === '') { - chineseStr += cnInteger; - } - return chineseStr; - } -}; - - -export const dateTimeRangeConvert = (timerange) => { - // timerange - let arr = []; - if (timerange[0] === '') { - arr.push(null); - } else { - arr.push(moment(timerange[0]).format("YYYY-MM-DD 00:00:00")); - } - - if (timerange[1] === '') { - arr.push(null); - } else { - arr.push(moment(timerange[1]).format("YYYY-MM-DD 23:59:59")); - } - return arr; -} - diff --git a/smart-admin-h5/src/lib/watermark.js b/smart-admin-h5/src/lib/watermark.js deleted file mode 100644 index 30747309..00000000 --- a/smart-admin-h5/src/lib/watermark.js +++ /dev/null @@ -1,49 +0,0 @@ -const watermark = {}; - -const setWatermark = (str) => { - const id = '1.23452384164.123412415'; - - if (document.getElementById(id) !== null) { - document.body.removeChild(document.getElementById(id)); - } - - const can = document.createElement('canvas'); - can.width = 150; - can.height = 120; - - const cans = can.getContext('2d'); - cans.rotate(-20 * Math.PI / 180); - cans.font = '15px Vedana'; - cans.fillStyle = 'rgba(0, 0, 0, 0.15)'; - cans.textAlign = 'left'; - cans.textBaseline = 'Middle'; - cans.fillText(str, can.width / 20, can.height); - - const div = document.createElement('div'); - div.id = id; - div.style.pointerEvents = 'none'; - div.style.top = '3px'; - div.style.left = '0px'; - div.style.position = 'fixed'; - div.style.zIndex = '100000'; - div.style.width = document.documentElement.clientWidth + 'px'; - div.style.height = document.documentElement.clientHeight + 'px'; - div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat'; - document.body.appendChild(div); - return id; -}; - -// 该方法只允许调用一次 -watermark.set = (str) => { - let id = setWatermark(str); - setInterval(() => { - if (document.getElementById(id) === null) { - id = setWatermark(str); - } - }, 2000); - window.onresize = () => { - setWatermark(str); - }; -}; - -export default watermark; diff --git a/smart-admin-h5/src/main.js b/smart-admin-h5/src/main.js deleted file mode 100644 index 887c9198..00000000 --- a/smart-admin-h5/src/main.js +++ /dev/null @@ -1,62 +0,0 @@ -// vue 三大核心 -import Vue from 'vue'; -import router from '@/router'; -import store from '@/store'; - -// 更好的兼容性 -import 'core-js/stable'; -import 'regenerator-runtime/runtime'; -// 移动端适配 -import 'lib-flexible/flexible.js'; -import 'vant/lib/index.css'; -// 引入首个组件 -import App from './App.vue'; -// 引入自定义主题样式 -import './themes/index.scss'; -// 引入过滤器 -import './filters'; -// 引入配置信息 -import config from '@/config'; -// 引入自定义smart 插件 -import SmartPlugin from './plugins/smart'; -// Import component -import Loading from 'vue-loading-overlay'; -// Import stylesheet -import 'vue-loading-overlay/dist/vue-loading.css'; - -import Vant from 'vant'; -import 'vant/lib/index.css'; - -// sentry错误预警 -import SmartSentry from './plugins/smart-sentry'; - -import Enum from 'vue-enum'; - -import enumInfo from '@/constants'; - -import _ from 'lodash'; - -Vue.use(Vant); - -Vue.use(Loading); - -Vue.use(SmartPlugin); - -Vue.use(SmartSentry); - -Vue.prototype.$config = config; - -Vue.config.productionTip = false; - -Vue.use(Enum, { - enumInfo -}); - -window._ = _; - -new Vue({ - el: '#app', - router, - store, - render: h => h(App) -}); diff --git a/smart-admin-h5/src/plugins/smart-sentry.js b/smart-admin-h5/src/plugins/smart-sentry.js deleted file mode 100644 index b4ad2b09..00000000 --- a/smart-admin-h5/src/plugins/smart-sentry.js +++ /dev/null @@ -1,17 +0,0 @@ -import * as Sentry from '@sentry/browser'; - -const SmartSentry = {}; - -SmartSentry.install = function(Vue, options) { - Vue.prototype.$smartSentry = { - captureException: (error) => { - console.error(error); - if (error.config && error.data && error && error.headers && error.request && error.status) { - return; - } - Sentry.captureException(error); - } - }; -}; - -export default SmartSentry; diff --git a/smart-admin-h5/src/plugins/smart.js b/smart-admin-h5/src/plugins/smart.js deleted file mode 100644 index 5567acca..00000000 --- a/smart-admin-h5/src/plugins/smart.js +++ /dev/null @@ -1,24 +0,0 @@ -let loader = null; - -const SmartPlugin = {}; - -SmartPlugin.install = function(Vue, options) { - Vue.prototype.$smart = { - loading: (message) => { - if (loader) { - loader.hide(); - } - - loader = Vue.$loading.show({ - // Optional parameters - lockScroll: true, - color: '#1989fa' - }); - }, - loadingClear: () => { - loader.hide(); - } - }; -}; - -export default SmartPlugin; diff --git a/smart-admin-h5/src/plugins/vant.js b/smart-admin-h5/src/plugins/vant.js deleted file mode 100644 index 8daa8e3e..00000000 --- a/smart-admin-h5/src/plugins/vant.js +++ /dev/null @@ -1,8 +0,0 @@ -// 按需全局引入 vant组件 -import Vue from 'vue'; -import { Button, List, Cell, Tabbar, TabbarItem } from 'vant'; - -Vue.use(Button); -Vue.use(Cell); -Vue.use(List); -Vue.use(Tabbar).use(TabbarItem); diff --git a/smart-admin-h5/src/router/dashboard/index.js b/smart-admin-h5/src/router/dashboard/index.js deleted file mode 100644 index 69506bbe..00000000 --- a/smart-admin-h5/src/router/dashboard/index.js +++ /dev/null @@ -1,42 +0,0 @@ -import { ROUTER_PERMISSION_TYPE } from '@/router/router-const'; - -/** - * dashboard首页 - */ -export const dashboardRouter = [ - { - path: '/', - // redirect: '/dashboard/contact-company', - redirect: '/dashboard/user', - meta: { - title: '首页', - keepAlive: true, - permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value - }, - component: () => import('@/views/dashboard/dashboard'), - children: [ - // { - // path: '/dashboard/contact-company', - // name: 'ContactCompany', - // meta: { - // title: '往来单位', - // keepAlive: true, - // showTabbar: true, - // permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value - // }, - // component: () => import('@/views/erp/contact-company/contact-company') - // }, - { - path: '/dashboard/user', - name: 'Mine', - meta: { - title: '我的', - keepAlive: false, - showTabbar: true, - permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value - }, - component: () => import('@/views/user/index') - } - ] - } -]; diff --git a/smart-admin-h5/src/router/develop/develop.js b/smart-admin-h5/src/router/develop/develop.js deleted file mode 100644 index a3220405..00000000 --- a/smart-admin-h5/src/router/develop/develop.js +++ /dev/null @@ -1,21 +0,0 @@ -import { ROUTER_PERMISSION_TYPE } from '@/router/router-const'; - -export const developRouter = [ - { - path: '/develop', - component: () => import('@/views/dashboard/dashboard'), - children: [ - { - path: '/develop/config', - name: 'DevelopConfig', - meta: { - title: '开发专用配置', - permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value - }, - component: () => import('views/develop/config') - } - ] - } - -]; - diff --git a/smart-admin-h5/src/router/error/error.js b/smart-admin-h5/src/router/error/error.js deleted file mode 100644 index 982c0f96..00000000 --- a/smart-admin-h5/src/router/error/error.js +++ /dev/null @@ -1,26 +0,0 @@ -// 错误页 -import { ROUTER_PERMISSION_TYPE } from '@/router/router-const'; - -export const errorRouter = [ - { - path: '/404', - name: 'Error404', - meta: { - hideInMenu: true, - access: true, - permissionType: ROUTER_PERMISSION_TYPE.NO_VALID.value - }, - component: () => import('views/error/404.vue') - }, - { - path: '/500', - name: 'Error500', - meta: { - hideInMenu: true, - access: true, - noValidatePrivilege: true, - permissionType: ROUTER_PERMISSION_TYPE.NO_VALID.value - }, - component: () => import('views/error/404.vue') - } -]; diff --git a/smart-admin-h5/src/router/index.js b/smart-admin-h5/src/router/index.js deleted file mode 100644 index c47e1a4a..00000000 --- a/smart-admin-h5/src/router/index.js +++ /dev/null @@ -1,150 +0,0 @@ -import Vue from 'vue'; -import Router from 'vue-router'; -import { routers } from './routers'; -import cookie from '@/lib/cookie'; -import { ROUTER_PERMISSION_TYPE } from './router-const'; -import NProgress from 'nprogress'; -import 'nprogress/nprogress.css'; - -const projectConfig = require('@/config/index.js'); - -Vue.use(Router); - -/** - * 导入所有的router - * @type {VueRouter} - */ -const router = new Router({ - routes: routers -}); - -// 解决路由跳转相同的地址报错 -const originalPush = Router.prototype.push; -Router.prototype.push = function(location) { - try { - return originalPush.call(this, location).catch(err => err); - } catch (error) { - // TODO zhuoda sentry - console.error(error); - } -}; - -const LOGIN_PAGE_NAME = 'Login'; - -// --------------------- router 守卫 begin --------------------- - -router.beforeEach((to, from, next) => { - // 加载进度条 - NProgress.start(); - - // 权限 - const permissionType = to.meta.permissionType; - // 不需要验证,直接放行 - if (permissionType === ROUTER_PERMISSION_TYPE.NO_VALID.value) { - next(); - return; - } - - const token = cookie.getToken(); - // 需要登录 - if (permissionType === ROUTER_PERMISSION_TYPE.NEED_LOGIN.value) { - if (token) { - next(); - } else { - next({ - name: LOGIN_PAGE_NAME - }); - } - return; - } - - // 需要登录,且验证权限 - if (permissionType === ROUTER_PERMISSION_TYPE.VALIDATE_PERMISSION.value) { - if (!token) { - // TODO 验证权限 - next({ - name: LOGIN_PAGE_NAME - }); - return; - } - } - - next({ - name: 'Error404' - }); -}); - -router.afterEach(to => { - NProgress.done(); - window.scrollTo(0, 0); - if (to.meta.title) { - console.log(to.meta); - document.title = to.meta.title + ' ' + projectConfig.title; - } -}); - -// --------------------- router 守卫 end --------------------- - -/** - * router 检测 - * - * 如果存在相同的 path 或者 name 是一件非常恐怖的事情,所以在develop环境将所有router进行一次遍历
- * 检测内容如下:
- * 1、相同的router name - * 2、相同的router name - * 3、path没有以 / 开头 - * - */ - -const tempCheckObj = { - checkRouterNameMap: new Map(), - checkRouterPathMap: new Map() -}; - -function recursionCheckRouter(routerArray) { - for (const routerItem of routerArray) { - if (!routerItem.name) { - console.error('没有配置router name', routerItem); - } else { - const existNameRouter = tempCheckObj.checkRouterNameMap.get( - routerItem.name - ); - if (typeof existNameRouter !== 'undefined') { - console.error('存在相同的router name', routerItem, existNameRouter); - } else { - tempCheckObj.checkRouterNameMap.set(routerItem.name, routerItem); - } - } - - if (!routerItem.path) { - console.error('没有配置router path', routerItem); - } else { - // path必须以 / 开头 - if (routerItem.path !== '*' && routerItem.path.indexOf('/') !== 0) { - console.error('path 没有以/开头 ', routerItem); - } - - const existPathRouter = tempCheckObj.checkRouterPathMap.get( - routerItem.path - ); - if (typeof existPathRouter !== 'undefined') { - console.error('存在相同的router path', routerItem, existPathRouter); - } else { - tempCheckObj.checkRouterPathMap.set(routerItem.path, routerItem); - } - } - - if (routerItem.children) { - recursionCheckRouter(routerItem.children); - } - } -} - -// 如果是开发环境,需要检测router的规范性 -if (process.env.NODE_ENV === 'development') { - recursionCheckRouter(routers); - delete tempCheckObj.checkRouterNameMap; - delete tempCheckObj.checkRouterPathMap; -} - -export default router; diff --git a/smart-admin-h5/src/router/login/login.js b/smart-admin-h5/src/router/login/login.js deleted file mode 100644 index 7c9b6a53..00000000 --- a/smart-admin-h5/src/router/login/login.js +++ /dev/null @@ -1,15 +0,0 @@ -import { ROUTER_PERMISSION_TYPE } from '@/router/router-const'; - -export const loginRouter = [ - { - path: '/login', - name: 'Login', - meta: { - title: '登录', - keepAlive: false, - permissionType: ROUTER_PERMISSION_TYPE.NO_VALID.value - }, - component: () => import('@/views/login/login.vue') - } - -]; diff --git a/smart-admin-h5/src/router/router-const.js b/smart-admin-h5/src/router/router-const.js deleted file mode 100644 index 4d509cf8..00000000 --- a/smart-admin-h5/src/router/router-const.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * 权限类型 - */ -export const ROUTER_PERMISSION_TYPE = { - /** - * 不 验 证 - */ - NO_VALID: { - value: 1 - }, - /** - * 需要登录 - */ - NEED_LOGIN: { - value: 2 - }, - /** - * 需要验证权限 - */ - VALIDATE_PERMISSION: { - value: 3 - } -}; diff --git a/smart-admin-h5/src/router/routers.js b/smart-admin-h5/src/router/routers.js deleted file mode 100644 index e1c106e9..00000000 --- a/smart-admin-h5/src/router/routers.js +++ /dev/null @@ -1,32 +0,0 @@ -// 全局错误页面 -import { errorRouter } from './error/error'; -// 登录注册模块 -import { loginRouter } from './login/login'; -// tabbar dashboard 框架页面 -import { dashboardRouter } from './dashboard'; -// 用户相关 -import { userRouter } from './user/user'; -// 开发相关 -import { developRouter } from './develop/develop'; - -/** - * router meta 说明:
- * - * title: 为页面的title,会显示到浏览器的title上 - * permissionType: 具体使用 router-const.js中的 ROUTER_PERMISSION_TYPE 常量;情况有: 1)不验证 2)校验登录 3)登录后校验权限 - * keepAlive: true or false ; 是否进行页面keepalive, 如果想删除keepalive,可以使用vuex中的app module里有mutation - * showTabbar: true or false ; 是否展示 tabbar, 如果是true, 则会展示tabbar - * - */ -export const routers = [ - // 登录、注册 - ...loginRouter, - // 404、500、403等 - ...errorRouter, - // tab bar 页面 - ...dashboardRouter, - // 用户 - ...userRouter, - // 开发相关 - ...developRouter -]; diff --git a/smart-admin-h5/src/router/user/user.js b/smart-admin-h5/src/router/user/user.js deleted file mode 100644 index 901e5708..00000000 --- a/smart-admin-h5/src/router/user/user.js +++ /dev/null @@ -1,21 +0,0 @@ -import { ROUTER_PERMISSION_TYPE } from '@/router/router-const'; - -export const userRouter = [ - { - path: '/user', - component: () => import('@/views/dashboard/dashboard'), - children: [ - { - path: '/user/change-password', - name: 'UserChangePassword', - meta: { - title: '修改密码', - permissionType: ROUTER_PERMISSION_TYPE.NEED_LOGIN.value - }, - component: () => - import('views/user/change-password') - } - ] - } -]; - diff --git a/smart-admin-h5/src/store/index.js b/smart-admin-h5/src/store/index.js deleted file mode 100644 index 11c4962b..00000000 --- a/smart-admin-h5/src/store/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import Vue from 'vue'; -import Vuex from 'vuex'; - -import user from './module/user'; -import app from './module/app'; - -Vue.use(Vuex); - -export default new Vuex.Store({ - state: { - // - }, - mutations: { - // - }, - actions: { - // - }, - modules: { - app, - user - } -}); diff --git a/smart-admin-h5/src/store/module/app.js b/smart-admin-h5/src/store/module/app.js deleted file mode 100644 index 486defe1..00000000 --- a/smart-admin-h5/src/store/module/app.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * 整个应用相关的状态信息 - * - * 比如: keepalive等 - */ -export default { - namespaced: true, - state: { - // 缓存路由 - keepAliveIncludes: [] - }, - - mutations: { - // 加入keep-alive缓存 - pushKeepAliveIncludes(state, val) { - if (state.keepAliveIncludes.length < 30) { - const number = state.keepAliveIncludes.findIndex(e => e === val); - if (number === -1) { - state.keepAliveIncludes.push(val); - } - } - }, - // 删除缓存 - deleteKeepAliveIncludes(state, val) { - const number = state.keepAliveIncludes.findIndex(e => e === val); - if (number !== -1) { - state.keepAliveIncludes.splice(number, 1); - } - } - } - -}; diff --git a/smart-admin-h5/src/store/module/user.js b/smart-admin-h5/src/store/module/user.js deleted file mode 100644 index 5f64b72e..00000000 --- a/smart-admin-h5/src/store/module/user.js +++ /dev/null @@ -1,41 +0,0 @@ -import cookie from '@/lib/cookie.js'; - -export default { - namespaced: true, - state: { - token: cookie.getToken(), - // session 信息 - sessionInfo: {}, - // 是否获取了session - isHaveGotSessionInfo: false, - // 权限集合 - privilegeKeySet: new Set() - - }, - mutations: { - clearSession() { - state.token = null; - state.sessionInfo = null; - state.privilegeKeySet = new Set(); - }, - updateSession(state, userLoginInfo) { - state.isHaveGotSessionInfo = true; - state.sessionInfo = userLoginInfo; - if (userLoginInfo.privilegeList) { - state.privilegeKeySet = new Set(userLoginInfo.privilegeList.map(e => e.key)); - } - } - }, - getters: { - // 用户菜单权限 - privilegeKeySet: state => state.privilegeKeySet, - isSuperMan: state => state.sessionInfo.isSuperMan, - actualName: state => state.sessionInfo.actualName, - loginUserId: state => state.sessionInfo.id - }, - actions: { - // 登录 - handleLogin({ commit }, params) { - } - } -}; diff --git a/smart-admin-h5/src/themes/index.scss b/smart-admin-h5/src/themes/index.scss deleted file mode 100644 index b540e422..00000000 --- a/smart-admin-h5/src/themes/index.scss +++ /dev/null @@ -1,6 +0,0 @@ - -html, -body { - font-family: Arial, Helvetica, 'STHeiti STXihei', 'Microsoft YaHei', Tohoma, sans-serif; - background-color: $background-color; -} diff --git a/smart-admin-h5/src/utils/index.js b/smart-admin-h5/src/utils/index.js deleted file mode 100644 index 37d915fc..00000000 --- a/smart-admin-h5/src/utils/index.js +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Created by PanJiaChen on 16/11/18. - */ - -/** - * Parse the time to string - * @param {(Object|string|number)} time - * @param {string} cFormat - * @returns {string} - */ -export function parseTime(time, cFormat) { - if (arguments.length === 0) { - return null - } - const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' - let date - if (typeof time === 'object') { - date = time - } else { - if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { - time = parseInt(time) - } - if ((typeof time === 'number') && (time.toString().length === 10)) { - time = time * 1000 - } - date = new Date(time) - } - const formatObj = { - y: date.getFullYear(), - m: date.getMonth() + 1, - d: date.getDate(), - h: date.getHours(), - i: date.getMinutes(), - s: date.getSeconds(), - a: date.getDay() - } - const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { - let value = formatObj[key] - // Note: getDay() returns 0 on Sunday - if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } - if (result.length > 0 && value < 10) { - value = '0' + value - } - return value || 0 - }) - return time_str -} - -/** - * @param {number} time - * @param {string} option - * @returns {string} - */ -export function formatTime(time, option) { - if (('' + time).length === 10) { - time = parseInt(time) * 1000 - } else { - time = +time - } - const d = new Date(time) - const now = Date.now() - - const diff = (now - d) / 1000 - - if (diff < 30) { - return '刚刚' - } else if (diff < 3600) { - // less 1 hour - return Math.ceil(diff / 60) + '分钟前' - } else if (diff < 3600 * 24) { - return Math.ceil(diff / 3600) + '小时前' - } else if (diff < 3600 * 24 * 2) { - return '1天前' - } - if (option) { - return parseTime(time, option) - } else { - return ( - d.getMonth() + - 1 + - '月' + - d.getDate() + - '日' + - d.getHours() + - '时' + - d.getMinutes() + - '分' - ) - } -} - -/** - * @param {string} url - * @returns {Object} - */ -export function param2Obj(url) { - const search = url.split('?')[1] - if (!search) { - return {} - } - return JSON.parse( - '{"' + - decodeURIComponent(search) - .replace(/"/g, '\\"') - .replace(/&/g, '","') - .replace(/=/g, '":"') - .replace(/\+/g, ' ') + - '"}' - ) -} diff --git a/smart-admin-h5/src/utils/request.js b/smart-admin-h5/src/utils/request.js deleted file mode 100644 index 6788f91b..00000000 --- a/smart-admin-h5/src/utils/request.js +++ /dev/null @@ -1,58 +0,0 @@ -import axios from 'axios' -import store from '@/store' -import { Toast } from 'vant' -// 根据环境不同引入不同api地址 -import { baseApi } from '@/config' -// create an axios instance -const service = axios.create({ - baseURL: baseApi, // url = base api url + request url - withCredentials: true, // send cookies when cross-domain requests - timeout: 5000 // request timeout -}) - -// request拦截器 request interceptor -service.interceptors.request.use( - config => { - // 不传递默认开启loading - if (!config.hideloading) { - // loading - Toast.loading({ - forbidClick: true - }) - } - if (store.getters.token) { - config.headers['X-Token'] = '' - } - return config - }, - error => { - // do something with request error - console.log(error) // for debug - return Promise.reject(error) - } -) -// respone拦截器 -service.interceptors.response.use( - response => { - Toast.clear() - const res = response.data - if (res.status && res.status !== 200) { - // 登录超时,重新登录 - if (res.status === 401) { - store.dispatch('FedLogOut').then(() => { - location.reload() - }) - } - return Promise.reject(res || 'error') - } else { - return Promise.resolve(res) - } - }, - error => { - Toast.clear() - console.log('err' + error) // for debug - return Promise.reject(error) - } -) - -export default service diff --git a/smart-admin-h5/src/utils/validate.js b/smart-admin-h5/src/utils/validate.js deleted file mode 100644 index e9bd1bab..00000000 --- a/smart-admin-h5/src/utils/validate.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Created by Sunnie on 19/06/04. - */ - -/** - * @param {string} path - * @returns {Boolean} - */ -export function isExternal(path) { - return /^(https?:|mailto:|tel:)/.test(path) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validUsername(str) { - const valid_map = ['admin', 'editor'] - return valid_map.indexOf(str.trim()) >= 0 -} diff --git a/smart-admin-h5/src/views/dashboard/dashboard.vue b/smart-admin-h5/src/views/dashboard/dashboard.vue deleted file mode 100644 index 47b1ab24..00000000 --- a/smart-admin-h5/src/views/dashboard/dashboard.vue +++ /dev/null @@ -1,99 +0,0 @@ - - - - diff --git a/smart-admin-h5/src/views/develop/config.vue b/smart-admin-h5/src/views/develop/config.vue deleted file mode 100644 index 18b2ec08..00000000 --- a/smart-admin-h5/src/views/develop/config.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - diff --git a/smart-admin-h5/src/views/error/404.vue b/smart-admin-h5/src/views/error/404.vue deleted file mode 100644 index 66168409..00000000 --- a/smart-admin-h5/src/views/error/404.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - - diff --git a/smart-admin-h5/src/views/login/login.vue b/smart-admin-h5/src/views/login/login.vue deleted file mode 100644 index 8fd8806f..00000000 --- a/smart-admin-h5/src/views/login/login.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - - - diff --git a/smart-admin-h5/src/views/user/change-password.vue b/smart-admin-h5/src/views/user/change-password.vue deleted file mode 100644 index 08f4c4e8..00000000 --- a/smart-admin-h5/src/views/user/change-password.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - - diff --git a/smart-admin-h5/src/views/user/index.vue b/smart-admin-h5/src/views/user/index.vue deleted file mode 100644 index be177fff..00000000 --- a/smart-admin-h5/src/views/user/index.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - - diff --git a/smart-admin-h5/vue.config.js b/smart-admin-h5/vue.config.js deleted file mode 100644 index a31f3a23..00000000 --- a/smart-admin-h5/vue.config.js +++ /dev/null @@ -1,200 +0,0 @@ -const path = require('path'); -const CompressionWebpackPlugin = require('compression-webpack-plugin'); -const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin'); -const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); -const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin'); -const SentryPlugin = require('@sentry/webpack-plugin'); -const resolve = dir => path.join(__dirname, dir); -// 项目配置 -const projectConfig = require('./src/config/index.js'); - -// 生产环境,测试和正式 -const isProductionEnv = ['production'].includes(process.env.NODE_ENV); -const isProductionAppEnv = ['prod', 'pre'].includes(process.env.VUE_APP_ENV); - -module.exports = { - publicPath: projectConfig.publicPath, - // 生产环境构建文件的目录 - outputDir: 'dist', - // outputDir的静态资源(js、css、img、fonts)目录 - assetsDir: 'static', - // eslint检测 按需开启 - lintOnSave: !isProductionEnv, - // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 - productionSourceMap: false, - devServer: { - // 设置主机地址 - host: '0.0.0.0', - // 设置默认端口 - port: 8090, - // 禁用host验证 - disableHostCheck: true, - // 启动后打开浏览器 - open: true, - overlay: { - // 当出现编译器错误或警告时,在浏览器中显示全屏覆盖层 - warnings: false, - errors: true - } - // proxy: { - // //配置跨域 - // '/api': { - // // 接口前缀 - // target: "https://sit.smart-h5.1024lab.net/api", - // // ws:true, - // changOrigin:true, - // // 改写规则,把/api 替换为/ - // pathRewrite:{ - // '^/api':'/' - // } - // } - // } - }, - css: { - // 是否使用css分离插件 ExtractTextPlugin 是否将组件中的 CSS 提取至一个独立的 CSS 文件中 (而不是动态注入到 JavaScript 中的 inline 代码)。 - extract: isProductionEnv, - // 开启 CSS source maps - sourceMap: false, - // 使用vw布局去掉这个 - requireModuleExtension: true, - loaderOptions: { - // 引入全局变量 - scss: { - additionalData: `@import "@/assets/css/index";` // 全局引入 - } - } - }, - configureWebpack: config => { - config.name = projectConfig.title; - }, - - chainWebpack: config => { - // 移除资源预加载(路由懒加载才能正常使用) - config.plugins.delete('preload'); - config.plugins.delete('prefetch'); - - // 别名 alias - config.resolve.alias - .set('@', resolve('src')) - .set('assets', resolve('src/assets')) - .set('api', resolve('src/api')) - .set('views', resolve('src/views')) - .set('components', resolve('src/components')); - - // 应用名字 - config.plugin('html').tap(args => { - args[0].title = projectConfig.title; - return args; - }); - - // 设置保留空格 - config.module - .rule('vue') - .use('vue-loader') - .loader('vue-loader') - .tap(options => { - options.compilerOptions.preserveWhitespace = true; - return options; - }) - .end(); - - // ==================== 生产环境配置 begin ==================== - if (isProductionEnv) { - // 打包分析 - config.plugin('webpack-report').use(BundleAnalyzerPlugin, [ - { - analyzerMode: 'static' - } - ]); - // 不显示源码 - config.devtool('cheap-source-map'); - - // cdn - config.plugin('html').tap(args => { - args[0].cdn = projectConfig.cdn.cdnResource; - // 压缩html中的css - args[0].minify.minifyCSS = true; - return args; - }); - // 指定资源加载cdn - config.externals(projectConfig.cdn.externals); - - // 开启gzip , Nginx上也需要配置gzip才会生效 - config - .plugin('compression') - .use(CompressionWebpackPlugin) - .tap(() => [ - { - // 压缩 js 与 css - test: new RegExp( - '\\.(js|css)$' - ), - // 资源文件大于10240B=10kB时会被压缩 - threshold: 10240, - // 最小压缩比达到0.8时才会被压缩 - minRatio: 0.8 - } - ]); - - // sentry - if (isProductionAppEnv) { - config.plugin('sentry').use(SentryPlugin, [{ - ignore: ['node_modules'], - include: './dist', // 上传dist文件的js - configFile: './.sentryclirc' // 配置文件地址 - }]); - } - - config.optimization.minimizer = [ - new UglifyjsWebpackPlugin({ - // 生产环境推荐关闭 sourcemap 防止源码泄漏 - // 服务端通过前端发送的行列,根据 sourcemap 转为源文件位置 - sourceMap: false, - uglifyOptions: { - warnings: false, - compress: { - drop_console: true, - drop_debugger: true - } - } - }) - ]; - - config - .plugin('ScriptExtHtmlWebpackPlugin') - .after('html') - .use(ScriptExtHtmlWebpackPlugin, [ - { - // 将 runtime 作为内联引入不单独存在 - inline: /runtime\..*\.js$/ - } - ]) - .end(); - - config.optimization.splitChunks({ - chunks: 'all', - cacheGroups: { - commons: { - name: 'chunk-commons', - test: resolve('src/components'), - minChunks: 3, // 模块至少使用次数 - priority: 5, - reuseExistingChunk: true // 模块嵌套引入时,判断是否复用已经被打包的模块 - }, - node_vendors: { - name: 'chunk-libs', - chunks: 'initial', - test: /[\\/]node_modules[\\/]/, - priority: 10 - }, - vantUI: { - name: 'chunk-vantUI', - priority: 20, - test: /[\\/]node_modules[\\/]_?vant(.*)/ - } - } - }); - } - // ==================== 生产环境配置 end ==================== - } -}; diff --git a/smart-admin-service/.gitignore b/smart-admin-service/.gitignore deleted file mode 100644 index a2a3040a..00000000 --- a/smart-admin-service/.gitignore +++ /dev/null @@ -1,31 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/** -!**/src/test/** - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ - -### VS Code ### -.vscode/ diff --git a/smart-admin-service/README.md b/smart-admin-service/README.md deleted file mode 100644 index 19273c14..00000000 --- a/smart-admin-service/README.md +++ /dev/null @@ -1,17 +0,0 @@ -### 部署说明 - -#### 下载代码 - -smart-admin-service - -将两个项目导入idea - -#### 创建数据库 - -先执行:src/main/resources/sql/smart-admin.sql - -再执行:src/main/resources/sql/quartz_mysql_2.3.0.sql - -#### 启动 - -运行 smart-admin-api项目 SmartAdminApplication类 diff --git a/smart-admin-service/pom.xml b/smart-admin-service/pom.xml deleted file mode 100644 index 39a6f3ce..00000000 --- a/smart-admin-service/pom.xml +++ /dev/null @@ -1,349 +0,0 @@ - - - 4.0.0 - - net.1024lab - smart-admin-service-parent - 1.0.0 - pom - - - smart-admin-api - - - - UTF-8 - UTF-8 - 1.8 - 3.1.1 - 2.10.0 - 2.2.5.RELEASE - 1.7 - 2.0 - 2.7.0 - 2.0.4 - 3.3.1 - 1.2.73 - 28.2-jre - 2.7.0 - [7.2.0, 7.2.99] - 0.9.1 - 1.1.21 - 3.9.1 - 1.4.2 - 4.1.2 - 1.3.1 - 3.3.2 - 1.9.3 - 2.8.0 - 2.3.2 - 4.2.2 - 8.0.19 - 1.21 - 1.18.8 - - - - - - - org.springframework.boot - spring-boot-dependencies - ${smartadmin.springboot.version} - pom - import - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus-boot.version} - - - - - velocity - org.apache.velocity - ${velocity.version} - - - org.apache.velocity - velocity-engine-core - ${velocity-engine-core.version} - - - - - - com.alibaba - fastjson - ${fastjson.version} - - - - - com.alibaba - druid - ${druid.version} - - - - - p6spy - p6spy - ${p6spy.version} - - - - - io.springfox - springfox-swagger2 - ${swagger.version} - - - io.springfox - springfox-swagger-ui - ${swagger.version} - - - - - - com.github.xiaoymin - knife4j-spring-boot-starter - ${knife4j.version} - - - - - - com.google.guava - guava - ${guava.version} - - - - - com.aliyun.oss - aliyun-sdk-oss - ${aliyun-oss.version} - - - com.qiniu - qiniu-java-sdk - ${qiniu-oss.version} - - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - - - - - - io.jsonwebtoken - jjwt - ${jjwt.version} - - - - - cn.afterturn - easypoi-spring-boot-starter - ${easypoi.version} - - - - - - mysql - mysql-connector-java - ${mysql.version} - - - - commons-beanutils - commons-beanutils - ${commons-beanutils.version} - - - - org.apache.commons - commons-pool2 - ${commons-pool2.version} - - - - com.github.penggle - kaptcha - ${kaptcha.version} - - - - com.googlecode.concurrentlinkedhashmap - concurrentlinkedhashmap-lru - ${concurrentlinkedhashmap.version} - - - - com.squareup.okhttp3 - okhttp - ${okhttp.version} - - - - eu.bitwalker - UserAgentUtils - ${user-agent-util.version} - - - - org.projectlombok - lombok - ${lombok.version} - provided - - - - - - - - - src/main/java - - **/*.* - - - - false - src/main/resources - - dev/* - sit/* - pre/* - prod/* - - - - src/main/resources/${profiles.active} - true - - *.properties - - - - src/main/resources/${profiles.active} - false - - *.* - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${java.version} - ${java.version} - UTF-8 - - - - org.springframework.boot - spring-boot-maven-plugin - ${smartadmin.springboot.version} - - ${main-class} - - - - - repackage - - - - - - - - - - - - dev - - dev - - - true - - - - telework - - telework - - - - sit - - sit - - - - pre - - pre - - - - prod - - prod - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/doc/readme.txt b/smart-admin-service/smart-admin-api/doc/readme.txt deleted file mode 100644 index f586e4b8..00000000 --- a/smart-admin-service/smart-admin-api/doc/readme.txt +++ /dev/null @@ -1,15 +0,0 @@ -1 超管默认账号 -sa/123456 - -2 执行脚本: -先执行:src/main/resources/sql/smart-admin.sql -再执行:src/main/resources/sql/quartz_mysql_2.3.0.sql - -3 除dev之外文件 - -4 刷新页面,获取权限是否走缓存 -LoginService.getSession - -5 test类中去掉代码生成run - -6 前端百度统计 \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/pom.xml b/smart-admin-service/smart-admin-api/pom.xml deleted file mode 100644 index f7ec8db4..00000000 --- a/smart-admin-service/smart-admin-api/pom.xml +++ /dev/null @@ -1,276 +0,0 @@ - - - net.1024lab - smart-admin-service-parent - 1.0.0 - ../pom.xml - - - 4.0.0 - smart-admin-api - jar - - smart-admin-api - - - UTF-8 - UTF-8 - 1.8 - - - - - - - org.springframework.boot - spring-boot-starter-log4j2 - - - org.springframework.boot - spring-boot-starter-aop - - - spring-boot-starter-logging - org.springframework.boot - - - - - org.springframework.boot - spring-boot-starter-quartz - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-data-redis - - - 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-test - test - - - org.springframework.boot - spring-boot-starter-actuator - - - logback-classic - ch.qos.logback - - - spring-boot-starter-logging - org.springframework.boot - - - - - - - com.baomidou - mybatis-plus-boot-starter - - - - - velocity - org.apache.velocity - - - commons-collections - commons-collections - - - - - org.apache.velocity - velocity-engine-core - - - - - - com.alibaba - fastjson - - - - - com.alibaba - druid - - - - - p6spy - p6spy - - - - - io.springfox - springfox-swagger2 - - - io.springfox - springfox-swagger-ui - - - - - - com.github.xiaoymin - knife4j-spring-boot-starter - ${knife4j.version} - - - - - - com.google.guava - guava - - - - - com.aliyun.oss - aliyun-sdk-oss - - - commons-logging - commons-logging - - - - - com.qiniu - qiniu-java-sdk - - - commons-fileupload - commons-fileupload - - - - - - io.jsonwebtoken - jjwt - - - - - cn.afterturn - easypoi-spring-boot-starter - - - - - commons-beanutils - commons-beanutils - - - commons-logging - commons-logging - - - - - - org.apache.commons - commons-pool2 - - - - mysql - mysql-connector-java - - - - com.github.penggle - kaptcha - - - - com.googlecode.concurrentlinkedhashmap - concurrentlinkedhashmap-lru - - - - com.squareup.okhttp3 - okhttp - - - - eu.bitwalker - UserAgentUtils - - - - org.projectlombok - lombok - provided - - - - - - - - src/main/java - - **/*.* - - - - false - src/main/resources - - dev/* - sit/* - pre/* - prod/* - - - - src/main/resources/${profiles.active} - true - - *.properties - *.xml - - - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - org.apache.maven.plugins - maven-surefire-plugin - - true - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/NoNeedLogin.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/NoNeedLogin.java deleted file mode 100644 index 3957937a..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/NoNeedLogin.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.lab1024.smartadmin.common.anno; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * - * [ 不需要登陆 ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface NoNeedLogin { -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/NoValidPrivilege.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/NoValidPrivilege.java deleted file mode 100644 index d37e63c2..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/anno/NoValidPrivilege.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.lab1024.smartadmin.common.anno; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * - * [ 不需要权限验证 ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@Retention(RetentionPolicy.RUNTIME) -public @interface NoValidPrivilege { - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/CommentSortTypeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/CommentSortTypeEnum.java deleted file mode 100644 index 1a4de4e4..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/CommentSortTypeEnum.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.lab1024.smartadmin.common.constant; - - -import net.lab1024.smartadmin.common.domain.BaseEnum; - -/** - * 全局排序枚举类 - * - * @author listen - * @date 2018/01/13 14:24 - */ -public enum CommentSortTypeEnum implements BaseEnum { - - /** - * 正序 ASC 1 - */ - ASC(1, "ASC"), - - /** - * 倒序 DESC 2 - */ - DESC(2, "DESC"); - - private Integer value; - - private String desc; - - /** - * 排序类型:1正序 | 2倒序 - */ - public static final String INFO = "排序类型:1正序 | 2倒序"; - - CommentSortTypeEnum(Integer value, String desc) { - this.value = value; - this.desc = desc; - } - - /** - * 获取枚举类的值 - * - * @return Integer - */ - @Override - public Integer getValue() { - return value; - } - - /** - * 获取枚举类的说明 - * - * @return String - */ - @Override - public String getDesc() { - return desc; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/JudgeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/JudgeEnum.java deleted file mode 100644 index d7c55429..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/JudgeEnum.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.lab1024.smartadmin.common.constant; - -import net.lab1024.smartadmin.common.domain.BaseEnum; - -import java.util.Arrays; -import java.util.Optional; - -/** - * - * [ 是与否] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -public enum JudgeEnum implements BaseEnum { - - NO(0, "否"), - - YES(1, "是"); - - private Integer value; - private String desc; - - JudgeEnum(Integer value, String desc) { - this.value = value; - this.desc = desc; - } - - @Override - public Integer getValue() { - return value; - } - @Override - public String getDesc() { - return desc; - } - - public static JudgeEnum valueOf(Integer status) { - JudgeEnum[] values = JudgeEnum.values(); - Optional first = Arrays.stream(values).filter(e -> e.getValue().equals(status)).findFirst(); - return !first.isPresent() ? null : first.get(); - } - - public static boolean isExist(Integer status) { - JudgeEnum judgeEnum = valueOf(status); - return judgeEnum != null; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/ResponseCodeConst.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/ResponseCodeConst.java deleted file mode 100644 index c572eecd..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/constant/ResponseCodeConst.java +++ /dev/null @@ -1,181 +0,0 @@ -package net.lab1024.smartadmin.common.constant; - -import net.lab1024.smartadmin.module.system.department.DepartmentResponseCodeConst; -import net.lab1024.smartadmin.module.system.employee.constant.EmployeeResponseCodeConst; -import net.lab1024.smartadmin.module.support.file.constant.FileResponseCodeConst; -import net.lab1024.smartadmin.module.business.log.orderoperatelog.constant.OrderOperateLogOperateTypeConst; -import net.lab1024.smartadmin.module.system.login.LoginResponseCodeConst; -import net.lab1024.smartadmin.module.system.position.PositionResponseCodeConst; -import net.lab1024.smartadmin.module.system.privilege.constant.PrivilegeResponseCodeConst; -import net.lab1024.smartadmin.module.system.role.basic.RoleResponseCodeConst; -import net.lab1024.smartadmin.module.system.systemconfig.constant.SystemConfigResponseCodeConst; -import lombok.extern.slf4j.Slf4j; - -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; - -/** - * 每个业务,100个范围值就够了. - */ -@Slf4j -public class ResponseCodeConst { - - // 范围声明 - static { - // 系统功能,从0开始,step=1000 - ResponseCodeContainer.register(ResponseCodeConst.class, 0, 1000); - ResponseCodeContainer.register(LoginResponseCodeConst.class, 1001, 1999); - ResponseCodeContainer.register(DepartmentResponseCodeConst.class, 2001, 2999); - ResponseCodeContainer.register(EmployeeResponseCodeConst.class, 3001, 3999); - ResponseCodeContainer.register(FileResponseCodeConst.class, 4001, 4999); - ResponseCodeContainer.register(SystemConfigResponseCodeConst.class, 5001, 5999); - ResponseCodeContainer.register(RoleResponseCodeConst.class, 6001, 6999); - ResponseCodeContainer.register(PrivilegeResponseCodeConst.class, 7001, 7999); - ResponseCodeContainer.register(OrderOperateLogOperateTypeConst.class, 8001, 8999); - ResponseCodeContainer.register(PositionResponseCodeConst.class, 13000, 13999); - - } - - public static final ResponseCodeConst SUCCESS = new ResponseCodeConst(1, "操作成功!", true); - - public static final ResponseCodeConst ERROR_PARAM = new ResponseCodeConst(101, "参数异常!"); - - public static final ResponseCodeConst ERROR_PARAM_ANY = new ResponseCodeConst(102, "%s参数异常!"); - - public static final ResponseCodeConst SYSTEM_ERROR = new ResponseCodeConst(111, "系统错误"); - - public static final ResponseCodeConst DEVELOPMENT = new ResponseCodeConst(112, "此功能正在开发中"); - - public static final ResponseCodeConst NOT_EXISTS = new ResponseCodeConst(113, "数据不存在"); - - public static ResponseCodeConst REQUEST_METHOD_ERROR = new ResponseCodeConst(114, "请求方式错误"); - - public static ResponseCodeConst JSON_FORMAT_ERROR = new ResponseCodeConst(115, "JSON格式错误"); - - protected int code; - - protected String msg; - - protected boolean success; - - public ResponseCodeConst() { - } - - protected ResponseCodeConst(int code, String msg) { - super(); - this.code = code; - this.msg = msg; - ResponseCodeContainer.put(this); - } - - protected ResponseCodeConst(int code, String msg, boolean success) { - super(); - this.code = code; - this.msg = msg; - this.success = success; - ResponseCodeContainer.put(this); - } - - protected ResponseCodeConst(int code) { - super(); - this.code = code; - ResponseCodeContainer.put(this); - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } - - public static void init() { - log.info("ResponseCodeConst init...."); - } - - // =======================分割======================= - - /** - * 内部类,用于检测code范围 - * - * @author Anders - */ - @Slf4j - private static class ResponseCodeContainer { - - private static final Map RESPONSE_CODE_MAP = new HashMap<>(); - - private static final Map, int[]> RESPONSE_CODE_RANGE_MAP = new HashMap<>(); - - /** - * id的范围:[start, end]左闭右闭 - * - * @param clazz - * @param start - * @param end - */ - private static void register(Class clazz, int start, int end) { - if (start > end) { - throw new IllegalArgumentException(" start > end!"); - } - - if (RESPONSE_CODE_RANGE_MAP.containsKey(clazz)) { - throw new IllegalArgumentException(String.format(" Class:%s already exist!", clazz.getSimpleName())); - } - RESPONSE_CODE_RANGE_MAP.forEach((k, v) -> { - if ((start >= v[0] && start <= v[1]) || (end >= v[0] && end <= v[1])) { - throw new IllegalArgumentException(String.format(" Class:%s 's id range[%d,%d] has " + "intersection with " + "class:%s", clazz.getSimpleName(), start, end, - k.getSimpleName())); - } - }); - - RESPONSE_CODE_RANGE_MAP.put(clazz, new int[]{start, end}); - - // 提前初始化static变量,进行范围检测 - Field[] fields = clazz.getFields(); - if (fields.length != 0) { - try { - fields[0].get(clazz); - } catch (IllegalArgumentException | IllegalAccessException e) { - log.error("", e); - } - } - } - - public static void put(ResponseCodeConst codeConst) { - int[] idRange = RESPONSE_CODE_RANGE_MAP.get(codeConst.getClass()); - if (idRange == null) { - throw new IllegalArgumentException(String.format(" Class:%s has not been registered!", codeConst.getClass().getSimpleName())); - } - int code = codeConst.code; - if (code < idRange[0] || code > idRange[1]) { - throw new IllegalArgumentException(String.format(" Id(%d) out of range[%d,%d], " + "class:%s", code, idRange[0], idRange[1], codeConst.getClass().getSimpleName())); - } - if (RESPONSE_CODE_MAP.keySet().contains(code)) { - log.error(String.format(" Id(%d) out of range[%d,%d], " + "class:%s code is repeat!", code, idRange[0], idRange[1], codeConst.getClass().getSimpleName())); - System.exit(0); - } - RESPONSE_CODE_MAP.put(code, codeConst); - } - - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/controller/BaseController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/controller/BaseController.java deleted file mode 100644 index 47b321aa..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/controller/BaseController.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.lab1024.smartadmin.common.controller; - -import lombok.extern.slf4j.Slf4j; -import org.apache.poi.ss.usermodel.Workbook; - -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; - -/** - * @author: zhuoda - * @create: 2020-03-31 08:54 PM from win10 - */ - -@Slf4j -public class BaseController { - - /** - * 下载 Excel 消息头 - * @param fileName - * @param workbook - * @param response - */ - public void downloadExcel(String fileName, Workbook workbook, HttpServletResponse response) { - try { - fileName = URLEncoder.encode(fileName, "UTF-8"); - } catch (UnsupportedEncodingException e) { - log.error("", e); - } - response.setCharacterEncoding("utf-8"); - response.setHeader("Content-Type", "application/vnd.ms-excel"); - response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls"); - try { - workbook.write(response.getOutputStream()); - workbook.close(); - } catch (IOException e) { - log.error("", e); - } - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/BaseEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/BaseEntity.java deleted file mode 100644 index e6724c94..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/BaseEntity.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.lab1024.smartadmin.common.domain; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.Date; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 上午 11:15 - * @since JDK1.8 - */ -@Data -public class BaseEntity { - - /** - * 主键id - */ - @TableId(type = IdType.AUTO) - private Long id; - - /** - * 更新时间 - */ - private Date updateTime; - - /** - * 创建时间 - */ - private Date createTime; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/ITask.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/ITask.java deleted file mode 100644 index b6427c8e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/ITask.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.lab1024.smartadmin.common.domain; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 14:23 - * @since JDK1.8 - */ -public interface ITask { - - void execute(String paramJson) throws Exception; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/OrderItemDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/OrderItemDTO.java deleted file mode 100644 index 759bb93d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/OrderItemDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.lab1024.smartadmin.common.domain; - -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -/** - * @author: zhuoda - * @create: 2020-03-20 09:07 PM from win10 - */ - -@Slf4j -@Data -public class OrderItemDTO { - private String column; - private boolean asc = true; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/PageParamDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/PageParamDTO.java deleted file mode 100644 index 73590fc5..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/domain/PageParamDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.lab1024.smartadmin.common.domain; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.Max; -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 分页基础参数 - * - * @author lihaifan - * @Date Created in 2017/10/28 16:19 - */ -@Data -public class PageParamDTO { - - @NotNull(message = "分页参数不能为空") - @ApiModelProperty(value = "页码(不能为空)", example = "1") - protected Integer pageNum; - - @NotNull(message = "每页数量不能为空") - @ApiModelProperty(value = "每页数量(不能为空)", example = "10") - @Max(value = 500, message = "每页最大为500") - protected Integer pageSize; - - @ApiModelProperty("是否查询总条数") - protected Boolean searchCount; - - @ApiModelProperty("排序") - protected List orders; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/exception/SmartResponseCodeException.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/exception/SmartResponseCodeException.java deleted file mode 100644 index f3c37ed2..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/exception/SmartResponseCodeException.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.lab1024.smartadmin.common.exception; - -/** - * [ 全局异常拦截后保留ResponseCode码的异常] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/7 0007 下午 16:11 - * @since JDK1.8 - */ -public class SmartResponseCodeException extends RuntimeException{ - private Integer code; - - public SmartResponseCodeException(Integer code, String message) { - super(message); - this.code = code; - } - - public Integer getCode() { - return code; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatLogger.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatLogger.java deleted file mode 100644 index 0376b0f0..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatLogger.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.lab1024.smartadmin.common.heartbeat; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/8 0008 下午 16:23 - * @since JDK1.8 - */ -public interface HeartBeatLogger { - - void error(String string); - - void error(String string, Throwable e); - - void info(String string); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatRecordCommendInterface.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatRecordCommendInterface.java deleted file mode 100644 index e94369e3..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/HeartBeatRecordCommendInterface.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.lab1024.smartadmin.common.heartbeat; - - - -/** -* @Description: -* @Author: simajinqiang -* @Date: 2018/7/9 14:06 -*/ -public interface HeartBeatRecordCommendInterface { - /** - * 处理 - * @param heartBeatRecord - */ - void handler(HeartBeatRecordDTO heartBeatRecord); - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/IpUtil.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/IpUtil.java deleted file mode 100644 index e250f074..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/IpUtil.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.lab1024.smartadmin.common.heartbeat; - -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; - -/** -* @Description: ip工具类 -* @Author: sbq -* @CreateDate: 2019/8/8 10:33 -* @Version: 1.0 -*/ -public class IpUtil { - /** - * 获得服务器的IP地址 - */ - public static String getLocalIP() { - String sIP = ""; - InetAddress ip = null; - try { - boolean bFindIP = false; - Enumeration netInterfaces = (Enumeration) NetworkInterface - .getNetworkInterfaces(); - while (netInterfaces.hasMoreElements()) { - if (bFindIP) { - break; - } - NetworkInterface ni = (NetworkInterface) netInterfaces - .nextElement(); - Enumeration ips = ni.getInetAddresses(); - while (ips.hasMoreElements()) { - ip = (InetAddress) ips.nextElement(); - if (!ip.isLoopbackAddress() - && ip.getHostAddress().matches( - "(\\d{1,3}\\.){3}\\d{1,3}")) { - bFindIP = true; - break; - } - } - } - } catch (Exception e) { - } - if (null != ip) { - sIP = ip.getHostAddress(); - } - return sIP; - } - - /** - * @Description: 获得服务器的IP地址(多网卡) - * @Author: sbq - * @CreateDate: 2019/8/8 10:34 - * @Version: 1.0 - */ - public static List getLocalIPS() { - InetAddress ip = null; - List ipList = new ArrayList(); - try { - Enumeration netInterfaces = (Enumeration) NetworkInterface - .getNetworkInterfaces(); - while (netInterfaces.hasMoreElements()) { - NetworkInterface ni = (NetworkInterface) netInterfaces - .nextElement(); - Enumeration ips = ni.getInetAddresses(); - while (ips.hasMoreElements()) { - ip = (InetAddress) ips.nextElement(); - if (!ip.isLoopbackAddress() - && ip.getHostAddress().matches( - "(\\d{1,3}\\.){3}\\d{1,3}")) { - ipList.add(ip.getHostAddress()); - } - } - } - } catch (Exception e) { - } - return ipList; - } - -} \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/StringUtil.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/StringUtil.java deleted file mode 100644 index 9e0842ec..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/heartbeat/StringUtil.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.lab1024.smartadmin.common.heartbeat; - -import java.util.Iterator; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/8 0008 下午 16:27 - * @since JDK1.8 - */ -public class StringUtil { - - - - public static String join(Iterable iterable, String separator) { - return iterable == null ? null : join(iterable.iterator(), separator); - } - - - public static String join(Iterator iterator, String separator) { - if (iterator == null) { - return null; - } else if (!iterator.hasNext()) { - return ""; - } else { - Object first = iterator.next(); - if (!iterator.hasNext()) { - String result = toString(first); - return result; - } else { - StringBuilder buf = new StringBuilder(256); - if (first != null) { - buf.append(first); - } - - while(iterator.hasNext()) { - if (separator != null) { - buf.append(separator); - } - - Object obj = iterator.next(); - if (obj != null) { - buf.append(obj); - } - } - - return buf.toString(); - } - } - } - - public static String toString(Object obj) { - return obj == null ? "" : obj.toString(); - } - -} \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/json/LongJsonDeserializer.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/json/LongJsonDeserializer.java deleted file mode 100644 index 0dc8e315..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/json/LongJsonDeserializer.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lab1024.smartadmin.common.json; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; - -import java.io.IOException; - -public class LongJsonDeserializer extends JsonDeserializer { - - @Override - public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { - String value = jsonParser.getText(); - try { - return value == null ? null : Long.parseLong(value); - } catch (NumberFormatException e) { - return null; - } - } -} \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/json/LongJsonSerializer.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/json/LongJsonSerializer.java deleted file mode 100644 index 75442925..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/json/LongJsonSerializer.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.lab1024.smartadmin.common.json; - - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; - -import java.io.IOException; - -public class LongJsonSerializer extends JsonSerializer { - @Override - public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { - String text = (value == null ? null : String.valueOf(value)); - if (text != null) { - jsonGenerator.writeString(text); - } - } -} \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/SmartReloadManager.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/SmartReloadManager.java deleted file mode 100644 index 1d4770c4..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/SmartReloadManager.java +++ /dev/null @@ -1,134 +0,0 @@ -package net.lab1024.smartadmin.common.reload; - -import net.lab1024.smartadmin.common.reload.annotation.SmartReload; -import net.lab1024.smartadmin.common.reload.domain.AbstractSmartReloadObject; -import net.lab1024.smartadmin.common.reload.domain.AnnotationReloadObject; -import net.lab1024.smartadmin.common.reload.domain.InterfaceReloadObject; -import net.lab1024.smartadmin.common.reload.domain.entity.ReloadItem; -import net.lab1024.smartadmin.common.reload.domain.entity.SmartReloadResult; -import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadCommandInterface; -import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadThreadLogger; -import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadable; - -import java.lang.reflect.Method; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -import static java.util.Objects.requireNonNull; - -/** - * SmartReloadManager 管理器 - *

- * 可以在此类中添加 检测任务 以及注册 处理程序 - * - * @author zhuoda - */ -public class SmartReloadManager { - - private Map tagReloadObject; - - private SmartReloadScheduler reloadScheduler; - - private SmartReloadThreadLogger logger; - - public SmartReloadManager(SmartReloadThreadLogger logger, int threadCount) { - this.tagReloadObject = new ConcurrentHashMap<>(); - if (logger == null) { - throw new ExceptionInInitializerError("SmartReloadLoggerImp cannot be null"); - } - - if (threadCount < 1) { - throw new ExceptionInInitializerError("threadCount must be greater than 1"); - } - - this.logger = logger; - this.reloadScheduler = new SmartReloadScheduler(this.logger, threadCount); - } - - /** - * 默认创建单个线程 - * - * @param logger - */ - public SmartReloadManager(SmartReloadThreadLogger logger) { - this(logger, 1); - } - - /** - * 停止 - */ - public void shutdown() { - reloadScheduler.shutdown(); - } - - /** - * 添加任务 - * - * @param command SmartReloadCommand实现类 - * @param initialDelay 第一次执行前的延迟时间 - * @param delay 任务间隔时间 - * @param unit 延迟单位 TimeUnit 天、小时、分、秒等 - */ - public void addCommand(SmartReloadCommandInterface command, long initialDelay, long delay, TimeUnit unit) { - reloadScheduler.addCommand(command, initialDelay, delay, unit); - } - - /** - * 注册 实现接口的方式 - * - * @param tag - * @param reloadable - */ - public void register(String tag, SmartReloadable reloadable) { - requireNonNull(reloadable); - requireNonNull(tag); - if (tagReloadObject.containsKey(tag)) { - logger.error("<> register duplicated tag reload : " + tag + " , and it will be cover!"); - } - tagReloadObject.put(tag, new InterfaceReloadObject(reloadable)); - } - - /** - * 注册 要求此类必须包含使用了SmartReload注解的方法 - * - * @param reloadObject - */ - public void register(Object reloadObject) { - requireNonNull(reloadObject); - Method[] declaredMethods = reloadObject.getClass().getDeclaredMethods(); - if (declaredMethods != null) { - for (int i = 0; i < declaredMethods.length; i++) { - Method method = declaredMethods[i]; - SmartReload annotation = method.getAnnotation(SmartReload.class); - if (annotation != null) { - String reloadTag = annotation.value(); - this.register(reloadTag, new AnnotationReloadObject(reloadObject, method)); - } - } - } - } - - private void register(String tag, AbstractSmartReloadObject reloadObject) { - if (tagReloadObject.containsKey(tag)) { - logger.error("<> register duplicated tag reload : " + tag + " , and it will be cover!"); - } - tagReloadObject.put(tag, reloadObject); - } - - /** - * Reload 已注册的ReloadItem - * - * @param reloadItem - * @return SmartReloadResult - */ - public SmartReloadResult doReload(ReloadItem reloadItem) { - AbstractSmartReloadObject reloadObject = tagReloadObject.get(reloadItem.getTag()); - if (reloadObject != null) { - return reloadObject.reload(reloadItem); - } - // 返回注册结果 - return new SmartReloadResult(reloadItem.getTag(), reloadItem.getArgs(), reloadItem.getIdentification(), false, "No registered reload handler was found"); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/SmartReloadScheduler.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/SmartReloadScheduler.java deleted file mode 100644 index 121c3056..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/SmartReloadScheduler.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.lab1024.smartadmin.common.reload; - -import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadCommandInterface; -import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadThreadLogger; - -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * Reload 调度器 - * - * @author zhuoda - */ -public class SmartReloadScheduler { - - private ScheduledThreadPoolExecutor executor; - - private SmartReloadThreadLogger logger; - - SmartReloadScheduler(SmartReloadThreadLogger logger, int threadCount) { - this.executor = new ScheduledThreadPoolExecutor(threadCount, new SmartReloadSchedulerThreadFactory()); - this.logger = logger; - } - - void shutdown() { - try { - executor.shutdown(); - } catch (Throwable e) { - logger.error("<> shutdown ", e); - } - } - - void addCommand(SmartReloadCommandInterface command, long initialDelay, long delay, TimeUnit unit) { - executor.scheduleWithFixedDelay(new ScheduleRunnable(command, this.logger), initialDelay, delay, unit); - } - - static class ScheduleRunnable implements Runnable { - - private SmartReloadCommandInterface command; - - private SmartReloadThreadLogger logger; - - public ScheduleRunnable(SmartReloadCommandInterface command, SmartReloadThreadLogger logger) { - this.command = command; - this.logger = logger; - } - - @Override - public void run() { - try { - command.doTask(); - } catch (Throwable e) { - logger.error("", e); - } - } - } - - static class SmartReloadSchedulerThreadFactory implements ThreadFactory { - - private static final AtomicInteger poolNumber = new AtomicInteger(1); - - private final ThreadGroup group; - - private final AtomicInteger threadNumber = new AtomicInteger(1); - - private final String namePrefix; - - SmartReloadSchedulerThreadFactory() { - SecurityManager s = System.getSecurityManager(); - group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); - namePrefix = "smartreload-" + poolNumber.getAndIncrement() + "-thread-"; - } - - @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); - if (t.isDaemon()) - t.setDaemon(false); - if (t.getPriority() != Thread.NORM_PRIORITY) - t.setPriority(Thread.NORM_PRIORITY); - return t; - } - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/abstracts/AbstractSmartReloadCommand.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/abstracts/AbstractSmartReloadCommand.java deleted file mode 100644 index 8e1dc3ed..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/abstracts/AbstractSmartReloadCommand.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.lab1024.smartadmin.common.reload.abstracts; - -import net.lab1024.smartadmin.common.reload.SmartReloadManager; -import net.lab1024.smartadmin.common.reload.domain.entity.ReloadItem; -import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadCommandInterface; - -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 检测是否 Reload 的类 - * - * @author zhuoda - */ -public abstract class AbstractSmartReloadCommand implements SmartReloadCommandInterface { - - /** - * 当前ReloadItem的存储器 - */ - private ConcurrentHashMap currentTags = null; - - /** - * Reload的执行类 - */ - private SmartReloadManager reloadManager; - - public AbstractSmartReloadCommand(SmartReloadManager reloadManager) { - this.reloadManager = reloadManager; - this.currentTags = new ConcurrentHashMap<>(); - // 初始获取ReloadItem数据 - List readTagStatesFromDb = readReloadItem(); - if (readTagStatesFromDb != null) { - for (ReloadItem reloadItem : readTagStatesFromDb) { - String tag = reloadItem.getTag(); - String tagChangeIdentifier = reloadItem.getIdentification(); - this.currentTags.put(tag, tagChangeIdentifier); - } - } - } - /** - * 任务: - * 读取数据库中 ReloadItem 数据 - * 校验是否发生变化 - * 执行重加载动作 - */ - @Override - public void doTask() { - // 获取数据库数据 - List readTagStatesFromDb = readReloadItem(); - String tag; - String tagIdentifier; - String preTagChangeIdentifier; - for (ReloadItem reloadItem : readTagStatesFromDb) { - tag = reloadItem.getTag(); - tagIdentifier = reloadItem.getIdentification(); - preTagChangeIdentifier = currentTags.get(tag); - // 数据不一致 - if (preTagChangeIdentifier == null || ! preTagChangeIdentifier.equals(tagIdentifier)) { - // 更新map数据 - currentTags.put(tag, tagIdentifier); - // 执行重新加载此项的动作 - handleReloadResult(this.reloadManager.doReload(reloadItem)); - } - } - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/abstracts/AbstractSmartReloadCommand4Spring.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/abstracts/AbstractSmartReloadCommand4Spring.java deleted file mode 100644 index 60f34a9c..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/abstracts/AbstractSmartReloadCommand4Spring.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.lab1024.smartadmin.common.reload.abstracts; - -import net.lab1024.smartadmin.common.reload.SmartReloadManager; -import net.lab1024.smartadmin.common.reload.domain.entity.ReloadItem; -import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadCommandInterface; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 检测是否 Reload 的类 - * - * @author zhuoda - */ -public abstract class AbstractSmartReloadCommand4Spring implements SmartReloadCommandInterface { - - /** - * 当前ReloadItem的存储器 - */ - protected ConcurrentHashMap currentTags = new ConcurrentHashMap<>(); - - /** - * Reload的执行类 - */ - @Autowired - protected SmartReloadManager reloadManager; - -// @PostConstruct - public void init() { - List readTagStatesFromDb = readReloadItem(); - if (readTagStatesFromDb != null) { - for (ReloadItem reloadItem : readTagStatesFromDb) { - String tag = reloadItem.getTag(); - String tagChangeIdentifier = reloadItem.getIdentification(); - this.currentTags.put(tag, tagChangeIdentifier); - } - } - } - - /** - * 任务: - * 读取数据库中 ReloadItem 数据 - * 校验是否发生变化 - * 执行重加载动作 - */ - @Override - public void doTask() { - // 获取数据库数据 - List readTagStatesFromDb = readReloadItem(); - String tag; - String tagIdentifier; - String preTagChangeIdentifier; - for (ReloadItem reloadItem : readTagStatesFromDb) { - tag = reloadItem.getTag(); - tagIdentifier = reloadItem.getIdentification(); - preTagChangeIdentifier = currentTags.get(tag); - // 数据不一致 - if (preTagChangeIdentifier == null || ! preTagChangeIdentifier.equals(tagIdentifier)) { - // 更新map数据 - currentTags.put(tag, tagIdentifier); - // 执行重新加载此项的动作 - handleReloadResult(this.reloadManager.doReload(reloadItem)); - } - } - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/AbstractSmartReloadObject.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/AbstractSmartReloadObject.java deleted file mode 100644 index 907d37da..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/AbstractSmartReloadObject.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.lab1024.smartadmin.common.reload.domain; - -import net.lab1024.smartadmin.common.reload.domain.entity.ReloadItem; -import net.lab1024.smartadmin.common.reload.domain.entity.SmartReloadResult; - -import java.io.PrintWriter; -import java.io.StringWriter; -/** - * AbstractSmartReloadObject 处理程序的抽象类 - * - * @author zhuoda - */ -public abstract class AbstractSmartReloadObject { - - protected String getStackTrace(Throwable e) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - e.printStackTrace(pw); - return sw.toString(); - } - - /** - * 通过reloadItem参数reload,获得结果 - * - * @param reloadItem - * @return boolean - * @author zhuokongming - * @date 2016年10月21日 下午2:09:44 - */ - public abstract SmartReloadResult reload(ReloadItem reloadItem); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/AnnotationReloadObject.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/AnnotationReloadObject.java deleted file mode 100644 index da19bcb9..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/AnnotationReloadObject.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.lab1024.smartadmin.common.reload.domain; - -import net.lab1024.smartadmin.common.reload.annotation.SmartReload; -import net.lab1024.smartadmin.common.reload.domain.entity.ReloadItem; -import net.lab1024.smartadmin.common.reload.domain.entity.SmartReloadResult; - -import java.lang.reflect.Method; - -/** - * Reload 处理程序的实现类 - * 用于包装以注解 SmartReload 实现的处理类 - * - * @author zhuoda - */ -public class AnnotationReloadObject extends AbstractSmartReloadObject { - - private Object reloadObject; - - private Method method; - - public AnnotationReloadObject(Object reloadObject, Method method) { - super(); - this.reloadObject = reloadObject; - this.method = method; - this.method.setAccessible(true); - } - - @Override - public SmartReloadResult reload(ReloadItem reloadItem) { - SmartReloadResult result = new SmartReloadResult(); - String tag = method.getAnnotation(SmartReload.class).value(); - result.setTag(tag); - result.setArgs(reloadItem.getArgs()); - result.setIdentification(reloadItem.getIdentification()); - try { - Object invoke = method.invoke(reloadObject, reloadItem.getArgs()); - result.setResult((Boolean) invoke); - } catch (Throwable e) { - result.setException(getStackTrace(e)); - } - return result; - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/InterfaceReloadObject.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/InterfaceReloadObject.java deleted file mode 100644 index e0f75ba0..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/InterfaceReloadObject.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.lab1024.smartadmin.common.reload.domain; - -import net.lab1024.smartadmin.common.reload.domain.entity.ReloadItem; -import net.lab1024.smartadmin.common.reload.domain.entity.SmartReloadResult; -import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadable; - -/** - * Reload 处理程序的实现类 - * 用于处理以接口实现的处理类 - * - * @author zhuoda - */ -public class InterfaceReloadObject extends AbstractSmartReloadObject { - - private SmartReloadable object; - - public InterfaceReloadObject(SmartReloadable object) { - super(); - this.object = object; - } - - @Override - public SmartReloadResult reload(ReloadItem reloadItem) { - SmartReloadResult reloadResult = new SmartReloadResult(); - reloadResult.setArgs(reloadItem.getArgs()); - reloadResult.setIdentification(reloadItem.getIdentification()); - reloadResult.setTag(reloadItem.getTag()); - try { - boolean res = object.reload(reloadItem); - reloadResult.setResult(res); - } catch (Throwable e) { - reloadResult.setException(getStackTrace(e)); - } - return reloadResult; - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/entity/ReloadItem.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/entity/ReloadItem.java deleted file mode 100644 index 66a89b60..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/entity/ReloadItem.java +++ /dev/null @@ -1,55 +0,0 @@ -package net.lab1024.smartadmin.common.reload.domain.entity; -/** - * ReloadItem 类 - * - * @author zhuoda - */ -public class ReloadItem { - - /** - * 项名称 - */ - private String tag; - - /** - * 参数 - */ - private String args; - - /** - * 标识 - */ - private String identification; - - public ReloadItem() { - - } - public ReloadItem(String tag, String identification, String args) { - this.tag = tag; - this.identification = identification; - this.args = args; - } - - public String getTag() { - return tag; - } - public void setTag(String tag) { - this.tag = tag; - } - public String getIdentification() { - return identification; - } - public void setIdentification(String identification) { - this.identification = identification; - } - public String getArgs() { - return args; - } - public void setArgs(String args) { - this.args = args; - } - @Override - public String toString() { - return "ReloadItem{" + "tag='" + tag + '\'' + ", identification='" + identification + '\'' + ", args='" + args + '\'' + '}'; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/entity/SmartReloadResult.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/entity/SmartReloadResult.java deleted file mode 100644 index 07c6d2d5..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/domain/entity/SmartReloadResult.java +++ /dev/null @@ -1,102 +0,0 @@ -package net.lab1024.smartadmin.common.reload.domain.entity; -/** - * t_reload_result 表 实体类 - * - * @author zhuoda - */ -public class SmartReloadResult { - - /** - * 项名称 - */ - private String tag; - - /** - * 参数 - */ - private String args; - - /** - * 标识 - */ - private String identification; - - /** - * 处理结果 - */ - private boolean result; - - /** - * 异常说明 - */ - private String exception; - - public SmartReloadResult() { - } - - public SmartReloadResult(String tag, String args, boolean result, String exception) { - this.tag = tag; - this.args = args; - this.result = result; - this.exception = exception; - } - - public SmartReloadResult(String tag, String args, String identification, boolean result, String exception) { - this.tag = tag; - this.args = args; - this.identification = identification; - this.result = result; - this.exception = exception; - } - - public void setTag(String tag) { - this.tag = tag; - } - - public void setArgs(String args) { - this.args = args; - } - - public void setIdentification(String identification) { - this.identification = identification; - } - - public void setResult(boolean result) { - this.result = result; - } - - public void setException(String exception) { - this.exception = exception; - } - - public String getTag() { - return tag; - } - - public String getArgs() { - return args; - } - - public String getIdentification() { - return identification; - } - - public boolean isResult() { - return result; - } - - public String getException() { - return exception; - } - - @Override - public String toString() { - return "SmartReloadResult{" + - "tag='" + tag + '\'' + - ", args='" + args + '\'' + - ", identification='" + identification + '\'' + - ", result=" + result + - ", exception='" + exception + '\'' + - '}'; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadCommandInterface.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadCommandInterface.java deleted file mode 100644 index c9e04237..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadCommandInterface.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.lab1024.smartadmin.common.reload.interfaces; - -import net.lab1024.smartadmin.common.reload.domain.entity.ReloadItem; -import net.lab1024.smartadmin.common.reload.domain.entity.SmartReloadResult; - -import java.util.List; - -/** - * 检测是否 Reload 的类 - * - * @author zhuoda - */ -public interface SmartReloadCommandInterface { - - /** - * 任务: - * 读取数据库中 ReloadItem 数据 - * 校验是否发生变化 - * 执行重加载动作 - */ - void doTask(); - - /** - * 该方法返回一个List:
- * ReloadItem对象的tagIdentify为:该tag的 状态(状态其实就是个字符串,如果该字符串跟上次有变化则进行reload操作)
- * ReloadItem对象的args为: reload操作需要的参数

- * - * @return List - */ - List readReloadItem(); - - /** - * 处理Reload结果 - * - * @param reloadResult - */ - void handleReloadResult(SmartReloadResult reloadResult); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadThreadLogger.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadThreadLogger.java deleted file mode 100644 index e03c9ad7..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadThreadLogger.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.lab1024.smartadmin.common.reload.interfaces; - -/** - * SmartReloadThreadLogger 日志类 - */ -public interface SmartReloadThreadLogger { - - void error(String string); - - void error(String string, Throwable e); - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadable.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadable.java deleted file mode 100644 index 85473d5f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/common/reload/interfaces/SmartReloadable.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.lab1024.smartadmin.common.reload.interfaces; - -import net.lab1024.smartadmin.common.reload.domain.entity.ReloadItem; - -/** - * reload 接口
- * 需要reload的业务实现类 - */ -@FunctionalInterface -public interface SmartReloadable { - - /** - * reload - * - * @param reloadItem - * @return boolean - */ - boolean reload(ReloadItem reloadItem); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartAdminWebAppConfig.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartAdminWebAppConfig.java deleted file mode 100644 index 04d30c67..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartAdminWebAppConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.lab1024.smartadmin.config; - -import net.lab1024.smartadmin.interceptor.SmartAuthenticationInterceptor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.*; - -@Configuration -public class SmartAdminWebAppConfig implements WebMvcConfigurer { - - @Autowired - private SmartAuthenticationInterceptor smartAuthenticationInterceptor; - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(smartAuthenticationInterceptor).addPathPatterns("/**"); - } - - - @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/druidMonitor").setViewName("redirect:/druid/index.html"); - registry.addViewController("/swaggerApi").setViewName("redirect:/swagger-ui.html"); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartHeartBeatConfig.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartHeartBeatConfig.java deleted file mode 100644 index 14517a8f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartHeartBeatConfig.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.lab1024.smartadmin.config; - -import lombok.Data; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -/** - * - * [ ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@Data -@Configuration -public class SmartHeartBeatConfig { - - /** - * 延迟执行时间 - */ - @Value("${heart-beat.delayHandlerTime}") - private Long delayHandlerTime; - - /** - * 间隔执行时间 - */ - @Value("${heart-beat.intervalTime}") - private Long intervalTime; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartMybatisPlusConfig.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartMybatisPlusConfig.java deleted file mode 100644 index 6bdcfb08..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartMybatisPlusConfig.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.lab1024.smartadmin.config; - -import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; -import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -/** - * @author zhuoda - */ -@EnableTransactionManagement -@Configuration -@MapperScan(basePackages = {"net.lab1024.smartadmin.module.*"}) -public class SmartMybatisPlusConfig { - - /** - * 分页插件 - */ - @Bean - public PaginationInterceptor paginationInterceptor() { - // 开启 count 的 join 优化,只针对 left join !!! - return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true)); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartReloadConfig.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartReloadConfig.java deleted file mode 100644 index bf5defdd..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartReloadConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lab1024.smartadmin.config; - -import net.lab1024.smartadmin.common.reload.SmartReloadManager; -import net.lab1024.smartadmin.common.reload.interfaces.SmartReloadThreadLogger; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/28 0028 下午 20:15 - * @since JDK1.8 - */ -@Slf4j -@Configuration -public class SmartReloadConfig { - - @Value("${smart-reload.thread-count}") - private Integer threadCount; - - @Bean - public SmartReloadManager initSmartReloadManager() { - /** - * 创建 Reload Manager 调度器 - */ - SmartReloadManager smartReloadManager = new SmartReloadManager(new SmartReloadThreadLogger() { - @Override - public void error(String string) { - log.error(string); - } - - @Override - public void error(String string, Throwable e) { - log.error(string, e); - } - }, threadCount); - return smartReloadManager; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartRestTemplateConfig.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartRestTemplateConfig.java deleted file mode 100644 index 70d9624c..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartRestTemplateConfig.java +++ /dev/null @@ -1,109 +0,0 @@ -package net.lab1024.smartadmin.config; - -import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; -import org.apache.http.client.HttpClient; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.MediaType; -import org.springframework.http.client.ClientHttpRequestFactory; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.http.converter.FormHttpMessageConverter; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.StringHttpMessageConverter; -import org.springframework.web.client.RestTemplate; - -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Configuration -public class SmartRestTemplateConfig { - - - @Value("${http.pool.max-total}") - private Integer maxTotal; - @Value("${http.pool.default-max-per-route}") - private Integer defaultMaxPerRoute; - @Value("${http.pool.socket-timeout}") - private Integer socketTimeout; - @Value("${http.pool.connect-timeout}") - private Integer connectTimeout; - @Value("${http.pool.connection-request-timeout}") - private Integer connectionRequestTimeout; - - - @Bean - public RestTemplate restTemplate(ClientHttpRequestFactory factory) { - return new RestTemplate(factory); - } - - @Bean - public ClientHttpRequestFactory httpRequestFactory() { - HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient()); - return factory; - } - - /** - * fastJsonRestTemplate - * - * @return - */ - @Bean(name = "fastJsonRestTemplate") - public RestTemplate fastJsonRestTemplate() { - RestTemplate restTemplate = new RestTemplate(httpRequestFactory()); - - HttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8")); - - FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); - List fastMediaTypes = new ArrayList<>(); - fastMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED); - fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); - fastConverter.setSupportedMediaTypes(fastMediaTypes); - List> converters = restTemplate.getMessageConverters(); - converters.add(1,converter); - converters.add(fastConverter); - return restTemplate; - } - - - @Bean - public HttpClient httpClient() { - Registry registry = RegistryBuilder.create() - .register("http", PlainConnectionSocketFactory.getSocketFactory()) - .register("https", SSLConnectionSocketFactory.getSocketFactory()) - .build(); - PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); - connectionManager.setMaxTotal(maxTotal); - connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute); - - RequestConfig requestConfig = RequestConfig.custom() - .setSocketTimeout(socketTimeout) - .setConnectTimeout(connectTimeout) - .setConnectionRequestTimeout(connectionRequestTimeout) - .build(); - return HttpClientBuilder.create() - .setDefaultRequestConfig(requestConfig) - .setConnectionManager(connectionManager) - .build(); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartSwaggerApiModelEnumConfig.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartSwaggerApiModelEnumConfig.java deleted file mode 100644 index 93e45791..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartSwaggerApiModelEnumConfig.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.lab1024.smartadmin.config; - -import net.lab1024.smartadmin.common.swagger.SmartSwaggerApiModelEnumPlugin; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.core.annotation.Order; -import springfox.documentation.swagger.common.SwaggerPluginSupport; - -/** - * [ 对于枚举类进行swagger注解,与前端的vue-enum相匹配 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/9 0009 上午 9:46 - * @since JDK1.8 - */ -@Configuration -@Profile({"dev", "sit", "pre", "prod"}) -public class SmartSwaggerApiModelEnumConfig { - - @Bean - @Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER + 1) - public SmartSwaggerApiModelEnumPlugin swaggerEnum(){ - return new SmartSwaggerApiModelEnumPlugin(); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartWebSocketConfig.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartWebSocketConfig.java deleted file mode 100644 index f431fdac..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SmartWebSocketConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.lab1024.smartadmin.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.socket.server.standard.ServerEndpointExporter; - -/** - * [ WebSocketConfig ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/10 0010 下午 16:07 - * @since JDK1.8 - */ -@Configuration -public class SmartWebSocketConfig { - - @Bean - public ServerEndpointExporter serverEndpointExporter() { - return new ServerEndpointExporter(); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SystemEnvironmentCondition.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SystemEnvironmentCondition.java deleted file mode 100644 index 63c2a5ed..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/config/SystemEnvironmentCondition.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.lab1024.smartadmin.config; -import net.lab1024.smartadmin.constant.SystemEnvironmentEnum; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Condition; -import org.springframework.context.annotation.ConditionContext; -import org.springframework.core.type.AnnotatedTypeMetadata; -/** - * 是否是正式环境 - * - * @author listen - * @date 2019/08/27 08:56 - */ -public class SystemEnvironmentCondition implements Condition { - - @Value("${spring.profiles.active}") - private String systemEnvironment; - - @Override - public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { - return ! SystemEnvironmentEnum.PROD.equalsValue(systemEnvironment); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/CommonConst.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/CommonConst.java deleted file mode 100644 index b2c4a63f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/CommonConst.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.lab1024.smartadmin.constant; - -import com.google.common.collect.ImmutableSet; -import org.apache.commons.collections4.CollectionUtils; - -import java.util.Set; - -/** - * - * [ 通用常量 ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -public class CommonConst { - - - public static final class Page { - public static final Integer SIZE = 10; - } - - public static final class Password { - public static final String DEFAULT = "123456"; - public static final String SALT_FORMAT = "smart_%s_admin"; - } - - public static final String IGNORE_H5_URL_MAPPING = "/h5/api"; - - public static final class CommonCollection { - public static final Set IGNORE_URL = ImmutableSet.of("/swagger", "Excel"); - - public static final Set IGNORE_URL_MAPPING = ImmutableSet.of(IGNORE_H5_URL_MAPPING); - - public static Boolean contain(Set ignores, String uri) { - if (CollectionUtils.isEmpty(ignores)) { - return false; - } - for (String ignoreUrl : ignores) { - if (uri.startsWith(ignoreUrl)) { - return true; - } - } - return false; - } - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/SmartReloadTagConst.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/SmartReloadTagConst.java deleted file mode 100644 index 0799bd66..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/SmartReloadTagConst.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.lab1024.smartadmin.constant; -/** - * smart initDefines 项 常量 - * - * @author listen - * @date 2018/02/10 14:29 - */ -public class SmartReloadTagConst { - - /** - * 系统环境设置 DEMO - */ - public static final String SYSTEM_CONFIG = "system_config"; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/SwaggerTagConst.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/SwaggerTagConst.java deleted file mode 100644 index 559f9a30..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/constant/SwaggerTagConst.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.lab1024.smartadmin.constant; - -/** - * [] - * - * @author yandanyang - * @version 1.0 - * @since JDK1.8 - */ -public class SwaggerTagConst { - - - public static class Admin { - public static final String MANAGER_SYSTEM_CONFIG = "管理端-系统配置"; - - public static final String MANAGER_USER = "管理端-用户"; - - public static final String MANAGER_USER_LOGIN = "管理端-用户登录"; - - public static final String MANAGER_DEPARTMENT = "管理端-部门"; - - public static final String MANAGER_ROLE = "管理端-角色"; - - public static final String MANAGER_ROLE_USER = "管理端-角色用户"; - - public static final String MANAGER_ROLE_PRIVILEGE = "管理端-角色权限"; - - public static final String MANAGER_SMART_RELOAD = "管理端-smart reload"; - - public static final String MANAGER_ORDER_OPERATE_LOG = "管理端-单据操作日志"; - - public static final String MANAGER_TASK_SCHEDULER = "管理端-任务调度"; - - public static final String MANAGER_USER_LOGIN_LOG = "管理端-用户登录日志"; - - public static final String MANAGER_USER_OPERATE_LOG = "管理端-用户操作日志"; - - public static final String MANAGER_DATA_SCOPE = "管理端-数据范围"; - - public static final String MANAGER_JOB = "管理端-岗位"; - - public static final String MANAGER_NOTICE = "管理端-系统通知"; - - public static final String MANAGER_FILE = "通用-文件服务"; - - public static final String MANAGER_PRIVILEGE = "通用-权限"; - - public static final String MANAGER_EMAIL = "通用-邮件发送"; - - public static final String MANAGER_HEART_BEAT = "通用-心跳服务"; - } - - /** - * 自定义分组2 - */ - public static class Group2 { - - - } - - /** - * 自定义分组2 - */ - public static class Group3 { - - } - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/handler/SmartGlobalExceptionHandler.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/handler/SmartGlobalExceptionHandler.java deleted file mode 100644 index dabd6fd9..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/handler/SmartGlobalExceptionHandler.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.lab1024.smartadmin.handler; - -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.common.exception.SmartBusinessException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.TypeMismatchException; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.validation.FieldError; -import org.springframework.web.HttpRequestMethodNotSupportedException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * [ 全局异常拦截 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Slf4j -@ControllerAdvice -public class SmartGlobalExceptionHandler { - - /** - * 添加全局异常处理流程 - * - * @param e - * @return - * @throws Exception - */ - @ResponseBody - @ExceptionHandler(Exception.class) - public ResponseDTO exceptionHandler(Exception e) { - log.error("error:", e); - - // http 请求方式错误 - if (e instanceof HttpRequestMethodNotSupportedException) { - return ResponseDTO.wrap(ResponseCodeConst.REQUEST_METHOD_ERROR); - } - - // 参数类型错误 - if (e instanceof TypeMismatchException) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM); - } - - // json 格式错误 - if (e instanceof HttpMessageNotReadableException) { - return ResponseDTO.wrap(ResponseCodeConst.JSON_FORMAT_ERROR); - } - - // 参数校验未通过 - if (e instanceof MethodArgumentNotValidException) { - List fieldErrors = ((MethodArgumentNotValidException) e).getBindingResult().getFieldErrors(); - List msgList = fieldErrors.stream().map(FieldError :: getDefaultMessage).collect(Collectors.toList()); - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, String.join(",", msgList)); - } - - if (e instanceof SmartBusinessException) { - return ResponseDTO.wrap(ResponseCodeConst.SYSTEM_ERROR); - } - - return ResponseDTO.wrap(ResponseCodeConst.SYSTEM_ERROR); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/handler/SmartOperateLogAspect.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/handler/SmartOperateLogAspect.java deleted file mode 100644 index 0dd49cd2..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/handler/SmartOperateLogAspect.java +++ /dev/null @@ -1,167 +0,0 @@ -package net.lab1024.smartadmin.handler; - -import com.alibaba.fastjson.JSON; -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.constant.JudgeEnum; -import net.lab1024.smartadmin.module.business.log.LogService; -import net.lab1024.smartadmin.module.business.log.useroperatelog.domain.UserOperateLogEntity; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.util.SmartRequestTokenUtil; -import net.lab1024.smartadmin.util.SmartStringUtil; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.Signature; -import org.aspectj.lang.annotation.AfterReturning; -import org.aspectj.lang.annotation.AfterThrowing; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.http.HttpServletRequest; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.lang.reflect.Method; -/** - * [ 操作日志记录处理,对所有OperateLog注解的Controller进行操作日志监控 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Slf4j -@Aspect -@Component -public class SmartOperateLogAspect { - - @Autowired - private LogService logService; - - @Pointcut("execution(* net.lab1024.smartadmin.module..*Controller.*(..)))") - public void logPointCut() { - } - - @AfterReturning(pointcut = "logPointCut()") - public void doAfterReturning(JoinPoint joinPoint) { - handleLog(joinPoint, null); - } - - @AfterThrowing(value = "logPointCut()", throwing = "e") - public void doAfterThrowing(JoinPoint joinPoint, Exception e) { - handleLog(joinPoint, e); - } - - protected void handleLog(final JoinPoint joinPoint, final Exception e) { - try { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - OperateLog operateLog = this.getAnnotationLog(joinPoint); - if (operateLog == null) { - return; - } - RequestTokenBO requestToken = SmartRequestTokenUtil.getRequestUser(); - if (requestToken == null) { - return; - } - // 设置方法名称 - String className = joinPoint.getTarget().getClass().getName(); - String methodName = joinPoint.getSignature().getName(); - String operateMethod = className + "." + methodName; - Object[] args = joinPoint.getArgs(); - StringBuilder sb = new StringBuilder(); - for (Object obj : args) { - sb.append(obj.getClass().getSimpleName()); - sb.append("["); - sb.append(JSON.toJSONString(obj)); - sb.append("]"); - } - String params = sb.toString(); - String failReason = null; - Integer result = JudgeEnum.YES.getValue(); - if (e != null) { - result = JudgeEnum.NO.getValue(); - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw, true); - e.printStackTrace(pw); - failReason = sw.toString(); - pw.flush(); - pw.close(); - sw.flush(); - sw.close(); - } - UserOperateLogEntity operateLogEntity = - UserOperateLogEntity.builder().userId(requestToken.getRequestUserId()).userName(requestToken.getEmployeeBO().getActualName()).url(request.getRequestURI()).method(operateMethod).param(params).failReason(failReason).result(result).build(); - ApiOperation apiOperation = this.getApiOperation(joinPoint); - if (apiOperation != null) { - operateLogEntity.setContent(apiOperation.value()); - } - Api api = this.getApi(joinPoint); - if (api != null) { - String[] tags = api.tags(); - operateLogEntity.setModule(SmartStringUtil.join(tags, ",")); - } - logService.addLog(operateLogEntity); - } catch (Exception exp) { - log.error("保存操作日志异常:{}", exp.getMessage()); - exp.printStackTrace(); - } - } - - private OperateLog getAnnotationLog(JoinPoint joinPoint) throws Exception { - Signature signature = joinPoint.getSignature(); - MethodSignature methodSignature = (MethodSignature) signature; - Method method = methodSignature.getMethod(); - OperateLog classAnnotation = AnnotationUtils.findAnnotation(method.getDeclaringClass(), OperateLog.class); - - if (method != null) { - return classAnnotation; - } - return null; - } - - /** - * swagger API - * - * @param joinPoint - * @return - * @throws Exception - */ - private Api getApi(JoinPoint joinPoint) { - Signature signature = joinPoint.getSignature(); - MethodSignature methodSignature = (MethodSignature) signature; - Method method = methodSignature.getMethod(); - Api classAnnotation = AnnotationUtils.findAnnotation(method.getDeclaringClass(), Api.class); - - if (method != null) { - return classAnnotation; - } - return null; - } - - /** - * swagger ApiOperation - * - * @param joinPoint - * @return - * @throws Exception - */ - private ApiOperation getApiOperation(JoinPoint joinPoint) { - Signature signature = joinPoint.getSignature(); - MethodSignature methodSignature = (MethodSignature) signature; - Method method = methodSignature.getMethod(); - - if (method != null) { - return method.getAnnotation(ApiOperation.class); - } - return null; - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/interceptor/SmartAuthenticationInterceptor.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/interceptor/SmartAuthenticationInterceptor.java deleted file mode 100644 index 30f299f9..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/interceptor/SmartAuthenticationInterceptor.java +++ /dev/null @@ -1,158 +0,0 @@ -package net.lab1024.smartadmin.interceptor; - -import com.alibaba.fastjson.JSONObject; -import net.lab1024.smartadmin.common.anno.NoNeedLogin; -import net.lab1024.smartadmin.common.anno.NoValidPrivilege; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.CommonConst; -import net.lab1024.smartadmin.module.system.login.LoginResponseCodeConst; -import net.lab1024.smartadmin.module.system.login.LoginTokenService; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.module.system.privilege.service.PrivilegeEmployeeService; -import net.lab1024.smartadmin.util.SmartRequestTokenUtil; -import net.lab1024.smartadmin.util.SmartStringUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.List; - -/** - * [ 登录拦截器 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Component -public class SmartAuthenticationInterceptor extends HandlerInterceptorAdapter { - - public static final String TOKEN_NAME = "x-access-token"; - - @Value("${access-control-allow-origin}") - private String accessControlAllowOrigin; - - @Autowired - private LoginTokenService loginTokenService; - - @Autowired - private PrivilegeEmployeeService privilegeEmployeeService; - - /** - * 拦截服务器端响应处理ajax请求返回结果 - * - * @param request - * @param response - * @param handler - * @return - * @throws Exception - */ - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - //跨域设置 - this.crossDomainConfig(response); - boolean isHandlerMethod = handler instanceof HandlerMethod; - if (! isHandlerMethod) { - return true; - } - - //不需要登录的注解 - Boolean isNoNeedLogin = ((HandlerMethod) handler).getMethodAnnotation(NoNeedLogin.class) != null; - if (isNoNeedLogin) { - return true; - } - - //放行的Uri前缀 - String uri = request.getRequestURI(); - String contextPath = request.getContextPath(); - String target = uri.replaceFirst(contextPath, ""); - if (CommonConst.CommonCollection.contain(CommonConst.CommonCollection.IGNORE_URL, target)) { - return true; - } - - //需要做token校验, 消息头的token优先于请求query参数的token - String xHeaderToken = request.getHeader(TOKEN_NAME); - String xRequestToken = request.getParameter(TOKEN_NAME); - String xAccessToken = null != xHeaderToken ? xHeaderToken : xRequestToken; - if (null == xAccessToken) { - this.outputResult(response, LoginResponseCodeConst.LOGIN_ERROR); - return false; - } - - //根据token获取登录用户 - RequestTokenBO requestToken = loginTokenService.getEmployeeTokenInfo(xAccessToken); - if (null == requestToken) { - this.outputResult(response, LoginResponseCodeConst.LOGIN_ERROR); - return false; - } - - //判断接口权限 - String methodName = ((HandlerMethod) handler).getMethod().getName(); - String className = ((HandlerMethod) handler).getBeanType().getName(); - List list = SmartStringUtil.splitConvertToList(className, "\\."); - String controllerName = list.get(list.size() - 1); - Method m = ((HandlerMethod) handler).getMethod(); - Class cls = ((HandlerMethod) handler).getBeanType(); - boolean isClzAnnotation = cls.isAnnotationPresent(NoValidPrivilege.class); - boolean isMethodAnnotation = m.isAnnotationPresent(NoValidPrivilege.class); - NoValidPrivilege noValidPrivilege = null; - if (isClzAnnotation) { - noValidPrivilege = cls.getAnnotation(NoValidPrivilege.class); - } else if (isMethodAnnotation) { - noValidPrivilege = m.getAnnotation(NoValidPrivilege.class); - } - //不需验证权限 - if (noValidPrivilege != null) { - SmartRequestTokenUtil.setUser(request, requestToken); - return true; - } - //需要验证权限 - Boolean privilegeValidPass = privilegeEmployeeService.checkEmployeeHavePrivilege(requestToken, controllerName, methodName); - if (! privilegeValidPass) { - this.outputResult(response, LoginResponseCodeConst.NOT_HAVE_PRIVILEGES); - return false; - } - SmartRequestTokenUtil.setUser(request, requestToken); - return true; - } - - /** - * 配置跨域 - * - * @param response - */ - private void crossDomainConfig(HttpServletResponse response) { - response.setHeader("Access-Control-Allow-Origin", accessControlAllowOrigin); - response.setHeader("Access-Control-Allow-Credentials", "true"); - response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH"); - response.setHeader("Access-Control-Expose-Headers", "*"); - response.setHeader("Access-Control-Allow-Headers", "Authentication,Origin, X-Requested-With, Content-Type, " + "Accept, x-access-token"); - response.setHeader("Cache-Control", "no-cache"); - response.setHeader("Pragma", "no-cache"); - response.setHeader("Expires ", "-1"); - } - - /** - * 错误输出 - * - * @param response - * @param responseCodeConst - * @throws IOException - */ - private void outputResult(HttpServletResponse response, LoginResponseCodeConst responseCodeConst) throws IOException { - ResponseDTO wrap = ResponseDTO.wrap(responseCodeConst); - String msg = JSONObject.toJSONString(wrap); - response.setContentType("application/json;charset=UTF-8"); - response.getWriter().write(msg); - response.flushBuffer(); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/listener/SmartAdminStartupRunner.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/listener/SmartAdminStartupRunner.java deleted file mode 100644 index 9205fa5b..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/listener/SmartAdminStartupRunner.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.lab1024.smartadmin.listener; - -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; -import org.springframework.boot.CommandLineRunner; -import org.springframework.stereotype.Component; - -/** - * 应用启动以后检测code码 - * - * @author zhuo - * @version 1.0 - * @since JDK1.8 - */ - -@Component -public class SmartAdminStartupRunner implements CommandLineRunner { - - @Override - public void run(String... args) { - ResponseCodeConst.init(); - } -} \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailController.java deleted file mode 100644 index b7e350bd..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailController.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.lab1024.smartadmin.module.business.email; - -import net.lab1024.smartadmin.common.anno.NoValidPrivilege; -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.business.email.domain.dto.EmailDTO; -import net.lab1024.smartadmin.module.business.email.domain.dto.EmailQueryDTO; -import net.lab1024.smartadmin.module.business.email.domain.dto.EmailVO; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-05-13 17:10:16 - * @since JDK1.8 - */ -@RestController -@OperateLog -@Api(tags = {SwaggerTagConst.Admin.MANAGER_EMAIL}) -public class EmailController { - - @Autowired - private EmailService emailService; - - @ApiOperation(value = "分页查询",notes = "@author yandanyang") - @PostMapping("/email/page/query") - @NoValidPrivilege - public ResponseDTO> queryByPage(@RequestBody @Validated EmailQueryDTO queryDTO) { - return emailService.queryByPage(queryDTO); - } - - @ApiOperation(value = "添加",notes = "@author yandanyang") - @PostMapping("/email/add") - @NoValidPrivilege - public ResponseDTO add(@RequestBody @Valid EmailDTO addTO){ - return emailService.add(addTO); - } - - @ApiOperation(value="修改",notes = "@author yandanyang") - @PostMapping("/email/update") - @NoValidPrivilege - public ResponseDTO update(@RequestBody @Valid EmailDTO updateDTO){ - return emailService.update(updateDTO); - } - - - @ApiOperation(value="删除",notes = "@author yandanyang") - @GetMapping("/email/delete/{id}") - @NoValidPrivilege - public ResponseDTO delete(@PathVariable("id") Long id){ - return emailService.delete(id); - } - - - @ApiOperation(value="详情",notes = "@author yandanyang") - @GetMapping("/email/detail/{id}") - @NoValidPrivilege - public ResponseDTO detail(@PathVariable("id") Long id){ - return emailService.detail(id); - } - - - @ApiOperation(value="发送",notes = "@author yandanyang") - @GetMapping("/email/send/{id}") - @NoValidPrivilege - public ResponseDTO send(@PathVariable("id") Long id){ - return emailService.send(id); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailSendStatusEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailSendStatusEnum.java deleted file mode 100644 index a6cf0c44..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailSendStatusEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.lab1024.smartadmin.module.business.email; - - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/28 0028 下午 15:37 - * @since JDK1.8 - */ -public enum EmailSendStatusEnum { - - NOT_SEND(0,"未发送"), - - SEND(1,"已发送"); - - private Integer type; - private String desc; - - EmailSendStatusEnum(Integer type, String desc) { - this.type = type; - this.desc = desc; - } - - public Integer getType() { - return type; - } - - public String getDesc() { - return desc; - } - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailService.java deleted file mode 100644 index 6b7e5b7d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/EmailService.java +++ /dev/null @@ -1,122 +0,0 @@ -package net.lab1024.smartadmin.module.business.email; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.business.email.domain.dto.EmailConfigDTO; -import net.lab1024.smartadmin.module.business.email.domain.dto.EmailDTO; -import net.lab1024.smartadmin.module.business.email.domain.dto.EmailQueryDTO; -import net.lab1024.smartadmin.module.business.email.domain.dto.EmailVO; -import net.lab1024.smartadmin.module.business.email.domain.entity.EmailEntity; -import net.lab1024.smartadmin.module.system.systemconfig.SystemConfigService; -import net.lab1024.smartadmin.module.system.systemconfig.constant.SystemConfigEnum; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartPageUtil; -import net.lab1024.smartadmin.util.SmartSendMailUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-05-13 17:10:16 - * @since JDK1.8 - */ -@Service -public class EmailService { - - @Autowired - private EmailDao emailDao; - - @Autowired - private SystemConfigService systemConfigService; - - /** - * @author yandanyang - * @description 分页查询 - * @date 2019-05-13 17:10:16 - */ - public ResponseDTO> queryByPage(EmailQueryDTO queryDTO) { - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - List entities = emailDao.queryByPage(page, queryDTO); - List dtoList = SmartBeanUtil.copyList(entities, EmailVO.class); - page.setRecords(dtoList); - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page); - return ResponseDTO.succData(pageResultDTO); - } - - /** - * @author yandanyang - * @description 添加 - * @date 2019-05-13 17:10:16 - */ - public ResponseDTO add(EmailDTO addDTO) { - EmailEntity entity = SmartBeanUtil.copy(addDTO, EmailEntity.class); - emailDao.insert(entity); - return ResponseDTO.succData(entity.getId()); - } - - /** - * @author yandanyang - * @description 编辑 - * @date 2019-05-13 17:10:16 - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO update(EmailDTO updateDTO) { - EmailEntity entity = SmartBeanUtil.copy(updateDTO, EmailEntity.class); - emailDao.updateById(entity); - return ResponseDTO.succData(entity.getId()); - } - - /** - * @author yandanyang - * @description 删除 - * @date 2019-05-13 17:10:16 - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO delete(Long id) { - emailDao.deleteById(id); - return ResponseDTO.succ(); - } - - /** - * @author yandanyang - * @description 根据ID查询 - * @date 2019-05-13 17:10:16 - */ - public ResponseDTO detail(Long id) { - EmailEntity entity = emailDao.selectById(id); - EmailVO dto = SmartBeanUtil.copy(entity, EmailVO.class); - return ResponseDTO.succData(dto); - } - - /** - * 发送某个已创建的邮件 - * - * @param id - * @return - */ - public ResponseDTO send(Long id) { - EmailEntity entity = emailDao.selectById(id); - EmailConfigDTO emailConfig = systemConfigService.selectByKey2Obj(SystemConfigEnum.Key.EMAIL_CONFIG.name(), EmailConfigDTO.class); - String toEmails = entity.getToEmails(); - if (StringUtils.isEmpty(toEmails)) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "收件人信息为空"); - } - String[] emails = toEmails.split(";"); - SmartSendMailUtil.sendMail(emailConfig.getUsername(), emailConfig.getPassword(), emailConfig.getUsername(), emails, "", emailConfig.getSmtpHost(), entity.getTitle(), entity.getContent()); - entity.setSendStatus(EmailSendStatusEnum.SEND.getType()); - emailDao.updateById(entity); - return ResponseDTO.succ(); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailConfigDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailConfigDTO.java deleted file mode 100644 index 87f0e413..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailConfigDTO.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.lab1024.smartadmin.module.business.email.domain.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/13 0013 下午 16:52 - * @since JDK1.8 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class EmailConfigDTO { - - private String smtpHost; - - private String username; - - private String password; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailDTO.java deleted file mode 100644 index 8300a3f5..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailDTO.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.lab1024.smartadmin.module.business.email.domain.dto; -import lombok.Data; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 12:27 - * @since JDK1.8 - */ -@Data -public class EmailDTO { - - @ApiModelProperty("主键") - private Long id; - - @ApiModelProperty("标题") - private String title; - - @ApiModelProperty("收件人") - private String toEmails; - - @ApiModelProperty("发送状态 0未发送 1已发送") - private Integer sendStatus; - - @ApiModelProperty("邮件内容") - private String content; - - @ApiModelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date createTime; - - @ApiModelProperty("更新时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date updateTime; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailQueryDTO.java deleted file mode 100644 index 6768dc4f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailQueryDTO.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.lab1024.smartadmin.module.business.email.domain.dto; - -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-05-13 17:10:16 - * @since JDK1.8 - */ -@Data -public class EmailQueryDTO extends PageParamDTO { - - - @ApiModelProperty("开始日期") - private String startDate; - - @ApiModelProperty("结束日期") - private String endDate; - - - @ApiModelProperty("标题") - private String title; - - - @ApiModelProperty("发送状态 0未发送 1已发送") - private Integer sendStatus; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailVO.java deleted file mode 100644 index 4686efad..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/dto/EmailVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lab1024.smartadmin.module.business.email.domain.dto; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 12:27 - * @since JDK1.8 - */ -@Data -public class EmailVO { - - @ApiModelProperty("主键") - private Long id; - - @ApiModelProperty("标题") - private String title; - - @ApiModelProperty("收件人") - private String toEmails; - - @ApiModelProperty("发送状态 0未发送 1已发送") - private Integer sendStatus; - - @ApiModelProperty("邮件内容") - private String content; - - @ApiModelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date createTime; - - @ApiModelProperty("更新时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date updateTime; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/entity/EmailEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/entity/EmailEntity.java deleted file mode 100644 index d7c0da18..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/email/domain/entity/EmailEntity.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.lab1024.smartadmin.module.business.email.domain.entity; -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019-05-13 17:10:16 - * @since JDK1.8 - */ -@Data -@TableName("t_email") -public class EmailEntity extends BaseEntity { - - /** - * 标题 - */ - private String title; - - /** - * 收件人 - */ - private String toEmails; - - /** - * 发送状态 0未发送 1已发送 - */ - private Integer sendStatus; - - /** - * 邮件内容 - */ - private String content; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/LogService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/LogService.java deleted file mode 100644 index 9aae836c..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/LogService.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.lab1024.smartadmin.module.business.log; - -import net.lab1024.smartadmin.module.business.log.orderoperatelog.OrderOperateLogDao; -import net.lab1024.smartadmin.module.business.log.orderoperatelog.domain.entity.OrderOperateLogEntity; -import net.lab1024.smartadmin.module.business.log.userloginlog.UserLoginLogDao; -import net.lab1024.smartadmin.module.business.log.userloginlog.domain.UserLoginLogEntity; -import net.lab1024.smartadmin.module.business.log.useroperatelog.UserOperateLogDao; -import net.lab1024.smartadmin.module.business.log.useroperatelog.domain.UserOperateLogEntity; -import net.lab1024.smartadmin.util.SmartThreadFactory; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/4 0004 下午 16:19 - * @since JDK1.8 - */ -@Slf4j -@Service -public class LogService { - - private ThreadPoolExecutor threadPoolExecutor; - - @Autowired - private UserLoginLogDao userLoginLogDao; - - @Autowired - private OrderOperateLogDao orderOperateLogDao; - - @Autowired - private UserOperateLogDao userOperateLogDao; - - @PostConstruct - void init() { - if (threadPoolExecutor == null) { - threadPoolExecutor = new ThreadPoolExecutor(1, 1, 10L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(2000), SmartThreadFactory.create("LogAspect")); - } - } - - @PreDestroy - void destroy() { - if (threadPoolExecutor != null) { - threadPoolExecutor.shutdown(); - threadPoolExecutor = null; - } - } - - public void addLog(Object object) { - try { - if (object instanceof UserLoginLogEntity) { - threadPoolExecutor.execute(() -> userLoginLogDao.insert((UserLoginLogEntity) object)); - } - if (object instanceof OrderOperateLogEntity) { - threadPoolExecutor.execute(() -> orderOperateLogDao.insert((OrderOperateLogEntity) object)); - } - if (object instanceof UserOperateLogEntity) { - threadPoolExecutor.execute(() -> userOperateLogDao.insert((UserOperateLogEntity) object)); - } - } catch (Throwable e) { - log.error("userLogAfterAdvice:{}", e); - } - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogController.java deleted file mode 100644 index 5f84c7ab..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogController.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.orderoperatelog; - -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.business.log.orderoperatelog.constant.OrderOperateLogOrderTypeEnum; -import net.lab1024.smartadmin.module.business.log.orderoperatelog.domain.vo.OrderOperateLogVO; -import net.lab1024.smartadmin.util.SmartStringUtil; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 单据操作记录Controller - * - * @author lidoudou - * @date: 2018/1/31 16:56 - */ - -@Api(tags = {SwaggerTagConst.Admin.MANAGER_ORDER_OPERATE_LOG}) -@OperateLog -@RestController -public class OrderOperateLogController { - - @Autowired - private OrderOperateLogService orderOperateLogService; - - @ApiOperation(value = "查询单据操作日志", notes = "查询单据操作日志") - @GetMapping("/orderOperateLog/list/{orderId}") - @ApiImplicitParams({@ApiImplicitParam(name = "orderId", value = "业务id", paramType = "path"), @ApiImplicitParam(name = "orderType", value = "业务类型" + OrderOperateLogOrderTypeEnum.INFO, paramType - = "query")}) - public ResponseDTO> list(@PathVariable Long orderId, String orderType) { - List orderTypeList = SmartStringUtil.splitConverToIntSet(orderType, ",").stream().collect(Collectors.toList()); - return orderOperateLogService.listOrderOperateLogsByOrderTypeAndOrderId(orderId, orderTypeList); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogDao.java deleted file mode 100644 index a720f5c5..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogDao.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.orderoperatelog; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import net.lab1024.smartadmin.module.business.log.orderoperatelog.domain.entity.OrderOperateLogEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - *

- * 各种单据操作记录 - * Mapper 接口 - *

- * - * @author anders - * @since 2018-01-09 - */ -@Mapper -@Component -public interface OrderOperateLogDao extends BaseMapper { - - List listOrderOperateLogsByOrderTypeAndOrderId(@Param("orderId") Long orderId, @Param("orderTypeList") List orderTypeList); - - List listOrderOperateLogsByOrderTypeAndOrderIds(@Param("orderIds") List orderIds, @Param("orderTypeList") List orderTypeList); - - void batchInsert(List list); - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogService.java deleted file mode 100644 index 601b8cef..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/OrderOperateLogService.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.orderoperatelog; - -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.business.log.orderoperatelog.domain.dto.OrderOperateLogSaveDTO; -import net.lab1024.smartadmin.module.business.log.orderoperatelog.domain.entity.OrderOperateLogEntity; -import net.lab1024.smartadmin.module.business.log.orderoperatelog.domain.vo.OrderOperateLogVO; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartStringUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; - -/** - *

- * 各种单据操作记录 - * 服务实现类 - *

- * - * @author anders - * @since 2018-01-09 - */ -@Service -public class OrderOperateLogService { - - @Autowired - private OrderOperateLogDao orderOperateLogDao; - - public void batchSaveOrderOperateLog(List orderOperateLogSaveDTOList) { - List entityList = new ArrayList<>(); - orderOperateLogSaveDTOList.forEach(e -> { - OrderOperateLogEntity orderOperateLogEntity = SmartBeanUtil.copy(e, OrderOperateLogEntity.class); - orderOperateLogEntity.setOperateType(e.getOperateType().getCode()); - if (SmartStringUtil.isNotBlank(e.getOperateContent())) { - orderOperateLogEntity.setOperateContent(e.getOperateContent()); - } else { - orderOperateLogEntity.setOperateContent(e.getOperateType().getMsg()); - } - orderOperateLogEntity.setOperateRemark(e.getOperateRemark()); - orderOperateLogEntity.setExtData(e.getExtData()); - orderOperateLogEntity.setCreateTime(new Date()); - orderOperateLogEntity.setOrderType(e.getOrderType().getType()); - entityList.add(orderOperateLogEntity); - }); - //批量添加 - orderOperateLogDao.batchInsert(entityList); - } - - public ResponseDTO> listOrderOperateLogsByOrderTypeAndOrderId(Long orderId, List orderTypeList) { - List orderOperateLogEntities = orderOperateLogDao.listOrderOperateLogsByOrderTypeAndOrderId(orderId, orderTypeList); - List dtoList = orderOperateLogEntities.stream().map(e -> SmartBeanUtil.copy(e, OrderOperateLogVO.class)).collect(Collectors.toList()); - return ResponseDTO.succData(dtoList); - } - - public ResponseDTO> listOrderOperateLogsByOrderTypeAndOrderIds(List orderIds, List orderTypeList) { - List orderOperateLogEntities = orderOperateLogDao.listOrderOperateLogsByOrderTypeAndOrderIds(orderIds, orderTypeList); - List dtoList = orderOperateLogEntities.stream().map(e -> SmartBeanUtil.copy(e, OrderOperateLogVO.class)).collect(Collectors.toList()); - return ResponseDTO.succData(dtoList); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogDefaultEmpEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogDefaultEmpEnum.java deleted file mode 100644 index c088322d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogDefaultEmpEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.orderoperatelog.constant; - -/** - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -public enum OrderOperateLogDefaultEmpEnum { - - DEFAULT_EMP(0,"系统"); - - - private Integer empId; - - private String empName; - - OrderOperateLogDefaultEmpEnum(Integer empId,String empName) { - this.empId = empId; - this.empName = empName; - } - - public int getEmpId() { - return empId; - } - - public String getEmpName() { - return empName; - } - - - -} - diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogOperateTypeConst.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogOperateTypeConst.java deleted file mode 100644 index d5d14b63..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogOperateTypeConst.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.orderoperatelog.constant; - -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; - -/** - * [ 8001 -8999 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -public class OrderOperateLogOperateTypeConst extends ResponseCodeConst { - - - public static final OrderOperateLogOperateTypeConst ADD = new OrderOperateLogOperateTypeConst(8001, "创建并提交"); - - public static final OrderOperateLogOperateTypeConst UPDATE = new OrderOperateLogOperateTypeConst(8002, "修改并提交"); - - public static final OrderOperateLogOperateTypeConst DELETE = new OrderOperateLogOperateTypeConst(8003, "删除"); - - - private OrderOperateLogOperateTypeConst(int code, String msg) { - super(code, msg); - } - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogOrderTypeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogOrderTypeEnum.java deleted file mode 100644 index 9674836e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/constant/OrderOperateLogOrderTypeEnum.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.orderoperatelog.constant; - -import java.util.Arrays; -import java.util.Optional; - -/** - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -public enum OrderOperateLogOrderTypeEnum { - - EXAMPLE(1, "样例"); - - - public static final String INFO = ""; - - private int type; - - private String typeName; - - OrderOperateLogOrderTypeEnum(int type, String typeName) { - this.type = type; - this.typeName = typeName; - } - - public int getType() { - return type; - } - - public String getTypeName() { - return typeName; - } - - public static OrderOperateLogOrderTypeEnum getValueByName(String name) { - OrderOperateLogOrderTypeEnum[] values = OrderOperateLogOrderTypeEnum.values(); - Optional first = Arrays.stream(values).filter(e -> e.getTypeName().equals(name)).findFirst(); - if (!first.isPresent()) { - return null; - } - if (!first.isPresent()) { - return null; - } - OrderOperateLogOrderTypeEnum orderType = first.get(); - return orderType; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/dto/OrderOperateLogSaveDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/dto/OrderOperateLogSaveDTO.java deleted file mode 100644 index a9861bdc..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/dto/OrderOperateLogSaveDTO.java +++ /dev/null @@ -1,80 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.orderoperatelog.domain.dto; - - -import net.lab1024.smartadmin.module.business.log.orderoperatelog.constant.OrderOperateLogOperateTypeConst; -import net.lab1024.smartadmin.module.business.log.orderoperatelog.constant.OrderOperateLogOrderTypeEnum; -import lombok.Data; - -/** - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Data -public class OrderOperateLogSaveDTO { - - /** - * 各种单据的id - */ - private Long orderId; - - /** - * 单据类型 - */ - private OrderOperateLogOrderTypeEnum orderType; - - /** - * 操作类型 - */ - private OrderOperateLogOperateTypeConst operateType; - - /** - *操作类型 对应的中文 - */ - private String operateContent; - - /** - * 操作备注 - */ - private String operateRemark; - - /** - * 员工id - */ - private Long employeeId; - - /** - * 员工名称 - */ - private String employeeName; - - /** - * 额外信息 - */ - private String extData; - - public OrderOperateLogSaveDTO() { - } - - public OrderOperateLogSaveDTO(Long orderId, OrderOperateLogOrderTypeEnum orderType, OrderOperateLogOperateTypeConst operateType, String - operateRemark, Long employeeId, String employeeName, String extData) { - this.orderId = orderId; - this.orderType = orderType; - this.operateType = operateType; - this.operateRemark = operateRemark; - this.employeeId = employeeId; - this.employeeName = employeeName; - this.extData = extData; - } - - @Override - public String toString() { - return "OrderOperateLogSaveDTO{" + "orderId=" + orderId + ", orderType=" + orderType + ", operateType=" + operateType + ", operateRemark='" - + operateRemark + '\'' + ", employeeId=" + employeeId + ", employeeName='" + employeeName + '\'' + ", extData='" + extData + '\'' + '}'; - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/dto/SupplierOrderOperateVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/dto/SupplierOrderOperateVO.java deleted file mode 100644 index 9633527f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/dto/SupplierOrderOperateVO.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.orderoperatelog.domain.dto; - -import lombok.Data; - -import java.math.BigDecimal; -import java.util.Date; - -/** - * 预存款申请/提取单流水临时文件 - * @author zzr - */ -@Data -public class SupplierOrderOperateVO { - - /** - * 流水类型 - */ - private Integer tradingType; - - /** - * 总重 - */ - private BigDecimal totalWeight; - - /** - * 金额 - */ - private BigDecimal amount; - - /** - * 操作人名称 - */ - private String buyerName; - - /** - * 备注 - */ - private String remark; - - /** - * 创建时间 - */ - private Date createTime; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/entity/OrderOperateLogEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/entity/OrderOperateLogEntity.java deleted file mode 100644 index 8f61f3ec..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/entity/OrderOperateLogEntity.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.orderoperatelog.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Builder; -import lombok.Data; - -/** - *

- * 各种单据操作记录 - * - *

- * - * @author anders - * @since 2018-01-09 - */ - -@Data -@Builder -@TableName("t_order_operate_log") -public class OrderOperateLogEntity extends BaseEntity { - - /** - * 各种单据的id - */ - private Long orderId; - /** - * 单据类型 - */ - private Integer orderType; - /** - * 操作类型 - */ - private Integer operateType; - /** - * 操作类型 对应的中文 - */ - private String operateContent; - /** - * 操作备注 - */ - private String operateRemark; - /** - * 员工id - */ - private Long employeeId; - /** - * 员工名称 - */ - private String employeeName; - /** - * 额外信息 - */ - private String extData; - - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/vo/OrderOperateLogVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/vo/OrderOperateLogVO.java deleted file mode 100644 index ab565691..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/orderoperatelog/domain/vo/OrderOperateLogVO.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.orderoperatelog.domain.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * @author bhr - * @Description: 操作日志 - * @date 2019/8/28 9:31 - */ -@Data -public class OrderOperateLogVO { - - private Long id; - /** - * 各种单据的id - */ - @ApiModelProperty("各种单据的id") - private Long orderId; - /** - * 单据类型 - */ - @ApiModelProperty("单据类型") - private Integer orderType; - /** - * 操作类型 - */ - @ApiModelProperty("操作类型") - private Integer operateType; - /** - * 操作类型 对应的中文 - */ - @ApiModelProperty("操作类型 对应的中文") - private String operateContent; - /** - * 操作备注 - */ - @ApiModelProperty("操作备注") - private String operateRemark; - @ApiModelProperty("操作备注,包含审批人名使用别名显示") - private String operateSecondRemark; - /** - * 员工id - */ - @ApiModelProperty("员工id") - private Long employeeId; - /** - * 员工名称 - */ - @ApiModelProperty("员工名称") - private String employeeName; - /** - * 员工名称 - */ - @ApiModelProperty("员工别名") - private String employeeSecondName; - /** - * 额外信息 - */ - @ApiModelProperty("额外信息") - private String extData; - /** - * 创建时间 - */ - @ApiModelProperty("创建时间") - private Date createTime; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogController.java deleted file mode 100644 index eccf2e69..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogController.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.userloginlog; - -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeQueryDTO; -import net.lab1024.smartadmin.module.system.employee.domain.vo.EmployeeVO; -import net.lab1024.smartadmin.module.business.log.userloginlog.domain.UserLoginLogDTO; -import net.lab1024.smartadmin.module.business.log.userloginlog.domain.UserLoginLogQueryDTO; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - * [ 用户登录日志 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-05-15 10:25:21 - * @since JDK1.8 - */ -@RestController -@Api(tags = {SwaggerTagConst.Admin.MANAGER_USER_LOGIN_LOG}) -@OperateLog -public class UserLoginLogController { - - @Autowired - private UserLoginLogService userLoginLogService; - - @ApiOperation(value = "分页查询用户登录日志", notes = "@author yandanyang") - @PostMapping("/userLoginLog/page/query") - public ResponseDTO> queryByPage(@RequestBody UserLoginLogQueryDTO queryDTO) { - return userLoginLogService.queryByPage(queryDTO); - } - - @ApiOperation(value = "删除用户登录日志", notes = "@author yandanyang") - @GetMapping("/userLoginLog/delete/{id}") - public ResponseDTO delete(@PathVariable("id") Long id) { - return userLoginLogService.delete(id); - } - - @ApiOperation(value = "查询员工在线状态", notes = "@author zzr") - @PostMapping("/userOnLine/query") - public ResponseDTO> queryUserOnLine(@RequestBody @Valid EmployeeQueryDTO queryDTO) { - return userLoginLogService.queryUserOnLine(queryDTO); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogDao.java deleted file mode 100644 index ab585690..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogDao.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.userloginlog; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.module.business.log.userloginlog.domain.UserLoginLogQueryDTO; -import net.lab1024.smartadmin.module.business.log.userloginlog.domain.UserLoginLogEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * [ 用户登录日志 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019-05-15 10:25:21 - * @since JDK1.8 - */ -@Mapper -@Component -public interface UserLoginLogDao extends BaseMapper { - - /** - * 分页查询 - * @param queryDTO - * @return UserLoginLogEntity - */ - List queryByPage(Page page, @Param("queryDTO") UserLoginLogQueryDTO queryDTO); - - /** - * 根据id删除 - * @param id - * @return - */ - void deleteById(@Param("id") Long id); - - /** - * 批量删除 - * @param idList - * @return - */ - void deleteByIds(@Param("idList") List idList); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogService.java deleted file mode 100644 index 0d096fe3..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/UserLoginLogService.java +++ /dev/null @@ -1,82 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.userloginlog; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.system.employee.EmployeeService; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeQueryDTO; -import net.lab1024.smartadmin.module.system.employee.domain.vo.EmployeeVO; -import net.lab1024.smartadmin.module.business.log.userloginlog.domain.UserLoginLogDTO; -import net.lab1024.smartadmin.module.business.log.userloginlog.domain.UserLoginLogEntity; -import net.lab1024.smartadmin.module.business.log.userloginlog.domain.UserLoginLogQueryDTO; -import net.lab1024.smartadmin.module.support.websocket.WebSocketServer; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartPageUtil; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * [ 用户登录日志 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-05-15 10:25:21 - * @since JDK1.8 - */ -@Service -public class UserLoginLogService { - - @Autowired - private UserLoginLogDao userLoginLogDao; - - @Autowired - private EmployeeService employeeService; - - /** - * @author yandanyang - * @description 分页查询 - * @date 2019-05-15 10:25:21 - */ - public ResponseDTO> queryByPage(UserLoginLogQueryDTO queryDTO) { - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - List entities = userLoginLogDao.queryByPage(page, queryDTO); - List dtoList = SmartBeanUtil.copyList(entities, UserLoginLogDTO.class); - page.setRecords(dtoList); - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page); - return ResponseDTO.succData(pageResultDTO); - } - - /** - * @author yandanyang - * @description 删除 - * @date 2019-05-15 10:25:21 - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO delete(Long id) { - userLoginLogDao.deleteById(id); - return ResponseDTO.succ(); - } - - /** - * 查询员工在线状态 - * - * @param queryDTO - * @return - */ - public ResponseDTO> queryUserOnLine(EmployeeQueryDTO queryDTO) { - List onLineUserList = WebSocketServer.getOnLineUserList(); - if (CollectionUtils.isEmpty(onLineUserList)) { - return ResponseDTO.succ(); - } - queryDTO.setEmployeeIds(onLineUserList); - ResponseDTO> employeeList = employeeService.selectEmployeeList(queryDTO); - return employeeList; - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogDTO.java deleted file mode 100644 index efeb14de..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogDTO.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.userloginlog.domain; -import lombok.Data; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; - -/** - * [ 用户登录日志 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 12:27 - * @since JDK1.8 - */ -@Data -public class UserLoginLogDTO { - - @ApiModelProperty("主键") - private Long id; - - @ApiModelProperty("员工id") - private Long userId; - - @ApiModelProperty("用户名") - private String userName; - - @ApiModelProperty("用户ip") - private String remoteIp; - - @ApiModelProperty("用户端口") - private Integer remotePort; - - @ApiModelProperty("浏览器") - private String remoteBrowser; - - @ApiModelProperty("操作系统") - private String remoteOs; - - @ApiModelProperty("登录状态") - private Integer loginStatus; - - @ApiModelProperty("更新时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date updateTime; - - @ApiModelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date createTime; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogEntity.java deleted file mode 100644 index b0d02ac9..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogEntity.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.userloginlog.domain; -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.*; - - -/** - * [ 用户登录日志] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019-05-15 10:25:21 - * @since JDK1.8 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -@TableName("t_user_login_log") -public class UserLoginLogEntity extends BaseEntity { - - /** - * 员工id - */ - private Long userId; - - /** - * 用户名 - */ - private String userName; - /** - * 用户ip - */ - private String remoteIp; - - /** - * 用户端口 - */ - private Integer remotePort; - - /** - * 浏览器 - */ - private String remoteBrowser; - - /** - * 操作系统 - */ - private String remoteOs; - - /** - * 登录状态 - */ - private Integer loginStatus; - - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogQueryDTO.java deleted file mode 100644 index 726797cc..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/userloginlog/domain/UserLoginLogQueryDTO.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.userloginlog.domain; - -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * [ 用户登录日志 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-05-15 10:25:21 - * @since JDK1.8 - */ -@Data -public class UserLoginLogQueryDTO extends PageParamDTO { - - - @ApiModelProperty("开始日期") - private String startDate; - - @ApiModelProperty("结束日期") - private String endDate; - - - @ApiModelProperty("用户名") - private String userName; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogController.java deleted file mode 100644 index e1c2d775..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogController.java +++ /dev/null @@ -1,50 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.useroperatelog; - -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.business.log.useroperatelog.domain.UserOperateLogDTO; -import net.lab1024.smartadmin.module.business.log.useroperatelog.domain.UserOperateLogQueryDTO; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-05-15 11:32:14 - * @since JDK1.8 - */ -@RestController -@Api(tags = {SwaggerTagConst.Admin.MANAGER_USER_OPERATE_LOG}) -@OperateLog -public class UserOperateLogController { - - @Autowired - private UserOperateLogService userOperateLogService; - - @ApiOperation(value = "分页查询",notes = "@author yandanyang") - @PostMapping("/userOperateLog/page/query") - public ResponseDTO> queryByPage(@RequestBody UserOperateLogQueryDTO queryDTO) { - return userOperateLogService.queryByPage(queryDTO); - } - - @ApiOperation(value="删除",notes = "@author yandanyang") - @GetMapping("/userOperateLog/delete/{id}") - public ResponseDTO delete(@PathVariable("id") Long id){ - return userOperateLogService.delete(id); - } - - - @ApiOperation(value="详情",notes = "@author yandanyang") - @GetMapping("/userOperateLog/detail/{id}") - public ResponseDTO detail(@PathVariable("id") Long id){ - return userOperateLogService.detail(id); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogDao.java deleted file mode 100644 index 8959bbed..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogDao.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.useroperatelog; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.module.business.log.useroperatelog.domain.UserOperateLogQueryDTO; -import net.lab1024.smartadmin.module.business.log.useroperatelog.domain.UserOperateLogEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019-05-15 11:32:14 - * @since JDK1.8 - */ -@Mapper -@Component -public interface UserOperateLogDao extends BaseMapper { - - /** - * 分页查询 - * @param queryDTO - * @return UserOperateLogEntity - */ - List queryByPage(Page page, @Param("queryDTO") UserOperateLogQueryDTO queryDTO); - - /** - * 根据id删除 - * @param id - * @return - */ - void deleteById(@Param("id") Long id); - - /** - * 批量删除 - * @param idList - * @return - */ - void deleteByIds(@Param("idList") List idList); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogService.java deleted file mode 100644 index 772504ce..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/log/useroperatelog/UserOperateLogService.java +++ /dev/null @@ -1,91 +0,0 @@ -package net.lab1024.smartadmin.module.business.log.useroperatelog; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.business.log.useroperatelog.domain.UserOperateLogDTO; -import net.lab1024.smartadmin.module.business.log.useroperatelog.domain.UserOperateLogEntity; -import net.lab1024.smartadmin.module.business.log.useroperatelog.domain.UserOperateLogQueryDTO; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartPageUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-05-15 11:32:14 - * @since JDK1.8 - */ -@Service -public class UserOperateLogService { - - @Autowired - private UserOperateLogDao userOperateLogDao; - - /** - * @author yandanyang - * @description 分页查询 - * @date 2019-05-15 11:32:14 - */ - public ResponseDTO> queryByPage(UserOperateLogQueryDTO queryDTO) { - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - List entities = userOperateLogDao.queryByPage(page, queryDTO); - List dtoList = SmartBeanUtil.copyList(entities, UserOperateLogDTO.class); - page.setRecords(dtoList); - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page); - return ResponseDTO.succData(pageResultDTO); - } - - /** - * @author yandanyang - * @description 添加 - * @date 2019-05-15 11:32:14 - */ - public ResponseDTO add(UserOperateLogDTO addDTO) { - UserOperateLogEntity entity = SmartBeanUtil.copy(addDTO, UserOperateLogEntity.class); - userOperateLogDao.insert(entity); - return ResponseDTO.succ(); - } - - /** - * @author yandanyang - * @description 编辑 - * @date 2019-05-15 11:32:14 - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO update(UserOperateLogDTO updateDTO) { - UserOperateLogEntity entity = SmartBeanUtil.copy(updateDTO, UserOperateLogEntity.class); - userOperateLogDao.updateById(entity); - return ResponseDTO.succ(); - } - - /** - * @author yandanyang - * @description 删除 - * @date 2019-05-15 11:32:14 - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO delete(Long id) { - userOperateLogDao.deleteById(id); - return ResponseDTO.succ(); - } - - /** - * @author yandanyang - * @description 根据ID查询 - * @date 2019-05-15 11:32:14 - */ - public ResponseDTO detail(Long id) { - UserOperateLogEntity entity = userOperateLogDao.selectById(id); - UserOperateLogDTO dto = SmartBeanUtil.copy(entity, UserOperateLogDTO.class); - return ResponseDTO.succData(dto); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/NoticeManage.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/NoticeManage.java deleted file mode 100644 index 7f65e416..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/NoticeManage.java +++ /dev/null @@ -1,97 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice; - -import net.lab1024.smartadmin.common.constant.JudgeEnum; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.module.business.notice.dao.NoticeDao; -import net.lab1024.smartadmin.module.business.notice.dao.NoticeReceiveRecordDao; -import net.lab1024.smartadmin.module.business.notice.domain.dto.NoticeUpdateDTO; -import net.lab1024.smartadmin.module.business.notice.domain.entity.NoticeEntity; -import net.lab1024.smartadmin.module.business.notice.domain.entity.NoticeReceiveRecordEntity; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.Date; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/13 0013 下午 17:33 - * @since JDK1.8 - */ -@Service -public class NoticeManage { - - @Autowired - private NoticeDao noticeDao; - @Autowired - private NoticeReceiveRecordDao noticeReceiveRecordDao; - - /** - * 发送消息 - * @param entity - * @param requestToken - */ - @Transactional(rollbackFor = Exception.class) - public void send(NoticeEntity entity, RequestTokenBO requestToken){ - - entity.setSendStatus(JudgeEnum.YES.getValue()); - noticeDao.updateById(entity); - //默认发件人 已读此消息 - NoticeReceiveRecordEntity recordEntity = new NoticeReceiveRecordEntity(); - recordEntity.setEmployeeId(requestToken.getRequestUserId()); - recordEntity.setNoticeId(entity.getId()); - recordEntity.setCreateTime(new Date()); - recordEntity.setUpdateTime(new Date()); - noticeReceiveRecordDao.insert(recordEntity); - } - - - /** - * 保存读取记录 - * @param noticeId - * @param requestToken - */ - public void saveReadRecord(Long noticeId, RequestTokenBO requestToken){ - NoticeReceiveRecordEntity recordEntity = new NoticeReceiveRecordEntity(); - recordEntity.setEmployeeId(requestToken.getRequestUserId()); - recordEntity.setNoticeId(noticeId); - recordEntity.setCreateTime(new Date()); - recordEntity.setUpdateTime(new Date()); - noticeReceiveRecordDao.insert(recordEntity); - } - - - /** - * 消息删除 - * @param entity - */ - @Transactional(rollbackFor = Exception.class) - public void delete(NoticeEntity entity) { - if(JudgeEnum.YES.getValue().equals(entity.getSendStatus())){ - //消息已发送 执行逻辑删除 - noticeDao.logicDeleteById(entity.getId(),JudgeEnum.YES.getValue()); - }else{ - //消息未发送 执行真实删除 - noticeDao.deleteById(entity.getId()); - } - } - - /** - * 更新消息 - * @param entity - * @param updateDTO - */ - public void update(NoticeEntity entity,NoticeUpdateDTO updateDTO) { - entity.setTitle(updateDTO.getTitle()); - entity.setContent(updateDTO.getContent()); - entity.setSendStatus(JudgeEnum.NO.getValue()); - entity.setDeleted(JudgeEnum.NO.getValue()); - noticeDao.updateById(entity); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/NoticeService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/NoticeService.java deleted file mode 100644 index 113c285c..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/NoticeService.java +++ /dev/null @@ -1,235 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.constant.JudgeEnum; -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.module.business.notice.dao.NoticeDao; -import net.lab1024.smartadmin.module.business.notice.dao.NoticeReceiveRecordDao; -import net.lab1024.smartadmin.module.business.notice.domain.dto.*; -import net.lab1024.smartadmin.module.business.notice.domain.entity.NoticeEntity; -import net.lab1024.smartadmin.module.business.notice.domain.entity.NoticeReceiveRecordEntity; -import net.lab1024.smartadmin.module.support.websocket.WebSocketServer; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartPageUtil; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-07-11 16:19:48 - * @since JDK1.8 - */ -@Service -public class NoticeService { - - @Autowired - private NoticeDao noticeDao; - - @Autowired - private NoticeReceiveRecordDao noticeReceiveRecordDao; - - @Autowired - private NoticeManage noticeManage; - - /** - * @author yandanyang - * @description 分页查询 - * @date 2019-07-11 16:19:48 - */ - public ResponseDTO> queryByPage(NoticeQueryDTO queryDTO) { - queryDTO.setDeleted(JudgeEnum.NO.getValue()); - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - List dtoList = noticeDao.queryByPage(page, queryDTO); - page.setRecords(dtoList); - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page); - return ResponseDTO.succData(pageResultDTO); - } - - /** - * 获取当前登录人的消息列表 - * - * @param queryDTO - * @param requestToken - * @return - */ - public ResponseDTO> queryReceiveByPage(NoticeReceiveQueryDTO queryDTO, RequestTokenBO requestToken) { - queryDTO.setEmployeeId(requestToken.getRequestUserId()); - queryDTO.setSendStatus(JudgeEnum.YES.getValue()); - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - List dtoList = noticeDao.queryReceiveByPage(page, queryDTO); - dtoList.forEach(e -> { - if (e.getReceiveTime() == null) { - e.setReadStatus(JudgeEnum.NO.getValue()); - } else { - e.setReadStatus(JudgeEnum.YES.getValue()); - } - }); - page.setRecords(dtoList); - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page); - return ResponseDTO.succData(pageResultDTO); - } - - /** - * 获取我的未读消息 - * - * @param queryDTO - * @param requestToken - * @return - */ - public ResponseDTO> queryUnreadByPage(PageParamDTO queryDTO, RequestTokenBO requestToken) { - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - List dtoList = noticeDao.queryUnreadByPage(page, requestToken.getRequestUserId(), JudgeEnum.YES.getValue()); - page.setRecords(dtoList); - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page); - return ResponseDTO.succData(pageResultDTO); - } - - /** - * @author yandanyang - * @description 添加 - * @date 2019-07-11 16:19:48 - */ - public ResponseDTO add(NoticeAddDTO addDTO, RequestTokenBO requestToken) { - NoticeEntity entity = SmartBeanUtil.copy(addDTO, NoticeEntity.class); - entity.setCreateTime(new Date()); - entity.setUpdateTime(new Date()); - entity.setCreateUser(requestToken.getRequestUserId()); - entity.setSendStatus(JudgeEnum.NO.getValue()); - entity.setDeleted(JudgeEnum.NO.getValue()); - noticeDao.insert(entity); - return ResponseDTO.succ(); - } - - /** - * @author yandanyang - * @description 编辑 - * @date 2019-07-11 16:19:48 - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO update(NoticeUpdateDTO updateDTO) { - NoticeEntity entity = noticeDao.selectById(updateDTO.getId()); - if (entity == null) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "此系统通知不存在"); - } - if (JudgeEnum.YES.getValue().equals(entity.getSendStatus())) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "此系统通知已发送无法修改"); - } - noticeManage.update(entity, updateDTO); - return ResponseDTO.succ(); - } - - /** - * @author yandanyang - * @description 删除 - * @date 2019-07-11 16:19:48 - */ - public ResponseDTO delete(Long id) { - NoticeEntity entity = noticeDao.selectById(id); - if (entity == null) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "此系统通知不存在"); - } - noticeManage.delete(entity); - return ResponseDTO.succ(); - } - - /** - * @author yandanyang - * @description 根据ID查询 - * @date 2019-07-11 16:19:48 - */ - public ResponseDTO detail(Long id) { - NoticeDetailVO noticeDTO = noticeDao.detail(id); - return ResponseDTO.succData(noticeDTO); - } - - /** - * 获取某人的未读消息数 - * - * @param employeeId - * @return - */ - private Integer getUnreadCount(Long employeeId) { - return noticeDao.noticeUnreadCount(employeeId, JudgeEnum.YES.getValue()); - } - - /** - * 发送给所有在线用户未读消息数 - * - * @param id - * @param requestToken - * @return - */ - public ResponseDTO send(Long id, RequestTokenBO requestToken) { - NoticeEntity entity = noticeDao.selectById(id); - if (entity == null) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "此系统通知不存在"); - } - noticeManage.send(entity, requestToken); - this.sendMessage(requestToken); - return ResponseDTO.succ(); - } - - /** - * 发送系统通知 ,发送人不进行接收,需再事务外调用 以防止数据隔离级别不同造成未读消息数异常 - * - * @param requestToken - */ - private void sendMessage(RequestTokenBO requestToken) { - List onLineEmployeeIds = WebSocketServer.getOnLineUserList(); - if (CollectionUtils.isEmpty(onLineEmployeeIds)) { - return; - } - //在线用户已读消息数 - Map readCountMap = new HashMap<>(); - List readCountList = noticeDao.readCount(onLineEmployeeIds); - if (CollectionUtils.isNotEmpty(readCountList)) { - readCountMap = readCountList.stream().collect(Collectors.toMap(NoticeReadCountDTO :: getEmployeeId, NoticeReadCountDTO :: getReadCount)); - } - //已发送消息数 - Integer noticeCount = noticeDao.noticeCount(JudgeEnum.YES.getValue()); - for (Long employeeId : onLineEmployeeIds) { - Integer readCount = readCountMap.get(employeeId) == null ? 0 : readCountMap.get(employeeId); - Integer unReadCount = noticeCount - readCount; - if (! requestToken.getRequestUserId().equals(employeeId)) { - WebSocketServer.sendOneOnLineUser(unReadCount.toString(), employeeId); - } - } - } - - /** - * 读取消息 - * - * @param id - * @param requestToken - * @return - */ - public ResponseDTO read(Long id, RequestTokenBO requestToken) { - NoticeDetailVO noticeDTO = noticeDao.detail(id); - - NoticeReceiveRecordEntity recordEntity = noticeReceiveRecordDao.selectByEmployeeAndNotice(requestToken.getRequestUserId(), id); - if (recordEntity != null) { - return ResponseDTO.succData(noticeDTO); - } - noticeManage.saveReadRecord(id, requestToken); - this.sendMessage(requestToken); - return ResponseDTO.succData(noticeDTO); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/dao/NoticeDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/dao/NoticeDao.java deleted file mode 100644 index de7caec5..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/dao/NoticeDao.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice.dao; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.anno.DataScope; -import net.lab1024.smartadmin.module.business.notice.domain.dto.*; -import net.lab1024.smartadmin.module.business.notice.domain.entity.NoticeEntity; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeWhereInTypeEnum; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019-07-11 16:19:48 - * @since JDK1.8 - */ -@Mapper -@Component -public interface NoticeDao extends BaseMapper { - - /** - * 分页查询 - * @param queryDTO - * @return NoticeEntity - */ - @DataScope(joinSql = "n.create_user in (#employeeIds)", whereInType = DataScopeWhereInTypeEnum.EMPLOYEE) - List queryByPage(Page page, @Param("queryDTO") NoticeQueryDTO queryDTO); - - - /** - * 获取某人的未读消息 - * @param page - * @param employeeId - * @return - */ - @DataScope(joinSql = "e.department_id in (#departmentIds)", whereInType = DataScopeWhereInTypeEnum.DEPARTMENT) - List queryUnreadByPage(Page page, @Param("employeeId") Long employeeId, @Param("sendStatus") Integer sendStatus); - - - /** - * 获取 - * @param page - * @param queryDTO - * @return - */ - List queryReceiveByPage(Page page, @Param("queryDTO") NoticeReceiveQueryDTO queryDTO); - - /** - * 详情 - * @param id - * @return - */ - NoticeDetailVO detail(@Param("id") Long id); - - /** - * 根据id删除 逻辑删除 - * @param id - * @param deletedFlag - */ - void logicDeleteById(@Param("id") Long id,@Param("deletedFlag") Integer deletedFlag); - - - - /** - * 批量逻辑删除 - * @param idList - * @param deletedFlag - * @return - */ - void logicDeleteByIds(@Param("idList") List idList,@Param("deletedFlag") Integer deletedFlag); - - /** - * 获取消息总数 - * @return - */ - Integer noticeCount(@Param("sendStatus") Integer sendStatus); - - - /** - * 获取已读消息数 - * @param employeeIds - * @return - */ - List readCount(@Param("employeeIds") List employeeIds); - - - /** - * 获取某人的未读消息数 - * @param employeeId - * @param sendStatus - * @return - */ - Integer noticeUnreadCount(@Param("employeeId") Long employeeId, @Param("sendStatus") Integer sendStatus); - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeDetailVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeDetailVO.java deleted file mode 100644 index 097317cd..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeDetailVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice.domain.dto; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 12:27 - * @since JDK1.8 - */ -@Data -public class NoticeDetailVO extends NoticeVO { - - - @ApiModelProperty("消息内容") - private String content; - - @ApiModelProperty("更新时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date updateTime; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeQueryDTO.java deleted file mode 100644 index b68feb4f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeQueryDTO.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice.domain.dto; - -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date 2019-07-11 16:19:48 - * @since JDK1.8 - */ -@Data -public class NoticeQueryDTO extends PageParamDTO { - - - @ApiModelProperty("开始日期") - private String startDate; - - @ApiModelProperty("结束日期") - private String endDate; - - - @ApiModelProperty("消息标题") - private String title; - - @ApiModelProperty(value = "是否删除",hidden = true) - private Integer deleted; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReadCountDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReadCountDTO.java deleted file mode 100644 index 7821cf76..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReadCountDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice.domain.dto; - -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/12 0012 上午 8:11 - * @since JDK1.8 - */ -@Data -public class NoticeReadCountDTO { - /** - * 员工id - */ - private Long employeeId; - /** - * 已读消息数 - */ - private Integer readCount; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReceiveDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReceiveDTO.java deleted file mode 100644 index aa4aa7ad..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReceiveDTO.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice.domain.dto; - -import com.fasterxml.jackson.annotation.JsonFormat; -import net.lab1024.smartadmin.common.anno.ApiModelPropertyEnum; -import net.lab1024.smartadmin.common.constant.JudgeEnum; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/12 0012 上午 11:53 - * @since JDK1.8 - */ -@Data -public class NoticeReceiveDTO{ - - @ApiModelProperty("id") - private Long id; - - @ApiModelProperty("消息标题") - private String title; - - - @ApiModelProperty("消息创建人") - private Long createUser; - - @ApiModelProperty("消息创建人名称") - private String createUserName; - - @ApiModelProperty("结束时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date receiveTime; - - @ApiModelPropertyEnum(enumDesc = "读取状态",value = JudgeEnum.class) - private Integer readStatus; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReceiveQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReceiveQueryDTO.java deleted file mode 100644 index 63bbc87b..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeReceiveQueryDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/12 0012 下午 12:32 - * @since JDK1.8 - */ -@Data -public class NoticeReceiveQueryDTO extends NoticeQueryDTO{ - - @ApiModelProperty(value = "当前登录人",hidden = true) - private Long employeeId; - - @ApiModelProperty(value = "发送状态",hidden = true) - private Integer sendStatus; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeUpdateDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeUpdateDTO.java deleted file mode 100644 index d62c00ca..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeUpdateDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/11 0011 下午 16:24 - * @since JDK1.8 - */ -@Data -public class NoticeUpdateDTO extends NoticeAddDTO{ - - @ApiModelProperty("id") - private Long id; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeVO.java deleted file mode 100644 index 04fc5fbb..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/dto/NoticeVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice.domain.dto; -import net.lab1024.smartadmin.common.anno.ApiModelPropertyEnum; -import net.lab1024.smartadmin.common.constant.JudgeEnum; -import lombok.Data; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 12:27 - * @since JDK1.8 - */ -@Data -public class NoticeVO { - - @ApiModelProperty("id") - private Long id; - - @ApiModelProperty("消息标题") - private String title; - - - @ApiModelProperty("消息创建人") - private Long createUser; - - @ApiModelPropertyEnum(enumDesc = "发送状态",value = JudgeEnum.class) - private Integer sendStatus; - - @ApiModelProperty("消息创建人名称") - private String createUserName; - - @ApiModelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date createTime; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/entity/NoticeEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/entity/NoticeEntity.java deleted file mode 100644 index 4caeca22..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/entity/NoticeEntity.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice.domain.entity; -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019-07-11 16:19:48 - * @since JDK1.8 - */ -@Data -@TableName("t_notice") -public class NoticeEntity extends BaseEntity { - - /** - * 消息标题 - */ - private String title; - - /** - * 消息内容 - */ - private String content; - - /** - * 消息创建人 - */ - private Long createUser; - - /** - * 发送状态 - */ - private Integer sendStatus; - - /** - * 删除状态 - */ - private Integer deleted; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/entity/NoticeReceiveRecordEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/entity/NoticeReceiveRecordEntity.java deleted file mode 100644 index 74f5f3e7..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/notice/domain/entity/NoticeReceiveRecordEntity.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.lab1024.smartadmin.module.business.notice.domain.entity; -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019-07-11 16:19:48 - * @since JDK1.8 - */ -@Data -@TableName("t_notice_receive_record") -public class NoticeReceiveRecordEntity extends BaseEntity { - - - /** - * 消息id - */ - private Long noticeId; - - /** - * 消息接收人 - */ - private Long employeeId; - - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/controller/PeonyController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/controller/PeonyController.java deleted file mode 100644 index 08b12c62..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/controller/PeonyController.java +++ /dev/null @@ -1,88 +0,0 @@ -package net.lab1024.smartadmin.module.business.peony.controller; - -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.controller.BaseController; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.common.domain.ValidateList; -import net.lab1024.smartadmin.module.business.peony.domain.dto.PeonyAddDTO; -import net.lab1024.smartadmin.module.business.peony.domain.dto.PeonyUpdateDTO; -import net.lab1024.smartadmin.module.business.peony.domain.dto.PeonyQueryDTO; -import net.lab1024.smartadmin.module.business.peony.domain.vo.PeonyVO; -import net.lab1024.smartadmin.module.business.peony.domain.vo.PeonyExcelVO; -import net.lab1024.smartadmin.module.business.peony.service.PeonyService; -import cn.afterturn.easypoi.excel.ExcelExportUtil; -import cn.afterturn.easypoi.excel.entity.ExportParams; -import org.apache.poi.ss.usermodel.Workbook; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; - -/** - * [ 牡丹花 ] - * - * @author 卓大 - * @version 1.0 - * @company 1024创新实验室( www.1024lab.net ) - * @copyright (c) 1024创新实验室( www.1024lab.net )Inc. All rights reserved. - * @date 2020-04-06 18:17:56 - * @since JDK1.8 - */ -@RestController -@Api(tags = {"牡丹花"}) -public class PeonyController extends BaseController { - - @Autowired - private PeonyService peonyService; - - @ApiOperation(value = "分页查询牡丹花",notes = "@author 卓大") - @PostMapping("/peony/page/query") - public ResponseDTO> queryByPage(@RequestBody PeonyQueryDTO queryDTO) { - return peonyService.queryByPage(queryDTO); - } - - @ApiOperation(value = "添加牡丹花",notes = "@author 卓大") - @PostMapping("/peony/add") - public ResponseDTO add(@RequestBody @Validated PeonyAddDTO addTO){ - return peonyService.add(addTO); - } - - @ApiOperation(value="修改牡丹花",notes = "@author 卓大") - @PostMapping("/peony/update") - public ResponseDTO update(@RequestBody @Validated PeonyUpdateDTO updateDTO){ - return peonyService.update(updateDTO); - } - - @ApiOperation(value="批量删除牡丹花",notes = "@author 卓大") - @PostMapping("/peony/deleteByIds") - public ResponseDTO delete(@RequestBody @Validated ValidateList idList) { - return peonyService.deleteByIds(idList); - } - - @ApiOperation(value = "批量导出", notes = "@author 卓大") - @PostMapping("/peony/export/batch") - public void batchExport(@RequestBody @Validated ValidateList idList, HttpServletResponse response) { - //查询数据 - List peonyList = peonyService.queryBatchExportData(idList); - //导出操作 - ExportParams ex = new ExportParams("牡丹花", "Sheet1"); - Workbook workbook = ExcelExportUtil.exportExcel(ex, PeonyExcelVO.class, peonyList); - downloadExcel("牡丹花", workbook, response); - } - - @ApiOperation(value = "导出全部", notes = "@author 卓大") - @PostMapping("/peony/export/all") - public void exportAll(@RequestBody @Validated PeonyQueryDTO queryDTO, HttpServletResponse response) { - //查询数据 - List peonyList = peonyService.queryAllExportData(queryDTO); - //导出操作 - ExportParams ex = new ExportParams("牡丹花", "Sheet1"); - Workbook workbook = ExcelExportUtil.exportExcel(ex, PeonyExcelVO.class, peonyList); - downloadExcel("牡丹花", workbook, response); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/dao/PeonyDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/dao/PeonyDao.java deleted file mode 100644 index bc131bb3..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/dao/PeonyDao.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.lab1024.smartadmin.module.business.peony.dao; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.core.metadata.IPage; -import net.lab1024.smartadmin.module.business.peony.domain.dto.PeonyQueryDTO; -import net.lab1024.smartadmin.module.business.peony.domain.entity.PeonyEntity; -import net.lab1024.smartadmin.module.business.peony.domain.vo.PeonyVO; -import net.lab1024.smartadmin.module.business.peony.domain.vo.PeonyExcelVO; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * [ 牡丹花 ] - * - * @author 卓大 - * @version 1.0 - * @company 1024创新实验室( www.1024lab.net ) - * @copyright (c) 1024创新实验室( www.1024lab.net )Inc. All rights reserved. - * @date 2020-04-06 18:17:56 - * @since JDK1.8 - */ -@Mapper -@Component -public interface PeonyDao extends BaseMapper { - - /** - * 分页查询 - * @param queryDTO - * @return PeonyVO - */ - IPage queryByPage(Page page, @Param("queryDTO") PeonyQueryDTO queryDTO); - - /** - * 根据id删除 - * @param id - * @return - */ - void deleteById(@Param("id") Long id); - - /** - * 根据id批量删除 - * @param idList - * @return - */ - void deleteByIdList(@Param("idList") List idList); - - /** - * 查询所有导出数据 - * @param queryDTO - * @return - */ - List queryAllExportData(@Param("queryDTO") PeonyQueryDTO queryDTO); - - /** - * 查询批量导出数据 - * @param idList - * @return - */ - List queryBatchExportData(@Param("idList") List idList); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyAddDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyAddDTO.java deleted file mode 100644 index 976a2593..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyAddDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.lab1024.smartadmin.module.business.peony.domain.dto; - -import lombok.Data; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; - -/** - * 新建 [ 牡丹花 ] - * - * @author 卓大 - * @version 1.0 - * @company 1024创新实验室( www.1024lab.net ) - * @copyright (c) 2018 1024创新实验室( www.1024lab.net )Inc. All rights reserved. - * @date 2020-04-06 18:17:56 - * @since JDK1.8 - */ -@Data -public class PeonyAddDTO { - @ApiModelProperty("品种") - private String kind; - - @ApiModelProperty("名字") - private String name; - - @ApiModelProperty("颜色") - private String color; - - @ApiModelProperty("图片链接") - private String imageUrl; - - @ApiModelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date createTime; - - @ApiModelProperty("更新时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date updateTime; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyQueryDTO.java deleted file mode 100644 index 9841f01d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyQueryDTO.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.lab1024.smartadmin.module.business.peony.domain.dto; - -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import java.util.Date; - -/** - * [ 牡丹花 ] - * - * @author 卓大 - * @version 1.0 - * @company 1024创新实验室( www.1024lab.net ) - * @copyright (c) 1024创新实验室( www.1024lab.net )Inc. All rights reserved. - * @date 2020-04-06 18:17:56 - * @since JDK1.8 - */ -@Data -public class PeonyQueryDTO extends PageParamDTO { - - @ApiModelProperty("ID") - private Long id; - - @ApiModelProperty("品种") - private String kind; - - @ApiModelProperty("名字") - private String name; - - @ApiModelProperty("颜色") - private String color; - - @ApiModelProperty("创建时间-开始") - private Date createTimeBegin; - - @ApiModelProperty("创建时间-截止") - private Date createTimeEnd; - - @ApiModelProperty("上次更新时间-开始") - private Date updateTimeBegin; - - @ApiModelProperty("上次更新创建时间-开始") - private Date updateTimeEnd; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyUpdateDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyUpdateDTO.java deleted file mode 100644 index 7d7ca820..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/dto/PeonyUpdateDTO.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.lab1024.smartadmin.module.business.peony.domain.dto; - -import lombok.Data; - -/** - * 更新 [ 牡丹花 ] - * - * @author 卓大 - * @version 1.0 - * @company 1024创新实验室( www.1024lab.net ) - * @copyright (c) 2018 1024创新实验室( www.1024lab.net )Inc. All rights reserved. - * @date 2020-04-06 18:17:56 - * @since JDK1.8 - */ -@Data -public class PeonyUpdateDTO extends PeonyAddDTO { - - private Long id; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/entity/PeonyEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/entity/PeonyEntity.java deleted file mode 100644 index 48eb9d56..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/entity/PeonyEntity.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.lab1024.smartadmin.module.business.peony.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -/** - * [ 牡丹花 ] - * - * @author 卓大 - * @version 1.0 - * @company 1024创新实验室( www.1024lab.net ) - * @copyright (c) 1024创新实验室( www.1024lab.net )Inc. All rights reserved. - * @date 2020-04-06 18:17:56 - * @since JDK1.8 - */ -@Data -@TableName("t_peony") -public class PeonyEntity extends BaseEntity{ - - - /** - * 品种 - */ - private String kind; - - /** - * 名字 - */ - private String name; - - /** - * 颜色 - */ - private String color; - - /** - * 图片链接 - */ - private String imageUrl; - - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/vo/PeonyExcelVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/vo/PeonyExcelVO.java deleted file mode 100644 index 8964433f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/vo/PeonyExcelVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.lab1024.smartadmin.module.business.peony.domain.vo; - -import cn.afterturn.easypoi.excel.annotation.Excel; -import lombok.Data; -import java.util.Date; - -/** - * [ 牡丹花 ] - * - * @author 卓大 - * @version 1.0 - * @company 1024创新实验室( www.1024lab.net ) - * @copyright (c) 1024创新实验室( www.1024lab.net )Inc. All rights reserved. - * @date 2020-04-06 18:17:56 - * @since JDK1.8 - */ -@Data -public class PeonyExcelVO { - @Excel(name = "ID") - private Long id; - - @Excel(name = "品种") - private String kind; - - @Excel(name = "名字") - private String name; - - @Excel(name = "颜色") - private String color; - - @Excel(name = "图片链接") - private String imageUrl; - - @Excel(name = "创建时间", format = "yyyy-MM-dd HH:mm:ss") - private Date createTime; - - @Excel(name = "更新时间", format = "yyyy-MM-dd HH:mm:ss") - private Date updateTime; - - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/vo/PeonyVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/vo/PeonyVO.java deleted file mode 100644 index 06590916..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/domain/vo/PeonyVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lab1024.smartadmin.module.business.peony.domain.vo; - -import lombok.Data; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; - -/** - * [ 牡丹花 ] - * - * @author 卓大 - * @version 1.0 - * @company 1024创新实验室( www.1024lab.net ) - * @copyright (c) 1024创新实验室( www.1024lab.net )Inc. All rights reserved. - * @date 2020-04-06 18:17:56 - * @since JDK1.8 - */ -@Data -public class PeonyVO { - @ApiModelProperty("ID") - private Long id; - - @ApiModelProperty("品种") - private String kind; - - @ApiModelProperty("名字") - private String name; - - @ApiModelProperty("颜色") - private String color; - - @ApiModelProperty("图片链接") - private String imageUrl; - - @ApiModelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date createTime; - - @ApiModelProperty("更新时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date updateTime; - - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/service/PeonyService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/service/PeonyService.java deleted file mode 100644 index 50bfbb44..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/business/peony/service/PeonyService.java +++ /dev/null @@ -1,108 +0,0 @@ -package net.lab1024.smartadmin.module.business.peony.service; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.business.peony.dao.PeonyDao; -import net.lab1024.smartadmin.module.business.peony.domain.dto.PeonyAddDTO; -import net.lab1024.smartadmin.module.business.peony.domain.dto.PeonyUpdateDTO; -import net.lab1024.smartadmin.module.business.peony.domain.dto.PeonyQueryDTO; -import net.lab1024.smartadmin.module.business.peony.domain.entity.PeonyEntity; -import net.lab1024.smartadmin.module.business.peony.domain.vo.PeonyVO; -import net.lab1024.smartadmin.module.business.peony.domain.vo.PeonyExcelVO; -import net.lab1024.smartadmin.util.SmartPageUtil; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * [ 牡丹花 ] - * - * @author 卓大 - * @version 1.0 - * @company 1024创新实验室( www.1024lab.net ) - * @copyright (c) 1024创新实验室( www.1024lab.net )Inc. All rights reserved. - * @date 2020-04-06 18:17:56 - * @since JDK1.8 - */ -@Service -public class PeonyService { - - @Autowired - private PeonyDao peonyDao; - - /** - * 根据id查询 - */ - public PeonyEntity getById(Long id){ - return peonyDao.selectById(id); - } - - /** - * 分页查询 - * @author 卓大 - * @date 2020-04-06 18:17:56 - */ - public ResponseDTO> queryByPage(PeonyQueryDTO queryDTO) { - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - IPage voList = peonyDao.queryByPage(page, queryDTO); - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(voList); - return ResponseDTO.succData(pageResultDTO); - } - - /** - * 添加 - * @author 卓大 - * @date 2020-04-06 18:17:56 - */ - public ResponseDTO add(PeonyAddDTO addDTO) { - PeonyEntity entity = SmartBeanUtil.copy(addDTO, PeonyEntity.class); - peonyDao.insert(entity); - return ResponseDTO.succ(); - } - - /** - * 编辑 - * @author 卓大 - * @date 2020-04-06 18:17:56 - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO update(PeonyUpdateDTO updateDTO) { - PeonyEntity entity = SmartBeanUtil.copy(updateDTO, PeonyEntity.class); - peonyDao.updateById(entity); - return ResponseDTO.succ(); - } - - /** - * 删除 - * @author 卓大 - * @date 2020-04-06 18:17:56 - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO deleteByIds(List idList) { - peonyDao.deleteByIdList(idList); - return ResponseDTO.succ(); - } - - /** - * 查询全部导出对象 - * @author 卓大 - * @date 2020-04-06 18:17:56 - */ - public List queryAllExportData(PeonyQueryDTO queryDTO) { - return peonyDao.queryAllExportData( queryDTO); - } - - /** - * 批量查询导出对象 - * @author 卓大 - * @date 2020-04-06 18:17:56 - */ - public List queryBatchExportData(List idList) { - return peonyDao.queryBatchExportData(idList); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/constant/SqlOperateTypeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/constant/SqlOperateTypeEnum.java deleted file mode 100644 index 943e1c36..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/constant/SqlOperateTypeEnum.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.lab1024.smartadmin.module.support.codegenerator.constant; - - -/** - * [ gt,lt 目前只支持Date] - * - * @author yandanyang - * @version 1.0 - * @since JDK1.8 - */ -public enum SqlOperateTypeEnum{ - - - LIKE(1, "like"), - EQUALS(2, "equals"), - IN(3, "in"); - - private Integer type; - - private String name; - - SqlOperateTypeEnum(Integer type, String name) { - this.type = type; - this.name = name; - } - - public Integer getType() { - return type; - } - - public String getName() { - return name; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/dao/TableDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/dao/TableDao.java deleted file mode 100644 index f8d005ab..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/dao/TableDao.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.lab1024.smartadmin.module.support.codegenerator.dao; - -import net.lab1024.smartadmin.module.support.codegenerator.domain.ColumnVO; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/10 0010 下午 18:59 - * @since JDK1.8 - */ -@Mapper -@Component -public interface TableDao { - - - /** - * 查询表描述 - * @param tableName - * @return - */ - String selectTableDesc(@Param("tableName") String tableName); - - /** - * 查询表列信息 - * @param tableName - * @return - */ - List selectTableColumn(@Param("tableName") String tableName); - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/CodeGeneratorDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/CodeGeneratorDTO.java deleted file mode 100644 index 4995aa57..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/CodeGeneratorDTO.java +++ /dev/null @@ -1,56 +0,0 @@ -package net.lab1024.smartadmin.module.support.codegenerator.domain; - -import lombok.Builder; -import lombok.Data; - -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/11 0011 上午 10:12 - * @since JDK1.8 - */ -@Data -@Builder -public class CodeGeneratorDTO { - - /** - * 需要生成代码的表名 - */ - private String tableName; - - /** - * 表前缀 - */ - private String tablePrefix; - - /** - * 基础包路径 - */ - private String basePackage; - - /** - * module下的子包 - */ - private String modulePackage; - - /** - * 公司 - */ - private String company; - - /** - * 作者 - */ - private String author; - - /** - * 需要构建查询方法的列 - */ - private List queryColumnList; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/CodeGeneratorQueryColumnDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/CodeGeneratorQueryColumnDTO.java deleted file mode 100644 index 9e1bd054..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/CodeGeneratorQueryColumnDTO.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.lab1024.smartadmin.module.support.codegenerator.domain; - -import net.lab1024.smartadmin.module.support.codegenerator.constant.SqlOperateTypeEnum; -import lombok.Builder; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/11 0011 上午 10:13 - * @since JDK1.8 - */ -@Data -@Builder -public class CodeGeneratorQueryColumnDTO { - - /** - * 生成查询方法的查询列名 - */ - private String columnName; - - /** - * 此列的查询动作 - */ - private SqlOperateTypeEnum sqlOperate; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/ColumnVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/ColumnVO.java deleted file mode 100644 index 9bec4d9f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/ColumnVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.lab1024.smartadmin.module.support.codegenerator.domain; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/10 0010 下午 17:55 - * @since JDK1.8 - */ -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ColumnVO { - - private String columnName; - - private String columnType; - - private String columnDesc; - - private String fieldType; - - private String fieldName; - - private Boolean isNumber; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/QueryFieldVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/QueryFieldVO.java deleted file mode 100644 index c2afcc53..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/domain/QueryFieldVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.lab1024.smartadmin.module.support.codegenerator.domain; - -import lombok.Builder; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/10 0010 下午 17:56 - * @since JDK1.8 - */ -@Data -@Builder -public class QueryFieldVO { - - private String fieldName; - - private String columnName; - - private String columnDesc; - - private String fieldType; - - private String sqlOperate; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/service/CodeGeneratorComponent.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/service/CodeGeneratorComponent.java deleted file mode 100644 index 37ee4e87..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/service/CodeGeneratorComponent.java +++ /dev/null @@ -1,92 +0,0 @@ -package net.lab1024.smartadmin.module.support.codegenerator.service; - -import com.google.common.base.CaseFormat; -import org.springframework.stereotype.Component; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/11 0011 上午 8:33 - * @since JDK1.8 - */ -@Component -public class CodeGeneratorComponent { - - private static Map dataMap = new HashMap<>(16); - private static Map numberTypeMap = new HashMap<>(16); - - static { - dataMap(); - } - - public static void dataMap() { - numberTypeMap.put("int", "Integer"); - numberTypeMap.put("tinyint", "Integer"); - numberTypeMap.put("smallint", "Integer"); - numberTypeMap.put("integer", "Integer"); - numberTypeMap.put("bigint", "Long"); - numberTypeMap.put("float", "Float"); - numberTypeMap.put("double", "Double"); - numberTypeMap.put("decimal", "BigDecimal"); - - dataMap.put("char", "String"); - dataMap.put("varchar", "String"); - dataMap.put("tinytext", "String"); - dataMap.put("text", "String"); - dataMap.put("longtext", "String"); - - dataMap.put("date", "Date"); - dataMap.put("datetime", "Date"); - dataMap.put("timestamp", "Date"); - - } - - - public Map codeTemplates(String moduleClass, String basePackage, String modulePackage) { - String modulePath = modulePackage.replaceAll("\\.", "/"); - String javaPackagePath = "java/" + modulePath + File.separator; - String xmlPackagePath = "mapper/" + modulePath + File.separator; - String frontPackagePath = "web" + File.separator; - Map templateMap = new HashMap<>(); - //后端 - templateMap.put("templates/codegenerator/java/Controller.java.vm", javaPackagePath + "controller" + File.separator + moduleClass + "Controller.java"); - templateMap.put("templates/codegenerator/java/Dao.java.vm", javaPackagePath + "dao" + File.separator + moduleClass + "Dao.java"); - templateMap.put("templates/codegenerator/java/Dao.xml.vm", xmlPackagePath + moduleClass + "Mapper.xml"); - templateMap.put("templates/codegenerator/java/AddDTO.java.vm", javaPackagePath + "domain" + File.separator + "dto" + File.separator + moduleClass + "AddDTO.java"); - templateMap.put("templates/codegenerator/java/UpdateDTO.java.vm", javaPackagePath + "domain" + File.separator + "dto" + File.separator + moduleClass + "UpdateDTO.java"); - templateMap.put("templates/codegenerator/java/Entity.java.vm", javaPackagePath + "domain" + File.separator + "entity" + File.separator + moduleClass + "Entity.java"); - templateMap.put("templates/codegenerator/java/VO.java.vm", javaPackagePath + "domain" + File.separator + "vo" + File.separator + moduleClass + "VO.java"); - templateMap.put("templates/codegenerator/java/ExcelVO.java.vm", javaPackagePath + "domain" + File.separator + "vo" + File.separator + moduleClass + "ExcelVO.java"); - templateMap.put("templates/codegenerator/java/QueryDTO.java.vm", javaPackagePath + "domain" + File.separator + "dto" + File.separator + moduleClass + "QueryDTO.java"); - templateMap.put("templates/codegenerator/java/Service.java.vm", javaPackagePath + "service" + File.separator + moduleClass + "Service.java"); - //前端 - String webPackageName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, moduleClass).replaceAll("_", "-"); - templateMap.put("templates/codegenerator/web/Api.js.vm", frontPackagePath + "api" + File.separator + webPackageName + ".js"); - templateMap.put("templates/codegenerator/web/Router.js.vm", frontPackagePath + "router" + File.separator + webPackageName + ".js"); - templateMap.put("templates/codegenerator/web/List.vue.vm", frontPackagePath + webPackageName + File.separator + webPackageName + "-list.vue"); - templateMap.put("templates/codegenerator/web/ListForm.vue.vm", frontPackagePath + webPackageName + File.separator + "components" + File.separator + webPackageName + "-list-form.vue"); - return templateMap; - } - - public String getJavaType(String mysqlType) { - String javaType = dataMap.get(mysqlType); - if (javaType == null) { - javaType = numberTypeMap.get(mysqlType); - } - return javaType; - } - - public boolean isNumber(String mysqlType) { - return numberTypeMap.containsKey(mysqlType); - } - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/service/CodeGeneratorService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/service/CodeGeneratorService.java deleted file mode 100644 index b2b6585d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/codegenerator/service/CodeGeneratorService.java +++ /dev/null @@ -1,336 +0,0 @@ -package net.lab1024.smartadmin.module.support.codegenerator.service; - -import com.google.common.base.CaseFormat; -import net.lab1024.smartadmin.module.support.codegenerator.dao.TableDao; -import net.lab1024.smartadmin.module.support.codegenerator.domain.CodeGeneratorDTO; -import net.lab1024.smartadmin.module.support.codegenerator.domain.CodeGeneratorQueryColumnDTO; -import net.lab1024.smartadmin.module.support.codegenerator.domain.ColumnVO; -import net.lab1024.smartadmin.module.support.codegenerator.domain.QueryFieldVO; -import net.lab1024.smartadmin.util.SmartDateUtil; -import com.google.common.collect.Lists; -import lombok.extern.slf4j.Slf4j; -import net.lab1024.smartadmin.util.SmartStringUtil; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang.WordUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.Velocity; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.util.ResourceUtils; - -import javax.swing.filechooser.FileSystemView; -import java.io.File; -import java.io.FileWriter; -import java.util.*; -import java.util.Map.Entry; -import java.util.stream.Collectors; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/11 0011 上午 9:36 - * @since JDK1.8 - */ -@Slf4j -@Service -public class CodeGeneratorService { - - @Autowired - private TableDao tableDao; - - @Autowired - private CodeGeneratorComponent codeGeneratorComponent; - - /** - * 大家注意了开始生成代码了 - * - * @param codeGenerator - * @throws Exception - */ - public void codeGenerator(CodeGeneratorDTO codeGenerator) throws Exception { - this.basicValid(codeGenerator); - String date = SmartDateUtil.formatYMDHMS(new Date()); - String tableDesc = this.getTableDesc(codeGenerator.getTableName()); - String author = codeGenerator.getAuthor(); - String basePackage = codeGenerator.getBasePackage(); - if (StringUtils.isEmpty(basePackage)) { - basePackage = "net.lab1024.smartadmin"; - } - String moduleClass = this.tableName2Class(codeGenerator.getTableName(), codeGenerator.getTablePrefix()); - String moduleVar = this.tableName2Var(codeGenerator.getTableName(), codeGenerator.getTablePrefix()); - String modulePackage = codeGenerator.getModulePackage(); - - List columnList = this.columnList(codeGenerator.getTableName()); - List queryFieldList = this.buildQueryField(codeGenerator, columnList); - Map codeTemplates = codeGeneratorComponent.codeTemplates(moduleClass, basePackage, modulePackage); - List queryImports = this.buildQueryImport(queryFieldList); - List dtoImports = this.buildDTOImport(columnList); - List entityImports = this.buildEntityImport(columnList); - Properties p = new Properties(); - p.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); - p.put("directive.foreach.counter.name", "velocityCount"); - p.put("directive.foreach.counter.initial.value", "1"); - Velocity.init(p); - Map map = new HashMap<>(); - map.put("company", codeGenerator.getCompany()); - map.put("tableName", codeGenerator.getTableName()); - map.put("basePackage", basePackage); - map.put("modulePackage", modulePackage); - map.put("moduleClass", moduleClass); - map.put("tableDesc", tableDesc); - map.put("author", author); - map.put("date", date); - map.put("moduleVar", moduleVar); - map.put("columnList", columnList); - map.put("queryFieldList", queryFieldList); - map.put("queryImports", queryImports); - map.put("dtoImports", dtoImports); - map.put("entityImports", entityImports); - map.put("webModuleName", CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, moduleClass).replaceAll("_", "-")); - map.put("upperCamel", CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_CAMEL, moduleClass)); - //前端的变量 - map.put("ViewUIMessage", "$Message"); - map.put("VueRefs", "$refs"); - VelocityContext context = new VelocityContext(map); - this.codeGenerator(context, codeTemplates); - } - - private List buildQueryImport(List queryFieldList) { - List queryImports = Lists.newArrayList(); - if (CollectionUtils.isNotEmpty(queryFieldList)) { - queryFieldList.forEach(e -> { - importPackage(queryImports, e.getFieldType()); - if ("in".equals(e.getSqlOperate())) { - queryImports.add("import java.util.List;"); - } - }); - } - return queryImports; - } - - private List buildDTOImport(List columnList) { - List dtoImports = Lists.newArrayList(); - if (CollectionUtils.isNotEmpty(columnList)) { - columnList.forEach(e -> { - importPackage(dtoImports, e.getFieldType()); - }); - } - return dtoImports; - } - - private List buildEntityImport(List columnList) { - List entityImports = Lists.newArrayList(); - if (CollectionUtils.isNotEmpty(columnList)) { - columnList.forEach(e -> { - if (!e.getFieldName().equals("createTime") && !e.getFieldName().equals("updateTime") && !e.getFieldName().equals("id")) { - importPackage(entityImports, e.getFieldType()); - } - }); - } - return entityImports; - } - - private void importPackage(List imports, String fieldType) { - if ("Date".equals(fieldType) && !imports.contains("import java.util.Date;")) { - imports.add("import java.util.Date;"); - } - if ("BigDecimal".equals(fieldType) && !imports.contains("import java.math.BigDecimal;")) { - imports.add("import java.math.BigDecimal;"); - } - } - - private String getOutputDir() { - File desktopDir = FileSystemView.getFileSystemView().getHomeDirectory(); - return desktopDir.getAbsolutePath() + File.separator + "smart-admin" + File.separator; - } - - /** - * 生成代码 - * - * @param context - * @param codeTemplates - */ - private void codeGenerator(VelocityContext context, Map codeTemplates) throws Exception { - String projectPath = getOutputDir(); - - Velocity.setProperty("input.encoding", "UTF-8"); - Velocity.setProperty("output.encoding", "UTF-8"); - - for (Entry entry : codeTemplates.entrySet()) { - String template = entry.getKey(); - String filePath = projectPath + entry.getValue(); - String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1); - String fileDir = filePath.replace(fileName, ""); - File directory = new File(fileDir); - if (!directory.exists()) { - directory.mkdirs(); - } - FileWriter writer; - try { - writer = new FileWriter(filePath); - Template tpl = Velocity.getTemplate(template, "UTF-8"); - tpl.merge(context, writer); - writer.flush(); - writer.close(); - } catch (Exception e) { - log.error("", e); - } - } - - log.info("------------------------------ 代 码 生 成 完 毕 ! ------------------------------"); - log.info("代码目录:{}", projectPath); - log.info("------------------------------ 代 码 生 成 完 毕 ! ------------------------------"); - - } - - public static void main(String[] args) { - try { - int i = 1 / 0; - } catch (Exception e) { - log.error("", e); - } - } - - private void basicValid(CodeGeneratorDTO codeGenerator) throws Exception { - if (StringUtils.isEmpty(codeGenerator.getTableName())) { - throw new Exception("你没建表吗?"); - } - if (StringUtils.isEmpty(codeGenerator.getTablePrefix())) { - throw new Exception("你的表没前缀吗?"); - } - if (StringUtils.isEmpty(codeGenerator.getAuthor())) { - throw new Exception("输入下你的大名"); - } - } - - /** - * 构建查询集合 - * - * @param codeGenerator - * @param columnList - * @return - * @throws Exception - */ - private List buildQueryField(CodeGeneratorDTO codeGenerator, List columnList) throws Exception { - List queryFieldList = Lists.newArrayList(); - Map storageMap = columnList.stream().collect(Collectors.toMap(ColumnVO::getColumnName, e -> e)); - List queryColumnList = codeGenerator.getQueryColumnList(); - if (CollectionUtils.isEmpty(queryColumnList)) { - return queryFieldList; - } - for (CodeGeneratorQueryColumnDTO queryColumn : queryColumnList) { - ColumnVO columnDTO = storageMap.get(queryColumn.getColumnName()); - if (columnDTO == null) { - String errorMsg = "sql列[" + queryColumn.getColumnName() + "]在表[" + codeGenerator.getTableName() + "]中不存在。"; - log.error(errorMsg); - throw new Exception(errorMsg); - } - QueryFieldVO queryField = - QueryFieldVO.builder().fieldName(columnDTO.getFieldName()).fieldType(columnDTO.getFieldType()).columnName(columnDTO.getColumnName()).columnDesc(columnDTO.getColumnDesc()).sqlOperate(queryColumn.getSqlOperate().getName()).build(); - queryFieldList.add(queryField); - } - return queryFieldList; - } - - /** - * 列数据 组合 - * - * @param tableName - * @return - * @throws Exception - */ - private List columnList(String tableName) throws Exception { - List list = tableDao.selectTableColumn(tableName); - for (ColumnVO column : list) { - String javaType = codeGeneratorComponent.getJavaType(column.getColumnType()); - if (StringUtils.isEmpty(javaType)) { - String errorMsg = "sql数据类型[" + column.getColumnType() + "]缺少对应的java类型。"; - log.error(errorMsg); - throw new Exception(errorMsg); - } - if ("Integer".equals(javaType) && column.getColumnName().contains("id")) { - column.setFieldType("Long"); - } else { - column.setFieldType(javaType); - } - column.setFieldName(this.columnName2Field(column.getColumnName())); - if (SmartStringUtil.isBlank(column.getColumnDesc())) { - column.setColumnDesc(column.getColumnName()); - } - - column.setIsNumber(codeGeneratorComponent.isNumber(column.getColumnType())); - } - return list; - } - - /** - * 获取列注释为类描述 - * - * @param tableName - * @return - */ - private String getTableDesc(String tableName) { - return tableDao.selectTableDesc(tableName); - } - - /** - * 列名转字段名 - * - * @param columnName - * @return - */ - private String columnName2Field(String columnName) { - String transName = WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", ""); - return WordUtils.uncapitalize(transName); - } - - /** - * 表名转类名前缀 - * - * @param tableName - * @param tablePrefix - * @return - */ - private String tableName2Class(String tableName, String tablePrefix) { - if (StringUtils.isNotBlank(tablePrefix)) { - tableName = tableName.replaceFirst(tablePrefix, ""); - } - return WordUtils.capitalizeFully(tableName, new char[]{'_'}).replace("_", ""); - } - - /** - * 表名转包名 - * - * @param tableName - * @param tablePrefix - * @return - */ - private String tableName2Package(String tableName, String tablePrefix) { - if (StringUtils.isNotBlank(tablePrefix)) { - tableName = tableName.replaceFirst(tablePrefix, ""); - } - return tableName.replace("_", ""); - } - - /** - * 表名转 java变量前缀 - * - * @param tableName - * @param tablePrefix - * @return - */ - private String tableName2Var(String tableName, String tablePrefix) { - if (StringUtils.isNotBlank(tablePrefix)) { - tableName = tableName.replaceFirst(tablePrefix, ""); - } - String transName = WordUtils.capitalizeFully(tableName, new char[]{'_'}).replace("_", ""); - return WordUtils.uncapitalize(transName); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/FileController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/FileController.java deleted file mode 100644 index 001e99d2..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/FileController.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.lab1024.smartadmin.module.support.file; - -import net.lab1024.smartadmin.common.anno.NoNeedLogin; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.support.file.constant.FileServiceTypeEnum; -import net.lab1024.smartadmin.module.support.file.domain.dto.FileAddDTO; -import net.lab1024.smartadmin.module.support.file.domain.dto.FileQueryDTO; -import net.lab1024.smartadmin.module.support.file.domain.vo.FileVO; -import net.lab1024.smartadmin.module.support.file.domain.vo.UploadVO; -import net.lab1024.smartadmin.module.support.file.service.FileService; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.util.SmartRequestTokenUtil; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -/** - * @Description: 文件服务 - * @Author: sbq - * @CreateDate: 2019/7/18 9:36 - * @Version: 1.0 - */ -@RestController -@Api(tags = {SwaggerTagConst.Admin.MANAGER_FILE}) -public class FileController { - - @Autowired - private FileService fileService; - - @ApiOperation(value = "文件本地上传", notes = "文件本地上传") - @PostMapping("/api/file/localUpload/{moduleType}") - public ResponseDTO localUpload(MultipartFile file, @PathVariable Integer moduleType) throws Exception { - return fileService.fileUpload(file, FileServiceTypeEnum.LOCAL, moduleType); - } - - @ApiOperation(value = "获取本地文件URL", notes = "获取文件URL") - @PostMapping("/api/file/get") - public ResponseDTO localGetFile(String path) { - return fileService.getFileUrl(path, FileServiceTypeEnum.LOCAL); - } - - @ApiOperation(value = "文件阿里云上传", notes = "文件阿里云上传") - @PostMapping("/api/file/aliYunUpload/{moduleType}") - public ResponseDTO aliYunUpload(MultipartFile file, @PathVariable Integer moduleType) throws Exception { - return fileService.fileUpload(file, FileServiceTypeEnum.ALI_OSS, moduleType); - } - - @ApiOperation(value = "获取阿里云文件URL", notes = "获取阿里云文件URL") - @PostMapping("/api/file/aliYunGet") - public ResponseDTO aliYunGet(String path) { - return fileService.getFileUrl(path, FileServiceTypeEnum.ALI_OSS); - } - - @ApiOperation(value = "文件七牛云上传", notes = "文件七牛云上传") - @PostMapping("/api/file/qiNiuUpload/{moduleType}") - public ResponseDTO qiNiuUpload(MultipartFile file, @PathVariable Integer moduleType) throws Exception { - return fileService.fileUpload(file, FileServiceTypeEnum.QI_NIU_OSS, moduleType); - } - - @ApiOperation(value = "获取七牛云文件URL", notes = "获取七牛云URL") - @PostMapping("/api/file/qiNiuGet") - public ResponseDTO qiNiuGet(String path) { - return fileService.getFileUrl(path, FileServiceTypeEnum.QI_NIU_OSS); - } - - @ApiOperation(value = "系统文件查询") - @PostMapping("/api/file/query") - public ResponseDTO> queryListByPage(@RequestBody FileQueryDTO queryDTO) { - return fileService.queryListByPage(queryDTO); - } - - @ApiOperation(value = "系统文件下载通用接口(流下载)") - @GetMapping("/api/file/downLoad") - @NoNeedLogin - public ResponseEntity downLoadById(Long id, HttpServletRequest request) { - return fileService.downLoadById(id, request); - } - - @ApiOperation(value = "系统文件保存通用接口") - @PostMapping("/api/file/save") - public ResponseDTO saveFile(@Valid @RequestBody FileAddDTO addDTO) { - RequestTokenBO requestToken = SmartRequestTokenUtil.getRequestUser(); - return fileService.saveFile(addDTO,requestToken); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/FileDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/FileDao.java deleted file mode 100644 index 3155bf25..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/FileDao.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.lab1024.smartadmin.module.support.file; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.module.support.file.domain.dto.FileDTO; -import net.lab1024.smartadmin.module.support.file.domain.dto.FileQueryDTO; -import net.lab1024.smartadmin.module.support.file.domain.entity.FileEntity; -import net.lab1024.smartadmin.module.support.file.domain.vo.FileVO; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * @author cyj - * @date 2018-01-05 上午 9:49 - */ -@Mapper -@Component -public interface FileDao extends BaseMapper { - - /** - * 批量添加上传文件 - * - * @param fileDTOList - * @return - */ - Integer insertFileBatch(List fileDTOList); - - - /** - * 批量添加上传文件 - * - * @param fileDTOList - * @return - */ - Integer insertFileEntityBatch(List fileDTOList); - - /** - * 批量删除 - * - * @param moduleId - * @return - */ - Integer deleteFilesByModuleId(@Param("moduleId") String moduleId); - - /** - * 批量删除 - * - * @param moduleId - * @param moduleType - * @return - */ - Integer deleteFilesByModuleIdAndModuleType(@Param("moduleId") String moduleId, @Param("moduleType") String moduleType); - - /** - * @param moduleId - * @return - */ - List listFilesByModuleId(@Param("moduleId") String moduleId); - - List listFilesByFileIds(@Param("fileIds") List fileIds); - - List listFilesByModuleIdAndModuleType(@Param("moduleId") String moduleId, @Param("moduleType") String moduleType); - - List listFilesByModuleIdAndModuleTypes(@Param("moduleId") String moduleId, @Param("moduleTypes") List moduleTypes); - - List listFilesByModuleIdsAndModuleType(@Param("moduleIds") List moduleIds, @Param("moduleType") String moduleType); - - List queryListByPage(Page page, @Param("queryDTO") FileQueryDTO queryDTO); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileModuleTypeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileModuleTypeEnum.java deleted file mode 100644 index 8052b767..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileModuleTypeEnum.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.constant; - -import net.lab1024.smartadmin.common.domain.BaseEnum; - -/** - * [] - * - * @author yandanyang - * @version 1.0 - * @since JDK1.8 - */ -public enum FileModuleTypeEnum implements BaseEnum { - - /** - * path 首字符不能包含\ 或者/ - */ - - BACK_USER(1, "backUser/config", "backUser"), - - CODE_REVIEW(2, "codeReview", "CodeReview"); - - private Integer value; - - private String path; - - private String desc; - - FileModuleTypeEnum(Integer value, String path, String desc) { - this.value = value; - this.path = path; - this.desc = desc; - } - - public String getPath() { - return path; - } - - @Override - public Integer getValue() { - return this.value; - } - - @Override - public String getDesc() { - return this.desc; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileResponseCodeConst.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileResponseCodeConst.java deleted file mode 100644 index fd5abfb9..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileResponseCodeConst.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.constant; - -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -public class FileResponseCodeConst extends ResponseCodeConst { - - /** - * 4001 -4999 - */ - public static final FileResponseCodeConst FILE_EMPTY = new FileResponseCodeConst(4001, "上传文件不存在!"); - - public static final FileResponseCodeConst FILE_SIZE_ERROR = new FileResponseCodeConst(4002, "上传文件超过%s,请重新上传!"); - - public static final FileResponseCodeConst UNKNOWN_FILE_TYPE = new FileResponseCodeConst(4003, "未知的文件类型!"); - - public static final FileResponseCodeConst LOCAL_UPDATE_PREFIX_ERROR = new FileResponseCodeConst(4004, "文件本地上传缺少URL前缀配置[local_upload_url_prefix]"); - - public static final FileResponseCodeConst UPLOAD_ERROR = new FileResponseCodeConst(4005, "上传失败"); - - public static final FileResponseCodeConst URL_ERROR = new FileResponseCodeConst(4006, "获取URL失败"); - - public static final FileResponseCodeConst FILE_MODULE_ERROR = new FileResponseCodeConst(4007, "文件目录类型错误"); - - public FileResponseCodeConst(int code, String msg) { - super(code, msg); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileServiceNameConst.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileServiceNameConst.java deleted file mode 100644 index 012cffbf..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileServiceNameConst.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.constant; -/** - * 文件服务名称常量 - * - * @author listen - * @date 2019/08/27 15:24 - */ -public class FileServiceNameConst { - - /** - * 阿里OSS文件服务 - */ - public static final String ALI_OSS = "ali_oss"; - - /** - * 七牛文件服务 - */ - public static final String QI_NIU_OSS = "qi_niu_oss"; - - /** - * 本地文件服务 - */ - public static final String LOCAL = "local"; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileServiceTypeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileServiceTypeEnum.java deleted file mode 100644 index 793503fc..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/constant/FileServiceTypeEnum.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.constant; - -import net.lab1024.smartadmin.common.domain.BaseEnum; - -/** - * 文件服务枚举类 - * - * @author listen - * @date 2019年8月27日 14:27:16 - */ -public enum FileServiceTypeEnum implements BaseEnum { - - /** - * 本地文件服务 - */ - LOCAL(1, FileServiceNameConst.LOCAL, "本地文件服务"), - - /** - * 阿里OSS文件服务 - */ - ALI_OSS(2, FileServiceNameConst.ALI_OSS, "阿里OSS文件服务"), - - /** - * 七牛文件服务 - */ - QI_NIU_OSS(3, FileServiceNameConst.QI_NIU_OSS, "七牛文件服务"); - - private Integer locationType; - - private String serviceName; - - private String desc; - - FileServiceTypeEnum(Integer locationType, String serviceName, String desc) { - this.locationType = locationType; - this.serviceName = serviceName; - this.desc = desc; - } - - public String getServiceName() { - return serviceName; - } - @Override - public Integer getValue() { - return this.locationType; - } - - @Override - public String getDesc() { - return this.desc; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/FileAddDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/FileAddDTO.java deleted file mode 100644 index b097df0a..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/FileAddDTO.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.domain.dto; - -import net.lab1024.smartadmin.common.anno.ApiModelPropertyEnum; -import net.lab1024.smartadmin.common.validator.en.CheckEnum; -import net.lab1024.smartadmin.module.support.file.constant.FileServiceTypeEnum; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; - -/** -* @Description: 文件保存DTO -* @Author: sbq -* @CreateDate: 2019/9/11 15:05 -* @Version: 1.0 -*/ -@Data -public class FileAddDTO { - - @ApiModelProperty("相关业务id(无业务可写死一个id)") - @NotBlank(message = "相关业务id不能为空") - private String moduleId; - - @ApiModelProperty("相关业务类型(无模块写1)") - @NotBlank(message = "相关业务类型不能为空") - private String moduleType; - - @ApiModelPropertyEnum(enumDesc = "文件类型",value = FileServiceTypeEnum.class) - @CheckEnum(enumClazz = FileServiceTypeEnum.class,message = "文件类型错误") - private Integer fileLocationType; - - @ApiModelProperty("文件名称") - @NotBlank(message = "文件名称不能为空") - private String fileName; - - @ApiModelProperty("文件路径") - @NotBlank(message = "文件路径不能为空") - private String filePath; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/FileQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/FileQueryDTO.java deleted file mode 100644 index 85df6375..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/FileQueryDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.domain.dto; - -import net.lab1024.smartadmin.common.anno.ApiModelPropertyEnum; -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import net.lab1024.smartadmin.common.validator.en.CheckEnum; -import net.lab1024.smartadmin.module.support.file.constant.FileModuleTypeEnum; -import net.lab1024.smartadmin.module.support.file.constant.FileServiceTypeEnum; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @Description: 文件信息查询dto - * @Author: sbq - * @CreateDate: 2019/7/3 17:38 - * @Version: 1.0 - */ -@Data -public class FileQueryDTO extends PageParamDTO { - - @ApiModelProperty(value = "文件名称") - private String fileName; - - @ApiModelProperty(value = "业务类型") - @ApiModelPropertyEnum(FileModuleTypeEnum.class) - @CheckEnum(enumClazz = FileModuleTypeEnum.class, message = "文件业务类型错误") - private Integer moduleType; - - @ApiModelProperty(value = "文件位置") - @ApiModelPropertyEnum(FileServiceTypeEnum.class) - @CheckEnum(enumClazz = FileServiceTypeEnum.class, message = "文件位置类型错误") - private Integer fileLocationType; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/OSSConfig.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/OSSConfig.java deleted file mode 100644 index 112ad4eb..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/dto/OSSConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.domain.dto; - -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/11 0011 下午 16:05 - * @since JDK1.8 - */ -@Data -public class OSSConfig { - - private String endpoint; - - private String accessKeyId; - - private String accessKeySecret; - - private String bucketName; - - @Override - public String toString() { - return "OSSConfig{" + - "endpoint='" + endpoint + '\'' + - ", accessKeyId='" + accessKeyId + '\'' + - ", accessKeySecret='" + accessKeySecret + '\'' + - ", bucketName='" + bucketName + '\'' + - '}'; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/entity/FileEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/entity/FileEntity.java deleted file mode 100644 index 38b0db3d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/entity/FileEntity.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - - -/** - * - * [ ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@Data -@TableName(value = "t_file") -public class FileEntity extends BaseEntity { - - - /** - * 相关业务id - */ - private String moduleId; - /** - * 相关业务类型 - */ - private String moduleType; - /** - * 文件位置类型 - */ - private Integer fileLocationType; - /** - * 文件名称 - */ - private String fileName; - /** - * 文件大小 - */ - private String fileSize; - /** - * 文件类型,程序中枚举控制,文件类型:如身份证正面,三证合一等等 - */ - private String fileType; - /** - * 文件key,用于文件下载 - */ - private String filePath; - /** - * 创建人,即上传人 - */ - private Long createrUser; - -} - diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/vo/FileVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/vo/FileVO.java deleted file mode 100644 index 7f101482..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/vo/FileVO.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.domain.vo; - -import net.lab1024.smartadmin.common.anno.ApiModelPropertyEnum; -import net.lab1024.smartadmin.module.support.file.constant.FileServiceTypeEnum; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.sql.Date; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Data -public class FileVO { - - @ApiModelProperty("主键") - private Long id; - - @ApiModelProperty("相关业务id") - private String moduleId; - - @ApiModelProperty("相关业务类型") - private String moduleType; - - @ApiModelPropertyEnum(FileServiceTypeEnum.class) - private Integer fileLocationType; - - @ApiModelProperty("文件名称") - private String fileName; - - @ApiModelProperty("文件大小") - private String fileSize; - - @ApiModelProperty("文件类型") - private String fileType; - - @ApiModelProperty("文件路径") - private String filePath; - - @ApiModelProperty("上传人") - private Long createUser; - - @ApiModelProperty("updateTime") - private Date updateTime; - - @ApiModelProperty("创建时间") - private Date createTime; - - @ApiModelProperty("文件展示url(可用于下载,注:七牛云下载url要拼接 ?attname=文件名.jpg)") - private String fileUrl; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/vo/UploadVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/vo/UploadVO.java deleted file mode 100644 index f878e7a7..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/domain/vo/UploadVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.domain.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2018/12/11 0011 上午 10:57 - * @since JDK1.8 - */ -@Data -public class UploadVO { - - @ApiModelProperty(value = "文件名称") - private String fileName; - @ApiModelProperty(value = "url") - private String url; - @ApiModelProperty(value = "filePath") - private String filePath; - @ApiModelProperty(value = "文件大小") - private Long fileSize; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileService.java deleted file mode 100644 index 9f645620..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileService.java +++ /dev/null @@ -1,198 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.service; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.support.file.FileDao; -import net.lab1024.smartadmin.module.support.file.constant.FileModuleTypeEnum; -import net.lab1024.smartadmin.module.support.file.constant.FileResponseCodeConst; -import net.lab1024.smartadmin.module.support.file.constant.FileServiceTypeEnum; -import net.lab1024.smartadmin.module.support.file.domain.dto.FileAddDTO; -import net.lab1024.smartadmin.module.support.file.domain.dto.FileDTO; -import net.lab1024.smartadmin.module.support.file.domain.dto.FileQueryDTO; -import net.lab1024.smartadmin.module.support.file.domain.entity.FileEntity; -import net.lab1024.smartadmin.module.support.file.domain.vo.FileVO; -import net.lab1024.smartadmin.module.support.file.domain.vo.UploadVO; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.util.SmartBaseEnumUtil; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartPageUtil; -import com.google.common.collect.Lists; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; -import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Service -public class FileService { - - @Autowired - private FileDao fileDao; - - @Autowired - private java.util.Map fileServiceMap; - - /** - * 获取文件服务实现 - * - * @param typeEnum - * @return - */ - private IFileService getFileService(FileServiceTypeEnum typeEnum) { - /** - * 获取文件服务 - */ - String serviceName = typeEnum.getServiceName(); - IFileService fileService = fileServiceMap.get(serviceName); - if (null == fileService) { - throw new RuntimeException("未找到文件服务实现类:" + serviceName); - } - return fileService; - } - - /** - * 文件上传服务 - * - * @param file - * @param typeEnum 文件服务类型枚举类 - * @param moduleType 文件夹类型 - * @return - */ - public ResponseDTO fileUpload(MultipartFile file, FileServiceTypeEnum typeEnum, Integer moduleType) { - FileModuleTypeEnum moduleTypeEnum = SmartBaseEnumUtil.getEnumByValue(moduleType, FileModuleTypeEnum.class); - if (null == moduleTypeEnum) { - return ResponseDTO.wrap(FileResponseCodeConst.FILE_MODULE_ERROR); - } - // 获取文件服务 - IFileService fileService = this.getFileService(typeEnum); - ResponseDTO response = fileService.fileUpload(file, moduleTypeEnum.getPath()); - return response; - } - - /** - * 根据文件绝对路径 获取文件URL - * - * @param path - * @return - */ - public ResponseDTO getFileUrl(String path, FileServiceTypeEnum typeEnum) { - IFileService fileService = this.getFileService(typeEnum); - return fileService.getFileUrl(path); - } - - /** - * 批量插入 - * - * @param fileDTOList - */ - public void insertFileBatch(List fileDTOList) { - fileDao.insertFileBatch(fileDTOList); - } - - /** - * 根据module 删除文件信息 - * - * @param moduleId - * @return - */ - public void deleteFilesByModuleId(String moduleId) { - fileDao.deleteFilesByModuleId(moduleId); - } - - /** - * 根据module 获取文件信息 - * - * @param moduleId - * @return - */ - public List listFilesByModuleId(String moduleId) { - return fileDao.listFilesByModuleId(moduleId); - } - - /** - * @param filesStr 逗号分隔文件id字符串 - * @return - */ - public List getFileDTOList(String filesStr) { - if (StringUtils.isEmpty(filesStr)) { - return Lists.newArrayList(); - } - String[] fileIds = filesStr.split(","); - List fileIdList = Arrays.asList(fileIds).stream().map(e -> Long.valueOf(e)).collect(Collectors.toList()); - List files = fileDao.listFilesByFileIds(fileIdList); - return files; - } - - /** - * 分页查询文件列表 - * - * @param queryDTO - * @return - */ - public ResponseDTO> queryListByPage(FileQueryDTO queryDTO) { - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - List fileList = fileDao.queryListByPage(page, queryDTO); - if (CollectionUtils.isNotEmpty(fileList)) { - fileList.forEach(e -> { - // 根据文件服务类 获取对应文件服务 查询 url - FileServiceTypeEnum serviceTypeEnum = SmartBaseEnumUtil.getEnumByValue(e.getFileLocationType(), FileServiceTypeEnum.class); - IFileService fileService = this.getFileService(serviceTypeEnum); - e.setFileUrl(fileService.getFileUrl(e.getFilePath()).getData()); - }); - } - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page, fileList); - return ResponseDTO.succData(pageResultDTO); - } - - /** - * 根据id 下载文件 - * - * @param id - * @param request - * @return - */ - public ResponseEntity downLoadById(Long id, HttpServletRequest request) { - FileEntity entity = fileDao.selectById(id); - if (null == entity) { - throw new RuntimeException("文件信息不存在"); - } - - // 根据文件服务类 获取对应文件服务 查询 url - FileServiceTypeEnum serviceTypeEnum = SmartBaseEnumUtil.getEnumByValue(entity.getFileLocationType(), FileServiceTypeEnum.class); - IFileService fileService = this.getFileService(serviceTypeEnum); - ResponseEntity stream = fileService.fileDownload(entity.getFilePath(), entity.getFileName(), request); - return stream; - } - - /** - * 系统文件保存通用接口 - * @param addDTO - * @return - */ - public ResponseDTO saveFile(FileAddDTO addDTO, RequestTokenBO requestToken) { - FileEntity entity = SmartBeanUtil.copy(addDTO,FileEntity.class); - entity.setCreaterUser(requestToken.getRequestUserId()); - entity.setCreateTime(new Date()); - fileDao.insert(entity); - return ResponseDTO.succ(); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceAliYun.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceAliYun.java deleted file mode 100644 index 15ae3feb..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceAliYun.java +++ /dev/null @@ -1,182 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.service; - -import com.aliyun.oss.OSSClient; -import com.aliyun.oss.model.OSSObject; -import com.aliyun.oss.model.ObjectMetadata; -import com.aliyun.oss.model.PutObjectRequest; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.support.file.constant.FileResponseCodeConst; -import net.lab1024.smartadmin.module.support.file.constant.FileServiceNameConst; -import net.lab1024.smartadmin.module.support.file.domain.dto.OSSConfig; -import net.lab1024.smartadmin.module.support.file.domain.vo.UploadVO; -import net.lab1024.smartadmin.module.system.systemconfig.SystemConfigService; -import net.lab1024.smartadmin.module.system.systemconfig.constant.SystemConfigEnum; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.util.FileCopyUtils; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/10 0010 上午 8:29 - * @since JDK1.8 - */ -@Slf4j -@Service(FileServiceNameConst.ALI_OSS) -public class FileServiceAliYun implements IFileService { - - @Autowired - private SystemConfigService systemConfigService; - - OSSClient ossClient = null; - - String accessConfig = null; - - @Override - public ResponseDTO fileUpload(MultipartFile multipartFile, String path) { - OSSConfig ossConfig = systemConfigService.selectByKey2Obj(SystemConfigEnum.Key.ALI_OSS.name(), OSSConfig.class); - try { - InputStream inputStream = new ByteArrayInputStream(multipartFile.getBytes()); - if (! ossConfig.toString().equals(accessConfig)) { - //accessKeyId 发生变动自动创建新的 - if (ossClient != null) { - ossClient.shutdown(); - } - ossClient = new OSSClient(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret()); - accessConfig = ossConfig.toString(); - } - String uuid = UUID.randomUUID().toString().replace("-", ""); - String ossPath = path + "/" + uuid; - String fileName = multipartFile.getOriginalFilename(); - String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1); - ObjectMetadata meta = new ObjectMetadata(); - meta.setContentDisposition("attachment;filename=" + fileName); - Map userMetadata = new HashMap(); - userMetadata.put("fileName", fileName); - userMetadata.put("fileExt", fileExt); - userMetadata.put("fileSize", String.valueOf(multipartFile.getSize())); - meta.setUserMetadata(userMetadata); - meta.setContentType(this.getContentType(fileExt)); - PutObjectRequest putObjectRequest = new PutObjectRequest(ossConfig.getBucketName(), ossPath, inputStream, meta); - ossClient.putObject(putObjectRequest); - UploadVO localUploadVO = new UploadVO(); - localUploadVO.setUrl(this.getUrl(ossPath, ossConfig.getBucketName(), ossClient)); - localUploadVO.setFileName(fileName); - localUploadVO.setFilePath(ossPath); - localUploadVO.setFileSize(multipartFile.getSize()); - return ResponseDTO.succData(localUploadVO); - } catch (Exception e) { - log.error("ALI UPLOAD ERROR : {}", e); - } - return ResponseDTO.wrap(FileResponseCodeConst.UPLOAD_ERROR); - } - - @Override - public ResponseDTO getFileUrl(String path) { - OSSConfig ossConfig = systemConfigService.selectByKey2Obj(SystemConfigEnum.Key.ALI_OSS.name(), OSSConfig.class); - try { - if (! ossConfig.toString().equals(accessConfig)) { - //accessKeyId 发生变动自动创建新的 - if (ossClient != null) { - ossClient.shutdown(); - } - ossClient = new OSSClient(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret()); - accessConfig = ossConfig.toString(); - } - String url = this.getUrl(path, ossConfig.getBucketName(), ossClient); - return ResponseDTO.succData(url); - } catch (Exception e) { - log.error("ALI getFileUrl ERROR : {}", e); - } - return ResponseDTO.wrap(FileResponseCodeConst.URL_ERROR); - } - - private String getUrl(String path, String bucketName, OSSClient ossClient) { - Date expiration = new Date(System.currentTimeMillis() + (60 * 60 * 1000)); - URL url = ossClient.generatePresignedUrl(bucketName, path, expiration); - return url.toString(); - } - - /** - * 流式下载(名称为原文件) - */ - @Override - public ResponseEntity fileDownload(String key, String fileName, HttpServletRequest request) { - File file = this.getFile(key, fileName); - if (file == null) { - throw new RuntimeException("文件不存在"); - } - return this.downloadMethod(file, request); - } - - /** - * 根据osskey获取文件 - * - * @param key - * @return - */ - public File getFile(String key, String fileName) { - OSSConfig ossConfig = systemConfigService.selectByKey2Obj(SystemConfigEnum.Key.ALI_OSS.name(), OSSConfig.class); - if (! ossConfig.toString().equals(accessConfig)) { - //accessKeyId 发生变动自动创建新的 - if (ossClient != null) { - ossClient.shutdown(); - } - ossClient = new OSSClient(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret()); - accessConfig = ossConfig.toString(); - } - //获取oss对象 - OSSObject ossObject = ossClient.getObject(ossConfig.getBucketName(), key); - if (StringUtils.isBlank(fileName)) { - // 获取元信息 - ObjectMetadata objectMetadata = ossObject.getObjectMetadata(); - // 获取下载时文件名 - Map userMetadata = objectMetadata.getUserMetadata(); - fileName = userMetadata == null ? "" : userMetadata.get("filename"); - if (StringUtils.isBlank(fileName)) { - fileName = objectMetadata.getContentDisposition(); - } - } - // 创建文件 - File file = new File(fileName); - // 获得输入流 - InputStream objectContent = ossObject.getObjectContent(); - try { - // 输入流转换为字节流 - byte[] buffer = FileCopyUtils.copyToByteArray(objectContent); - // 字节流写入文件 - FileCopyUtils.copy(buffer, file); - // 关闭输入流 - objectContent.close(); - } catch (IOException e) { - log.error("文件获取失败:" + e); - return null; - } finally { - try { - ossObject.close(); - } catch (IOException e) { - log.error("", e); - } - } - return file; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceLocal.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceLocal.java deleted file mode 100644 index 08aac36d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceLocal.java +++ /dev/null @@ -1,123 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.service; - -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.support.file.constant.FileResponseCodeConst; -import net.lab1024.smartadmin.module.support.file.constant.FileServiceNameConst; -import net.lab1024.smartadmin.module.support.file.domain.vo.UploadVO; -import net.lab1024.smartadmin.module.system.systemconfig.SystemConfigDao; -import net.lab1024.smartadmin.module.system.systemconfig.constant.SystemConfigEnum; -import net.lab1024.smartadmin.module.system.systemconfig.domain.entity.SystemConfigEntity; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; -import java.io.File; -import java.io.IOException; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/11 0011 下午 16:15 - * @since JDK1.8 - */ -@Slf4j -@Service(FileServiceNameConst.LOCAL) -public class FileServiceLocal implements IFileService { - - @Autowired - private SystemConfigDao systemConfigDao; - - @Value("${spring.servlet.multipart.max-file-size}") - private String maxFileSize; - - @Value("${file-upload-service.path}") - private String fileParentPath; - - private static final Long DEFAULT_SIZE = 10 * 1024 * 1024L; - - @Override - public ResponseDTO fileUpload(MultipartFile multipartFile, String path) { - if (null == multipartFile) { - return ResponseDTO.wrap(FileResponseCodeConst.FILE_EMPTY); - } - Long maxSize = DEFAULT_SIZE; - if (StringUtils.isNotEmpty(maxFileSize)) { - String maxSizeStr = maxFileSize.toLowerCase().replace("mb", ""); - maxSize = Integer.valueOf(maxSizeStr) * 1024 * 1024L; - } - if (multipartFile.getSize() > maxSize) { - return ResponseDTO.wrap(FileResponseCodeConst.FILE_SIZE_ERROR, String.format(FileResponseCodeConst.FILE_SIZE_ERROR.getMsg(), maxFileSize)); - } - String filePath = fileParentPath; - String urlParent = this.localUrlPrefix(); - if (urlParent == null) { - return ResponseDTO.wrap(FileResponseCodeConst.LOCAL_UPDATE_PREFIX_ERROR); - } - if (StringUtils.isNotEmpty(path)) { - filePath = filePath + path + "/"; - urlParent = urlParent + path + "/"; - } - File directory = new File(filePath); - if (!directory.exists()) { - // 目录不存在,新建 - directory.mkdirs(); - } - UploadVO localUploadVO = new UploadVO(); - String newFileName; - File fileTemp; - String originalFileName; - originalFileName = multipartFile.getOriginalFilename(); - newFileName = this.generateFileName(originalFileName); - fileTemp = new File(new File(filePath + newFileName).getAbsolutePath()); - try { - multipartFile.transferTo(fileTemp); - localUploadVO.setUrl(urlParent + newFileName); - localUploadVO.setFileName(newFileName); - localUploadVO.setFilePath(path + "/" + newFileName); - localUploadVO.setFileSize(multipartFile.getSize()); - } catch (IOException e) { - if (fileTemp.exists() && fileTemp.isFile()) { - fileTemp.delete(); - } - log.error("", e); - return ResponseDTO.wrap(FileResponseCodeConst.UPLOAD_ERROR); - } - return ResponseDTO.succData(localUploadVO); - } - - @Override - public ResponseDTO getFileUrl(String path) { - String urlParent = this.localUrlPrefix(); - if (urlParent == null) { - return ResponseDTO.wrap(FileResponseCodeConst.LOCAL_UPDATE_PREFIX_ERROR); - } - String url = urlParent + path; - return ResponseDTO.succData(url); - } - - private String localUrlPrefix() { - SystemConfigEntity configEntity = systemConfigDao.getByKey(SystemConfigEnum.Key.LOCAL_UPLOAD_URL_PREFIX.name()); - if (configEntity == null) { - return null; - } - return configEntity.getConfigValue(); - } - - @Override - public ResponseEntity fileDownload(String key, String fileName, HttpServletRequest request) { - - String url = fileParentPath + key; - // 创建文件 - File file = new File(url); - return this.downloadMethod(file, request); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceQiNiuYun.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceQiNiuYun.java deleted file mode 100644 index 394b7af8..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/FileServiceQiNiuYun.java +++ /dev/null @@ -1,175 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.service; - -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.support.file.constant.FileResponseCodeConst; -import net.lab1024.smartadmin.module.support.file.constant.FileServiceNameConst; -import net.lab1024.smartadmin.module.support.file.domain.dto.OSSConfig; -import net.lab1024.smartadmin.module.support.file.domain.vo.UploadVO; -import net.lab1024.smartadmin.module.system.systemconfig.SystemConfigService; -import net.lab1024.smartadmin.module.system.systemconfig.constant.SystemConfigEnum; -import com.qiniu.http.Response; -import com.qiniu.storage.Configuration; -import com.qiniu.storage.UploadManager; -import com.qiniu.util.Auth; -import lombok.extern.slf4j.Slf4j; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.ResponseBody; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.util.FileCopyUtils; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLEncoder; -import java.util.UUID; - -/** - * [ 七牛云 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/10 0010 上午 8:30 - * @since JDK1.8 - */ -@Slf4j -@Service(FileServiceNameConst.QI_NIU_OSS) -public class FileServiceQiNiuYun implements IFileService { - - //1小时,可以自定义链接过期时间 - private static final Long expireInSeconds = 3600L; - - @Autowired - private SystemConfigService systemConfigService; - - UploadManager ossClient = null; - - String accessConfig = null; - - String token = null; - - @Override - public ResponseDTO fileUpload(MultipartFile multipartFile, String path) { - OSSConfig ossConfig = systemConfigService.selectByKey2Obj(SystemConfigEnum.Key.QI_NIU_OSS.name(), OSSConfig.class); - try { - InputStream inputStream = new ByteArrayInputStream(multipartFile.getBytes()); - if (! ossConfig.toString().equals(accessConfig)) { - //accessKeyId 发生变动自动重新创建新的UploadManager - ossClient = new UploadManager(new Configuration()); - token = Auth.create(ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret()). - uploadToken(ossConfig.getBucketName()); - accessConfig = ossConfig.toString(); - } - String uuid = UUID.randomUUID().toString().replace("-", ""); - String ossPath = path + "/" + uuid; - String fileName = multipartFile.getOriginalFilename(); - String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1); - String mime = this.getContentType(fileExt); - Response res = ossClient.put(inputStream, ossPath, token, null, mime); - if (! res.isOK()) { - log.error("QINIU fileUpload ERROR : {}", res.toString()); - return ResponseDTO.wrap(FileResponseCodeConst.UPLOAD_ERROR); - } - UploadVO localUploadVO = new UploadVO(); - localUploadVO.setUrl(this.getFileUrl(ossPath).getData()); - localUploadVO.setFileName(fileName); - localUploadVO.setFilePath(ossPath); - localUploadVO.setFileSize(multipartFile.getSize()); - return ResponseDTO.succData(localUploadVO); - } catch (Exception e) { - log.error("QINIU fileUpload ERROR : {}", e); - } - return ResponseDTO.wrap(FileResponseCodeConst.UPLOAD_ERROR); - } - - @Override - public ResponseDTO getFileUrl(String path) { - OSSConfig ossConfig = systemConfigService.selectByKey2Obj(SystemConfigEnum.Key.QI_NIU_OSS.name(), OSSConfig.class); - try { - if (! ossConfig.toString().equals(accessConfig)) { - //accessKeyId 发生变动自动重新创建新的UploadManager - ossClient = new UploadManager(new Configuration()); - token = Auth.create(ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret()). - uploadToken(ossConfig.getBucketName()); - accessConfig = ossConfig.toString(); - } - String encodedFileName = URLEncoder.encode(path, "utf-8"); - String domainOfBucket = ossConfig.getEndpoint(); - String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName); - String accessKey = ossConfig.getAccessKeyId(); - String secretKey = ossConfig.getAccessKeySecret(); - Auth auth = Auth.create(accessKey, secretKey); - //1小时,可以自定义链接过期时间 - long expireInSeconds = 3600; - String finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds); - return ResponseDTO.succData(finalUrl); - } catch (Exception e) { - log.error("QINIU getFileUrl ERROR : {}", e); - } - return ResponseDTO.wrap(FileResponseCodeConst.URL_ERROR); - } - - @Override - public ResponseEntity fileDownload(String key, String fileName, HttpServletRequest request) { - File file = this.getFile(key, fileName); - if (file == null) { - throw new RuntimeException("文件不存在"); - } - return this.downloadMethod(file, request); - } - - /** - * 获取下载路径 - */ - public String getDownloadUrl(String key) { - OSSConfig ossConfig = systemConfigService.selectByKey2Obj(SystemConfigEnum.Key.QI_NIU_OSS.name(), OSSConfig.class); - String domainOfBucket = ossConfig.getEndpoint(); - String finalUrl = ""; - try { - String encodedFileName = URLEncoder.encode(key, "utf-8").replace("+", "%20"); - String publicUrl = String.format("%s/%s", domainOfBucket, encodedFileName); - Auth auth = Auth.create(ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret()); - finalUrl = auth.privateDownloadUrl(publicUrl, expireInSeconds); - } catch (Exception e) { - log.error("QINIU download ERROR : {}", e); - } - return finalUrl; - } - - /** - * 获取文件 - */ - public File getFile(String key, String fileName) { - String finalUrl = getDownloadUrl(key); - OkHttpClient client = new OkHttpClient(); - Request req = new Request.Builder().url(finalUrl).build(); - okhttp3.Response resp = null; - File file = new File(fileName); - try { - resp = client.newCall(req).execute(); - if (resp.isSuccessful()) { - ResponseBody body = resp.body(); - InputStream objectContent = body.byteStream(); - // 输入流转换为字节流 - byte[] buffer = FileCopyUtils.copyToByteArray(objectContent); - // 字节流写入文件 - FileCopyUtils.copy(buffer, file); - // 关闭输入流 - objectContent.close(); - } - - } catch (IOException e) { - log.error("文件获取失败:" + e); - return null; - } finally { - } - return file; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/IFileService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/IFileService.java deleted file mode 100644 index a818ae42..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/file/service/IFileService.java +++ /dev/null @@ -1,152 +0,0 @@ -package net.lab1024.smartadmin.module.support.file.service; - -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.support.file.domain.vo.UploadVO; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.util.FileCopyUtils; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletRequest; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.UUID; - -/** - * 文件服务接口 - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/5/11 0011 下午 16:42 - * @since JDK1.8 - */ -public interface IFileService { - - /** - * 文件上传 - * - * @param multipartFile - * @param path - * @return - */ - ResponseDTO fileUpload(MultipartFile multipartFile, String path); - - /** - * 获取文件url - * - * @param path - * @return - */ - ResponseDTO getFileUrl(String path); - - /** - * 文件下载 - * - * @param key - * @param fileName - * @param request - * @return - */ - ResponseEntity fileDownload(String key, String fileName, HttpServletRequest request); - - /** - * 生成文件名字 - * 当前年月日时分秒 +32位 uuid + 文件格式后缀 - * - * @param originalFileName - * @return String - */ - default String generateFileName(String originalFileName) { - String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddhhmms")); - String uuid = UUID.randomUUID().toString().replaceAll("-", ""); - String fileType = originalFileName.substring(originalFileName.lastIndexOf(".")); - return time + uuid + fileType; - } - - /** - * 获取文件类型 - * - * @param fileExt - * @return - */ - default String getContentType(String fileExt) { - // 文件的后缀名 - if ("bmp".equalsIgnoreCase(fileExt)) { - return "image/bmp"; - } - if ("gif".equalsIgnoreCase(fileExt)) { - return "image/gif"; - } - if ("jpeg".equalsIgnoreCase(fileExt) || "jpg".equalsIgnoreCase(fileExt) || ".png".equalsIgnoreCase(fileExt)) { - return "image/jpeg"; - } - if ("png".equalsIgnoreCase(fileExt)) { - return "image/png"; - } - if ("html".equalsIgnoreCase(fileExt)) { - return "text/html"; - } - if ("txt".equalsIgnoreCase(fileExt)) { - return "text/plain"; - } - if ("vsd".equalsIgnoreCase(fileExt)) { - return "application/vnd.visio"; - } - if ("ppt".equalsIgnoreCase(fileExt) || "pptx".equalsIgnoreCase(fileExt)) { - return "application/vnd.ms-powerpoint"; - } - if ("doc".equalsIgnoreCase(fileExt) || "docx".equalsIgnoreCase(fileExt)) { - return "application/msword"; - } - if ("xml".equalsIgnoreCase(fileExt)) { - return "text/xml"; - } - return ""; - } - - default ResponseEntity downloadMethod(File file, HttpServletRequest request) { - HttpHeaders heads = new HttpHeaders(); - heads.add(HttpHeaders.CONTENT_TYPE, "application/octet-stream; charset=utf-8"); - String fileName = file.getName(); - try { - if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) { - // firefox浏览器 - fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); - } else if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) { - // IE浏览器 - fileName = URLEncoder.encode(fileName, "UTF-8"); - } else if (request.getHeader("User-Agent").toUpperCase().indexOf("EDGE") > 0) { - // WIN10浏览器 - fileName = URLEncoder.encode(fileName, "UTF-8"); - } else if (request.getHeader("User-Agent").toUpperCase().indexOf("CHROME") > 0) { - // 谷歌 - fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1"); - } else { - //万能乱码问题解决 - fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); - } - } catch (UnsupportedEncodingException e) { - // log.error("", e); - } - heads.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + fileName); - try { - InputStream in = new FileInputStream(file); - // 输入流转换为字节流 - byte[] buffer = FileCopyUtils.copyToByteArray(in); - ResponseEntity responseEntity = new ResponseEntity<>(buffer, heads, HttpStatus.OK); - //file.delete(); - return responseEntity; - } catch (Exception e) { - // log.error("", e); - } - return null; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatController.java deleted file mode 100644 index a9671255..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatController.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.lab1024.smartadmin.module.support.heartbeat; - -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - - -@Api(tags = {SwaggerTagConst.Admin.MANAGER_HEART_BEAT}) -@OperateLog -@RestController -public class HeartBeatController { - - @Autowired - private HeartBeatService heartBeatService; - - @PostMapping("/heartBeat/query") - @ApiOperation("查询心跳记录 @author zhuoda") - public ResponseDTO> query(@RequestBody @Valid PageParamDTO pageParamDTO){ - return heartBeatService.pageQuery(pageParamDTO); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatService.java deleted file mode 100644 index b474c174..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/heartbeat/HeartBeatService.java +++ /dev/null @@ -1,90 +0,0 @@ -package net.lab1024.smartadmin.module.support.heartbeat; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.common.heartbeat.AbstractHeartBeatCommand; -import net.lab1024.smartadmin.common.heartbeat.HeartBeatConfig; -import net.lab1024.smartadmin.common.heartbeat.HeartBeatLogger; -import net.lab1024.smartadmin.common.heartbeat.HeartBeatRecordDTO; -import net.lab1024.smartadmin.config.SmartHeartBeatConfig; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartPageUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Slf4j -@Service -public class HeartBeatService extends AbstractHeartBeatCommand { - - @Autowired - private HeartBeatRecordDao heartBeatRecordDao; - - @Autowired - private SmartHeartBeatConfig heartBeatConfig; - - @PostConstruct - public void init() { - - HeartBeatConfig config = HeartBeatConfig.builder().delayHandlerTime(heartBeatConfig.getDelayHandlerTime()).intervalTime(heartBeatConfig.getIntervalTime()).build(); - - super.init(config, new HeartBeatLogger() { - @Override - public void error(String string) { - log.error(string); - } - - @Override - public void error(String string, Throwable e) { - log.error(string, e); - } - - @Override - public void info(String string) { - log.info(string); - } - }); - } - - @PreDestroy - @Override - public void destroy() { - super.destroy(); - } - - @Override - public void handler(HeartBeatRecordDTO heartBeatRecordDTO) { - HeartBeatRecordEntity heartBeatRecordEntity = SmartBeanUtil.copy(heartBeatRecordDTO, HeartBeatRecordEntity.class); - HeartBeatRecordEntity heartBeatRecordOld = heartBeatRecordDao.query(heartBeatRecordEntity); - if (heartBeatRecordOld == null) { - heartBeatRecordDao.insertHeartBeat(heartBeatRecordEntity); - } else { - heartBeatRecordDao.updateHeartBeatTimeById(heartBeatRecordOld.getId(), heartBeatRecordEntity.getHeartBeatTime()); - } - - } - - public ResponseDTO> pageQuery(PageParamDTO pageParamDTO) { - Page pageQueryInfo = SmartPageUtil.convert2QueryPage(pageParamDTO); - List recordVOList = heartBeatRecordDao.pageQuery(pageQueryInfo); - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(pageQueryInfo, recordVOList); - return ResponseDTO.succData(pageResultDTO); - - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorDao.java deleted file mode 100644 index e6e1341e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorDao.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.lab1024.smartadmin.module.support.idgenerator; - - -import net.lab1024.smartadmin.module.support.idgenerator.domain.IdGeneratorEntity; -import net.lab1024.smartadmin.module.support.idgenerator.domain.IdGeneratorLastNumberDTO; -import net.lab1024.smartadmin.module.support.idgenerator.domain.IdGeneratorRecordDTO; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * - * zhuo - */ -@Mapper -public interface IdGeneratorDao { - - IdGeneratorLastNumberDTO selectLastNumber(Long id); - - List selectAll(); - - void updateLastNumber(@Param("generatorId") Long generatorId, @Param("lastNumber") Long lastNumber); - - int replaceIdGeneratorRecord(@Param("generatorId") Long generatorId,// - @Param("year") int year,// - @Param("month") int month,// - @Param("day") int day,// - @Param("lastNumber") Long lastNumber); - - IdGeneratorRecordDTO selectHistoryLastNumber(@Param("generatorId") Long generatorId, - @Param("year") int year, - @Param("month") int month, - @Param("day") int day); - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorManager.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorManager.java deleted file mode 100644 index 1b2a926d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorManager.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.lab1024.smartadmin.module.support.idgenerator; - -import net.lab1024.smartadmin.common.exception.SmartBusinessException; -import net.lab1024.smartadmin.module.support.idgenerator.domain.IdGeneratorLastNumberDTO; -import net.lab1024.smartadmin.module.support.idgenerator.domain.IdGeneratorPOJO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.util.Date; - -/** - * 全局id生成器 - * zhuo - */ -@Service -public class IdGeneratorManager { - - @Autowired - private IdGeneratorDao idGeneratorDao; - - @Transactional(rollbackFor = Exception.class) - public long[] generate(IdGeneratorPOJO idGeneratorPOJO, int stepLength) { - IdGeneratorLastNumberDTO idGeneratorLastNumberDTO = idGeneratorDao.selectLastNumber(idGeneratorPOJO.getIdGeneratorEntity().getId()); - if (idGeneratorLastNumberDTO == null) { - throw new SmartBusinessException("IdGenerator, id 数据库不存在" + idGeneratorPOJO.getIdGeneratorEntity().getId()); - } - - Long lastNumber = idGeneratorLastNumberDTO.getLastNumber(); - if (lastNumber == null) { - lastNumber = idGeneratorPOJO.getIdGeneratorEntity().getInitNumber(); - } else { - lastNumber = lastNumber + 1; - } - - Date updateTime = idGeneratorLastNumberDTO.getUpdateTime(); - if (updateTime == null) { - updateTime = idGeneratorLastNumberDTO.getDatabaseTime(); - } - - Long startValue = -1L, endValue = -1L; - switch (idGeneratorPOJO.getIdGeneratorRuleTypeEnum()) { - case NO_CYCLE: - startValue = lastNumber.longValue(); - endValue = startValue + stepLength; - break; - default: - SimpleDateFormat format = new SimpleDateFormat(idGeneratorPOJO.getIdGeneratorRuleTypeEnum().getExt()); - if (format.format(idGeneratorLastNumberDTO.getDatabaseTime()).equals(format.format(updateTime))) { - startValue = lastNumber.longValue(); - endValue = startValue + stepLength; - } else { - startValue = idGeneratorPOJO.getIdGeneratorEntity().getInitNumber(); - endValue = startValue + stepLength; - } - break; - } - - idGeneratorDao.updateLastNumber(idGeneratorPOJO.getIdGeneratorEntity().getId(), endValue - 1); - LocalDate localDate = LocalDate.now(); - idGeneratorDao.replaceIdGeneratorRecord(idGeneratorPOJO.getIdGeneratorEntity().getId(), localDate.getYear(), localDate.getMonthValue(), localDate.getDayOfMonth(), endValue - 1); - return new long[]{startValue, endValue}; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorService.java deleted file mode 100644 index ca5d581b..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/IdGeneratorService.java +++ /dev/null @@ -1,140 +0,0 @@ -package net.lab1024.smartadmin.module.support.idgenerator; - -import net.lab1024.smartadmin.common.exception.SmartBusinessException; -import net.lab1024.smartadmin.module.support.idgenerator.constant.IdGeneratorEnum; -import net.lab1024.smartadmin.module.support.idgenerator.constant.IdGeneratorRuleTypeEnum; -import net.lab1024.smartadmin.module.support.idgenerator.domain.IdGeneratorEntity; -import net.lab1024.smartadmin.module.support.idgenerator.domain.IdGeneratorPOJO; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 全局id生成器 - * zhuo - */ -@Slf4j -@Service -public class IdGeneratorService { - - private Map idGeneratorMap; - - @Autowired - private IdGeneratorDao idGeneratorDao; - - @Autowired - private IdGeneratorManager idGeneratorManager; - - @PostConstruct - void init() { - this.idGeneratorMap = new ConcurrentHashMap<>(); - List idGeneratorEntities = idGeneratorDao.selectAll(); - if (idGeneratorEntities != null) { - idGeneratorEntities.forEach(e -> { - IdGeneratorRuleTypeEnum idGeneratorRuleTypeEnum = this.getIdGeneratorRuleTypeEnum(e.getRuleType()); - if (idGeneratorRuleTypeEnum != null) { - IdGeneratorPOJO idGeneratorPOJO = new IdGeneratorPOJO(idGeneratorRuleTypeEnum, e); - String ruleFormat = e.getRuleFormat(); - int startNInx = ruleFormat.indexOf("[n"); - int endNInx = ruleFormat.indexOf("n]"); - idGeneratorPOJO.setNumberCount(endNInx - startNInx); - idGeneratorPOJO.setHaveDay(ruleFormat.contains("[dd]")); - idGeneratorPOJO.setHaveMonth(ruleFormat.contains("[mm]")); - idGeneratorPOJO.setHaveYear(ruleFormat.contains("[yyyy]")); - this.idGeneratorMap.put(e.getId(), idGeneratorPOJO); - } else { - log.error("cannot find rule type , id : {}, key name : {} ", e.getId(), e.getKeyName()); - } - }); - } - } - - public String generate(IdGeneratorEnum idGeneratorEnum) { - return generate(idGeneratorEnum, 1).get(0); - } - - /** - * @param idGeneratorEnum - * @param stepLength - * @return - */ - public List generate(IdGeneratorEnum idGeneratorEnum, int stepLength) { - IdGeneratorPOJO idGeneratorPOJO = validateParams(idGeneratorEnum, stepLength); - long[] generateIds = idGeneratorManager.generate(idGeneratorPOJO, stepLength); - Long startValue = generateIds[0], endValue = generateIds[1]; - LocalDate now = LocalDate.now(); - String year = String.valueOf(now.getYear()); - String month = now.getMonthValue() > 9 ? String.valueOf(now.getMonthValue()) : "0" + now.getMonthValue(); - String day = now.getDayOfMonth() > 9 ? String.valueOf(now.getDayOfMonth()) : "0" + now.getDayOfMonth(); - ArrayList codeList = new ArrayList<>(); - for (long loop = startValue; loop < endValue; loop++) { - String generateBillCode = this.replaceAndFill(idGeneratorPOJO, loop, year, month, day); - codeList.add(generateBillCode); - } - return codeList; - } - - private IdGeneratorRuleTypeEnum getIdGeneratorRuleTypeEnum(String ruleType) { - for (IdGeneratorRuleTypeEnum en : IdGeneratorRuleTypeEnum.values()) { - if (en.name().equalsIgnoreCase(ruleType)) { - return en; - } - } - return null; - } - - private IdGeneratorPOJO validateParams(IdGeneratorEnum idGeneratorEnum, int stepLength) { - if (stepLength < 1) { - throw new SmartBusinessException("IdGenerator, step过短" + stepLength); - } - - IdGeneratorPOJO idGeneratorPOJO = this.idGeneratorMap.get(idGeneratorEnum.getId()); - if (idGeneratorPOJO == null) { - throw new SmartBusinessException("IdGenerator, id 不存在" + idGeneratorEnum); - } - return idGeneratorPOJO; - } - - /** - * 替换特殊rule,即替换[yyyy][mm][dd][nnn]等规则 - */ - private String replaceAndFill(IdGeneratorPOJO idGeneratorPOJO, Long number, String year, String month, String day) { - StringBuilder numberStringBuilder = new StringBuilder(); - int curNumberCount = String.valueOf(number).length(); - - if (idGeneratorPOJO.getNumberCount() > curNumberCount) { - int remain = idGeneratorPOJO.getNumberCount() - curNumberCount; - for (int i = 0; i < remain; i++) { - numberStringBuilder.append(0); - } - } - numberStringBuilder.append(number); - - StringBuilder nStringBuilder = new StringBuilder(); - nStringBuilder.append("\\["); - for (int i = 0; i < idGeneratorPOJO.getNumberCount(); i++) { - nStringBuilder.append("n"); - } - nStringBuilder.append("\\]"); - - String tempRuleFormat = new String(idGeneratorPOJO.getIdGeneratorEntity().getRuleFormat().getBytes()); - if (idGeneratorPOJO.isHaveYear()) { - tempRuleFormat = tempRuleFormat.replaceAll("\\[yyyy\\]", year); - } - if (idGeneratorPOJO.isHaveMonth()) { - tempRuleFormat = tempRuleFormat.replaceAll("\\[mm\\]", month); - } - if (idGeneratorPOJO.isHaveDay()) { - tempRuleFormat = tempRuleFormat.replaceAll("\\[dd\\]", day); - } - - return tempRuleFormat.replaceAll(nStringBuilder.toString(), numberStringBuilder.toString()); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/constant/IdGeneratorEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/constant/IdGeneratorEnum.java deleted file mode 100644 index 79cebd0e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/constant/IdGeneratorEnum.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lab1024.smartadmin.module.support.idgenerator.constant; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/8 0008 下午 13:43 - * @since JDK1.8 - */ -public enum IdGeneratorEnum { - - - /** - * 测试generate - */ - TEST_ID_GENERATOR(2, "testIdGenerator"), - - - ORDER(1, "order"); - - private long id; - private String keyName; - - IdGeneratorEnum(int id, String keyName) { - this.id = id; - this.keyName = keyName; - } - - @Override - public String toString() { - return "IdGeneratorEnum{" + "id=" + id + ", keyName='" + keyName + '\'' + '}'; - } - - public long getId() { - return id; - } - - public String getKeyName() { - return keyName; - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorEntity.java deleted file mode 100644 index e1d64ffc..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorEntity.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lab1024.smartadmin.module.support.idgenerator.domain; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -import java.io.Serializable; -import java.util.Date; - -/** - * @author sun - * @Auther: anders - * @Date: 2018/8/7 0007 13:33 - * @Description: - */ -@Data -@TableName(value = "t_id_generator") -public class IdGeneratorEntity extends BaseEntity implements Serializable { - - private static final long serialVersionUID = 5582354131134766548L; - /** - * 英文key - */ - private String keyName; - /** - * 规则格式 - */ - private String ruleFormat; - /** - * 类型 - */ - private String ruleType; - /** - * 初始值 - */ - private Long initNumber; - /** - * 上次产生的id - */ - private Long lastNumber; - /** - * 备注 - */ - private String remark; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorLastNumberDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorLastNumberDTO.java deleted file mode 100644 index 69af325e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorLastNumberDTO.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.lab1024.smartadmin.module.support.idgenerator.domain; - -import java.util.Date; - -/** - * @Auther: yandanyang - * @Date: 2018/8/7 0007 13:33 - * @Description: - */ -public class IdGeneratorLastNumberDTO { - private Date updateTime; - private Long lastNumber; - private Date databaseTime; - - public Date getUpdateTime() { - return updateTime; - } - - public void setUpdateTime(Date updateTime) { - this.updateTime = updateTime; - } - - public Long getLastNumber() { - return lastNumber; - } - - public void setLastNumber(Long lastNumber) { - this.lastNumber = lastNumber; - } - - public Date getDatabaseTime() { - return databaseTime; - } - - public void setDatabaseTime(Date databaseTime) { - this.databaseTime = databaseTime; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorPOJO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorPOJO.java deleted file mode 100644 index 6cd93931..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorPOJO.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.lab1024.smartadmin.module.support.idgenerator.domain; - -import net.lab1024.smartadmin.module.support.idgenerator.constant.IdGeneratorRuleTypeEnum; - -/** - * @Auther: yandanyang - * @Date: 2018/8/7 0007 13:33 - * @Description: - */ -public class IdGeneratorPOJO { - - private IdGeneratorRuleTypeEnum idGeneratorRuleTypeEnum; - private IdGeneratorEntity idGeneratorEntity; - private int numberCount = 0; - private boolean haveYear = false; - private boolean haveMonth = false; - private boolean haveDay = false; - - public IdGeneratorPOJO(IdGeneratorRuleTypeEnum idGeneratorRuleTypeEnum, IdGeneratorEntity idGeneratorEntity) { - this.idGeneratorRuleTypeEnum = idGeneratorRuleTypeEnum; - this.idGeneratorEntity = idGeneratorEntity; - } - - public IdGeneratorRuleTypeEnum getIdGeneratorRuleTypeEnum() { - return idGeneratorRuleTypeEnum; - } - - public void setIdGeneratorRuleTypeEnum(IdGeneratorRuleTypeEnum idGeneratorRuleTypeEnum) { - this.idGeneratorRuleTypeEnum = idGeneratorRuleTypeEnum; - } - - public IdGeneratorEntity getIdGeneratorEntity() { - return idGeneratorEntity; - } - - public void setIdGeneratorEntity(IdGeneratorEntity idGeneratorEntity) { - this.idGeneratorEntity = idGeneratorEntity; - } - - public int getNumberCount() { - return numberCount; - } - - public void setNumberCount(int numberCount) { - this.numberCount = numberCount; - } - - public boolean isHaveYear() { - return haveYear; - } - - public void setHaveYear(boolean haveYear) { - this.haveYear = haveYear; - } - - public boolean isHaveMonth() { - return haveMonth; - } - - public void setHaveMonth(boolean haveMonth) { - this.haveMonth = haveMonth; - } - - public boolean isHaveDay() { - return haveDay; - } - - public void setHaveDay(boolean haveDay) { - this.haveDay = haveDay; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorRecordDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorRecordDTO.java deleted file mode 100644 index 50f79b1e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/idgenerator/domain/IdGeneratorRecordDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.lab1024.smartadmin.module.support.idgenerator.domain; - -import lombok.Data; - -/** - * @Auther: yandanyang - * @Date: 2018/8/7 0007 13:33 - * @Description: - */ -@Data -public class IdGeneratorRecordDTO { - - private Long generatorId; - - private Integer year; - - private Integer month; - - private Integer day; - - private Long lastNumber; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/QuartzConst.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/QuartzConst.java deleted file mode 100644 index 949da2bc..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/QuartzConst.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.constant; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 15:21 - * @since JDK1.8 - */ -public class QuartzConst { - public static final String QUARTZ_PARAMS_KEY="TASK_PARAMS"; - public static final String JOB_KEY_PREFIX="TASK_"; - public static final String TRIGGER_KEY_PREFIX="TRIGGER_"; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/TaskResultEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/TaskResultEnum.java deleted file mode 100644 index df5fbc5d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/TaskResultEnum.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.constant; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 14:19 - * @since JDK1.8 - */ -public enum TaskResultEnum { - - SUCCESS(0,"成功"), - /** - * - */ - FAIL(1,"失败"); - - public static final String INFO="0:成功,1:失败"; - - private Integer status; - - private String desc; - - TaskResultEnum(Integer status , String desc) { - this.status = status; - this.desc = desc; - } - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/TaskStatusEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/TaskStatusEnum.java deleted file mode 100644 index 9a7f9bd7..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/constant/TaskStatusEnum.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.constant; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 14:19 - * @since JDK1.8 - */ -public enum TaskStatusEnum { - - NORMAL(0,"正常"), - /** - * - */ - PAUSE(1,"暂停"); - - public static final String INFO="0:正常,1:暂停"; - - private Integer status; - - private String desc; - - TaskStatusEnum(Integer status ,String desc) { - this.status = status; - this.desc = desc; - } - - public Integer getStatus() { - return status; - } - - public void setStatus(Integer status) { - this.status = status; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/controller/QuartzController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/controller/QuartzController.java deleted file mode 100644 index 59a71ad3..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/controller/QuartzController.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.controller; - -import net.lab1024.smartadmin.common.anno.NoValidPrivilege; -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.support.quartz.service.QuartzTaskService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import net.lab1024.smartadmin.module.support.quartz.domain.dto.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - * - * [ ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@OperateLog -@RestController -@Api(tags = {SwaggerTagConst.Admin.MANAGER_TASK_SCHEDULER}) -public class QuartzController { - - @Autowired - private QuartzTaskService quartzTaskService; - - - @PostMapping("/quartz/task/query") - @ApiOperation(value = "查询任务") - @NoValidPrivilege - public ResponseDTO> query(@RequestBody @Valid QuartzQueryDTO queryDTO){ - return quartzTaskService.query(queryDTO); - } - - - @PostMapping("/quartz/task/queryLog") - @ApiOperation(value = "查询任务运行日志") - @NoValidPrivilege - public ResponseDTO> queryLog(@RequestBody @Valid QuartzLogQueryDTO queryDTO){ - return quartzTaskService.queryLog(queryDTO); - } - - @PostMapping("/quartz/task/saveOrUpdate") - @ApiOperation(value = "新建更新任务") - public ResponseDTO saveOrUpdateTask(@RequestBody @Valid QuartzTaskDTO quartzTaskDTO)throws Exception{ - return quartzTaskService.saveOrUpdateTask(quartzTaskDTO); - } - - @GetMapping("/quartz/task/run/{taskId}") - @ApiOperation(value = "立即运行某个任务") - public ResponseDTO runTask(@PathVariable("taskId") Long taskId)throws Exception{ - return quartzTaskService.runTask(taskId); - } - - @GetMapping("/quartz/task/pause/{taskId}") - @ApiOperation(value = "暂停某个任务") - public ResponseDTO pauseTask(@PathVariable("taskId")Long taskId)throws Exception{ - return quartzTaskService.pauseTask(taskId); - } - - @GetMapping("/quartz/task/resume/{taskId}") - @ApiOperation(value = "恢复某个任务") - public ResponseDTO resumeTask(@PathVariable("taskId")Long taskId)throws Exception{ - return quartzTaskService.resumeTask(taskId); - } - - @GetMapping("/quartz/task/delete/{taskId}") - @ApiOperation(value = "删除某个任务") - public ResponseDTO deleteTask(@PathVariable("taskId")Long taskId)throws Exception{ - return quartzTaskService.deleteTask(taskId); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/dao/QuartzTaskDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/dao/QuartzTaskDao.java deleted file mode 100644 index f9153e9e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/dao/QuartzTaskDao.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.dao; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.module.support.quartz.domain.dto.QuartzQueryDTO; -import net.lab1024.smartadmin.module.support.quartz.domain.dto.QuartzTaskVO; -import net.lab1024.smartadmin.module.support.quartz.domain.entity.QuartzTaskEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 14:35 - * @since JDK1.8 - */ -@Mapper -@Component -public interface QuartzTaskDao extends BaseMapper { - - /** - * 更新任务状态 - * @param taskId - * @param taskStatus - */ - void updateStatus(@Param("taskId") Integer taskId,@Param("taskStatus") Integer taskStatus); - - /** - * 查询列表 - * @param queryDTO - * @return - */ - List queryList(Page page, @Param("queryDTO")QuartzQueryDTO queryDTO); - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/dao/QuartzTaskLogDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/dao/QuartzTaskLogDao.java deleted file mode 100644 index b2e9cb04..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/dao/QuartzTaskLogDao.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.dao; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.module.support.quartz.domain.dto.QuartzLogQueryDTO; -import net.lab1024.smartadmin.module.support.quartz.domain.dto.QuartzTaskLogVO; -import net.lab1024.smartadmin.module.support.quartz.domain.entity.QuartzTaskLogEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 14:35 - * @since JDK1.8 - */ -@Mapper -@Component -public interface QuartzTaskLogDao extends BaseMapper{ - - - /** - * 查询列表 - * @param queryDTO - * @return - */ - List queryList(Page page, @Param("queryDTO")QuartzLogQueryDTO queryDTO); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzLogQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzLogQueryDTO.java deleted file mode 100644 index 84b8564e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzLogQueryDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.domain.dto; - -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/15 0015 上午 11:29 - * @since JDK1.8 - */ -@Data -public class QuartzLogQueryDTO extends PageParamDTO { - - @ApiModelProperty(value = "任务Id(不能为空)") - @NotNull(message = "任务Id不能为空") - private Integer taskId; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzQueryDTO.java deleted file mode 100644 index 51e6b584..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzQueryDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.domain.dto; - -import net.lab1024.smartadmin.common.domain.PageParamDTO; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/15 0015 上午 11:29 - * @since JDK1.8 - */ -public class QuartzQueryDTO extends PageParamDTO { -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskDTO.java deleted file mode 100644 index 5fb303fc..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskDTO.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.domain.dto; - -import net.lab1024.smartadmin.module.support.quartz.constant.TaskStatusEnum; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 15:42 - * @since JDK1.8 - */ -@Data -public class QuartzTaskDTO { - - @ApiModelProperty("id") - private Long id; - - @ApiModelProperty("任务名称") - @NotNull(message = "任务名称不能为空") - private String taskName; - - @ApiModelProperty("任务Bean") - @NotNull(message = "任务Bean不能为空") - private String taskBean; - - @ApiModelProperty("任务参数") - private String taskParams; - - @ApiModelProperty("cron") - @NotNull(message = "cron表达式不能为空") - private String taskCron; - - @ApiModelProperty("任务状态:"+ TaskStatusEnum.INFO) - private Integer taskStatus; - - @ApiModelProperty("任务备注") - private String remark; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskLogVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskLogVO.java deleted file mode 100644 index 23cd35fc..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskLogVO.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.domain.dto; - -import net.lab1024.smartadmin.module.support.quartz.constant.TaskResultEnum; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 15:42 - * @since JDK1.8 - */ -@Data -public class QuartzTaskLogVO { - - @ApiModelProperty("id") - private Long id; - - @ApiModelProperty("任务id") - private Long taskId; - - @ApiModelProperty("任务名称") - private String taskName; - - @ApiModelProperty("任务参数") - private String taskParams; - - @ApiModelProperty("任务处理状态:"+ TaskResultEnum.INFO) - private Integer processStatus; - - @ApiModelProperty("任务时长ms") - private Long processDuration; - - @ApiModelProperty("处理日志") - private String processLog; - - @ApiModelProperty("创建时间") - private Date createTime; - - - @ApiModelProperty("主机ip") - private String ipAddress; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskVO.java deleted file mode 100644 index b588c532..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/dto/QuartzTaskVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.domain.dto; - -import net.lab1024.smartadmin.module.support.quartz.constant.TaskStatusEnum; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 15:42 - * @since JDK1.8 - */ -@Data -public class QuartzTaskVO { - - @ApiModelProperty("id") - private Long id; - - @ApiModelProperty("任务名称") - @NotNull(message = "任务名称不能为空") - private String taskName; - - @ApiModelProperty("任务Bean") - @NotNull(message = "任务Bean不能为空") - private String taskBean; - - @ApiModelProperty("任务参数") - private String taskParams; - - @ApiModelProperty("cron") - @NotNull(message = "cron表达式不能为空") - private String taskCron; - - @ApiModelProperty("任务状态:"+ TaskStatusEnum.INFO) - private Integer taskStatus; - - @ApiModelProperty("任务备注") - private String remark; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/entity/QuartzTaskEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/entity/QuartzTaskEntity.java deleted file mode 100644 index cb419b84..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/entity/QuartzTaskEntity.java +++ /dev/null @@ -1,50 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 13:45 - * @since JDK1.8 - */ -@Data -@TableName("t_quartz_task") -public class QuartzTaskEntity extends BaseEntity { - /** - * 任务名称参数 - */ - private String taskName; - /** - * 任务类 - */ - private String taskBean; - - /** - * 任务参数 - */ - private String taskParams; - - /** - * cron - */ - private String taskCron; - - /** - * 任务状态 - */ - private Integer taskStatus; - - /** - * 备注 - */ - private String remark; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/entity/QuartzTaskLogEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/entity/QuartzTaskLogEntity.java deleted file mode 100644 index 9d728416..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/domain/entity/QuartzTaskLogEntity.java +++ /dev/null @@ -1,50 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 13:45 - * @since JDK1.8 - */ -@Data -@TableName("t_quartz_task_log") -public class QuartzTaskLogEntity extends BaseEntity { - /** - * 任务名称参数 - */ - private Long taskId; - /** - * 任务名称 - */ - private String taskName; - /** - * 任务参数 - */ - private String taskParams; - /** - * 任务处理状态 - */ - private Integer processStatus; - - /** - * 任务时长ms - */ - private Long processDuration; - - /** - * 处理日志 - */ - private String processLog; - - - private String ipAddress; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java deleted file mode 100644 index 4b327d1f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTask.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.service; - -import lombok.extern.slf4j.Slf4j; -import net.lab1024.smartadmin.common.domain.ITask; -import net.lab1024.smartadmin.module.support.quartz.constant.QuartzConst; -import net.lab1024.smartadmin.module.support.quartz.constant.TaskResultEnum; -import net.lab1024.smartadmin.module.support.quartz.domain.entity.QuartzTaskEntity; -import net.lab1024.smartadmin.module.support.quartz.domain.entity.QuartzTaskLogEntity; -import net.lab1024.smartadmin.third.SmartApplicationContext; -import net.lab1024.smartadmin.util.SmartIPUtil; -import net.lab1024.smartadmin.util.SmartQuartzUtil; -import org.quartz.JobDetail; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; -import org.quartz.JobKey; -import org.springframework.scheduling.quartz.QuartzJobBean; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Date; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Slf4j -public class QuartzTask extends QuartzJobBean { - - @Override - protected void executeInternal(JobExecutionContext context) throws JobExecutionException { - JobDetail jobDetail = context.getJobDetail(); - Object params = context.getMergedJobDataMap().get(QuartzConst.QUARTZ_PARAMS_KEY); - JobKey jobKey = jobDetail.getKey(); - - Long taskId = SmartQuartzUtil.getTaskIdByJobKey(jobKey); - QuartzTaskService quartzTaskService = (QuartzTaskService) SmartApplicationContext.getBean("quartzTaskService"); - QuartzTaskEntity quartzTaskEntity = quartzTaskService.getByTaskId(taskId); - - QuartzTaskLogService quartzTaskLogService = (QuartzTaskLogService) SmartApplicationContext.getBean("quartzTaskLogService"); - - QuartzTaskLogEntity taskLogEntity = new QuartzTaskLogEntity(); - taskLogEntity.setTaskId(taskId); - taskLogEntity.setIpAddress(SmartIPUtil.getLocalHostIP()); - try { - taskLogEntity.setTaskName(quartzTaskEntity.getTaskName()); - } catch (Exception e) { - e.printStackTrace(); - } - String paramsStr = null; - if (params != null) { - paramsStr = params.toString(); - taskLogEntity.setTaskParams(paramsStr); - } - taskLogEntity.setUpdateTime(new Date()); - taskLogEntity.setCreateTime(new Date()); - //任务开始时间 - long startTime = System.currentTimeMillis(); - try { - ITask taskClass = (ITask) SmartApplicationContext.getBean(quartzTaskEntity.getTaskBean()); - taskClass.execute(paramsStr); - taskLogEntity.setProcessStatus(TaskResultEnum.SUCCESS.getStatus()); - } catch (Exception e) { - log.error("", e); - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw, true); - e.printStackTrace(pw); - pw.flush(); - sw.flush(); - taskLogEntity.setProcessStatus(TaskResultEnum.FAIL.getStatus()); - taskLogEntity.setProcessLog(sw.toString()); - } finally { - long times = System.currentTimeMillis() - startTime; - taskLogEntity.setProcessDuration(times); - quartzTaskLogService.save(taskLogEntity); - } - - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskLogService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskLogService.java deleted file mode 100644 index e54c483c..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskLogService.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.service; - -import net.lab1024.smartadmin.module.support.quartz.dao.QuartzTaskLogDao; -import net.lab1024.smartadmin.module.support.quartz.domain.entity.QuartzTaskLogEntity; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 14:50 - * @since JDK1.8 - */ -@Service -public class QuartzTaskLogService { - - @Autowired - private QuartzTaskLogDao quartzTaskLogDao; - - - public void save(QuartzTaskLogEntity logEntity){ - quartzTaskLogDao.insert(logEntity); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskService.java deleted file mode 100644 index 9f88132a..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/service/QuartzTaskService.java +++ /dev/null @@ -1,349 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.service; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.support.quartz.constant.QuartzConst; -import net.lab1024.smartadmin.module.support.quartz.constant.TaskStatusEnum; -import net.lab1024.smartadmin.module.support.quartz.dao.QuartzTaskDao; -import net.lab1024.smartadmin.module.support.quartz.dao.QuartzTaskLogDao; -import net.lab1024.smartadmin.module.support.quartz.domain.entity.QuartzTaskEntity; -import net.lab1024.smartadmin.third.SmartApplicationContext; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartPageUtil; -import net.lab1024.smartadmin.util.SmartQuartzUtil; -import lombok.extern.slf4j.Slf4j; -import net.lab1024.smartadmin.module.support.quartz.domain.dto.*; -import org.quartz.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.Date; -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 14:50 - * @since JDK1.8 - */ -@Slf4j -@Service -public class QuartzTaskService { - - @Autowired - private QuartzTaskDao quartzTaskDao; - - @Autowired - private QuartzTaskLogDao quartzTaskLogDao; - - @Autowired - private Scheduler scheduler; - - /** - * 查询列表 - * - * @param queryDTO - * @return - */ - public ResponseDTO> query(QuartzQueryDTO queryDTO) { - Page pageParam = SmartPageUtil.convert2QueryPage(queryDTO); - List taskList = quartzTaskDao.queryList(pageParam, queryDTO); - pageParam.setRecords(taskList); - return ResponseDTO.succData(SmartPageUtil.convert2PageResult(pageParam)); - } - - /** - * 查询运行日志 - * - * @param queryDTO - * @return - */ - public ResponseDTO> queryLog(QuartzLogQueryDTO queryDTO) { - Page pageParam = SmartPageUtil.convert2QueryPage(queryDTO); - List taskList = quartzTaskLogDao.queryList(pageParam, queryDTO); - pageParam.setRecords(taskList); - return ResponseDTO.succData(SmartPageUtil.convert2PageResult(pageParam)); - } - - /** - * 保存或更新 - * - * @param quartzTaskDTO - * @return - * @throws Exception - */ - @Transactional(rollbackFor = Throwable.class) - public ResponseDTO saveOrUpdateTask(QuartzTaskDTO quartzTaskDTO) throws Exception { - ResponseDTO baseValid = this.baseValid(quartzTaskDTO); - if (!baseValid.isSuccess()) { - return baseValid; - } - Long taskId = quartzTaskDTO.getId(); - if (taskId == null) { - return this.saveTask(quartzTaskDTO); - } else { - return this.updateTask(quartzTaskDTO); - } - } - - private ResponseDTO baseValid(QuartzTaskDTO quartzTaskDTO) { - Object taskBean = null; - try { - taskBean = SmartApplicationContext.getBean(quartzTaskDTO.getTaskBean()); - } catch (Exception e) { - log.error("taskBean 不存在{}", e); - } - if (taskBean == null) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "taskBean 不存在"); - } - if (!CronExpression.isValidExpression(quartzTaskDTO.getTaskCron())) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "请传入正确的正则表达式"); - } - return ResponseDTO.succ(); - } - - private ResponseDTO saveTask(QuartzTaskDTO quartzTaskDTO) throws Exception { - QuartzTaskEntity taskEntity = SmartBeanUtil.copy(quartzTaskDTO, QuartzTaskEntity.class); - taskEntity.setTaskStatus(TaskStatusEnum.NORMAL.getStatus()); - taskEntity.setUpdateTime(new Date()); - taskEntity.setCreateTime(new Date()); - quartzTaskDao.insert(taskEntity); - this.createQuartzTask(scheduler, taskEntity); - return ResponseDTO.succ(); - } - - private ResponseDTO updateTask(QuartzTaskDTO quartzTaskDTO) throws Exception { - QuartzTaskEntity updateEntity = quartzTaskDao.selectById(quartzTaskDTO.getId()); - if (updateEntity == null) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "task不存在"); - } - QuartzTaskEntity taskEntity = SmartBeanUtil.copy(quartzTaskDTO, QuartzTaskEntity.class); - //任务状态不能更新 - taskEntity.setTaskStatus(updateEntity.getTaskStatus()); - taskEntity.setUpdateTime(new Date()); - quartzTaskDao.updateById(taskEntity); - if(this.checkExist(taskEntity.getId())){ - this.updateQuartzTask(scheduler, taskEntity); - }else{ - this.createQuartzTask(scheduler,taskEntity); - } - - return ResponseDTO.succ(); - } - - /** - * 立即运行 - * - * @param taskId - * @return - * @throws Exception - */ - public ResponseDTO runTask(Long taskId) throws Exception { - QuartzTaskEntity quartzTaskEntity = quartzTaskDao.selectById(taskId); - if (quartzTaskEntity == null) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "task不存在"); - } - this.runQuartzTask(scheduler, quartzTaskEntity); - return ResponseDTO.succ(); - } - - /** - * 暂停运行 - * - * @param taskId - * @return - * @throws Exception - */ - @Transactional(rollbackFor = Throwable.class) - public ResponseDTO pauseTask(Long taskId) throws Exception { - QuartzTaskEntity quartzTaskEntity = quartzTaskDao.selectById(taskId); - if (quartzTaskEntity == null) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "task不存在"); - } - quartzTaskEntity.setTaskStatus(TaskStatusEnum.PAUSE.getStatus()); - quartzTaskDao.updateById(quartzTaskEntity); - this.pauseQuartzTask(scheduler, quartzTaskEntity); - return ResponseDTO.succ(); - } - - /** - * 恢复任务 - * - * @param taskId - * @return - * @throws Exception - */ - @Transactional(rollbackFor = Throwable.class) - public ResponseDTO resumeTask(Long taskId) throws Exception { - QuartzTaskEntity quartzTaskEntity = quartzTaskDao.selectById(taskId); - if (quartzTaskEntity == null) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "task不存在"); - } - quartzTaskEntity.setTaskStatus(TaskStatusEnum.NORMAL.getStatus()); - quartzTaskDao.updateById(quartzTaskEntity); - this.resumeQuartzTask(scheduler, quartzTaskEntity); - return ResponseDTO.succ(); - } - - /** - * 删除任务 - * - * @param taskId - * @return - * @throws Exception - */ - public ResponseDTO deleteTask(Long taskId) throws Exception { - QuartzTaskEntity quartzTaskEntity = quartzTaskDao.selectById(taskId); - if (quartzTaskEntity == null) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM, "task不存在"); - } - quartzTaskDao.deleteById(taskId); - this.deleteQuartzTask(scheduler, taskId); - return ResponseDTO.succ(); - } - - /** - * 通过任务Id 获取任务实体 - * - * @param taskId - * @return - */ - public QuartzTaskEntity getByTaskId(Long taskId) { - return quartzTaskDao.selectById(taskId); - } - - /** - * 创建任务 - * - * @param scheduler - * @param taskEntity - * @throws Exception - */ - public void createQuartzTask(Scheduler scheduler, QuartzTaskEntity taskEntity) throws Exception { - JobKey jobKey = SmartQuartzUtil.getJobKey(taskEntity.getId()); - JobDetail jobDetail = JobBuilder.newJob(QuartzTask.class).withIdentity(jobKey).build(); - - CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(taskEntity.getTaskCron()).withMisfireHandlingInstructionDoNothing(); - - TriggerKey triggerKey = SmartQuartzUtil.getTriggerKey(Long.valueOf(taskEntity.getId())); - CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); - - jobDetail.getJobDataMap().put(QuartzConst.QUARTZ_PARAMS_KEY, taskEntity.getTaskParams()); - scheduler.scheduleJob(jobDetail, trigger); - //如果任务是暂停状态,则暂停任务 - if (TaskStatusEnum.PAUSE.getStatus().equals(taskEntity.getTaskStatus())) { - this.pauseQuartzTask(scheduler, taskEntity); - } - } - - /** - * 更新任务 - * - * @param scheduler - * @param taskEntity - * @throws Exception - */ - private void updateQuartzTask(Scheduler scheduler, QuartzTaskEntity taskEntity) throws Exception { - TriggerKey triggerKey = SmartQuartzUtil.getTriggerKey(Long.valueOf(taskEntity.getId())); - - CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(taskEntity.getTaskCron()).withMisfireHandlingInstructionDoNothing(); - - CronTrigger trigger = this.getCronTrigger(scheduler, Long.valueOf(taskEntity.getId())); - - trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); - - trigger.getJobDataMap().put(QuartzConst.QUARTZ_PARAMS_KEY, taskEntity.getTaskParams()); - - scheduler.rescheduleJob(triggerKey, trigger); - //如果更新之前任务是暂停状态,此时再次暂停任务 - if (TaskStatusEnum.PAUSE.getStatus().equals(taskEntity.getTaskStatus())) { - this.pauseQuartzTask(scheduler, taskEntity); - } - } - - private CronTrigger getCronTrigger(Scheduler scheduler, Long taskId) throws Exception { - TriggerKey triggerKey = SmartQuartzUtil.getTriggerKey(taskId); - return (CronTrigger) scheduler.getTrigger(triggerKey); - } - - /** - * 立即运行 - * - * @param scheduler - * @param taskEntity - * @throws Exception - */ - private void runQuartzTask(Scheduler scheduler, QuartzTaskEntity taskEntity) throws Exception { - JobDataMap dataMap = new JobDataMap(); - dataMap.put(QuartzConst.QUARTZ_PARAMS_KEY, taskEntity.getTaskParams()); - JobKey jobKey = SmartQuartzUtil.getJobKey(taskEntity.getId()); - if(!scheduler.checkExists(jobKey)){ - this.createQuartzTask(scheduler,taskEntity); - scheduler.triggerJob(jobKey, dataMap); - return; - } - scheduler.triggerJob(jobKey, dataMap); - } - - /** - * 暂停任务 - * - * @param scheduler - * @param quartzTaskEntity - * @throws Exception - */ - private void pauseQuartzTask(Scheduler scheduler, QuartzTaskEntity quartzTaskEntity) throws Exception { - JobKey jobKey = SmartQuartzUtil.getJobKey(quartzTaskEntity.getId()); - if(!scheduler.checkExists(jobKey)){ - this.createQuartzTask(scheduler,quartzTaskEntity); - scheduler.pauseJob(jobKey); - return; - } - scheduler.pauseJob(jobKey); - } - - /** - * 恢复任务 - * - * @param scheduler - * @param quartzTaskEntity - * @throws Exception - */ - private void resumeQuartzTask(Scheduler scheduler, QuartzTaskEntity quartzTaskEntity) throws Exception { - JobKey jobKey = SmartQuartzUtil.getJobKey(quartzTaskEntity.getId()); - if(!scheduler.checkExists(jobKey)){ - this.createQuartzTask(scheduler,quartzTaskEntity); - return; - } - scheduler.resumeJob(jobKey); - } - - /** - * 删除任务 - * - * @param scheduler - * @param taskId - * @throws Exception - */ - private void deleteQuartzTask(Scheduler scheduler, Long taskId) throws Exception { - JobKey jobKey = SmartQuartzUtil.getJobKey(taskId); - if(!scheduler.checkExists(jobKey)){ - return; - } - scheduler.deleteJob(jobKey); - } - - - private Boolean checkExist(Long taskId) throws Exception{ - JobKey jobKey = SmartQuartzUtil.getJobKey(taskId); - return scheduler.checkExists(jobKey); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/task/test/Example.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/task/test/Example.java deleted file mode 100644 index f62d22b5..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/quartz/task/test/Example.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.lab1024.smartadmin.module.support.quartz.task.test; - -import lombok.extern.slf4j.Slf4j; -import net.lab1024.smartadmin.common.domain.ITask; -import net.lab1024.smartadmin.util.SmartDateUtil; -import org.springframework.stereotype.Component; - -import java.util.Date; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 14:26 - * @since JDK1.8 - */ -@Slf4j -@Component("exampleTask") -public class Example implements ITask { - - @Override - public void execute(String paramJson) throws Exception { - log.warn("{}-今天搬了{}块砖,paramJson:{}",SmartDateUtil.formatYMDHMS(new Date()),System.currentTimeMillis(),paramJson ); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadCommand.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadCommand.java deleted file mode 100644 index 2535efdd..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadCommand.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.lab1024.smartadmin.module.support.smartreload; - -import net.lab1024.smartadmin.common.reload.abstracts.AbstractSmartReloadCommand4Spring; -import net.lab1024.smartadmin.common.reload.domain.entity.ReloadItem; -import net.lab1024.smartadmin.common.reload.domain.entity.SmartReloadResult; -import net.lab1024.smartadmin.module.support.smartreload.dao.ReloadItemDao; -import net.lab1024.smartadmin.module.support.smartreload.dao.ReloadResultDao; -import net.lab1024.smartadmin.module.support.smartreload.domain.entity.ReloadItemEntity; -import net.lab1024.smartadmin.module.support.smartreload.domain.entity.ReloadResultEntity; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * Smart Reload 业务 - * - * @author listen - * @date 2018/02/10 09:18 - */ -@Component -public class SmartReloadCommand extends AbstractSmartReloadCommand4Spring { - - @Autowired - private ReloadItemDao reloadItemDao; - - @Autowired - private ReloadResultDao reloadResultDao; - - /** - * 读取数据库中SmartReload项 - * - * @return List - */ - @Override - public List readReloadItem() { - List reloadItemEntityList = reloadItemDao.selectList(null); - return SmartBeanUtil.copyList(reloadItemEntityList, ReloadItem.class); - } - - /** - * 保存reload结果 - * - * @param smartReloadResult - */ - @Override - public void handleReloadResult(SmartReloadResult smartReloadResult) { - ReloadResultEntity reloadResultEntity = SmartBeanUtil.copy(smartReloadResult, ReloadResultEntity.class); - reloadResultDao.insert(reloadResultEntity); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadController.java deleted file mode 100644 index 2d6e9560..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadController.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.lab1024.smartadmin.module.support.smartreload; - -import net.lab1024.smartadmin.common.anno.NoValidPrivilege; -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.support.smartreload.domain.dto.ReloadItemUpdateDTO; -import net.lab1024.smartadmin.module.support.smartreload.domain.dto.ReloadItemVO; -import net.lab1024.smartadmin.module.support.smartreload.domain.dto.ReloadResultVO; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -/** - * Smart Reload 路由 - * - * @author listen - * @date 2018/02/10 09:18 - */ -@Api(tags = {SwaggerTagConst.Admin.MANAGER_SMART_RELOAD}) -@OperateLog -@RestController -public class SmartReloadController { - - @Autowired - private SmartReloadService smartReloadService; - - @ApiOperation(value = "获取全部Smart-reload项", notes = "获取全部Smart-reload项") - @GetMapping("/smartReload/all") - @NoValidPrivilege - public ResponseDTO> listAllReloadItem() { - return smartReloadService.listAllReloadItem(); - } - - @ApiOperation(value = "获取reload result", notes = "获取reload result") - @GetMapping("/smartReload/result/{tag}") - @NoValidPrivilege - public ResponseDTO> queryReloadResult(@PathVariable("tag") String tag) { - return smartReloadService.listReloadItemResult(tag); - } - - @ApiOperation("通过tag更新标识") - @PostMapping("/smartReload/update") - @NoValidPrivilege - public ResponseDTO updateByTag(@RequestBody @Valid ReloadItemUpdateDTO updateDTO) { - return smartReloadService.updateByTag(updateDTO); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadService.java deleted file mode 100644 index 78778659..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/SmartReloadService.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.lab1024.smartadmin.module.support.smartreload; - -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.common.reload.SmartReloadManager; -import net.lab1024.smartadmin.module.support.smartreload.dao.ReloadItemDao; -import net.lab1024.smartadmin.module.support.smartreload.dao.ReloadResultDao; -import net.lab1024.smartadmin.module.support.smartreload.domain.dto.ReloadItemUpdateDTO; -import net.lab1024.smartadmin.module.support.smartreload.domain.dto.ReloadItemVO; -import net.lab1024.smartadmin.module.support.smartreload.domain.dto.ReloadResultVO; -import net.lab1024.smartadmin.module.support.smartreload.domain.entity.ReloadItemEntity; -import net.lab1024.smartadmin.module.support.smartreload.domain.entity.ReloadResultEntity; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import java.sql.Timestamp; -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** - * Smart initDefines 业务 - * - * @author listen - * @date 2018/02/10 13:49 - */ -@Service -public class SmartReloadService { - - @Autowired - private SmartReloadManager smartReloadManager; - - @Autowired - private SmartReloadCommand smartReloadCommand; - - @Autowired - private ReloadItemDao reloadItemDao; - - @Autowired - private ReloadResultDao reloadResultDao; - - @Value("${smart-reload.time-interval}") - private Long timeInterval; - - @PostConstruct - public void init() { - smartReloadManager.addCommand(smartReloadCommand, 10, timeInterval, TimeUnit.SECONDS); - } - - /** - * 注册到SmartReload里 - */ - public void register(Object reload) { - smartReloadManager.register(reload); - } - - /** - * 获取所有 initDefines 项 - * - * @return - */ - public ResponseDTO> listAllReloadItem() { - List reloadItemEntityList = reloadItemDao.selectList(null); - List reloadItemDTOList = SmartBeanUtil.copyList(reloadItemEntityList, ReloadItemVO.class); - return ResponseDTO.succData(reloadItemDTOList); - } - - /** - * 根据 tag - * 获取所有 initDefines 运行结果 - * - * @return ResponseDTO - */ - public ResponseDTO> listReloadItemResult(String tag) { - ReloadResultEntity query = new ReloadResultEntity(); - query.setTag(tag); - List reloadResultEntityList = reloadResultDao.query(tag); - List reloadResultDTOList = SmartBeanUtil.copyList(reloadResultEntityList, ReloadResultVO.class); - return ResponseDTO.succData(reloadResultDTOList); - } - - /** - * 通过标签更新标识符 - * - * @param updateDTO - * @return - */ - public ResponseDTO updateByTag(ReloadItemUpdateDTO updateDTO) { - ReloadItemEntity entity = new ReloadItemEntity(); - entity.setTag(updateDTO.getTag()); - ReloadItemEntity reloadItemEntity = reloadItemDao.selectById(entity.getTag()); - if (null == reloadItemEntity) { - return ResponseDTO.wrap(ResponseCodeConst.NOT_EXISTS); - } - reloadItemEntity.setIdentification(updateDTO.getIdentification()); - reloadItemEntity.setUpdateTime(new Timestamp(System.currentTimeMillis())); - reloadItemEntity.setArgs(updateDTO.getArgs()); - reloadItemDao.updateById(reloadItemEntity); - return ResponseDTO.succ(); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/dao/ReloadItemDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/dao/ReloadItemDao.java deleted file mode 100644 index c497ebbc..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/dao/ReloadItemDao.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.lab1024.smartadmin.module.support.smartreload.dao; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import net.lab1024.smartadmin.module.support.smartreload.domain.entity.ReloadItemEntity; -import org.apache.ibatis.annotations.Mapper; -import org.springframework.stereotype.Component; - -/** - * t_reload_item 数据表dao - * - * @author listen - * @date 2018/02/10 09:23 - */ -@Component -@Mapper -public interface ReloadItemDao extends BaseMapper {} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/dao/ReloadResultDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/dao/ReloadResultDao.java deleted file mode 100644 index dc4d2d69..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/dao/ReloadResultDao.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.lab1024.smartadmin.module.support.smartreload.dao; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import net.lab1024.smartadmin.module.support.smartreload.domain.entity.ReloadResultEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * t_reload_result 数据表dao - * - * @author listen - * @date 2018/02/10 09:23 - */ -@Component -@Mapper -public interface ReloadResultDao extends BaseMapper { - - - List query(@Param("tag") String tag); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadItemUpdateDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadItemUpdateDTO.java deleted file mode 100644 index 20ad98f5..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadItemUpdateDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.lab1024.smartadmin.module.support.smartreload.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -/** - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Data -public class ReloadItemUpdateDTO { - - @ApiModelProperty("标签") - @NotBlank(message = "标签不能为空") - private String tag; - - @ApiModelProperty("状态标识") - @NotBlank(message = "状态标识不能为空") - private String identification; - - @ApiModelProperty("reload时传入的参数,可以为空") - private String args; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadItemVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadItemVO.java deleted file mode 100644 index 8f462297..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadItemVO.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.lab1024.smartadmin.module.support.smartreload.domain.dto; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * initDefines 项 DTO 类 - * - * @author listen - * @date 2018/02/10 09:29 - */ -@Data -public class ReloadItemVO { - - /** - * 加载项标签 - */ - @ApiModelProperty("加载项标签") - private String tag; - - /** - * 参数 - */ - @ApiModelProperty("参数") - private String args; - - /** - * 状态标识 - */ - @ApiModelProperty("状态标识") - private String identification; - - /** - * 更新时间 - */ - @ApiModelProperty("最后更新时间") - private Date updateTime; - - /** - * 创建时间 - */ - @ApiModelProperty("创建时间") - private Date createTime; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadResultVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadResultVO.java deleted file mode 100644 index 56b388a3..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/dto/ReloadResultVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lab1024.smartadmin.module.support.smartreload.domain.dto; -import lombok.Data; - -import java.util.Date; - -/** - * reload_result DTO 类 - * - * @author listen - * @date 2018/02/10 09:29 - */ -@Data -public class ReloadResultVO { - - /** - * 加载项标签 - */ - private String tag; - - /** - * 参数 - */ - private String args; - - /** - * 状态标识 - */ - private String identification; - - /** - * 运行结果 - */ - private Boolean result; - - /** - * 异常 - */ - private String exception; - - /** - * 创建时间 - */ - private Date createTime; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/entity/ReloadItemEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/entity/ReloadItemEntity.java deleted file mode 100644 index cbd264c1..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/entity/ReloadItemEntity.java +++ /dev/null @@ -1,46 +0,0 @@ -package net.lab1024.smartadmin.module.support.smartreload.domain.entity; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -/** - * t_reload_item 数据表 实体类 - * - * @author listen - * @date 2018/02/10 09:29 - */ -@Data -@TableName("t_reload_item") -public class ReloadItemEntity { - - /** - * 加载项标签 - */ - @TableId(type = IdType.INPUT) - private String tag; - - /** - * 参数 - */ - private String args; - - /** - * 运行标识 - */ - private String identification; - - /** - * 更新时间 - */ - private Date updateTime; - - /** - * 创建时间 - */ - private Date createTime; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/entity/ReloadResultEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/entity/ReloadResultEntity.java deleted file mode 100644 index bb79c21e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/smartreload/domain/entity/ReloadResultEntity.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.lab1024.smartadmin.module.support.smartreload.domain.entity; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -/** - * t_reload_result 数据表 实体类 - * - * @author listen - * @date 2018/02/10 09:29 - */ -@Data -@TableName("t_reload_result") -public class ReloadResultEntity { - - /** - * 加载项标签 - */ - private String tag; - - /** - * 运行标识 - */ - private String identification; - - /** - * 参数 - */ - private String args; - - /** - * 运行结果 - */ - private Boolean result; - - /** - * 异常 - */ - private String exception; - - /** - * 创建时间 - */ - private Date createTime; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/MessageTypeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/MessageTypeEnum.java deleted file mode 100644 index eda10334..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/MessageTypeEnum.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.lab1024.smartadmin.module.support.websocket; - -import net.lab1024.smartadmin.common.domain.BaseEnum; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/10 0010 下午 19:11 - * @since JDK1.8 - */ -public enum MessageTypeEnum implements BaseEnum{ - - SYS_NOTICE(1,"系统通知"), - - PRIVATE_LETTER(2,"私信"), - - HEART_BEAT(3,"心跳"); - - - private Integer value; - - private String desc; - - - MessageTypeEnum(Integer value,String desc){ - this.value = value; - this.desc = desc; - } - - - @Override - public Integer getValue() { - return this.value; - } - - @Override - public String getDesc() { - return this.desc; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/WebSocketServer.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/WebSocketServer.java deleted file mode 100644 index a26489c8..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/WebSocketServer.java +++ /dev/null @@ -1,199 +0,0 @@ -package net.lab1024.smartadmin.module.support.websocket; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import net.lab1024.smartadmin.module.support.websocket.domain.MessageCommonDTO; -import net.lab1024.smartadmin.module.support.websocket.domain.MessageDTO; -import net.lab1024.smartadmin.module.support.websocket.domain.WebSocketHeartBeatDTO; -import com.google.common.collect.Lists; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import javax.websocket.*; -import javax.websocket.server.PathParam; -import javax.websocket.server.ServerEndpoint; -import java.io.IOException; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/10 0010 下午 16:09 - * @since JDK1.8 - */ -@Slf4j -@ServerEndpoint("/webSocket/{employeeId}") -@Component -public class WebSocketServer { - - /** - * 当前在线用户 employee,expireTime - */ - private static ConcurrentHashMap onLineUser = new ConcurrentHashMap<>(); - - /** - * 当前在线用户所对应的 socket session信息 - */ - private static ConcurrentHashMap webSocketSession = new ConcurrentHashMap<>(); - - @OnOpen - public void onOpen(Session session, @PathParam("employeeId") Long employeeId) { - if (employeeId == null) { - return; - } - webSocketSession.put(employeeId, session); - log.info("连接打开"); - } - - /** - * 不做处理如果 前台可以监听到浏览器关闭 此处处理在线人数也可 - * - * @param session - */ - @OnClose - public void onClose(Session session) { - - log.info("连接关闭"); - } - - @OnError - public void onError(Session session, Throwable error) { - log.error("socket error,{}", error); - error.printStackTrace(); - } - - /** - * 此方法接收 前台信息 - * - * @param message - * @param session - */ - @OnMessage - public void onMessage(String message, Session session) { - if (StringUtils.isEmpty(message)) { - return; - } - MessageCommonDTO messageCommonDTO = JSON.parseObject(message, new TypeReference() {}); - if (MessageTypeEnum.HEART_BEAT.getValue().equals(messageCommonDTO.getMessageType())) { - this.heartBeatHandle(messageCommonDTO.getJsonStr()); - } - } - - /** - * 更新用户过期时间 - * - * @param json - */ - private void heartBeatHandle(String json) { - Long currentDate = System.currentTimeMillis(); - Long expireTime = currentDate + 5 * 1000; - WebSocketHeartBeatDTO heartBeatDTO = JSON.parseObject(json, new TypeReference() {}); - Long employeeId = heartBeatDTO.getEmployeeId(); - onLineUser.put(employeeId, expireTime); - } - - /** - * 移除过期用户,如果用户超过5s未获取到心跳列表则清除在线用户信息 - */ - @Scheduled(cron = "0/5 * * * * ?") - private void removeOnLineUser() { - Long currentDate = System.currentTimeMillis(); - Iterator> it = onLineUser.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry entry = it.next(); - Long key = entry.getKey(); - Long value = entry.getValue(); - Long userExpireTime = value + 5 * 1000; - if (currentDate > userExpireTime) { - onLineUser.remove(key); - webSocketSession.remove(key); - } - } - } - - /** - * 此方法用户后台发送消息 - * - * @param messageDTO - */ - public static void sendMessage(MessageDTO messageDTO) { - //系统通知 - if (MessageTypeEnum.SYS_NOTICE.getValue().equals(messageDTO.getMessageType())) { - sendAllOnLineUser(messageDTO.getMessage(), messageDTO.getFromUserId()); - } - //站内信 - if (MessageTypeEnum.PRIVATE_LETTER.getValue().equals(messageDTO.getMessageType())) { - sendOneOnLineUser(messageDTO.getMessage(), messageDTO.getToUserId()); - } - } - - /** - * 通知所有在线用户 - * - * @param message - */ - public static void sendAllOnLineUser(String message, Long fromUserId) { - for (Entry entry : webSocketSession.entrySet()) { - Session session = entry.getValue(); - Long userId = entry.getKey(); - try { - //不想消息创建人推送消息 - if (! userId.equals(fromUserId)) { - session.getBasicRemote().sendText(message); - } - } catch (IOException e) { - log.error("推送消息到{},发送错误{}", userId, e); - log.error("", e); - } - - } - } - - /** - * 通知某人 - * - * @param message - * @param toUserId - */ - public static void sendOneOnLineUser(String message, Long toUserId) { - Session session = webSocketSession.get(toUserId); - if (session == null) { - log.error("推送消息到{},用户不在线", toUserId); - } - try { - session.getBasicRemote().sendText(message); - } catch (IOException e) { - log.error("推送消息到{},发送错误{}", toUserId, e); - log.error("", e); - } - } - - /** - * 获取所有在线用户id - * - * @return - */ - public static List getOnLineUserList() { - return Lists.newArrayList(onLineUser.keySet()); - } - - /** - * 获取当前在线用户数 - * - * @return - */ - public static Integer getOnLineUserCount() { - return onLineUser.entrySet().size(); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/MessageCommonDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/MessageCommonDTO.java deleted file mode 100644 index 43828b38..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/MessageCommonDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.lab1024.smartadmin.module.support.websocket.domain; - -import net.lab1024.smartadmin.module.support.websocket.MessageTypeEnum; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/13 0013 下午 14:37 - * @since JDK1.8 - */ -@Data -public class MessageCommonDTO { - /** - * 消息类型 {@link MessageTypeEnum} - */ - private Integer messageType; - - /** - * 具体消息内容 - */ - private String jsonStr; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/MessageDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/MessageDTO.java deleted file mode 100644 index 23fc615f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/MessageDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.lab1024.smartadmin.module.support.websocket.domain; - -import net.lab1024.smartadmin.module.support.websocket.MessageTypeEnum; -import lombok.Builder; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/10 0010 下午 18:50 - * @since JDK1.8 - */ -@Data -@Builder -public class MessageDTO { - - /** - * 消息类型 {@link MessageTypeEnum} - */ - private Integer messageType; - - /** - * 消息体 - */ - private String message; - - /** - * 发送者 - */ - private Long fromUserId; - - /** - * 接收者,系统通知可为null - */ - private Long toUserId; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/WebSocketHeartBeatDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/WebSocketHeartBeatDTO.java deleted file mode 100644 index 90f8c78f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/support/websocket/domain/WebSocketHeartBeatDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.lab1024.smartadmin.module.support.websocket.domain; - -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/13 0013 下午 14:39 - * @since JDK1.8 - */ -@Data -public class WebSocketHeartBeatDTO { - - /** - * 当前登录人id - */ - private Long employeeId; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeViewTypeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeViewTypeEnum.java deleted file mode 100644 index 75ddf0c9..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/constant/DataScopeViewTypeEnum.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.lab1024.smartadmin.module.system.datascope.constant; - - -import net.lab1024.smartadmin.common.domain.BaseEnum; - -import java.util.Arrays; -import java.util.Optional; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/28 0028 下午 15:37 - * @since JDK1.8 - */ -public enum DataScopeViewTypeEnum implements BaseEnum { - - ME(0,0,"本人"), - - DEPARTMENT(1,5,"本部门"), - - DEPARTMENT_AND_SUB(2,10,"本部门及下属子部门"), - - ALL(3,15,"全部"); - - private Integer value; - private Integer level; - private String desc; - - DataScopeViewTypeEnum(Integer value,Integer level, String desc) { - this.value = value; - this.level = level; - this.desc = desc; - } - - @Override - public Integer getValue() { - return value; - } - - public Integer getLevel() { - return level; - } - - @Override - public String getDesc() { - return desc; - } - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/entity/DataScopeRoleEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/entity/DataScopeRoleEntity.java deleted file mode 100644 index 016f05bf..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/domain/entity/DataScopeRoleEntity.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.lab1024.smartadmin.module.system.datascope.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -/** - * [ 数据范围与角色关系 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/27 0027 下午 14:43 - * @since JDK1.8 - */ -@Data -@TableName("t_role_data_scope") -public class DataScopeRoleEntity extends BaseEntity { - - /** - * 数据范围id - */ - private Integer dataScopeType; - /** - * 数据范围类型 - */ - private Integer viewType; - /** - * 角色id - */ - private Long roleId; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/strategy/DataScopePowerStrategy.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/strategy/DataScopePowerStrategy.java deleted file mode 100644 index d12cbf15..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/datascope/strategy/DataScopePowerStrategy.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.lab1024.smartadmin.module.system.datascope.strategy; -import net.lab1024.smartadmin.module.system.datascope.constant.DataScopeViewTypeEnum; -import net.lab1024.smartadmin.module.system.datascope.domain.dto.DataScopeSqlConfigDTO; - -/** - * [ 数据范围策略 ,使用DataScopeWhereInTypeEnum.CUSTOM_STRATEGY类型,DataScope注解的joinSql属性无用] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2020/11/28 0008 下午 16:00 - * @since JDK1.8 - */ -public abstract class DataScopePowerStrategy { - - /** - * 获取joinsql 字符串 - * @param viewTypeEnum 查看的类型 - * @param sqlConfigDTO - * @return - */ - public abstract String getCondition(DataScopeViewTypeEnum viewTypeEnum, DataScopeSqlConfigDTO sqlConfigDTO); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentController.java deleted file mode 100644 index 1a070773..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentController.java +++ /dev/null @@ -1,99 +0,0 @@ -package net.lab1024.smartadmin.module.system.department; - -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.system.department.domain.dto.DepartmentCreateDTO; -import net.lab1024.smartadmin.module.system.department.domain.dto.DepartmentUpdateDTO; -import net.lab1024.smartadmin.module.system.department.domain.dto.DepartmentVO; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -/** - * 部门管理路由器 - * - * @author listen - * @date 2017/12/19 14:29 - */ -@Api(tags = {SwaggerTagConst.Admin.MANAGER_DEPARTMENT}) -@OperateLog -@RestController -public class DepartmentController { - - @Autowired - private DepartmentService departmentService; - - @ApiOperation(value = "查询部门树形列表", notes = "查询部门列表") - @GetMapping("/department/list") - public ResponseDTO> listDepartment() { - return departmentService.listDepartment(); - } - - @ApiOperation(value = "查询部门及员工列表", notes = "查询部门及员工列表") - @GetMapping("/department/listEmployee") - public ResponseDTO> listDepartmentEmployee() { - return departmentService.listAllDepartmentEmployee(null); - } - - @ApiOperation(value = "根据部门名称查询部门及员工列表", notes = "根据部门名称查询部门及员工列表") - @GetMapping("/department/listEmployeeByDepartmentName") - public ResponseDTO> listDepartmentEmployee(String departmentName) { - return departmentService.listAllDepartmentEmployee(departmentName); - } - - @ApiOperation(value = "添加部门", notes = "添加部门") - @PostMapping("/department/add") - public ResponseDTO addDepartment(@Valid @RequestBody DepartmentCreateDTO departmentCreateDTO) { - return departmentService.addDepartment(departmentCreateDTO); - } - - @ApiOperation(value = "更新部门信息", notes = "更新部门信息") - @PostMapping("/department/update") - public ResponseDTO updateDepartment(@Valid @RequestBody DepartmentUpdateDTO departmentUpdateDTO) { - return departmentService.updateDepartment(departmentUpdateDTO); - } - - @ApiOperation(value = "删除部门", notes = "删除部门") - @PostMapping("/department/delete/{deptId}") - public ResponseDTO delDepartment(@PathVariable Long deptId) { - return departmentService.delDepartment(deptId); - } - - @ApiOperation(value = "获取部门信息", notes = "获取部门") - @GetMapping("/department/query/{deptId}") - public ResponseDTO getDepartment(@PathVariable Long deptId) { - return departmentService.getDepartmentById(deptId); - } - - @ApiOperation(value = "查询部门列表", notes = "查询部门列表") - @GetMapping("/department/listAll") - public ResponseDTO> listAll() { - return departmentService.listAll(); - } - - - @ApiOperation(value = "上下移动") - @GetMapping("/department/upOrDown/{deptId}/{swapId}") - public ResponseDTO upOrDown(@PathVariable Long deptId, @PathVariable Long swapId) { - return departmentService.upOrDown(deptId, swapId); - } - - @ApiOperation(value = "升级") - @GetMapping("/department/upgrade/{deptId}") - public ResponseDTO upgrade(@PathVariable Long deptId) { - return departmentService.upgrade(deptId); - } - - @ApiOperation(value = "降级") - @GetMapping("/department/downgrade/{deptId}/{preId}") - public ResponseDTO downgrade(@PathVariable Long deptId, @PathVariable Long preId) { - return departmentService.downgrade(deptId, preId); - } - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentService.java deleted file mode 100644 index b5b99ab0..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentService.java +++ /dev/null @@ -1,285 +0,0 @@ -package net.lab1024.smartadmin.module.system.department; - -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.system.department.domain.dto.DepartmentCreateDTO; -import net.lab1024.smartadmin.module.system.department.domain.dto.DepartmentUpdateDTO; -import net.lab1024.smartadmin.module.system.department.domain.dto.DepartmentVO; -import net.lab1024.smartadmin.module.system.department.domain.entity.DepartmentEntity; -import net.lab1024.smartadmin.module.system.employee.EmployeeDao; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeDTO; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * 部门管理业务类 - * - * @author listen - * @date 2017/12/19 14:25 - */ -@Service -public class DepartmentService { - - @Autowired - private DepartmentDao departmentDao; - - @Autowired - private EmployeeDao employeeDao; - - @Autowired - private DepartmentTreeService departmentTreeService; - - /** - * 获取部门树形结构 - * - * @return - */ - public ResponseDTO> listDepartment() { - List departmentVOList = departmentDao.listAll(); - List result = departmentTreeService.buildTree(departmentVOList); - return ResponseDTO.succData(result); - } - - /** - * 获取所有部门和员工信息 - * - * @param departmentName - * @return - */ - public ResponseDTO> listAllDepartmentEmployee(String departmentName) { - - // 获取全部部门列表 - List departmentVOList = departmentDao.listAll(); - if (StringUtils.isNotBlank(departmentName)) { - // 检索条件不为空的时候 过滤部门列表 - departmentVOList = filterDepartment(departmentVOList, departmentName); - } - - Map departmentMap = departmentVOList.stream().collect(Collectors.toMap(DepartmentVO::getId, Function.identity())); - // 获取全部员工列表 - List employeeList = employeeDao.listAll(); - employeeList.forEach(employeeDTO -> { - - DepartmentVO departmentVO = departmentMap.get(employeeDTO.getDepartmentId()); - if (null == departmentVO) { - return; - } - List employeeDTOList = departmentVO.getEmployees(); - if (null == employeeDTOList) { - employeeDTOList = new ArrayList<>(); - } - employeeDTOList.add(employeeDTO); - departmentVO.setEmployees(employeeDTOList); - }); - List result = departmentTreeService.buildTree(departmentVOList); - return ResponseDTO.succData(result); - } - - /** - * 过滤部门名称,获取过滤后的结果 - * - * @author lidoudou - * @date 2019/4/28 20:17 - */ - private List filterDepartment(List departmentVOList, String departmentName) { - Map departmentMap = new HashMap<>(); - departmentVOList.forEach(item -> { - if (item.getName().indexOf(departmentName) < 0) { - return; - } - // 当前部门包含关键字 - departmentMap.put(item.getId(), item); - Long parentId = item.getParentId(); - if (null != parentId) { - List filterResult = new ArrayList<>(); - getParentDepartment(departmentVOList, parentId, filterResult); - for (DepartmentVO dto : filterResult) { - if (!departmentMap.containsKey(dto.getId())) { - departmentMap.put(dto.getId(), dto); - } - } - } - }); - return departmentMap.values().stream().collect(Collectors.toList()); - } - - private List getParentDepartment(List departmentVOList, Long parentId, List result) { - List deptList = departmentVOList.stream().filter(e -> e.getId().equals(parentId)).collect(Collectors.toList()); - for (DepartmentVO item : deptList) { - result.add(item); - if (item.getParentId() != 0 && item.getParentId() != null) { - result.addAll(getParentDepartment(departmentVOList, item.getParentId(), result)); - } - } - return result; - } - - /** - * 新增添加部门 - * - * @param departmentCreateDTO - * @return AjaxResult - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO addDepartment(DepartmentCreateDTO departmentCreateDTO) { - DepartmentEntity departmentEntity = SmartBeanUtil.copy(departmentCreateDTO, DepartmentEntity.class); - departmentEntity.setSort(0L); - departmentDao.insert(departmentEntity); - departmentEntity.setSort(departmentEntity.getId()); - departmentDao.updateById(departmentEntity); - return ResponseDTO.succ(); - } - - /** - * 更新部门信息 - * - * @param updateDTO - * @return AjaxResult - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO updateDepartment(DepartmentUpdateDTO updateDTO) { - if (updateDTO.getParentId() == null) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.PARENT_ID_ERROR); - } - DepartmentEntity entity = departmentDao.selectById(updateDTO.getId()); - if (entity == null) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.NOT_EXISTS); - } - DepartmentEntity departmentEntity = SmartBeanUtil.copy(updateDTO, DepartmentEntity.class); - departmentEntity.setSort(entity.getSort()); - departmentDao.updateById(departmentEntity); - return ResponseDTO.succ(); - } - - /** - * 根据id删除部门 - * 1、需要判断当前部门是否有子部门,有子部门则不允许删除 - * 2、需要判断当前部门是否有员工,有员工则不能删除 - * - * @param deptId - * @return - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO delDepartment(Long deptId) { - DepartmentEntity departmentEntity = departmentDao.selectById(deptId); - if (null == departmentEntity) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.DEPT_NOT_EXISTS); - } - // 是否有子级部门 - int subDepartmentNum = departmentDao.countSubDepartment(deptId); - if (subDepartmentNum > 0) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.CANNOT_DEL_DEPARTMENT_WITH_CHILD); - } - - // 是否有未删除员工 - int employeeNum = employeeDao.countByDepartmentId(deptId, false); - if (employeeNum > 0) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.CANNOT_DEL_DEPARTMENT_WITH_EMPLOYEE); - } - departmentDao.deleteById(deptId); - return ResponseDTO.succ(); - } - - /** - * 根据id获取部门信息 - * - * @param departmentId - * @return AjaxResult - */ - public ResponseDTO getDepartmentById(Long departmentId) { - DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); - if (departmentEntity == null) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.DEPT_NOT_EXISTS); - } - DepartmentVO departmentVO = SmartBeanUtil.copy(departmentEntity, DepartmentVO.class); - return ResponseDTO.succData(departmentVO); - } - - /** - * 获取所有部门 - * - * @return - */ - public ResponseDTO> listAll() { - List departmentVOList = departmentDao.listAll(); - return ResponseDTO.succData(departmentVOList); - } - - /** - * 上下移动 - * - * @param departmentId - * @param swapId - * @return - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO upOrDown(Long departmentId, Long swapId) { - DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); - if (departmentEntity == null) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.NOT_EXISTS); - } - DepartmentEntity swapEntity = departmentDao.selectById(swapId); - if (swapEntity == null) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.NOT_EXISTS); - } - Long departmentSort = departmentEntity.getSort(); - departmentEntity.setSort(swapEntity.getSort()); - departmentDao.updateById(departmentEntity); - swapEntity.setSort(departmentSort); - departmentDao.updateById(swapEntity); - return ResponseDTO.succ(); - } - - /** - * 部门升级 - * - * @param departmentId - * @return - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO upgrade(Long departmentId) { - DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); - if (departmentEntity == null) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.NOT_EXISTS); - } - if (departmentEntity.getParentId() == null || departmentEntity.getParentId().equals(0)) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.ERROR_PARAM, "此部门已经是根节点无法移动"); - } - DepartmentEntity parentEntity = departmentDao.selectById(departmentEntity.getParentId()); - - departmentEntity.setParentId(parentEntity.getParentId()); - departmentDao.updateById(departmentEntity); - return ResponseDTO.succ(); - } - - /** - * 部门降级 - * - * @param departmentId - * @param preId - * @return - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO downgrade(Long departmentId, Long preId) { - DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); - if (departmentEntity == null) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.NOT_EXISTS); - } - DepartmentEntity preEntity = departmentDao.selectById(preId); - if (preEntity == null) { - return ResponseDTO.wrap(DepartmentResponseCodeConst.NOT_EXISTS); - } - departmentEntity.setParentId(preEntity.getId()); - departmentDao.updateById(departmentEntity); - return ResponseDTO.succ(); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentTreeService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentTreeService.java deleted file mode 100644 index b34a2678..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/DepartmentTreeService.java +++ /dev/null @@ -1,99 +0,0 @@ -package net.lab1024.smartadmin.module.system.department; - -import net.lab1024.smartadmin.module.system.department.domain.dto.DepartmentVO; -import com.google.common.collect.Lists; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/29 0029 下午 13:52 - * @since JDK1.8 - */ -@Service -public class DepartmentTreeService { - - @Autowired - private DepartmentDao departmentDao; - - /** - * 构建部门树结构 - * @param departmentVOList - * @return - */ - public List buildTree(List departmentVOList) { - if(CollectionUtils.isEmpty(departmentVOList)){ - return Lists.newArrayList(); - } - List list = departmentVOList.stream().filter(e -> e.getParentId() == null || e.getParentId() == 0).collect(Collectors.toList()); - if(CollectionUtils.isEmpty(list)){ - return Lists.newArrayList(); - } - this.buildTree(list,departmentVOList); - return list; - } - - private void buildTree(List nodeList,List departmentVOList){ - int nodeSize = nodeList.size(); - for(int i =0 ;i< nodeSize;i++){ - int preIndex = i-1; - int nextIndex = i+1; - DepartmentVO node = nodeList.get(i); - if(preIndex>-1){ - node.setPreId(nodeList.get(preIndex).getId()); - } - if(nextIndex departmentVOList) { - List children = getChildren(node, departmentVOList); - if (CollectionUtils.isNotEmpty(children)) { - node.setChildrenDepartment(children); - this.buildTree(children,departmentVOList); - } - } - - private List getChildren(DepartmentVO node, List departmentVOList) { - Long id = node.getId(); - return departmentVOList.stream().filter(e -> id.equals(e.getParentId())).collect(Collectors.toList()); - } - - - - /** - * 通过部门id,获取当前以及下属部门 - */ - public void buildIdList(Long deptId, List result) { - List departmentVOList = departmentDao.listAll(); - result.add(deptId); - if (null == deptId) { - result.addAll(departmentVOList.stream().map(DepartmentVO::getId).collect(Collectors.toList())); - return; - } - List children = getChildrenIdList(deptId, departmentVOList); - if (!children.isEmpty()) { - result.addAll(children.stream().map(DepartmentVO::getId).collect(Collectors.toList())); - for (DepartmentVO child : children) { - buildTree(child, departmentVOList); - } - } - } - - private List getChildrenIdList(Long deptId, List departmentVOList) { - return departmentVOList.stream().filter(e -> deptId.equals(e.getParentId())).collect(Collectors.toList()); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/entity/DepartmentEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/entity/DepartmentEntity.java deleted file mode 100644 index 26023788..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/department/domain/entity/DepartmentEntity.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.lab1024.smartadmin.module.system.department.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -import java.io.Serializable; - -/** - * 部门实体类 - * t_department 数据表 - * - * @author listen - * @date 2017/12/19 10:45 - */ -@Data -@TableName(value = "t_department") -public class DepartmentEntity extends BaseEntity implements Serializable { - - private static final long serialVersionUID = -6787726615141147044L; - - /** - * 部门名称 - */ - private String name; - - /** - * 部门简称 - */ - private String shortName; - - /** - * 负责人员工 id - */ - private Long managerId; - - /** - * 部门父级id - */ - private Long parentId; - - /** - * 排序 - */ - private Long sort; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeController.java deleted file mode 100644 index 33c788e1..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeController.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee; - -import net.lab1024.smartadmin.common.anno.NoValidPrivilege; -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.system.employee.domain.dto.*; -import net.lab1024.smartadmin.module.system.employee.domain.vo.EmployeeVO; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.util.SmartRequestTokenUtil; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -/** - * 员工管理 - * - * @author lidoudou - * @date 2017年12月19日上午11:34:52 - */ -@RestController -@Api(tags = {SwaggerTagConst.Admin.MANAGER_USER}) -@OperateLog -public class EmployeeController { - - @Autowired - private EmployeeService employeeService; - - @PostMapping("/employee/query") - @ApiOperation(value = "员工管理查询", notes = "员工管理查询 @author lidoudou") - public ResponseDTO> query(@RequestBody EmployeeQueryDTO query) { - return employeeService.selectEmployeeList(query); - } - - @GetMapping("/employee/get/all") - @ApiOperation(value = "查询所有员工基本信息,用于选择框", notes = "查询所有员工基本信息,用于选择框") - @NoValidPrivilege - public ResponseDTO> getAll() { - return ResponseDTO.succData(employeeService.getAllEmployee()); - } - - @ApiOperation(value = "添加员工", notes = "@author yandanyang") - @PostMapping("/employee/add") - public ResponseDTO addEmployee(@Valid @RequestBody EmployeeAddDTO emp) { - RequestTokenBO requestToken = SmartRequestTokenUtil.getRequestUser(); - return employeeService.addEmployee(emp, requestToken); - } - - @ApiOperation(value = "禁用单个员工", notes = "@author yandanyang") - @GetMapping("/employee/updateStatus/{employeeId}/{status}") - public ResponseDTO updateStatus(@PathVariable("employeeId") Long employeeId, @PathVariable("status") Integer status) { - return employeeService.updateStatus(employeeId, status); - } - - @ApiOperation(value = "批量禁用", notes = "@author yandanyang") - @PostMapping("/employee/batchUpdateStatus") - public ResponseDTO batchUpdateStatus(@Valid @RequestBody EmployeeBatchUpdateStatusDTO batchUpdateStatusDTO) { - return employeeService.batchUpdateStatus(batchUpdateStatusDTO); - } - - @ApiOperation(value = "更新员工信息", notes = "@author yandanyang") - @PostMapping("/employee/update") - public ResponseDTO updateEmployee(@Valid @RequestBody EmployeeUpdateDTO employeeUpdateDto) { - return employeeService.updateEmployee(employeeUpdateDto); - } - - @ApiOperation(value = "删除员工信息", notes = "@author yandanyang") - @PostMapping("/employee/delete/{employeeId}") - public ResponseDTO deleteEmployeeById(@PathVariable("employeeId") Long employeeId) { - return employeeService.deleteEmployeeById(employeeId); - } - - @ApiOperation(value = "单个员工角色授权", notes = "@author yandanyang") - @PostMapping("/employee/updateRoles") - public ResponseDTO updateRoles(@Valid @RequestBody EmployeeUpdateRolesDTO updateRolesDTO) { - return employeeService.updateRoles(updateRolesDTO); - } - - @ApiOperation(value = "修改密码", notes = "@author yandanyang") - @PostMapping("/employee/updatePwd") - public ResponseDTO updatePwd(@Valid @RequestBody EmployeeUpdatePwdDTO updatePwdDTO) { - RequestTokenBO requestToken = SmartRequestTokenUtil.getRequestUser(); - return employeeService.updatePwd(updatePwdDTO, requestToken); - } - - @ApiOperation(value = "通过部门id获取当前部门的人员&没有部门的人", notes = "@author yandanyang") - @GetMapping("/employee/listEmployeeByDeptId/{deptId}") - public ResponseDTO> listEmployeeByDeptId(@PathVariable Long deptId) { - return employeeService.getEmployeeByDeptId(deptId); - } - - @ApiOperation(value = "员工重置密码", notes = "@author lizongliang") - @GetMapping("/employee/resetPasswd/{employeeId}") - public ResponseDTO resetPasswd(@PathVariable("employeeId") Integer employeeId) { - return employeeService.resetPasswd(employeeId); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeDao.java deleted file mode 100644 index d77779ea..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeDao.java +++ /dev/null @@ -1,138 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeDTO; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeQueryDTO; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeQueryExportDTO; -import net.lab1024.smartadmin.module.system.employee.domain.entity.EmployeeEntity; -import net.lab1024.smartadmin.module.system.employee.domain.vo.EmployeeVO; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.Collection; -import java.util.List; - -/** - * 员工dao接口 - * - * @author lidoudou - * @date 2017年12月19日下午1:36:30 - */ -@Mapper -@Component -public interface EmployeeDao extends BaseMapper { - /** - * 查询员工列表 - * - * @param page - * @param queryDTO - * @return - */ - List selectEmployeeList(Page page, @Param("queryDTO") EmployeeQueryDTO queryDTO); - - /** - * 不带分页查询员工列表 - * - * @param queryDTO - * @return - */ - List selectEmployeeList(@Param("queryDTO") EmployeeQueryExportDTO queryDTO); - - /** - * 批量更新禁用状态 - * - * @param employeeIds - * @param isDisabled - */ - void batchUpdateStatus(@Param("employeeIds") List employeeIds, @Param("isDisabled") Integer isDisabled); - - /** - * 登录 - * - * @param loginName - * @param loginPwd - * @return - */ - EmployeeDTO login(@Param("loginName") String loginName, @Param("loginPwd") String loginPwd); - - /** - * 通过登录名查询 - * - * @param loginName - * @param isDisabled - * @return - */ - EmployeeDTO getByLoginName(@Param("loginName") String loginName, @Param("isDisabled") Integer isDisabled); - - /** - * 通过手机号查询 - * - * @param phone - * @param isDisabled - * @return - */ - EmployeeDTO getByPhone(@Param("phone") String phone, @Param("isDisabled") Integer isDisabled); - - /** - * 获取所有员工 - * - * @return - */ - List listAll(); - - /** - * 获取某个部门员工数 - * - * @param depId - * @param deleteFlag 可以null - * @return - */ - Integer countByDepartmentId(@Param("depId") Long depId, @Param("deleteFlag") Boolean deleteFlag); - - /** - * 获取一批员工 - * - * @param employeeIds - * @return - */ - List getEmployeeByIds(@Param("ids") Collection employeeIds); - - - EmployeeDTO getEmployeeById(@Param("id") Long employeeId); - - /** - * 获取某个部门的员工 - * - * @param departmentId - * @return - */ - List getEmployeeIdByDeptId(@Param("departmentId") Long departmentId); - - /** - * 获取某批部门的员工 - * - * @param departmentIds - * @return - */ - List getEmployeeIdByDeptIds(@Param("departmentIds") List departmentIds); - - - /** - * 员工重置密码 - * - * @param employeeId - * @param password - * @return - */ - Integer updatePassword(@Param("employeeId") Integer employeeId, @Param("password") String password); - - - /** - * 查询所有员工 - * - * @return - */ - List selectAll(); -} \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeService.java deleted file mode 100644 index a689bea2..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/EmployeeService.java +++ /dev/null @@ -1,369 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.google.common.collect.Lists; -import net.lab1024.smartadmin.common.constant.JudgeEnum; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.CommonConst; -import net.lab1024.smartadmin.module.system.department.DepartmentDao; -import net.lab1024.smartadmin.module.system.department.domain.entity.DepartmentEntity; -import net.lab1024.smartadmin.module.system.employee.constant.EmployeeResponseCodeConst; -import net.lab1024.smartadmin.module.system.employee.constant.EmployeeStatusEnum; -import net.lab1024.smartadmin.module.system.employee.domain.bo.EmployeeBO; -import net.lab1024.smartadmin.module.system.employee.domain.dto.*; -import net.lab1024.smartadmin.module.system.employee.domain.entity.EmployeeEntity; -import net.lab1024.smartadmin.module.system.employee.domain.vo.EmployeeVO; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.module.system.position.PositionDao; -import net.lab1024.smartadmin.module.system.position.PositionService; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionRelationAddDTO; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionRelationResultDTO; -import net.lab1024.smartadmin.module.system.privilege.service.PrivilegeEmployeeService; -import net.lab1024.smartadmin.module.system.role.roleemployee.RoleEmployeeDao; -import net.lab1024.smartadmin.module.system.role.roleemployee.domain.RoleEmployeeEntity; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartDigestUtil; -import net.lab1024.smartadmin.util.SmartPageUtil; -import net.lab1024.smartadmin.util.SmartVerificationUtil; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.map.HashedMap; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -/** - * 员工管理 - * - * @author lidoudou - * @date 2017年12月21日上午11:54:52 - */ -@Service -public class EmployeeService { - - private static final String RESET_PASSWORD = "123456"; - - @Autowired - private EmployeeDao employeeDao; - - @Autowired - private DepartmentDao departmentDao; - - @Autowired - private RoleEmployeeDao roleEmployeeDao; - - @Autowired - private PositionService positionService; - - @Autowired - private PositionDao positionDao; - - @Autowired - private PrivilegeEmployeeService privilegeEmployeeService; - - /** - * 员工基本信息的缓存 - */ - private static final ConcurrentHashMap employeeCache = new ConcurrentHashMap<>(); - - public List getAllEmployee() { - return employeeDao.selectAll(); - } - - public EmployeeBO getById(Long id) { - EmployeeBO employeeBO = employeeCache.get(id); - if (employeeBO == null) { - EmployeeEntity employeeEntity = employeeDao.selectById(id); - if (employeeEntity != null) { - Boolean superman = privilegeEmployeeService.isSuperman(id); - employeeBO = new EmployeeBO(employeeEntity, superman); - employeeCache.put(employeeEntity.getId(), employeeBO); - } - } - return employeeBO; - } - - /** - * 查询员工列表 - * - * @param queryDTO - * @return - */ - public ResponseDTO> selectEmployeeList(EmployeeQueryDTO queryDTO) { - Page pageParam = SmartPageUtil.convert2QueryPage(queryDTO); - queryDTO.setIsDelete(JudgeEnum.NO.getValue()); - List employeeList = employeeDao.selectEmployeeList(pageParam, queryDTO); - List employeeIdList = employeeList.stream().map(EmployeeDTO::getId).collect(Collectors.toList()); - - if (CollectionUtils.isNotEmpty(employeeIdList)) { - List positionRelationResultDTOList = positionDao.selectEmployeesRelation(employeeIdList); - Map> employeePositionMap = new HashedMap(); - - for (PositionRelationResultDTO positionRelationResultDTO : positionRelationResultDTOList) { - List relationResultDTOList = employeePositionMap.get(positionRelationResultDTO.getEmployeeId()); - //匹配对应的岗位 - if (relationResultDTOList == null) { - relationResultDTOList = new ArrayList<>(); - employeePositionMap.put(positionRelationResultDTO.getEmployeeId(), relationResultDTOList); - } - relationResultDTOList.add(positionRelationResultDTO); - } - - for (EmployeeDTO employeeDTO : employeeList) { - List relationResultDTOList = employeePositionMap.get(employeeDTO.getId()); - if (relationResultDTOList != null) { - employeeDTO.setPositionRelationList(relationResultDTOList); - employeeDTO.setPositionName(relationResultDTOList.stream().map(PositionRelationResultDTO::getPositionName).collect(Collectors.joining(","))); - } - } - } - return ResponseDTO.succData(SmartPageUtil.convert2PageResult(pageParam, employeeList, EmployeeVO.class)); - } - - /** - * 新增员工 - * - * @param employeeAddDto - * @param requestToken - * @return - */ - public ResponseDTO addEmployee(EmployeeAddDTO employeeAddDto, RequestTokenBO requestToken) { - EmployeeEntity entity = SmartBeanUtil.copy(employeeAddDto, EmployeeEntity.class); - if (StringUtils.isNotEmpty(employeeAddDto.getIdCard())) { - boolean checkResult = Pattern.matches(SmartVerificationUtil.ID_CARD, employeeAddDto.getIdCard()); - if (!checkResult) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.ID_CARD_ERROR); - } - } - if (StringUtils.isNotEmpty(employeeAddDto.getBirthday())) { - boolean checkResult = Pattern.matches(SmartVerificationUtil.DATE, employeeAddDto.getBirthday()); - if (!checkResult) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.BIRTHDAY_ERROR); - } - } - //同名员工 - EmployeeDTO sameNameEmployee = employeeDao.getByLoginName(entity.getLoginName(), EmployeeStatusEnum.NORMAL.getValue()); - if (null != sameNameEmployee) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.LOGIN_NAME_EXISTS); - } - //同电话员工 - EmployeeDTO samePhoneEmployee = employeeDao.getByPhone(entity.getPhone(), EmployeeStatusEnum.NORMAL.getValue()); - if (null != samePhoneEmployee) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.PHONE_EXISTS); - } - Long departmentId = entity.getDepartmentId(); - DepartmentEntity department = departmentDao.selectById(departmentId); - if (department == null) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.DEPT_NOT_EXIST); - } - - //如果没有密码 默认设置为123456 - String pwd = entity.getLoginPwd(); - if (StringUtils.isBlank(pwd)) { - entity.setLoginPwd(SmartDigestUtil.encryptPassword(CommonConst.Password.SALT_FORMAT, RESET_PASSWORD)); - } else { - entity.setLoginPwd(SmartDigestUtil.encryptPassword(CommonConst.Password.SALT_FORMAT, entity.getLoginPwd())); - } - - entity.setCreateUser(requestToken.getRequestUserId()); - if (StringUtils.isEmpty(entity.getBirthday())) { - entity.setBirthday(null); - } - employeeDao.insert(entity); - - PositionRelationAddDTO positionRelAddDTO = new PositionRelationAddDTO(employeeAddDto.getPositionIdList(), entity.getId()); - //存储所选岗位信息 - positionService.addPositionRelation(positionRelAddDTO); - - return ResponseDTO.succ(); - } - - /** - * 更新禁用状态 - * - * @param employeeId - * @param status - * @return - */ - public ResponseDTO updateStatus(Long employeeId, Integer status) { - if (null == employeeId) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.EMP_NOT_EXISTS); - } - EmployeeBO entity = getById(employeeId); - if (null == entity) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.EMP_NOT_EXISTS); - } - List empIds = Lists.newArrayList(); - empIds.add(employeeId); - employeeDao.batchUpdateStatus(empIds, status); - employeeCache.remove(employeeId); - return ResponseDTO.succ(); - } - - /** - * 批量更新员工状态 - * - * @param batchUpdateStatusDTO - * @return - */ - public ResponseDTO batchUpdateStatus(EmployeeBatchUpdateStatusDTO batchUpdateStatusDTO) { - employeeDao.batchUpdateStatus(batchUpdateStatusDTO.getEmployeeIds(), batchUpdateStatusDTO.getStatus()); - if (batchUpdateStatusDTO.getEmployeeIds() != null) { - batchUpdateStatusDTO.getEmployeeIds().forEach(e -> employeeCache.remove(e)); - } - return ResponseDTO.succ(); - } - - /** - * 更新员工 - * - * @param updateDTO - * @return - */ - public ResponseDTO updateEmployee(EmployeeUpdateDTO updateDTO) { - Long employeeId = updateDTO.getId(); - EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); - if (null == employeeEntity) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.EMP_NOT_EXISTS); - } - if (StringUtils.isNotBlank(updateDTO.getIdCard())) { - boolean checkResult = Pattern.matches(SmartVerificationUtil.ID_CARD, updateDTO.getIdCard()); - if (!checkResult) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.ID_CARD_ERROR); - } - } - if (StringUtils.isNotEmpty(updateDTO.getBirthday())) { - boolean checkResult = Pattern.matches(SmartVerificationUtil.DATE, updateDTO.getBirthday()); - if (!checkResult) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.BIRTHDAY_ERROR); - } - } - Long departmentId = updateDTO.getDepartmentId(); - DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); - if (departmentEntity == null) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.DEPT_NOT_EXIST); - } - EmployeeDTO sameNameEmployee = employeeDao.getByLoginName(updateDTO.getLoginName(), EmployeeStatusEnum.NORMAL.getValue()); - if (null != sameNameEmployee && !sameNameEmployee.getId().equals(employeeId)) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.LOGIN_NAME_EXISTS); - } - EmployeeDTO samePhoneEmployee = employeeDao.getByPhone(updateDTO.getLoginName(), EmployeeStatusEnum.NORMAL.getValue()); - if (null != samePhoneEmployee && !samePhoneEmployee.getId().equals(employeeId)) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.PHONE_EXISTS); - } - String newPwd = updateDTO.getLoginPwd(); - if (!StringUtils.isBlank(newPwd)) { - updateDTO.setLoginPwd(SmartDigestUtil.encryptPassword(CommonConst.Password.SALT_FORMAT, updateDTO.getLoginPwd())); - } else { - updateDTO.setLoginPwd(employeeEntity.getLoginPwd()); - } - EmployeeEntity entity = SmartBeanUtil.copy(updateDTO, EmployeeEntity.class); - entity.setUpdateTime(new Date()); - if (StringUtils.isEmpty(entity.getBirthday())) { - entity.setBirthday(null); - } - if (CollectionUtils.isNotEmpty(updateDTO.getPositionIdList())) { - //删除旧的关联关系 添加新的关联关系 - positionService.removePositionRelation(entity.getId()); - PositionRelationAddDTO positionRelAddDTO = new PositionRelationAddDTO(updateDTO.getPositionIdList(), entity.getId()); - positionService.addPositionRelation(positionRelAddDTO); - } - entity.setIsDisabled(employeeEntity.getIsDisabled()); - entity.setIsLeave(employeeEntity.getIsLeave()); - entity.setCreateUser(employeeEntity.getCreateUser()); - entity.setCreateTime(employeeEntity.getCreateTime()); - entity.setUpdateTime(new Date()); - employeeDao.updateById(entity); - employeeCache.remove(employeeId); - return ResponseDTO.succ(); - } - - /** - * 删除员工 - * - * @param employeeId 员工ID - * @return - */ - public ResponseDTO deleteEmployeeById(Long employeeId) { - EmployeeEntity employeeEntity = employeeDao.selectById(employeeId); - if (null == employeeEntity) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.EMP_NOT_EXISTS); - } - //假删 - employeeEntity.setIsDelete(JudgeEnum.YES.getValue().longValue()); - employeeDao.updateById(employeeEntity); - employeeCache.remove(employeeId); - return ResponseDTO.succ(); - } - - /** - * 更新用户角色 - * - * @param updateRolesDTO - * @return - */ - public ResponseDTO updateRoles(EmployeeUpdateRolesDTO updateRolesDTO) { - roleEmployeeDao.deleteByEmployeeId(updateRolesDTO.getEmployeeId()); - if (CollectionUtils.isNotEmpty(updateRolesDTO.getRoleIds())) { - List roleEmployeeEntities = Lists.newArrayList(); - RoleEmployeeEntity roleEmployeeEntity; - for (Long roleId : updateRolesDTO.getRoleIds()) { - roleEmployeeEntity = new RoleEmployeeEntity(); - roleEmployeeEntity.setEmployeeId(updateRolesDTO.getEmployeeId()); - roleEmployeeEntity.setRoleId(roleId); - roleEmployeeEntities.add(roleEmployeeEntity); - } - roleEmployeeDao.batchInsert(roleEmployeeEntities); - } - return ResponseDTO.succ(); - } - - /** - * 更新密码 - * - * @param updatePwdDTO - * @param requestToken - * @return - */ - public ResponseDTO updatePwd(EmployeeUpdatePwdDTO updatePwdDTO, RequestTokenBO requestToken) { - Long employeeId = requestToken.getRequestUserId(); - EmployeeEntity employee = employeeDao.selectById(employeeId); - if (employee == null) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.EMP_NOT_EXISTS); - } - if (!employee.getLoginPwd().equals(SmartDigestUtil.encryptPassword(CommonConst.Password.SALT_FORMAT, updatePwdDTO.getOldPwd()))) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.PASSWORD_ERROR); - } - employee.setLoginPwd(SmartDigestUtil.encryptPassword(CommonConst.Password.SALT_FORMAT, updatePwdDTO.getPwd())); - employeeDao.updateById(employee); - employeeCache.remove(employeeId); - return ResponseDTO.succ(); - } - - public ResponseDTO> getEmployeeByDeptId(Long departmentId) { - List list = employeeDao.getEmployeeIdByDeptId(departmentId); - return ResponseDTO.succData(list); - } - - /** - * 重置密码 - * - * @param employeeId - * @return - */ - public ResponseDTO resetPasswd(Integer employeeId) { - String md5Password = SmartDigestUtil.encryptPassword(CommonConst.Password.SALT_FORMAT, RESET_PASSWORD); - employeeDao.updatePassword(employeeId, md5Password); - employeeCache.remove(employeeId); - return ResponseDTO.succ(); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/constant/EmployeeStatusEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/constant/EmployeeStatusEnum.java deleted file mode 100644 index 3c07ce72..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/constant/EmployeeStatusEnum.java +++ /dev/null @@ -1,56 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.constant; - -import net.lab1024.smartadmin.common.domain.BaseEnum; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 16:22 - * @since JDK1.8 - */ - -public enum EmployeeStatusEnum implements BaseEnum { - - /** - * 用户正常状态 1 - */ - NORMAL(0, "正常"), - - /** - * 用户已被禁用 0 - */ - DISABLED(1, "禁用"); - - private Integer value; - - private String desc; - - EmployeeStatusEnum(Integer value, String desc) { - this.value = value; - this.desc = desc; - } - - /** - * 获取枚举类的值 - * - * @return Integer - */ - @Override - public Integer getValue() { - return value; - } - - /** - * 获取枚举类的说明 - * - * @return String - */ - @Override - public String getDesc() { - return this.desc; - } -} \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/bo/EmployeeBO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/bo/EmployeeBO.java deleted file mode 100644 index 57050a5c..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/bo/EmployeeBO.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.domain.bo; - -import net.lab1024.smartadmin.module.system.employee.domain.entity.EmployeeEntity; -import lombok.Getter; - - -@Getter -public class EmployeeBO { - - /** - * 主键id - */ - private Long id; - - /** - * 登录账号 - */ - private String loginName; - - /** - * 员工名称 - */ - private String actualName; - - /** - * 别名 - */ - private String nickName; - - /** - * 手机号码 - */ - private String phone; - - /** - * 部门id - */ - private Long departmentId; - - /** - * 是否离职 - */ - private Integer isLeave; - - /** - * 是否被禁用 - */ - private Integer isDisabled; - - /** - * 删除状态 0否 1是 - */ - private Long isDelete; - - /** - * 是否为超级管理员 - */ - private Boolean isSuperman; - - public EmployeeBO(EmployeeEntity employeeEntity, boolean isSuperman) { - this.id = employeeEntity.getId(); - this.loginName = employeeEntity.getLoginName(); - this.actualName = employeeEntity.getActualName(); - this.nickName = employeeEntity.getNickName(); - this.phone = employeeEntity.getPhone(); - this.departmentId = employeeEntity.getDepartmentId(); - this.isLeave = employeeEntity.getIsLeave(); - this.isDisabled = employeeEntity.getIsDisabled(); - this.isDelete = employeeEntity.getIsDelete(); - this.isSuperman = isSuperman; - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeAddDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeAddDTO.java deleted file mode 100644 index bb1ac368..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeAddDTO.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.domain.dto; - -import net.lab1024.smartadmin.util.SmartVerificationUtil; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import java.util.List; - -/** - * 添加员工 - * - * @author lidoudou - * @date 2017年12月19日下午2:06:31 - */ -@Data -public class EmployeeAddDTO { - - @ApiModelProperty("姓名") - @NotNull(message = "姓名不能为空") - private String actualName; - - @ApiModelProperty("登录名") - @NotNull(message = "姓名不能为空") - private String loginName; - - @ApiModelProperty("别名") - private String nickName; - - @ApiModelProperty("部门id") - @NotNull(message = "部门id不能为空") - private Long departmentId; - - @ApiModelProperty("是否启用") - @NotNull(message = "是否被禁用不能为空") - private Integer isDisabled; - - @ApiModelProperty("手机号") - @NotNull(message = "手机号不能为空") - @Pattern(regexp = SmartVerificationUtil.PHONE_REGEXP, message = "手机号格式不正确") - private String phone; - - @ApiModelProperty("身份证(可选)") - private String idCard; - - @ApiModelProperty("生日(可选)") - private String birthday; - - @ApiModelProperty("密码") - // @NotNull(message = "密码不能为空") - // @Length(min = 6, message = "密码最少为6位字符") - private String loginPwd; - - @ApiModelProperty("邮箱") - private String email; - - @ApiModelProperty("岗位ID 集合") - @NotEmpty(message = "岗位ID 集合不能为空") - private List positionIdList; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeBaseDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeBaseDTO.java deleted file mode 100644 index 0931bdb4..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeBaseDTO.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.domain.dto; - -import net.lab1024.smartadmin.util.SmartVerificationUtil; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; - -/** - * 添加员工 - * - * @author lidoudou - * @date 2017年12月19日下午2:06:31 - */ -@Data -public class EmployeeBaseDTO { - - @ApiModelProperty("姓名") - @NotNull(message = "姓名不能为空") - private String actualName; - - @ApiModelProperty("登录名") - @NotNull(message = "姓名不能为空") - private String loginName; - - @ApiModelProperty("别名") - private String nickName; - - @ApiModelProperty("部门id") - @NotNull(message = "部门id不能为空") - private Long departmentId; - - @ApiModelProperty("是否启用") - @NotNull(message = "是否被禁用不能为空") - private Integer isDisabled; - - @ApiModelProperty("手机号") - @NotNull(message = "手机号不能为空") - @Pattern(regexp = SmartVerificationUtil.PHONE_REGEXP, message = "手机号格式不正确") - private String phone; - - @ApiModelProperty("身份证(可选)") - private String idCard; - - @ApiModelProperty("生日(可选)") - private String birthday; - - @ApiModelProperty("邮箱") - private String email; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeBatchUpdateStatusDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeBatchUpdateStatusDTO.java deleted file mode 100644 index 7d9db716..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeBatchUpdateStatusDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 批量更新 - * - * @author lidoudou - * @date 2017年12月21日上午13:17:52 - */ -@Data -public class EmployeeBatchUpdateStatusDTO { - - @ApiModelProperty("员工ids") - @NotNull(message = "员工ids不能为空") - private List employeeIds; - - @ApiModelProperty("状态") - @NotNull(message = "状态不能为空") - private Integer status; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeDTO.java deleted file mode 100644 index 61b49e1a..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeDTO.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.domain.dto; - -import com.fasterxml.jackson.annotation.JsonFormat; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionRelationResultDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * 员工列表DTO - * - * @author lidoudou - * @date 2017年12月21日上午09:09:31 - */ -@Data -public class EmployeeDTO { - - @ApiModelProperty("主键id") - private Long id; - - @ApiModelProperty("登录账号") - private String loginName; - - @ApiModelProperty("别名") - private String nickName; - - @ApiModelProperty("员工名称") - private String actualName; - - @ApiModelProperty("手机号码") - private String phone; - - @ApiModelProperty("身份证") - private String idCard; - - @ApiModelProperty("出生日期") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date birthday; - - @ApiModelProperty("创建者id") - private Long createUser; - - @ApiModelProperty("部门id") - private Long departmentId; - - @ApiModelProperty("是否离职") - private Integer isLeave; - - @ApiModelProperty("是否被禁用") - private Integer isDisabled; - - @ApiModelProperty("是否删除") - private Integer isDelete; - - @ApiModelProperty("部门名称") - private String departmentName; - - @ApiModelProperty("邮箱") - private String email; - - @ApiModelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date createTime; - - @ApiModelProperty("岗位关联信息") - private List positionRelationList; - - @ApiModelProperty("岗位名称") - private String positionName; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeLoginFormDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeLoginFormDTO.java deleted file mode 100644 index 0bf1f1a3..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeLoginFormDTO.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 登录 - * - * @author lidoudou - * @date 2017年12月19日上午11:49:46 - */ -@Data -public class EmployeeLoginFormDTO { - - @NotNull(message = "登录名不能为空") - @ApiModelProperty(example = "sa") - private String loginName; - - @NotNull(message = "密码不能为空") - @ApiModelProperty(example = "123456") - private String loginPwd; - - @ApiModelProperty(value = "验证码uuid") - private String codeUuid; - - @ApiModelProperty(value = "验证码") - private String code; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeQueryDTO.java deleted file mode 100644 index e384a4da..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeQueryDTO.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.domain.dto; - -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -/** - * 员工列表DTO - * - * @author lidoudou - * @date 2017年12月21日上午09:09:31 - */ -@Data -public class EmployeeQueryDTO extends PageParamDTO { - - private String phone; - - private String actualName; - - private String keyword; - - private Long departmentId; - - private Integer isLeave; - - private Integer isDisabled; - - /** - * 删除状态 0否 1是 - */ - @ApiModelProperty("删除状态 0否 1是 不需要传") - private Integer isDelete; - - @ApiModelProperty("员工id集合") - private List employeeIds; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdateDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdateDTO.java deleted file mode 100644 index d835c522..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdateDTO.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 添加员工 - * - * @author lidoudou - * @date 2017年12月19日下午2:06:31 - */ -@Data -public class EmployeeUpdateDTO extends EmployeeBaseDTO { - - @ApiModelProperty("员工id") - @NotNull(message = "员工id不能为空") - private Long id; - - @ApiModelProperty("密码") - private String loginPwd; - - @ApiModelProperty("岗位ID 集合") - private List positionIdList; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdatePwdDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdatePwdDTO.java deleted file mode 100644 index f5841c31..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/dto/EmployeeUpdatePwdDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 修改密码所需参数 - * - * @author cyj - * @date 2018-02-23 下午 4:53 - */ -@Data -public class EmployeeUpdatePwdDTO { - - @ApiModelProperty("新密码") - @NotNull - private String pwd; - - @ApiModelProperty("原密码") - @NotNull - private String oldPwd; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/entity/EmployeeEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/entity/EmployeeEntity.java deleted file mode 100644 index 1744ee1b..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/entity/EmployeeEntity.java +++ /dev/null @@ -1,91 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -import java.io.Serializable; - -/** - * 员工实体类 - * - * @author lidoudou - * @date 2017年12月19日下午1:34:48 - */ -@Data -@TableName("t_employee") -public class EmployeeEntity extends BaseEntity implements Serializable { - - private static final long serialVersionUID = -8794328598524272806L; - - /** - * 登录账号 - */ - private String loginName; - - /** - * 登录密码 - */ - private String loginPwd; - - /** - * 员工名称 - */ - private String actualName; - - /** - * 别名 - */ - private String nickName; - - /** - * 手机号码 - */ - private String phone; - - /** - * 身份证 - */ - private String idCard; - - /** - * 出生日期 - */ - private String birthday; - - - /** - * 部门id - */ - private Long departmentId; - - /** - * 是否离职 - */ - private Integer isLeave; - - /** - * 是否被禁用 - */ - private Integer isDisabled; - /** - * 邮箱 - */ - private String email; - - /** - * 备注 - */ - private String remark; - - /** - * 创建者id - */ - private Long createUser; - - /** - * 删除状态 0否 1是 - */ - private Long isDelete; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/vo/EmployeeVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/vo/EmployeeVO.java deleted file mode 100644 index a180d59b..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/employee/domain/vo/EmployeeVO.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.lab1024.smartadmin.module.system.employee.domain.vo; - -import com.fasterxml.jackson.annotation.JsonFormat; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionRelationResultDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * @author bhr - * @Description: 员工信息 - * @date 2019/8/28 9:04 - */ - -@Data -public class EmployeeVO { - - @ApiModelProperty("主键id") - private Long id; - - @ApiModelProperty("登录账号") - private String loginName; - - @ApiModelProperty("别名") - private String nickName; - - @ApiModelProperty("员工名称") - private String actualName; - - @ApiModelProperty("手机号码") - private String phone; - - @ApiModelProperty("身份证") - private String idCard; - - @ApiModelProperty("出生日期") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date birthday; - - @ApiModelProperty("创建者id") - private Long createUser; - - @ApiModelProperty("部门id") - private Long departmentId; - - @ApiModelProperty("是否离职") - private Integer isLeave; - - @ApiModelProperty("是否被禁用") - private Integer isDisabled; - - @ApiModelProperty("是否删除") - private Integer isDelete; - - @ApiModelProperty("部门名称") - private String departmentName; - - @ApiModelProperty("邮箱") - private String email; - - @ApiModelProperty("创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private Date createTime; - - @ApiModelProperty("岗位关联信息") - private List positionRelationList; - - @ApiModelProperty("岗位名称") - private String positionName; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginController.java deleted file mode 100644 index 414c9ad4..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginController.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.lab1024.smartadmin.module.system.login; - -import net.lab1024.smartadmin.common.anno.NoNeedLogin; -import net.lab1024.smartadmin.common.anno.NoValidPrivilege; -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeLoginFormDTO; -import net.lab1024.smartadmin.module.system.login.domain.KaptchaVO; -import net.lab1024.smartadmin.module.system.login.domain.LoginDetailVO; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.util.SmartRequestTokenUtil; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - -/** - * 后台登录 - * - * @author lidoudou - * @date 2017年12月19日上午11:46:04 - */ -@RestController -@Api(tags = {SwaggerTagConst.Admin.MANAGER_USER_LOGIN}) -@OperateLog -public class LoginController { - - @Autowired - private LoginService loginService; - - @PostMapping("/session/login") - @ApiOperation(value = "登录", notes = "登录") - @NoNeedLogin - public ResponseDTO login(@Valid @RequestBody EmployeeLoginFormDTO loginForm, HttpServletRequest request) { - return loginService.login(loginForm, request); - } - - @GetMapping("/session/get") - @ApiOperation(value = "获取session", notes = "获取session") - @NoValidPrivilege - public ResponseDTO getSession() { - RequestTokenBO requestUser = SmartRequestTokenUtil.getRequestUser(); - return ResponseDTO.succData(loginService.getSession(requestUser)); - } - - @GetMapping("/session/logOut") - @ApiOperation(value = "退出登陆", notes = "退出登陆") - @NoValidPrivilege - public ResponseDTO logOut() { - RequestTokenBO requestToken = SmartRequestTokenUtil.getRequestUser(); - if (null == requestToken) { - return ResponseDTO.wrap(LoginResponseCodeConst.LOGIN_ERROR); - } - return loginService.logoutByToken(requestToken); - } - - @GetMapping("/session/verificationCode") - @ApiOperation(value = "获取验证码", notes = "获取验证码") - @NoNeedLogin - public ResponseDTO verificationCode() { - return loginService.verificationCode(); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginService.java deleted file mode 100644 index 070a9ff4..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginService.java +++ /dev/null @@ -1,215 +0,0 @@ -package net.lab1024.smartadmin.module.system.login; - -import net.lab1024.smartadmin.common.constant.JudgeEnum; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.CommonConst; -import net.lab1024.smartadmin.module.system.department.DepartmentDao; -import net.lab1024.smartadmin.module.system.department.domain.entity.DepartmentEntity; -import net.lab1024.smartadmin.module.system.employee.EmployeeDao; -import net.lab1024.smartadmin.module.system.employee.constant.EmployeeResponseCodeConst; -import net.lab1024.smartadmin.module.system.employee.constant.EmployeeStatusEnum; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeDTO; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeLoginFormDTO; -import net.lab1024.smartadmin.module.business.log.LogService; -import net.lab1024.smartadmin.module.business.log.userloginlog.domain.UserLoginLogEntity; -import net.lab1024.smartadmin.module.system.login.domain.KaptchaVO; -import net.lab1024.smartadmin.module.system.login.domain.LoginDetailVO; -import net.lab1024.smartadmin.module.system.login.domain.LoginPrivilegeDTO; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.module.system.privilege.domain.entity.PrivilegeEntity; -import net.lab1024.smartadmin.module.system.privilege.service.PrivilegeEmployeeService; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartDigestUtil; -import net.lab1024.smartadmin.util.SmartIPUtil; -import com.google.code.kaptcha.impl.DefaultKaptcha; -import eu.bitwalker.useragentutils.UserAgent; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.ValueOperations; -import org.springframework.stereotype.Service; - -import javax.imageio.ImageIO; -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.util.List; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 18:10 - * @since JDK1.8 - */ -@Slf4j -@Service -public class LoginService { - - private static final String VERIFICATION_CODE_REDIS_PREFIX = "vc_%s"; - - @Autowired - private EmployeeDao employeeDao; - - @Autowired - private DepartmentDao departmentDao; - - @Autowired - private PrivilegeEmployeeService privilegeEmployeeService; - - @Autowired - private LoginTokenService loginTokenService; - - @Autowired - private LogService logService; - - @Autowired - private DefaultKaptcha defaultKaptcha; - - @Autowired - private ValueOperations redisValueOperations; - - /** - * 登陆 - * - * @param loginForm 登录名 密码 - * @return 登录用户基本信息 - */ - public ResponseDTO login(@Valid EmployeeLoginFormDTO loginForm, HttpServletRequest request) { -// String redisVerificationCode = redisValueOperations.get(loginForm.getCodeUuid()); -// //增加删除已使用的验证码方式 频繁登录 -// redisValueOperations.getOperations().delete(loginForm.getCodeUuid()); -// if (StringUtils.isEmpty(redisVerificationCode)) { -// return ResponseDTO.wrap(EmployeeResponseCodeConst.VERIFICATION_CODE_INVALID); -// } -// if (!redisVerificationCode.equalsIgnoreCase(loginForm.getCode())) { -// return ResponseDTO.wrap(EmployeeResponseCodeConst.VERIFICATION_CODE_INVALID); -// } - String loginPwd = SmartDigestUtil.encryptPassword(CommonConst.Password.SALT_FORMAT, loginForm.getLoginPwd()); - EmployeeDTO employeeDTO = employeeDao.login(loginForm.getLoginName(), loginPwd); - if (null == employeeDTO) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.LOGIN_FAILED); - } - if (EmployeeStatusEnum.DISABLED.equalsValue(employeeDTO.getIsDisabled())) { - return ResponseDTO.wrap(EmployeeResponseCodeConst.IS_DISABLED); - } - //jwt token赋值 - String compactJws = loginTokenService.generateToken(employeeDTO); - - LoginDetailVO loginDTO = SmartBeanUtil.copy(employeeDTO, LoginDetailVO.class); - - //获取前端功能权限 - loginDTO.setPrivilegeList(initEmployeePrivilege(employeeDTO.getId())); - - loginDTO.setXAccessToken(compactJws); - DepartmentEntity departmentEntity = departmentDao.selectById(employeeDTO.getDepartmentId()); - loginDTO.setDepartmentName(departmentEntity.getName()); - - //判断是否为超管 - Boolean isSuperman = privilegeEmployeeService.isSuperman(loginDTO.getId()); - loginDTO.setIsSuperMan(isSuperman); - //登陆操作日志 - UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); - UserLoginLogEntity logEntity = - UserLoginLogEntity.builder() - .userId(employeeDTO.getId()) - .userName(employeeDTO.getActualName()) - .remoteIp(SmartIPUtil.getRemoteIp(request)) - .remotePort(request.getRemotePort()) - .remoteBrowser(userAgent.getBrowser().getName()) - .remoteOs(userAgent.getOperatingSystem().getName()) - .loginStatus(JudgeEnum.YES.getValue()).build(); - logService.addLog(logEntity); - return ResponseDTO.succData(loginDTO); - } - - /** - * 手机端退出登陆,清除token缓存 - * - * @param requestToken - * @return 退出登陆是否成功,bool - */ - public ResponseDTO logoutByToken(RequestTokenBO requestToken) { - privilegeEmployeeService.removeCache(requestToken.getRequestUserId()); - return ResponseDTO.succ(); - } - - /** - * 获取验证码 - * - * @return - */ - public ResponseDTO verificationCode() { - KaptchaVO kaptchaVO = new KaptchaVO(); - String uuid = buildVerificationCodeRedisKey(UUID.randomUUID().toString()); - String kaptchaText = defaultKaptcha.createText(); - - String base64Code = ""; - - BufferedImage image = defaultKaptcha.createImage(kaptchaText); - ByteArrayOutputStream outputStream = null; - try { - outputStream = new ByteArrayOutputStream(); - ImageIO.write(image, "jpg", outputStream); - base64Code = Base64.encodeBase64String(outputStream.toByteArray()); - } catch (Exception e) { - log.error("verificationCode exception .{}", e); - } finally { - if (outputStream != null) { - try { - outputStream.close(); - } catch (Exception e) { - log.error("verificationCode outputStream close exception .{}", e); - } - } - } - kaptchaVO.setUuid(uuid); - kaptchaVO.setCode("data:image/png;base64," + base64Code); - redisValueOperations.set(uuid, kaptchaText, 60L, TimeUnit.SECONDS); - return ResponseDTO.succData(kaptchaVO); - } - - private String buildVerificationCodeRedisKey(String uuid) { - return String.format(VERIFICATION_CODE_REDIS_PREFIX, uuid); - } - - /** - * 初始化员工权限 - * - * @param employeeId - * @return - */ - public List initEmployeePrivilege(Long employeeId) { - List privilegeList = privilegeEmployeeService.getPrivilegesByEmployeeId(employeeId); - privilegeEmployeeService.updateCachePrivilege(employeeId, privilegeList); - return SmartBeanUtil.copyList(privilegeList, LoginPrivilegeDTO.class); - } - - public LoginDetailVO getSession(RequestTokenBO requestUser) { - LoginDetailVO loginDTO = SmartBeanUtil.copy(requestUser.getEmployeeBO(), LoginDetailVO.class); - List privilegeEntityList = privilegeEmployeeService.getEmployeeAllPrivilege(requestUser.getRequestUserId()); - //====== 开启缓存 ====== - if (privilegeEntityList == null) { - List loginPrivilegeDTOS = initEmployeePrivilege(requestUser.getRequestUserId()); - loginDTO.setPrivilegeList(loginPrivilegeDTOS); - } else { - loginDTO.setPrivilegeList(SmartBeanUtil.copyList(privilegeEntityList, LoginPrivilegeDTO.class)); - } - - //====== 不开启缓存 ====== -// List loginPrivilegeDTOS = initEmployeePrivilege(requestUser.getRequestUserId()); -// loginDTO.setPrivilegeList(loginPrivilegeDTOS); - - //判断是否为超管 - Boolean isSuperman = privilegeEmployeeService.isSuperman(loginDTO.getId()); - loginDTO.setIsSuperMan(isSuperman); - return loginDTO; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginTokenService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginTokenService.java deleted file mode 100644 index 56ec269a..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/LoginTokenService.java +++ /dev/null @@ -1,118 +0,0 @@ -package net.lab1024.smartadmin.module.system.login; - -import net.lab1024.smartadmin.common.constant.JudgeEnum; -import net.lab1024.smartadmin.module.system.employee.EmployeeService; -import net.lab1024.smartadmin.module.system.employee.constant.EmployeeStatusEnum; -import net.lab1024.smartadmin.module.system.employee.domain.bo.EmployeeBO; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeDTO; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Date; -import java.util.UUID; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Slf4j -@Service -public class LoginTokenService { - - /** - * 过期时间一天 - */ - private static final int EXPIRE_SECONDS = 1 * 24 * 3600; - /** - * jwt加密字段 - */ - private static final String CLAIM_ID_KEY = "id"; - - @Value("${jwt.key}") - private String jwtKey; - - @Autowired - private EmployeeService employeeService; - - - /** - * 功能描述: 生成JWT TOKEN - * - * @param employeeDTO - * @return - * @auther yandanyang - * @date 2018/9/12 0012 上午 10:08 - */ - public String generateToken(EmployeeDTO employeeDTO) { - Long id = employeeDTO.getId(); - /**将token设置为jwt格式*/ - String baseToken = UUID.randomUUID().toString(); - LocalDateTime localDateTimeNow = LocalDateTime.now(); - LocalDateTime localDateTimeExpire = localDateTimeNow.plusSeconds(EXPIRE_SECONDS); - Date from = Date.from(localDateTimeNow.atZone(ZoneId.systemDefault()).toInstant()); - Date expire = Date.from(localDateTimeExpire.atZone(ZoneId.systemDefault()).toInstant()); - - Claims jwtClaims = Jwts.claims().setSubject(baseToken); - jwtClaims.put(CLAIM_ID_KEY, id); - String compactJws = Jwts.builder().setClaims(jwtClaims).setNotBefore(from).setExpiration(expire).signWith(SignatureAlgorithm.HS512, jwtKey).compact(); - - EmployeeBO employeeBO = employeeService.getById(id); - RequestTokenBO tokenBO = new RequestTokenBO(employeeBO); - - return compactJws; - } - - /** - * 功能描述: 根据登陆token获取登陆信息 - * - * @param - * @return - * @auther yandanyang - * @date 2018/9/12 0012 上午 10:11 - */ - public RequestTokenBO getEmployeeTokenInfo(String token) { - Long employeeId = -1L; - try { - Claims claims = Jwts.parser().setSigningKey(jwtKey).parseClaimsJws(token).getBody(); - String idStr = claims.get(CLAIM_ID_KEY).toString(); - employeeId = Long.valueOf(idStr); - } catch (Exception e) { - log.error("getEmployeeTokenInfo error:{}", e); - return null; - } - - EmployeeBO employeeBO = employeeService.getById(employeeId); - if (employeeBO == null) { - return null; - } - - if (EmployeeStatusEnum.DISABLED.getValue().equals(employeeBO.getIsDisabled())) { - return null; - } - - if (JudgeEnum.YES.equals(employeeBO.getIsLeave())) { - return null; - } - - if (JudgeEnum.YES.equals(employeeBO.getIsDelete())) { - return null; - } - - return new RequestTokenBO(employeeBO); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/KaptchaVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/KaptchaVO.java deleted file mode 100644 index 61814e63..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/KaptchaVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.lab1024.smartadmin.module.system.login.domain; - -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/7/4 0004 上午 10:11 - * @since JDK1.8 - */ -@Data -public class KaptchaVO { - - /** - * 验证码UUID - */ - private String uuid; - - /** - * base64 验证码 - */ - private String code; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginCacheDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginCacheDTO.java deleted file mode 100644 index c8e5f62f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginCacheDTO.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.lab1024.smartadmin.module.system.login.domain; - -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeDTO; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/9 0009 下午 17:32 - * @since JDK1.8 - */ -@Data -public class LoginCacheDTO { - - /** - * 基本信息 - */ - private EmployeeDTO employeeDTO; - - /** - * 过期时间 - */ - private Long expireTime; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginDetailVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginDetailVO.java deleted file mode 100644 index 72a27087..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginDetailVO.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.lab1024.smartadmin.module.system.login.domain; - -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; -import java.util.List; - -/** - * 登录返回DTO - * - * @author lidoudou - * @date 2017年12月21日上午09:06:31 - */ -@Data -public class LoginDetailVO { - - @ApiModelProperty("主键id") - private Long id; - - @ApiModelProperty("登录账号") - private String loginName; - - @ApiModelProperty("别名") - private String nickName; - - @ApiModelProperty("员工名称") - private String actualName; - - @ApiModelProperty("手机号码") - private String phone; - - @ApiModelProperty("身份证") - private String idCard; - - @ApiModelProperty("出生日期") - @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date birthday; - - @ApiModelProperty("创建者id") - private Long createUser; - - @ApiModelProperty("部门id") - private Long departmentId; - - @ApiModelProperty("是否离职") - private Integer isLeave; - - @ApiModelProperty("是否被禁用") - private Integer isDisabled; - - @ApiModelProperty("部门名称") - private String departmentName; - - @ApiModelProperty("邮箱") - private String email; - - @ApiModelProperty("登陆token") - private String xAccessToken; - - @ApiModelProperty("是否为超管") - private Boolean isSuperMan; - - @ApiModelProperty("权限列表") - private List privilegeList; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginPrivilegeDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginPrivilegeDTO.java deleted file mode 100644 index e1812b35..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/LoginPrivilegeDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.lab1024.smartadmin.module.system.login.domain; - -import net.lab1024.smartadmin.common.anno.ApiModelPropertyEnum; -import net.lab1024.smartadmin.module.system.privilege.constant.PrivilegeTypeEnum; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/21 0021 上午 10:28 - * @since JDK1.8 - */ -@Data -public class LoginPrivilegeDTO { - - @ApiModelProperty("权限key") - private String key; - - @ApiModelPropertyEnum(enumDesc = "菜单类型",value = PrivilegeTypeEnum.class) - private Integer type; - - @ApiModelProperty("url") - private String url; - - @ApiModelProperty("父级key") - private String parentKey; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/RequestTokenBO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/RequestTokenBO.java deleted file mode 100644 index 101f66db..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/login/domain/RequestTokenBO.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.lab1024.smartadmin.module.system.login.domain; - -import net.lab1024.smartadmin.module.system.employee.domain.bo.EmployeeBO; -import lombok.Getter; - - -@Getter -public class RequestTokenBO { - - private Long requestUserId; - - private EmployeeBO employeeBO; - - public RequestTokenBO(EmployeeBO employeeBO) { - this.requestUserId = employeeBO.getId(); - this.employeeBO = employeeBO; - } - - @Override - public String toString() { - return "RequestTokenBO{" + - "requestUserId=" + requestUserId + - ", employeeBO=" + employeeBO + - '}'; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionController.java deleted file mode 100644 index 0f1a311e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionController.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.lab1024.smartadmin.module.system.position; - -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionAddDTO; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionQueryDTO; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionResultVO; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionUpdateDTO; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - * @author zzr - */ -@Api(tags = {SwaggerTagConst.Admin.MANAGER_JOB}) -@OperateLog -@RestController -public class PositionController { - - @Autowired - private PositionService positionService; - - @ApiOperation(value = "分页查询所有岗位", notes = "分页查询所有岗位 @author zzr") - @PostMapping("/position/getListPage") - public ResponseDTO> getJobPage(@RequestBody @Valid PositionQueryDTO queryDTO) { - return positionService.queryPositionByPage(queryDTO); - } - - @ApiOperation(value = "添加岗位", notes = "添加岗位 @author zzr") - @PostMapping("/position/add") - public ResponseDTO addJob(@RequestBody @Valid PositionAddDTO addDTO) { - return positionService.addPosition(addDTO); - } - - @ApiOperation(value = "更新岗位", notes = "更新岗位 @author zzr") - @PostMapping("/position/update") - public ResponseDTO updateJob(@RequestBody @Valid PositionUpdateDTO updateDTO) { - return positionService.updatePosition(updateDTO); - } - - @ApiOperation(value = "根据ID查询岗位", notes = "根据ID查询岗位 @author zzr") - @GetMapping("/position/queryById/{id}") - public ResponseDTO queryJobById(@PathVariable Long id) { - return positionService.queryPositionById(id); - } - - @ApiOperation(value = "根据ID删除岗位", notes = "根据ID删除岗位 @author zzr") - @GetMapping("/position/remove/{id}") - public ResponseDTO removeJob(@PathVariable Long id) { - return positionService.removePosition(id); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionDao.java deleted file mode 100644 index 68423c59..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionDao.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.lab1024.smartadmin.module.system.position; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionQueryDTO; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionRelationAddDTO; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionRelationQueryDTO; -import net.lab1024.smartadmin.module.system.position.domain.dto.PositionRelationResultDTO; -import net.lab1024.smartadmin.module.system.position.domain.entity.PositionEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * @author zzr - */ -@Mapper -@Component -public interface PositionDao extends BaseMapper { - - /** - * 查询岗位列表 - * - * @param page - * @param queryDTO - * @return - */ - List selectByPage(Page page, @Param("queryDTO") PositionQueryDTO queryDTO); - - /** - * 查询岗位与人员关系 - * - * @param positionRelationQueryDTO - * @return - */ - List selectRelation(PositionRelationQueryDTO positionRelationQueryDTO); - - /** - * 批量查询员工岗位信息 - * @param employeeIdList - * @return - */ - List selectEmployeesRelation(@Param("employeeIdList") List employeeIdList); - - /** - * 批量添加岗位 人员 关联关系 - * - * @param positionRelationAddDTO - * @return - */ - Integer insertBatchRelation(@Param("batchDTO")PositionRelationAddDTO positionRelationAddDTO); - - /** - * 删除指定人员的 岗位关联关系 - * - * @param employeeId - * @return - */ - Integer deleteRelationByEmployeeId(@Param("employeeId") Long employeeId); - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionService.java deleted file mode 100644 index 58468969..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/PositionService.java +++ /dev/null @@ -1,124 +0,0 @@ -package net.lab1024.smartadmin.module.system.position; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.system.position.domain.dto.*; -import net.lab1024.smartadmin.module.system.position.domain.entity.PositionEntity; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartPageUtil; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * @author zzr - */ -@Service -public class PositionService { - - @Autowired - private PositionDao positionDao; - - /** - * 查询岗位 - * - * @param queryDTO - * @return - */ - public ResponseDTO> queryPositionByPage(PositionQueryDTO queryDTO) { - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - List entityList = positionDao.selectByPage(page, queryDTO); - page.setRecords(entityList.stream().map(e -> SmartBeanUtil.copy(e, PositionResultVO.class)).collect(Collectors.toList())); - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page); - return ResponseDTO.succData(pageResultDTO); - } - - /** - * 新增岗位 - * - * @param addDTO - * @return - */ - public ResponseDTO addPosition(PositionAddDTO addDTO) { - PositionEntity positionEntity = SmartBeanUtil.copy(addDTO, PositionEntity.class); - positionDao.insert(positionEntity); - return ResponseDTO.succ(); - } - - /** - * 修改岗位 - * - * @param updateDTO - * @return - */ - public ResponseDTO updatePosition(PositionUpdateDTO updateDTO) { - PositionEntity positionEntity = SmartBeanUtil.copy(updateDTO, PositionEntity.class); - positionDao.updateById(positionEntity); - return ResponseDTO.succ(); - } - - /** - * 根据ID查询 - * - * @param id - * @return - */ - public ResponseDTO queryPositionById(Long id) { - return ResponseDTO.succData(SmartBeanUtil.copy(positionDao.selectById(id), PositionResultVO.class)); - } - - /** - * 删除岗位 - */ - public ResponseDTO removePosition(Long id) { - //查询是否还有人关联该岗位 - PositionRelationQueryDTO positionRelationQueryDTO = new PositionRelationQueryDTO(); - positionRelationQueryDTO.setPositionId(id); - List dtoList = positionDao.selectRelation(positionRelationQueryDTO); - if (CollectionUtils.isNotEmpty(dtoList)) { - return ResponseDTO.wrap(PositionResponseCodeConst.REMOVE_DEFINE); - } - positionDao.deleteById(id); - return ResponseDTO.succ(); - } - - /** - * 添加岗位关联关系 - * - * @param positionRelAddDTO - * @return - */ - public ResponseDTO addPositionRelation(PositionRelationAddDTO positionRelAddDTO) { - positionDao.insertBatchRelation(positionRelAddDTO); - return ResponseDTO.succ(); - } - - /** - * 删除指定用户的岗位关联关系 - * - * @param employeeId - * @return - */ - public ResponseDTO removePositionRelation(Long employeeId) { - positionDao.deleteRelationByEmployeeId(employeeId); - return ResponseDTO.succ(); - } - - /** - * 根据员工ID查询 所关联的岗位信息 - * - * @param employeeId - * @return - */ - public List queryPositionByEmployeeId(Long employeeId) { - PositionRelationQueryDTO positionRelationQueryDTO = new PositionRelationQueryDTO(); - positionRelationQueryDTO.setEmployeeId(employeeId); - List positionRelationList = positionDao.selectRelation(positionRelationQueryDTO); - return positionRelationList; - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionAddDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionAddDTO.java deleted file mode 100644 index d7b4d8b6..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionAddDTO.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.lab1024.smartadmin.module.system.position.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; - -/** - * 岗位 - * - * @author zzr - */ -@Data -public class PositionAddDTO { - - /** - * 岗位名称 - */ - @ApiModelProperty("岗位名称") - @NotBlank(message = "岗位名称不能为空") - private String positionName; - - /** - * 岗位描述 - */ - @ApiModelProperty("岗位描述") - private String remark; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionQueryDTO.java deleted file mode 100644 index 6ab8d066..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionQueryDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.lab1024.smartadmin.module.system.position.domain.dto; - -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 岗位 - * - * @author zzr - */ -@Data -public class PositionQueryDTO extends PageParamDTO { - - @ApiModelProperty("岗位名称") - private String positionName; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationAddDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationAddDTO.java deleted file mode 100644 index 509c1a22..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationAddDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.lab1024.smartadmin.module.system.position.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.List; - -/** - * 岗位关系 - * - * @author zzr - */ -@Data -public class PositionRelationAddDTO { - - @ApiModelProperty("岗位ID") - @NotNull(message = "岗位ID 不能为空") - private List positionIdList; - - @ApiModelProperty("员工ID") - @NotNull(message = "员工ID 不能为空") - private Long employeeId; - - public PositionRelationAddDTO() { - } - - public PositionRelationAddDTO(List positionIdList, Long employeeId) { - this.positionIdList = positionIdList; - this.employeeId = employeeId; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationQueryDTO.java deleted file mode 100644 index 3732cd50..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationQueryDTO.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.lab1024.smartadmin.module.system.position.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 岗位关系 - * - * @author zzr - */ -@Data -public class PositionRelationQueryDTO { - - @ApiModelProperty("岗位ID") - private Long positionId; - - @ApiModelProperty("员工ID") - private Long employeeId; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationResultDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationResultDTO.java deleted file mode 100644 index 1881904f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionRelationResultDTO.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.lab1024.smartadmin.module.system.position.domain.dto; - -import lombok.Data; - -import java.util.Date; - -/** - * 岗位关联关系 - * - * @author zzr - */ -@Data -public class PositionRelationResultDTO { - - /** - * 岗位ID - */ - private Long positionId; - - /** - * 员工ID - */ - private Long employeeId; - - /** - * 岗位名称 - */ - private String positionName; - - /** - * 更新时间 - */ - private Date updateTime; - - /** - * 创建时间 - */ - private Date createTime; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionResultVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionResultVO.java deleted file mode 100644 index 3bc89efd..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionResultVO.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.lab1024.smartadmin.module.system.position.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Date; - -/** - * @author zzr - */ -@Data -public class PositionResultVO { - - @ApiModelProperty("主键") - private Long id; - - /** - * 更新时间 - */ - @ApiModelProperty("更新时间") - private Date updateTime; - - /** - * 创建时间 - */ - @ApiModelProperty("创建时间") - private Date createTime; - - /** - * 岗位名称 - */ - @ApiModelProperty("岗位名称") - private String positionName; - - /** - * 岗位描述 - */ - @ApiModelProperty("岗位描述") - private String remark; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionUpdateDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionUpdateDTO.java deleted file mode 100644 index 659da733..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/dto/PositionUpdateDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.lab1024.smartadmin.module.system.position.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 岗位 - * - * @author zzr - */ -@Data -public class PositionUpdateDTO extends PositionAddDTO { - - @ApiModelProperty("主键") - private Long id; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/entity/PositionEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/entity/PositionEntity.java deleted file mode 100644 index a42af4ac..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/entity/PositionEntity.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.lab1024.smartadmin.module.system.position.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -/** - * 岗位 - * - * @author zzr - */ -@Data -@TableName("t_position") -public class PositionEntity extends BaseEntity { - - /** - * 岗位名称 - */ - private String positionName; - - /** - * 岗位描述 - */ - private String remark; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/entity/PositionRelationEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/entity/PositionRelationEntity.java deleted file mode 100644 index b7ff8676..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/position/domain/entity/PositionRelationEntity.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.lab1024.smartadmin.module.system.position.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -/** - * 岗位关联关系 - * - * @author zzr - */ -@Data -@TableName("t_position_relation") -public class PositionRelationEntity extends BaseEntity { - - /** - * 岗位ID - */ - private Long positionId; - - /** - * 员工ID - */ - private Long employeeId; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/constant/PrivilegeTypeEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/constant/PrivilegeTypeEnum.java deleted file mode 100644 index 96b175e6..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/constant/PrivilegeTypeEnum.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.lab1024.smartadmin.module.system.privilege.constant; - - -import net.lab1024.smartadmin.common.domain.BaseEnum; - -import java.util.Arrays; -import java.util.Optional; - -/** - * - * [ ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -public enum PrivilegeTypeEnum implements BaseEnum { - - - MENU(1,"菜单"), - - POINTS(2,"功能点"); - - private Integer value; - - private String desc; - - PrivilegeTypeEnum(Integer value,String desc){ - this.value = value; - this.desc = desc; - } - @Override - public Integer getValue() { - return this.value; - } - - @Override - public String getDesc() { - return this.desc; - } - - public static PrivilegeTypeEnum selectByValue(Integer value) { - Optional first = Arrays.stream(PrivilegeTypeEnum.values()).filter(e -> e.getValue().equals(value)).findFirst(); - return !first.isPresent() ? null : first.get(); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/controller/PrivilegeController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/controller/PrivilegeController.java deleted file mode 100644 index 3a073a2d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/controller/PrivilegeController.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.lab1024.smartadmin.module.system.privilege.controller; - -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.common.domain.ValidateList; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.system.privilege.service.PrivilegeService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import net.lab1024.smartadmin.module.system.privilege.domain.dto.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -/** - * [ 与员工权限相关:角色权限关系、权限列表 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@OperateLog -@RestController -@Api(tags = {SwaggerTagConst.Admin.MANAGER_PRIVILEGE}) -public class PrivilegeController { - - @Autowired - private PrivilegeService privilegeService; - - @GetMapping("/privilege/getAllUrl") - @ApiOperation(value = "获取所有请求路径", notes = "获取所有请求路径") - public ResponseDTO> getAllUrl() { - return privilegeService.getPrivilegeUrlDTOList(); - } - - @ApiOperation(value = "菜单批量保存") - @PostMapping("/privilege/menu/batchSaveMenu") - public ResponseDTO menuBatchSave(@Valid @RequestBody ValidateList menuList) { - return privilegeService.menuBatchSave(menuList); - } - - - @ApiOperation(value = "查询所有菜单项") - @PostMapping("/privilege/menu/queryAll") - public ResponseDTO> queryAll() { - return privilegeService.menuQueryAll(); - } - - - @ApiOperation(value = "保存更新功能点") - @PostMapping("/privilege/function/saveOrUpdate") - public ResponseDTO functionSaveOrUpdate(@Valid @RequestBody PrivilegeFunctionDTO privilegeFunctionDTO) { - return privilegeService.functionSaveOrUpdate(privilegeFunctionDTO); - } - - @ApiOperation(value = "批量保存功能点") - @PostMapping("/privilege/function/batchSave") - public ResponseDTO batchSaveFunctionList(@Valid @RequestBody ValidateList functionList) { - return privilegeService.batchSaveFunctionList(functionList); - } - - - @ApiOperation(value = "查询菜单功能点", notes = "更新") - @PostMapping("/privilege/function/query/{menuKey}") - public ResponseDTO> functionQuery(@PathVariable String menuKey) { - return privilegeService.functionQuery(menuKey); - } - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/dao/PrivilegeDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/dao/PrivilegeDao.java deleted file mode 100644 index 291480d1..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/dao/PrivilegeDao.java +++ /dev/null @@ -1,94 +0,0 @@ -package net.lab1024.smartadmin.module.system.privilege.dao; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import net.lab1024.smartadmin.module.system.privilege.domain.entity.PrivilegeEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - - -/** - * - * [ ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@Mapper -@Component -public interface PrivilegeDao extends BaseMapper { - - /** - * 根据权限key删除 - * @param keyList - */ - void delByKeyList(@Param("keyList") List keyList); - /** - * 根据权限parentkey删除 - * @param keyList - */ - void delByParentKeyList(@Param("keyList") List keyList); - - /** - * 批量保存 - * @param privilegeList - */ - void batchInsert(List privilegeList); - - /** - * 批量更新 - * @param privilegeList - */ - void batchUpdate(@Param("updateList") List privilegeList); - - /** - * 根据父节点key查询 - * @param parentKey - * @return - */ - List selectByParentKey(@Param("parentKey") String parentKey); - - /** - * 根据父节点key查询 - * @param keyList - * @return - */ - List selectByKeyList(@Param("keyList") List keyList); - - /** - * 根据权限key查询 - * @param key - * @return - */ - PrivilegeEntity selectByKey(@Param("key") String key); - - /** - * 根据类型查询 - * @param type - * @return - */ - List selectByExcludeType(@Param("type") Integer type); - - /** - * 根据类型查询 - * @param type - * @return - */ - List selectByType(@Param("type") Integer type); - - /** - * 查询所有权限 - * @return - */ - List selectAll(); - - - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeFunctionDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeFunctionDTO.java deleted file mode 100644 index 0e15a42c..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeFunctionDTO.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.lab1024.smartadmin.module.system.privilege.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/20 0020 下午 16:45 - * @since JDK1.8 - */ -@Data -public class PrivilegeFunctionDTO { - - @ApiModelProperty("功能点名称") - @NotBlank(message = "功能点名称不能为空") - private String functionName; - - @ApiModelProperty("所属菜单Key") - @NotBlank(message = "所属菜单Key不能为空") - private String menuKey; - - @ApiModelProperty("功能点Key") - @NotBlank(message = "功能点Key不能为空") - private String functionKey; - - @ApiModelProperty("url列表") - private String url; - - @ApiModelProperty("排序") - @NotNull(message = "请输入功能点顺序") - private Integer sort; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeFunctionVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeFunctionVO.java deleted file mode 100644 index fd89f959..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeFunctionVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.lab1024.smartadmin.module.system.privilege.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/20 0020 下午 16:45 - * @since JDK1.8 - */ -@Data -public class PrivilegeFunctionVO { - - @ApiModelProperty("功能点名称") - @NotBlank(message = "功能点名称不能为空") - private String functionName; - - @ApiModelProperty("所属菜单Key") - @NotBlank(message = "所属菜单Key不能为空") - private String menuKey; - - @ApiModelProperty("功能点Key") - @NotBlank(message = "功能点Key不能为空") - private String functionKey; - - @ApiModelProperty("url列表") - @NotEmpty(message = "url列表不能为空") - private String url; - - @ApiModelProperty("顺序") - private Integer sort; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeMenuDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeMenuDTO.java deleted file mode 100644 index 137f827d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeMenuDTO.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lab1024.smartadmin.module.system.privilege.domain.dto; - -import net.lab1024.smartadmin.common.anno.ApiModelPropertyEnum; -import net.lab1024.smartadmin.module.system.privilege.constant.PrivilegeTypeEnum; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/20 0020 下午 16:32 - * @since JDK1.8 - */ -@Data -public class PrivilegeMenuDTO { - - @ApiModelPropertyEnum(enumDesc = "菜单类型",value = PrivilegeTypeEnum.class) - @NotNull - private Integer type; - - @ApiModelProperty("菜单名") - @NotNull(message = "菜单名不能为空") - private String menuName; - - @ApiModelProperty("菜单Key") - @NotNull(message = "菜单Key不能为空") - private String menuKey; - - @ApiModelProperty("父级菜单Key,根节点不传") - private String parentKey; - - @ApiModelProperty("前端路由path") - @NotNull(message = "前端路由path不能为空") - private String url; - - @ApiModelProperty("排序字段") - @NotNull(message = "菜单项顺序不能为空") - private Integer sort; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeMenuVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeMenuVO.java deleted file mode 100644 index 72febd9c..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeMenuVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.lab1024.smartadmin.module.system.privilege.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/8/20 0020 下午 16:41 - * @since JDK1.8 - */ -@Data -public class PrivilegeMenuVO { - - @ApiModelProperty("菜单名") - private String menuName; - - @ApiModelProperty("菜单Key") - private String menuKey; - - @ApiModelProperty("菜单父级Key") - private String parentKey; - - @ApiModelProperty("顺序") - private Integer sort; - - @ApiModelProperty("前端路由path") - private String url; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeRequestUrlVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeRequestUrlVO.java deleted file mode 100644 index d227c04d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/dto/PrivilegeRequestUrlVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.lab1024.smartadmin.module.system.privilege.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/28 0028 上午 9:20 - * @since JDK1.8 - */ -@Data -public class PrivilegeRequestUrlVO { - - @ApiModelProperty("注释说明") - private String comment; - - @ApiModelProperty("controller.method") - private String name; - - @ApiModelProperty("url") - private String url; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/entity/PrivilegeEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/entity/PrivilegeEntity.java deleted file mode 100644 index df49b874..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/domain/entity/PrivilegeEntity.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.lab1024.smartadmin.module.system.privilege.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -import java.io.Serializable; - -/** - * - * [ ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@Data -@TableName("t_privilege") -public class PrivilegeEntity extends BaseEntity implements Serializable { - private static final long serialVersionUID = 3848408566432915214L; - - /** - * 功能权限类型:1.模块 2.页面 3.功能点 4.子模块 - */ - private Integer type; - - /** - * 菜单名称 - */ - private String name; - - /** - * 路由name 英文关键字 - */ - @TableField(value = "`key`") - private String key; - - - private String url; - - /** - * 排序 - */ - private Integer sort; - - - /** - * 父级key - */ - private String parentKey; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeEmployeeService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeEmployeeService.java deleted file mode 100644 index 602a5b59..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeEmployeeService.java +++ /dev/null @@ -1,199 +0,0 @@ -package net.lab1024.smartadmin.module.system.privilege.service; - -import net.lab1024.smartadmin.common.constant.JudgeEnum; -import net.lab1024.smartadmin.common.exception.SmartBusinessException; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeDTO; -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import net.lab1024.smartadmin.module.system.privilege.constant.PrivilegeTypeEnum; -import net.lab1024.smartadmin.module.system.privilege.dao.PrivilegeDao; -import net.lab1024.smartadmin.module.system.privilege.domain.entity.PrivilegeEntity; -import net.lab1024.smartadmin.module.system.role.roleemployee.RoleEmployeeDao; -import net.lab1024.smartadmin.module.system.role.roleprivilege.RolePrivilegeDao; -import net.lab1024.smartadmin.module.system.systemconfig.SystemConfigService; -import net.lab1024.smartadmin.module.system.systemconfig.constant.SystemConfigEnum; -import net.lab1024.smartadmin.module.system.systemconfig.domain.dto.SystemConfigDTO; -import net.lab1024.smartadmin.util.SmartStringUtil; -import com.google.common.collect.Lists; -import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.concurrent.ConcurrentMap; -import java.util.stream.Collectors; - -/** - * [ 后台员工权限缓存方法 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/28 0028 下午 14:07 - * @since JDK1.8 - */ -@Service -public class PrivilegeEmployeeService { - - /** - * 后台用户权限缓存 > - */ - private ConcurrentMap>> employeePrivileges = new ConcurrentLinkedHashMap.Builder>>().maximumWeightedCapacity(1000).build(); - private ConcurrentMap> employeePrivilegeListMap = new ConcurrentLinkedHashMap.Builder>().maximumWeightedCapacity(1000).build(); - - @Autowired - private SystemConfigService systemConfigService; - - @Autowired - private RoleEmployeeDao roleEmployeeDao; - - @Autowired - private RolePrivilegeDao rolePrivilegeDao; - - @Autowired - private PrivilegeDao privilegeDao; - - /** - * 移除某人缓存中的权限 - * - * @param employeeId - */ - public void removeCache(Long employeeId) { - this.employeePrivileges.remove(employeeId); - } - - /** - * 检查某人是否有访问某个方法的权限 - * - * @param requestTokenBO - * @param controllerName - * @param methodName - * @return - */ - public Boolean checkEmployeeHavePrivilege(RequestTokenBO requestTokenBO, String controllerName, String methodName) { - if (StringUtils.isEmpty(controllerName) || StringUtils.isEmpty(methodName)) { - return false; - } - Boolean isSuperman = requestTokenBO.getEmployeeBO().getIsSuperman(); - if (isSuperman) { - return true; - } - Map> privileges = this.getPrivileges(requestTokenBO.getRequestUserId()); - List urlList = privileges.get(controllerName.toLowerCase()); - if (CollectionUtils.isEmpty(urlList)) { - return false; - } - return urlList.contains(methodName); - } - - public List getEmployeeAllPrivilege(Long employeeId) { - return employeePrivilegeListMap.get(employeeId); - } - - /** - * 判断是否为超级管理员 - * - * @param employeeId - * @return - */ - public Boolean isSuperman(Long employeeId) { - SystemConfigDTO systemConfig = systemConfigService.getCacheByKey(SystemConfigEnum.Key.EMPLOYEE_SUPERMAN); - if (systemConfig == null) { - throw new SmartBusinessException("缺少系统配置项[" + SystemConfigEnum.Key.EMPLOYEE_SUPERMAN.name() + "]"); - } - - List superManIdsList = SmartStringUtil.splitConverToLongList(systemConfig.getConfigValue(), ","); - return superManIdsList.contains(employeeId); - } - - /** - * 根据员工ID 获取 权限信息 - * - * @param employeeId - * @return - */ - public List getPrivilegesByEmployeeId(Long employeeId) { - List privilegeEntities = null; - // 如果是超管的话 - Boolean isSuperman = this.isSuperman(employeeId); - if (isSuperman) { - privilegeEntities = privilegeDao.selectAll(); - } else { - privilegeEntities = loadPrivilegeFromDb(employeeId); - } - - if (privilegeEntities == null) { - privilegeEntities = Lists.newArrayList(); - } - - this.updateCachePrivilege(employeeId, privilegeEntities); - return privilegeEntities; - } - - /** - * 获取某人所能访问的方法 - * - * @param employeeId - * @return - */ - private Map> getPrivileges(Long employeeId) { - Map> privileges = employeePrivileges.get(employeeId); - if (privileges != null) { - return privileges; - } - List privilegeEntities = this.loadPrivilegeFromDb(employeeId); - return updateCachePrivilege(employeeId, privilegeEntities); - } - - private List loadPrivilegeFromDb(Long employeeId) { - List roleIdList = roleEmployeeDao.selectRoleIdByEmployeeId(employeeId); - if (CollectionUtils.isEmpty(roleIdList)) { - return Lists.newArrayList(); - } - List privilegeEntities = rolePrivilegeDao.listByRoleIds(roleIdList, JudgeEnum.YES.getValue()); - if (privilegeEntities != null) { - return privilegeEntities; - } - return Collections.emptyList(); - } - - public Map> updateCachePrivilege(Long employeeId, List privilegeEntities) { - employeePrivilegeListMap.put(employeeId, privilegeEntities); - List privilegeList = new ArrayList<>(); - Map> privilegeMap = new HashMap<>(16); - if (CollectionUtils.isNotEmpty(privilegeEntities)) { - List> setList = - privilegeEntities.stream().filter(e -> e.getType().equals(PrivilegeTypeEnum.POINTS.getValue())).map(PrivilegeEntity::getUrl).collect(Collectors.toList()).stream().map(e -> SmartStringUtil.splitConvertToList(e, ",")).collect(Collectors.toList()); - setList.forEach(privilegeList::addAll); - } - privilegeList.forEach(item -> { - List path = SmartStringUtil.splitConvertToList(item, "\\."); - String controllerName = path.get(0).toLowerCase(); - String methodName = path.get(1); - List methodNameList = privilegeMap.get(controllerName); - if (null == methodNameList) { - methodNameList = new ArrayList(); - } - if (!methodNameList.contains(methodName)) { - methodNameList.add(methodName); - } - privilegeMap.put(controllerName, methodNameList); - }); - - employeePrivileges.put(employeeId, privilegeMap); - return privilegeMap; - } - - public void updateOnlineEmployeePrivilegeByRoleId(Long roleId) { - List roleEmployeeList = roleEmployeeDao.selectEmployeeByRoleId(roleId); - List employeeIdList = roleEmployeeList.stream().map(e -> e.getId()).collect(Collectors.toList()); - - for (Long empId : employeePrivileges.keySet()) { - if (employeeIdList.contains(empId)) { - getPrivilegesByEmployeeId(empId); - } - } - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeService.java deleted file mode 100644 index c66a919e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/privilege/service/PrivilegeService.java +++ /dev/null @@ -1,285 +0,0 @@ -package net.lab1024.smartadmin.module.system.privilege.service; - -import com.google.common.collect.Lists; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.common.domain.ValidateList; -import net.lab1024.smartadmin.module.system.privilege.constant.PrivilegeResponseCodeConst; -import net.lab1024.smartadmin.module.system.privilege.constant.PrivilegeTypeEnum; -import net.lab1024.smartadmin.module.system.privilege.dao.PrivilegeDao; -import net.lab1024.smartadmin.module.system.privilege.domain.dto.*; -import net.lab1024.smartadmin.module.system.privilege.domain.entity.PrivilegeEntity; -import net.lab1024.smartadmin.module.system.role.roleprivilege.RolePrivilegeDao; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * [ 后台员工权限 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Service -public class PrivilegeService { - - @Autowired - private PrivilegeRequestUrlService privilegeRequestUrlService; - - @Autowired - private PrivilegeDao privilegeDao; - - @Autowired - private RolePrivilegeDao rolePrivilegeDao; - - /** - * 获取系统所有请求路径 - * - * @return - */ - public ResponseDTO> getPrivilegeUrlDTOList() { - List privilegeUrlList = privilegeRequestUrlService.getPrivilegeList(); - return ResponseDTO.succData(privilegeUrlList); - } - - /** - * 批量保存权限菜单项 - * - * @param menuList - * @return - */ - @Transactional(rollbackFor = Throwable.class) - public ResponseDTO menuBatchSave(List menuList) { - if (CollectionUtils.isEmpty(menuList)) { - return ResponseDTO.succ(); - } - //使用前端发送权限的排序 - for (int i = 0; i < menuList.size(); i++) { - menuList.get(i).setSort(i); - } - - List privilegeList = privilegeDao.selectByExcludeType(PrivilegeTypeEnum.POINTS.getValue()); - //若数据库无数据 直接全部保存 - if (CollectionUtils.isEmpty(privilegeList)) { - List menuSaveEntity = this.buildPrivilegeMenuEntity(menuList); - privilegeDao.batchInsert(menuSaveEntity); - return ResponseDTO.succ(); - } - //处理需更新的菜单项 - Map storageMap = menuList.stream().collect(Collectors.toMap(PrivilegeMenuDTO::getMenuKey, e -> e)); - Set menuKeyList = storageMap.keySet(); - List updatePrivilegeList = privilegeList.stream().filter(e -> menuKeyList.contains(e.getKey())).collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(updatePrivilegeList)) { - this.rebuildPrivilegeMenuEntity(storageMap, updatePrivilegeList); - privilegeDao.batchUpdate(updatePrivilegeList); - } - //处理需删除的菜单项 - List delKeyList = privilegeList.stream().filter(e -> !menuKeyList.contains(e.getKey())).map(PrivilegeEntity::getKey).collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(delKeyList)) { - privilegeDao.delByKeyList(delKeyList); - //处理需删除的功能点 - privilegeDao.delByParentKeyList(delKeyList); - rolePrivilegeDao.deleteByPrivilegeKey(delKeyList); - } - - //处理需新增的菜单项 - List dbKeyList = privilegeList.stream().map(PrivilegeEntity::getKey).collect(Collectors.toList()); - List addPrivilegeList = menuList.stream().filter(e -> !dbKeyList.contains(e.getMenuKey())).collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(addPrivilegeList)) { - List menuAddEntity = this.buildPrivilegeMenuEntity(addPrivilegeList); - privilegeDao.batchInsert(menuAddEntity); - } - return ResponseDTO.succ(); - } - - /** - * 构建权限菜单项类别 - * - * @param menuList - * @return - */ - private List buildPrivilegeMenuEntity(List menuList) { - List privilegeList = Lists.newArrayList(); - PrivilegeEntity privilegeEntity; - for (PrivilegeMenuDTO menuDTO : menuList) { - privilegeEntity = new PrivilegeEntity(); - privilegeEntity.setKey(menuDTO.getMenuKey()); - privilegeEntity.setName(menuDTO.getMenuName()); - privilegeEntity.setParentKey(menuDTO.getParentKey()); - privilegeEntity.setType(menuDTO.getType()); - privilegeEntity.setSort(menuDTO.getSort()); - privilegeEntity.setUrl(menuDTO.getUrl()); - privilegeList.add(privilegeEntity); - } - return privilegeList; - } - - /** - * 更新权限菜单项 - * - * @param menuMap - * @param menuEntityList - */ - private void rebuildPrivilegeMenuEntity(Map menuMap, List menuEntityList) { - for (PrivilegeEntity menuEntity : menuEntityList) { - PrivilegeMenuDTO menuDTO = menuMap.get(menuEntity.getKey()); - menuEntity.setName(menuDTO.getMenuName()); - menuEntity.setParentKey(menuDTO.getParentKey()); - menuEntity.setType(menuDTO.getType()); - menuEntity.setSort(menuDTO.getSort()); - } - - } - - /** - * 查询所有的权限菜单 - * - * @return - */ - public ResponseDTO> menuQueryAll() { - List privilegeEntityList = privilegeDao.selectByType(PrivilegeTypeEnum.MENU.getValue()); - if (CollectionUtils.isEmpty(privilegeEntityList)) { - return ResponseDTO.succData(Lists.newArrayList()); - } - - List voList = privilegeEntityList.stream().map(e -> { - PrivilegeMenuVO vo = new PrivilegeMenuVO(); - vo.setMenuKey(e.getKey()); - vo.setMenuName(e.getName()); - vo.setParentKey(e.getParentKey()); - vo.setSort(e.getSort()); - vo.setUrl(e.getUrl()); - return vo; - }).collect(Collectors.toList()); - - return ResponseDTO.succData(voList); - } - - - /** - * 保存更新功能点 - * - * @param privilegeFunctionDTO - * @return - */ - public ResponseDTO functionSaveOrUpdate(PrivilegeFunctionDTO privilegeFunctionDTO) { - String functionKey = privilegeFunctionDTO.getFunctionKey(); - PrivilegeEntity functionEntity = privilegeDao.selectByKey(functionKey); - if (functionEntity == null) { - return ResponseDTO.wrap(PrivilegeResponseCodeConst.POINT_NOT_EXIST); - } - functionEntity.setUrl(privilegeFunctionDTO.getUrl()); - functionEntity.setName(privilegeFunctionDTO.getFunctionName()); - functionEntity.setParentKey(privilegeFunctionDTO.getMenuKey()); - functionEntity.setSort(privilegeFunctionDTO.getSort()); - privilegeDao.updateById(functionEntity); - - return ResponseDTO.succ(); - } - - /** - * 查询功能点 - * - * @param menuKey - * @return - */ - public ResponseDTO> functionQuery(String menuKey) { - List functionPrivilegeList = privilegeDao.selectByParentKey(menuKey); - if (CollectionUtils.isEmpty(functionPrivilegeList)) { - return ResponseDTO.succData(Lists.newArrayList()); - } - List functionList = Lists.newArrayList(); - for (PrivilegeEntity functionEntity : functionPrivilegeList) { - PrivilegeFunctionVO functionDTO = new PrivilegeFunctionVO(); - functionDTO.setFunctionKey(functionEntity.getKey()); - functionDTO.setFunctionName(functionEntity.getName()); - functionDTO.setMenuKey(functionEntity.getParentKey()); - functionDTO.setUrl(functionEntity.getUrl()); - functionDTO.setSort(functionEntity.getSort()); - functionList.add(functionDTO); - } - return ResponseDTO.succData(functionList); - } - - @Transactional(rollbackFor = Exception.class) - public ResponseDTO batchSaveFunctionList(ValidateList functionList) { - String menuKey = functionList.get(0).getMenuKey(); - PrivilegeEntity privilegeEntity = privilegeDao.selectByKey(menuKey); - if (privilegeEntity == null) { - return ResponseDTO.wrap(PrivilegeResponseCodeConst.MENU_NOT_EXIST); - } - - List functionKeyList = functionList.stream().map(PrivilegeFunctionDTO::getFunctionKey).collect(Collectors.toList()); - - //数据库中存在的数据 - List existFunctionList = privilegeDao.selectByKeyList(functionKeyList); - //校验是否parent key重复 - boolean parentKeyExist = existFunctionList.stream().anyMatch(e -> !menuKey.equals(e.getParentKey())); - if(parentKeyExist){ - return ResponseDTO.wrap(PrivilegeResponseCodeConst.ROUTER_KEY_NO_REPEAT); - } - - existFunctionList = privilegeDao.selectByParentKey(menuKey); - Map privilegeEntityMap = existFunctionList.stream().collect(Collectors.toMap(PrivilegeEntity::getKey, e -> e)); - //如果没有,则保存全部 - if (existFunctionList.isEmpty()) { - List privilegeEntityList = functionList.stream().map(e -> function2Privilege(e)).collect(Collectors.toList()); - privilegeDao.batchInsert(privilegeEntityList); - return ResponseDTO.succ(); - } - - Set functionKeySet = functionList.stream().map(PrivilegeFunctionDTO::getFunctionKey).collect(Collectors.toSet()); - //删除的 - List deleteIdList = existFunctionList.stream().filter(e -> !functionKeySet.contains(e.getKey())).map(PrivilegeEntity::getId).collect(Collectors.toList()); - List deleteKeyList = existFunctionList.stream().filter(e -> !functionKeySet.contains(e.getKey())).map(PrivilegeEntity::getKey).collect(Collectors.toList()); - if (!deleteIdList.isEmpty()) { - privilegeDao.deleteBatchIds(deleteIdList); - rolePrivilegeDao.deleteByPrivilegeKey(deleteKeyList); - } - - //需要更新的 - ArrayList batchUpdateList = Lists.newArrayList(); - for (PrivilegeFunctionDTO privilegeFunctionDTO : functionList) { - PrivilegeEntity existPrivilege = privilegeEntityMap.get(privilegeFunctionDTO.getFunctionKey()); - if (existPrivilege != null) { - existPrivilege.setSort(privilegeFunctionDTO.getSort()); - existPrivilege.setName(privilegeFunctionDTO.getFunctionName()); - batchUpdateList.add(existPrivilege); - } - } - - if (!batchUpdateList.isEmpty()) { - privilegeDao.batchUpdate(batchUpdateList); - } - - //新增的 - List batchInsertList = functionList.stream() - .filter(e -> !privilegeEntityMap.containsKey(e.getFunctionKey())) - .map(e -> function2Privilege(e)) - .collect(Collectors.toList()); - - if (!batchInsertList.isEmpty()) { - privilegeDao.batchInsert(batchInsertList); - } - - return ResponseDTO.succ(); - } - - private PrivilegeEntity function2Privilege(PrivilegeFunctionDTO privilegeFunction) { - PrivilegeEntity privilegeEntity = new PrivilegeEntity(); - privilegeEntity.setKey(privilegeFunction.getFunctionKey()); - privilegeEntity.setName(privilegeFunction.getFunctionName()); - privilegeEntity.setParentKey(privilegeFunction.getMenuKey()); - privilegeEntity.setType(PrivilegeTypeEnum.POINTS.getValue()); - privilegeEntity.setSort(privilegeFunction.getSort()); - privilegeEntity.setUrl(""); - return privilegeEntity; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleQueryDTO.java deleted file mode 100644 index 08f2a94b..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleQueryDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.basic.domain.dto; -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * - * [ ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@Data -public class RoleQueryDTO extends PageParamDTO { - - @ApiModelProperty("角色名称") - private String roleName; - - @ApiModelProperty("角色id") - private String roleId; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleSelectedVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleSelectedVO.java deleted file mode 100644 index 9a88d6d2..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/dto/RoleSelectedVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.basic.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 15:27 - * @since JDK1.8 - */ -@Data -public class RoleSelectedVO extends RoleVO { - - @ApiModelProperty("角色名称") - private Boolean selected; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/entity/RoleEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/entity/RoleEntity.java deleted file mode 100644 index ff9d650f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/basic/domain/entity/RoleEntity.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.basic.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -/** - * [ 角色 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 13:01 - * @since JDK1.8 - */ -@Data -@TableName("t_role") -public class RoleEntity extends BaseEntity { - - - private String roleName; - - private String remark; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/RoleEmployeeService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/RoleEmployeeService.java deleted file mode 100644 index cf57ed4f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/RoleEmployeeService.java +++ /dev/null @@ -1,132 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.roleemployee; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.system.department.DepartmentDao; -import net.lab1024.smartadmin.module.system.department.domain.entity.DepartmentEntity; -import net.lab1024.smartadmin.module.system.employee.domain.dto.EmployeeDTO; -import net.lab1024.smartadmin.module.system.employee.domain.vo.EmployeeVO; -import net.lab1024.smartadmin.module.system.role.basic.RoleDao; -import net.lab1024.smartadmin.module.system.role.basic.RoleResponseCodeConst; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleBatchDTO; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleQueryDTO; -import net.lab1024.smartadmin.module.system.role.basic.domain.dto.RoleSelectedVO; -import net.lab1024.smartadmin.module.system.role.basic.domain.entity.RoleEntity; -import net.lab1024.smartadmin.module.system.role.roleemployee.domain.RoleEmployeeEntity; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartPageUtil; -import com.google.common.collect.Lists; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * 角色管理业务 - * - * @author zzr - * @date 2019/4/3 - */ -@Service -public class RoleEmployeeService { - - @Autowired - private RoleEmployeeDao roleEmployeeDao; - - @Autowired - private RoleDao roleDao; - - @Autowired - private DepartmentDao departmentDao; - - /** - * 通过角色id,分页获取成员员工列表 - * - * @param queryDTO - * @return - */ - public ResponseDTO> listEmployeeByName(RoleQueryDTO queryDTO) { - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - List employeeDTOS = roleEmployeeDao.selectEmployeeByNamePage(page, queryDTO); - employeeDTOS.stream().filter(e -> e.getDepartmentId() != null).forEach(employeeDTO -> { - DepartmentEntity departmentEntity = departmentDao.selectById(employeeDTO.getDepartmentId()); - employeeDTO.setDepartmentName(departmentEntity.getName()); - }); - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page, employeeDTOS, EmployeeVO.class); - return ResponseDTO.succData(pageResultDTO); - } - - public ResponseDTO> getAllEmployeeByRoleId(Long roleId) { - List employeeDTOS = roleEmployeeDao.selectEmployeeByRoleId(roleId); - List list = SmartBeanUtil.copyList(employeeDTOS, EmployeeVO.class); - return ResponseDTO.succData(list); - } - - /** - * 移除员工角色 - * - * @param employeeId - * @param roleId - * @return ResponseDTO - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO removeEmployeeRole(Long employeeId, Long roleId) { - if (null == employeeId || null == roleId) { - return ResponseDTO.wrap(RoleResponseCodeConst.ERROR_PARAM); - } - roleEmployeeDao.deleteByEmployeeIdRoleId(employeeId, roleId); - return ResponseDTO.succ(); - } - - /** - * 批量删除角色的成员员工 - * - * @param removeDTO - * @return ResponseDTO - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO batchRemoveEmployeeRole(RoleBatchDTO removeDTO) { - List employeeIdList = removeDTO.getEmployeeIds(); - roleEmployeeDao.batchDeleteEmployeeRole(removeDTO.getRoleId(), employeeIdList); - return ResponseDTO.succ(); - } - - /** - * 批量添加角色的成员员工 - * - * @param addDTO - * @return ResponseDTO - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO batchAddEmployeeRole(RoleBatchDTO addDTO) { - Long roleId = addDTO.getRoleId(); - List employeeIdList = addDTO.getEmployeeIds(); - roleEmployeeDao.deleteByRoleId(roleId); - List roleRelationEntities = Lists.newArrayList(); - RoleEmployeeEntity employeeRoleRelationEntity; - for (Long employeeId : employeeIdList) { - employeeRoleRelationEntity = new RoleEmployeeEntity(); - employeeRoleRelationEntity.setRoleId(roleId); - employeeRoleRelationEntity.setEmployeeId(employeeId); - roleRelationEntities.add(employeeRoleRelationEntity); - } - roleEmployeeDao.batchInsert(roleRelationEntities); - return ResponseDTO.succ(); - } - - /** - * 通过员工id获取员工角色 - * - * @param employeeId - * @return - */ - public ResponseDTO> getRolesByEmployeeId(Long employeeId) { - List roleIds = roleEmployeeDao.selectRoleIdByEmployeeId(employeeId); - List roleList = roleDao.selectList(null); - List result = SmartBeanUtil.copyList(roleList, RoleSelectedVO.class); - result.stream().forEach(item -> item.setSelected(roleIds.contains(item.getId()))); - return ResponseDTO.succData(result); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/domain/RoleEmployeeDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/domain/RoleEmployeeDTO.java deleted file mode 100644 index 5dc70111..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/domain/RoleEmployeeDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.roleemployee.domain; - -import lombok.Data; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 15:27 - * @since JDK1.8 - */ -@Data -public class RoleEmployeeDTO { - - private Long roleId; - - private Long employeeId; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/domain/RoleEmployeeEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/domain/RoleEmployeeEntity.java deleted file mode 100644 index 58d16994..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleemployee/domain/RoleEmployeeEntity.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.roleemployee.domain; - -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -/** - * [ 角色 员工关系] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/27 0027 下午 13:01 - * @since JDK1.8 - */ -@Data -@TableName("t_role_employee") -public class RoleEmployeeEntity extends BaseEntity { - - private Long roleId; - - private Long employeeId; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeController.java deleted file mode 100644 index 3cb021ef..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeController.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.roleprivilege; - -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.system.role.roleprivilege.domain.dto.RolePrivilegeDTO; -import net.lab1024.smartadmin.module.system.role.roleprivilege.domain.dto.RolePrivilegeTreeVO; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - * [ 与员工权限相关:角色权限关系、权限列表 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@OperateLog -@RestController -@Api(tags = {SwaggerTagConst.Admin.MANAGER_ROLE_PRIVILEGE}) -public class RolePrivilegeController { - - @Autowired - private RolePrivilegeService rolePrivilegeService; - - @ApiOperation(value = "更新角色权限", notes = "更新角色权限") - @PostMapping("/privilege/updateRolePrivilege") - public ResponseDTO updateRolePrivilege(@Valid @RequestBody RolePrivilegeDTO updateDTO) { - return rolePrivilegeService.updateRolePrivilege(updateDTO); - } - - @ApiOperation(value = "获取角色可选的功能权限", notes = "获取角色可选的功能权限") - @GetMapping("/privilege/listPrivilegeByRoleId/{roleId}") - public ResponseDTO listPrivilegeByRoleId(@PathVariable("roleId") Long roleId) { - return rolePrivilegeService.listPrivilegeByRoleId(roleId); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeDao.java deleted file mode 100644 index ebf4284b..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeDao.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.roleprivilege; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import net.lab1024.smartadmin.module.system.privilege.domain.entity.PrivilegeEntity; -import net.lab1024.smartadmin.module.system.role.roleprivilege.domain.entity.RolePrivilegeEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/3/28 0028 下午 12:23 - * @since JDK1.8 - */ -@Mapper -@Component -public interface RolePrivilegeDao extends BaseMapper { - - /** - * 根据角色id删除 - * @param roleId - */ - void deleteByRoleId(@Param("roleId")Long roleId); - - /** - * 删除权限所关联的角色信息 - * @param privilegeKeyList - */ - void deleteByPrivilegeKey(@Param("privilegeKeyList")List privilegeKeyList); - - - /** - * 批量添加 - * @param rolePrivilegeList - */ - void batchInsert(List rolePrivilegeList); - - /** - * 查询某批角色的权限 - * @param roleIds - * @return - */ - List listByRoleIds(@Param("roleIds")List roleIds,@Param("normalStatus")Integer normalStatus); - - /** - * 查询某个角色的权限 - * @param roleId - * @return - */ - List listByRoleId(@Param("roleId")Long roleId); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeService.java deleted file mode 100644 index dd39f36f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/RolePrivilegeService.java +++ /dev/null @@ -1,129 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.roleprivilege; - -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.module.system.privilege.dao.PrivilegeDao; -import net.lab1024.smartadmin.module.system.privilege.domain.entity.PrivilegeEntity; -import net.lab1024.smartadmin.module.system.privilege.service.PrivilegeEmployeeService; -import net.lab1024.smartadmin.module.system.role.basic.RoleDao; -import net.lab1024.smartadmin.module.system.role.basic.RoleResponseCodeConst; -import net.lab1024.smartadmin.module.system.role.basic.domain.entity.RoleEntity; -import net.lab1024.smartadmin.module.system.role.roleprivilege.domain.dto.RolePrivilegeDTO; -import net.lab1024.smartadmin.module.system.role.roleprivilege.domain.dto.RolePrivilegeSimpleDTO; -import net.lab1024.smartadmin.module.system.role.roleprivilege.domain.dto.RolePrivilegeTreeVO; -import net.lab1024.smartadmin.module.system.role.roleprivilege.domain.entity.RolePrivilegeEntity; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import com.google.common.collect.Lists; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * [ 后台员工权限 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Service -public class RolePrivilegeService { - - @Autowired - private PrivilegeDao privilegeDao; - - @Autowired - private RoleDao roleDao; - - @Autowired - private RolePrivilegeDao rolePrivilegeDao; - - @Autowired - private PrivilegeEmployeeService privilegeEmployeeService; - - /** - * 更新角色权限 - * - * @param updateDTO - * @return ResponseDTO - */ - public ResponseDTO updateRolePrivilege(RolePrivilegeDTO updateDTO) { - Long roleId = updateDTO.getRoleId(); - RoleEntity roleEntity = roleDao.selectById(roleId); - if (null == roleEntity) { - return ResponseDTO.wrap(RoleResponseCodeConst.ROLE_NOT_EXISTS); - } - rolePrivilegeDao.deleteByRoleId(roleId); - List rolePrivilegeList = Lists.newArrayList(); - RolePrivilegeEntity rolePrivilegeEntity; - for (String privilegeKey : updateDTO.getPrivilegeKeyList()) { - rolePrivilegeEntity = new RolePrivilegeEntity(); - rolePrivilegeEntity.setRoleId(roleId); - rolePrivilegeEntity.setPrivilegeKey(privilegeKey); - rolePrivilegeList.add(rolePrivilegeEntity); - } - rolePrivilegeDao.batchInsert(rolePrivilegeList); - privilegeEmployeeService.updateOnlineEmployeePrivilegeByRoleId(roleId); - return ResponseDTO.succ(); - } - - public ResponseDTO listPrivilegeByRoleId(Long roleId) { - RolePrivilegeTreeVO rolePrivilegeTreeDTO = new RolePrivilegeTreeVO(); - rolePrivilegeTreeDTO.setRoleId(roleId); - - List privilegeDTOList = privilegeDao.selectAll(); - if (CollectionUtils.isEmpty(privilegeDTOList)) { - rolePrivilegeTreeDTO.setPrivilege(Lists.newArrayList()); - rolePrivilegeTreeDTO.setSelectedKey(Lists.newArrayList()); - return ResponseDTO.succData(rolePrivilegeTreeDTO); - } - //构造权限树 - List privilegeList = this.buildPrivilegeTree(privilegeDTOList); - //设置选中状态 - List rolePrivilegeEntityList = rolePrivilegeDao.listByRoleId(roleId); - List privilegeKeyList = rolePrivilegeEntityList.stream().map(e -> e.getKey()).collect(Collectors.toList()); - rolePrivilegeTreeDTO.setPrivilege(privilegeList); - rolePrivilegeTreeDTO.setSelectedKey(privilegeKeyList); - return ResponseDTO.succData(rolePrivilegeTreeDTO); - } - - private List buildPrivilegeTree(List privilegeEntityList) { - List privilegeTree = Lists.newArrayList(); - List rootPrivilege = privilegeEntityList.stream().filter(e -> e.getParentKey() == null).collect(Collectors.toList()); - rootPrivilege.sort(Comparator.comparing(PrivilegeEntity::getSort)); - if (CollectionUtils.isEmpty(rootPrivilege)) { - return privilegeTree; - } - privilegeTree = SmartBeanUtil.copyList(rootPrivilege, RolePrivilegeSimpleDTO.class); - privilegeTree.forEach(e -> e.setChildren(Lists.newArrayList())); - this.buildChildPrivilegeList(privilegeEntityList, privilegeTree); - return privilegeTree; - } - - private void buildChildPrivilegeList(List privilegeEntityList, List parentMenuList) { - List parentKeyList = parentMenuList.stream().map(RolePrivilegeSimpleDTO :: getKey).collect(Collectors.toList()); - List childEntityList = privilegeEntityList.stream().filter(e -> parentKeyList.contains(e.getParentKey())).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(childEntityList)) { - return; - } - Map> listMap = childEntityList.stream().collect(Collectors.groupingBy(PrivilegeEntity :: getParentKey)); - for (RolePrivilegeSimpleDTO rolePrivilegeSimpleDTO : parentMenuList) { - String key = rolePrivilegeSimpleDTO.getKey(); - List privilegeEntities = listMap.get(key); - if (CollectionUtils.isEmpty(privilegeEntities)) { - continue; - } - privilegeEntities.sort(Comparator.comparing(PrivilegeEntity::getSort)); - List privilegeList = SmartBeanUtil.copyList(privilegeEntities, RolePrivilegeSimpleDTO.class); - privilegeList.forEach(e -> e.setChildren(Lists.newArrayList())); - rolePrivilegeSimpleDTO.setChildren(privilegeList); - this.buildChildPrivilegeList(privilegeEntityList, privilegeList); - } - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeDTO.java deleted file mode 100644 index 261fbfd0..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeDTO.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.roleprivilege.domain.dto; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.util.List; -/** - * - * [ ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@Data -public class RolePrivilegeDTO { - - /** - * 角色id - */ - @ApiModelProperty("角色id") - @NotNull(message = "角色id不能为空") - private Long roleId; - - /** - * 功能权限id 集合 - */ - @ApiModelProperty("功能权限Key集合") - @NotNull(message = "功能权限集合不能为空") - private List privilegeKeyList; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeSimpleDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeSimpleDTO.java deleted file mode 100644 index 754b60f1..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeSimpleDTO.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.roleprivilege.domain.dto; - -import net.lab1024.smartadmin.common.anno.ApiModelPropertyEnum; -import net.lab1024.smartadmin.module.system.privilege.constant.PrivilegeTypeEnum; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -/** - * 角色功能权限 - * - * @author listen - * @date 2018/01/03 08:48 - */ -@Data -public class RolePrivilegeSimpleDTO { - - @ApiModelProperty("父级Key") - private String parentKey; - /** - * 功能名称 - */ - @ApiModelProperty("名称") - private String name; - - @ApiModelPropertyEnum(enumDesc = "类型",value = PrivilegeTypeEnum.class) - private Integer type; - - @ApiModelProperty("key") - private String key; - - @ApiModelProperty("url") - private String url; - - @ApiModelProperty("排序") - private Integer sort; - - @ApiModelProperty("子级列表") - private List children; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeTreeVO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeTreeVO.java deleted file mode 100644 index 2d441f85..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/dto/RolePrivilegeTreeVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.roleprivilege.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@Data -public class RolePrivilegeTreeVO { - - @ApiModelProperty("角色ID") - private Long roleId; - - @ApiModelProperty("权限列表") - private List privilege; - - @ApiModelProperty("选中的权限") - private List selectedKey; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/entity/RolePrivilegeEntity.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/entity/RolePrivilegeEntity.java deleted file mode 100644 index b17c80cc..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/role/roleprivilege/domain/entity/RolePrivilegeEntity.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.lab1024.smartadmin.module.system.role.roleprivilege.domain.entity; -import com.baomidou.mybatisplus.annotation.TableName; -import net.lab1024.smartadmin.common.domain.BaseEntity; -import lombok.Data; - -/** - * - * [ 角色 权限关系 ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@Data -@TableName("t_role_privilege") -public class RolePrivilegeEntity extends BaseEntity { - - /** - * 角色 id - */ - private Long roleId; - - /** - * 功能权限 id - */ - private String privilegeKey; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigController.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigController.java deleted file mode 100644 index efe62f4c..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigController.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.lab1024.smartadmin.module.system.systemconfig; - -import net.lab1024.smartadmin.common.anno.OperateLog; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.constant.SwaggerTagConst; -import net.lab1024.smartadmin.module.system.systemconfig.domain.dto.SystemConfigAddDTO; -import net.lab1024.smartadmin.module.system.systemconfig.domain.dto.SystemConfigQueryDTO; -import net.lab1024.smartadmin.module.system.systemconfig.domain.dto.SystemConfigUpdateDTO; -import net.lab1024.smartadmin.module.system.systemconfig.domain.dto.SystemConfigVO; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; -import java.util.List; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -@Api(tags = {SwaggerTagConst.Admin.MANAGER_SYSTEM_CONFIG}) -@OperateLog -@RestController -public class SystemConfigController { - - @Autowired - private SystemConfigService systemConfigService; - - @ApiOperation(value = "分页查询所有系统配置", notes = "分页查询所有系统配置") - @PostMapping("systemConfig/getListPage") - public ResponseDTO> getSystemConfigPage(@RequestBody @Valid SystemConfigQueryDTO queryDTO) { - return systemConfigService.getSystemConfigPage(queryDTO); - } - - @ApiOperation(value = "添加配置参数", notes = "添加配置参数") - @PostMapping("systemConfig/add") - public ResponseDTO addSystemConfig(@RequestBody @Valid SystemConfigAddDTO configAddDTO) { - return systemConfigService.addSystemConfig(configAddDTO); - } - - @ApiOperation(value = "修改配置参数", notes = "修改配置参数") - @PostMapping("systemConfig/update") - public ResponseDTO updateSystemConfig(@RequestBody @Valid SystemConfigUpdateDTO updateDTO) { - return systemConfigService.updateSystemConfig(updateDTO); - } - - @ApiOperation(value = "根据分组查询所有系统配置", notes = "根据分组查询所有系统配置") - @GetMapping("systemConfig/getListByGroup") - public ResponseDTO> getListByGroup(String group) { - return systemConfigService.getListByGroup(group); - } - - @ApiOperation(value = "通过key获取对应的信息", notes = "通过key获取对应的信息") - @GetMapping("systemConfig/selectByKey") - public ResponseDTO selectByKey(String configKey) { - return systemConfigService.selectByKey(configKey); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigDao.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigDao.java deleted file mode 100644 index e8114f11..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigDao.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.lab1024.smartadmin.module.system.systemconfig; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.module.system.systemconfig.domain.dto.SystemConfigQueryDTO; -import net.lab1024.smartadmin.module.system.systemconfig.domain.entity.SystemConfigEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * 系统参数配置 t_system_config Dao层 - * - * @author GHQ - * @date 2017-12-23 14:25 - */ -@Component -@Mapper -public interface SystemConfigDao extends BaseMapper { - - /** - * 查询所有系统配置(分页) - * - * @param page - * @return - */ - List selectSystemSettingList(Page page, @Param("queryDTO") SystemConfigQueryDTO queryDTO); - - /** - * 根据key查询获取数据 - * - * @param key - * @return - */ - SystemConfigEntity getByKey(@Param("key") String key); - - /** - * 根据key查询获取数据 排除掉某個id的数据 - * @param key - * @param excludeId - * @return - */ - SystemConfigEntity getByKeyExcludeId(@Param("key") String key,@Param("excludeId") Long excludeId); - /** - * 查询所有系统配置 - * - * @return - */ - List selectAll(); - - /** - * 根据分组查询所有系统配置 - * @param group - * @return - */ - List getListByGroup(String group); - - - SystemConfigEntity selectByKeyAndGroup(@Param("configKey") String configKey, @Param("group") String group); -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigService.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigService.java deleted file mode 100644 index 5dd00d65..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/SystemConfigService.java +++ /dev/null @@ -1,262 +0,0 @@ -package net.lab1024.smartadmin.module.system.systemconfig; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.constant.JudgeEnum; -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; -import net.lab1024.smartadmin.common.domain.PageResultDTO; -import net.lab1024.smartadmin.common.domain.ResponseDTO; -import net.lab1024.smartadmin.common.reload.annotation.SmartReload; -import net.lab1024.smartadmin.constant.SmartReloadTagConst; -import net.lab1024.smartadmin.module.support.smartreload.SmartReloadService; -import net.lab1024.smartadmin.module.system.systemconfig.constant.SystemConfigDataType; -import net.lab1024.smartadmin.module.system.systemconfig.constant.SystemConfigEnum; -import net.lab1024.smartadmin.module.system.systemconfig.constant.SystemConfigResponseCodeConst; -import net.lab1024.smartadmin.module.system.systemconfig.domain.dto.*; -import net.lab1024.smartadmin.module.system.systemconfig.domain.entity.SystemConfigEntity; -import net.lab1024.smartadmin.util.SmartBeanUtil; -import net.lab1024.smartadmin.util.SmartPageUtil; -import com.google.common.collect.Lists; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.annotation.PostConstruct; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.regex.Pattern; - -/** - * 系统配置业务类 - * - * @author GHQ - * @date 2017-12-23 15:09 - */ -@Slf4j -@Service -public class SystemConfigService { - - /** - * 系统配置缓存 - */ - private ConcurrentHashMap systemConfigMap = new ConcurrentHashMap<>(); - - @Autowired - private SystemConfigDao systemConfigDao; - - @Autowired - private SmartReloadService smartReloadService; - - /** - * 初始化系统设置缓存 - */ - @PostConstruct - private void initSystemConfigCache() { - List entityList = systemConfigDao.selectAll(); - if (CollectionUtils.isEmpty(entityList)) { - return; - } - - systemConfigMap.clear(); - entityList.forEach(entity -> this.systemConfigMap.put(entity.getConfigKey().toLowerCase(), entity)); - log.info("系统设置缓存初始化完毕:{}", systemConfigMap.size()); - - smartReloadService.register(this); - } - - @SmartReload(SmartReloadTagConst.SYSTEM_CONFIG) - public boolean reload(String args) { - this.initSystemConfigCache(); - log.warn("<> <<{}>> , args {} reload success ", SmartReloadTagConst.SYSTEM_CONFIG, args); - return true; - } - - /** - * 分页获取系统配置 - * - * @param queryDTO - * @return - */ - public ResponseDTO> getSystemConfigPage(SystemConfigQueryDTO queryDTO) { - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - if(queryDTO.getKey() != null){ - queryDTO.setKey(queryDTO.getKey().toLowerCase()); - } - List entityList = systemConfigDao.selectSystemSettingList(page, queryDTO); - PageResultDTO pageResultDTO = SmartPageUtil.convert2PageResult(page, entityList, SystemConfigVO.class); - return ResponseDTO.succData(pageResultDTO); - } - - /** - * 根据参数key获得一条数据(数据库) - * - * @param configKey - * @return - */ - public ResponseDTO selectByKey(String configKey) { - if(configKey != null){ - configKey = configKey.toLowerCase(); - } - SystemConfigEntity entity = systemConfigDao.getByKey(configKey); - if (entity == null) { - return ResponseDTO.wrap(SystemConfigResponseCodeConst.NOT_EXIST); - } - SystemConfigVO configDTO = SmartBeanUtil.copy(entity, SystemConfigVO.class); - return ResponseDTO.succData(configDTO); - } - - /** - * 根据参数key获得一条数据 并转换为 对象 - * - * @param configKey - * @param clazz - * @param - * @return - */ - public T selectByKey2Obj(String configKey, Class clazz) { - if(configKey != null){ - configKey = configKey.toLowerCase(); - } - SystemConfigEntity entity = systemConfigDao.getByKey(configKey); - if (entity == null) { - return null; - } - SystemConfigDTO configDTO = SmartBeanUtil.copy(entity, SystemConfigDTO.class); - String configValue = configDTO.getConfigValue(); - if (StringUtils.isEmpty(configValue)) { - return null; - } - T obj = JSON.parseObject(configValue, clazz); - return obj; - } - - public SystemConfigDTO getCacheByKey(SystemConfigEnum.Key key) { - SystemConfigEntity entity = this.systemConfigMap.get(key.name().toLowerCase()); - if (entity == null) { - return null; - } - return SmartBeanUtil.copy(entity, SystemConfigDTO.class); - } - - /** - * 添加系统配置 - * - * @param configAddDTO - * @return - */ - public ResponseDTO addSystemConfig(SystemConfigAddDTO configAddDTO) { - configAddDTO.setConfigKey(configAddDTO.getConfigKey().toLowerCase()); - SystemConfigEntity entity = systemConfigDao.getByKey(configAddDTO.getConfigKey()); - if (entity != null) { - return ResponseDTO.wrap(SystemConfigResponseCodeConst.ALREADY_EXIST); - } - ResponseDTO valueValid = this.configValueValid(configAddDTO.getConfigKey(),configAddDTO.getConfigValue()); - if(!valueValid.isSuccess()){ - return valueValid; - } - configAddDTO.setConfigKey(configAddDTO.getConfigKey().toLowerCase()); - SystemConfigEntity addEntity = SmartBeanUtil.copy(configAddDTO, SystemConfigEntity.class); - addEntity.setIsUsing(JudgeEnum.YES.getValue()); - systemConfigDao.insert(addEntity); - //刷新缓存 - this.initSystemConfigCache(); - return ResponseDTO.succ(); - } - - /** - * 更新系统配置 - * - * @param updateDTO - * @return - */ - public ResponseDTO updateSystemConfig(SystemConfigUpdateDTO updateDTO) { - updateDTO.setConfigKey(updateDTO.getConfigKey().toLowerCase()); - SystemConfigEntity entity = systemConfigDao.selectById(updateDTO.getId()); - //系统配置不存在 - if (entity == null) { - return ResponseDTO.wrap(SystemConfigResponseCodeConst.NOT_EXIST); - } - SystemConfigEntity alreadyEntity = systemConfigDao.getByKeyExcludeId(updateDTO.getConfigKey().toLowerCase(), updateDTO.getId()); - if (alreadyEntity != null) { - return ResponseDTO.wrap(SystemConfigResponseCodeConst.ALREADY_EXIST); - } - ResponseDTO valueValid = this.configValueValid(updateDTO.getConfigKey(),updateDTO.getConfigValue()); - if(!valueValid.isSuccess()){ - return valueValid; - } - entity = SmartBeanUtil.copy(updateDTO, SystemConfigEntity.class); - updateDTO.setConfigKey(updateDTO.getConfigKey().toLowerCase()); - systemConfigDao.updateById(entity); - - //刷新缓存 - this.initSystemConfigCache(); - return ResponseDTO.succ(); - } - - - private ResponseDTO configValueValid(String configKey , String configValue){ - SystemConfigEnum.Key configKeyEnum = SystemConfigEnum.Key.selectByKey(configKey); - if(configKeyEnum == null){ - return ResponseDTO.succ(); - } - SystemConfigDataType dataType = configKeyEnum.getDataType(); - if(dataType == null){ - return ResponseDTO.succ(); - } - if(dataType.name().equals(SystemConfigDataType.TEXT.name())){ - return ResponseDTO.succ(); - } - if(dataType.name().equals(SystemConfigDataType.JSON.name())){ - try { - JSONObject jsonStr = JSONObject.parseObject(configValue); - return ResponseDTO.succ(); - } catch (Exception e) { - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM,"数据格式不是JSON,请修改后提交。"); - } - } - if(StringUtils.isNotEmpty(dataType.getValid())){ - Boolean valid = Pattern.matches(dataType.getValid(), configValue); - if(valid){ - return ResponseDTO.succ(); - } - return ResponseDTO.wrap(ResponseCodeConst.ERROR_PARAM,"数据格式不是"+dataType.name().toLowerCase()+",请修改后提交。"); - } - - return ResponseDTO.succ(); - } - - /** - * 根据分组名称 获取获取系统设置 - * - * @param group - * @return - */ - public ResponseDTO> getListByGroup(String group) { - - List entityList = systemConfigDao.getListByGroup(group); - if (CollectionUtils.isEmpty(entityList)) { - return ResponseDTO.succData(Lists.newArrayList()); - } - List systemConfigList = SmartBeanUtil.copyList(entityList, SystemConfigVO.class); - return ResponseDTO.succData(systemConfigList); - } - - /** - * 根据分组名称 获取获取系统设置 - * - * @param group - * @return - */ - public List getListByGroup(SystemConfigEnum.Group group) { - List entityList = systemConfigDao.getListByGroup(group.name()); - if (CollectionUtils.isEmpty(entityList)) { - return Lists.newArrayList(); - } - List systemConfigList = SmartBeanUtil.copyList(entityList, SystemConfigDTO.class); - return systemConfigList; - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigDataType.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigDataType.java deleted file mode 100644 index 900256d8..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigDataType.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.lab1024.smartadmin.module.system.systemconfig.constant; - -import net.lab1024.smartadmin.util.SmartVerificationUtil; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/9/4 0004 上午 11:43 - * @since JDK1.8 - */ -public enum SystemConfigDataType { - /** - * 整数 - */ - INTEGER(SmartVerificationUtil.INTEGER), - /** - * 文本 - */ - TEXT(null), - /** - * url地址 - */ - URL(SmartVerificationUtil.URL), - /** - * 邮箱 - */ - EMAIL(SmartVerificationUtil.EMAIL), - /** - * JSON 字符串 - */ - JSON(null), - /** - * 2019-08 - */ - YEAR_MONTH(SmartVerificationUtil.YEAR_MONTH), - /** - * 2019-08-01 - */ - DATE(SmartVerificationUtil.DATE), - /** - * 2019-08-01 10:23 - */ - DATE_TIME(SmartVerificationUtil.DATE_TIME), - /** - * 10:23-10:56 - */ - TIME_SECTION(SmartVerificationUtil.TIME_SECTION), - /** - * 10:23 - */ - TIME(SmartVerificationUtil.TIME); - - private String valid; - - - SystemConfigDataType(String valid){ - this.valid = valid; - } - - public String getValid() { - return valid; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigEnum.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigEnum.java deleted file mode 100644 index 9791d772..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigEnum.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.lab1024.smartadmin.module.system.systemconfig.constant; - - -import java.util.Arrays; -import java.util.Optional; - -/** - * [ 系统配置常量类 ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -public class SystemConfigEnum { - - public enum Group { - BACK, - GIT_LOG - } - - public enum Key { - /** - * 超管id - */ - EMPLOYEE_SUPERMAN(SystemConfigDataType.TEXT), - /** - * 阿里云OSS配置项 - */ - ALI_OSS(SystemConfigDataType.JSON), - /** - * 七牛云OSS配置项 - */ - QI_NIU_OSS(SystemConfigDataType.JSON), - /** - * 本地文件上传url前缀 - */ - LOCAL_UPLOAD_URL_PREFIX(SystemConfigDataType.URL), - /** - * 邮件配置 - */ - EMAIL_CONFIG(SystemConfigDataType.JSON), - /** - * git-log 插件 - */ - GIT_LOG_PLUGIN(SystemConfigDataType.JSON); - - private SystemConfigDataType dataType; - - Key(SystemConfigDataType dataType) { - this.dataType = dataType; - } - - - public SystemConfigDataType getDataType() { - return dataType; - } - - public static Key selectByKey(String key) { - Key[] values = Key.values(); - Optional first = Arrays.stream(values).filter(e -> e.name().equalsIgnoreCase(key)).findFirst(); - return !first.isPresent() ? null : first.get(); - } - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigResponseCodeConst.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigResponseCodeConst.java deleted file mode 100644 index fd9fa9e4..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/constant/SystemConfigResponseCodeConst.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.lab1024.smartadmin.module.system.systemconfig.constant; -import net.lab1024.smartadmin.common.constant.ResponseCodeConst; - -/** - * - * [ 5001-5999 ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -public class SystemConfigResponseCodeConst extends ResponseCodeConst { - - /** - * 配置参数已存在 10201 - */ - public static final SystemConfigResponseCodeConst ALREADY_EXIST = new SystemConfigResponseCodeConst(5001, "配置参数已存在"); - /** - * 配置参数不存在 10203 - */ - public static final SystemConfigResponseCodeConst NOT_EXIST = new SystemConfigResponseCodeConst(5002, "配置参数不存在"); - - public SystemConfigResponseCodeConst(int code, String msg) { - super(code, msg); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigQueryDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigQueryDTO.java deleted file mode 100644 index 458ef395..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigQueryDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.lab1024.smartadmin.module.system.systemconfig.domain.dto; - - -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * - * [ ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@Data -public class SystemConfigQueryDTO extends PageParamDTO { - - @ApiModelProperty("参数KEY") - private String key; - - @ApiModelProperty("参数类别") - private String configGroup; - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigUpdateDTO.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigUpdateDTO.java deleted file mode 100644 index 2fa29788..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/module/system/systemconfig/domain/dto/SystemConfigUpdateDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.lab1024.smartadmin.module.system.systemconfig.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * - * [ ] - * - * @version 1.0 - * @since JDK1.8 - * @author yandanyang - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - */ -@Data -public class SystemConfigUpdateDTO extends SystemConfigAddDTO{ - - @ApiModelProperty("id") - @NotNull(message = "id不能为空") - private Long id; -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartBaseEnumUtil.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartBaseEnumUtil.java deleted file mode 100644 index e433367b..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartBaseEnumUtil.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.lab1024.smartadmin.util; - -import net.lab1024.smartadmin.common.domain.BaseEnum; - -/** - * 枚举工具类 - * - * @author listen - * @date 2017/10/10 18:17 - */ -public class SmartBaseEnumUtil { - - /** - * 校验int类型的参数与枚举类比较是否合法 - * - * @param value 参数 - * @param enumClass 枚举类必须实现BaseEnum接口 - * @return boolean - * @Author listen - */ - public static boolean checkEnum(Integer value, Class enumClass) { - if (null == value) { - return false; - } - BaseEnum[] enums = enumClass.getEnumConstants(); - for (BaseEnum baseEnum : enums) { - if (baseEnum.equalsValue(value)) { - return true; - } - } - return false; - } - - /** - * 获取枚举类的说明 value : info 的形式 - * - * @param enumClass - * @return String - */ - public static String getEnumDesc(Class enumClass) { - BaseEnum[] enums = enumClass.getEnumConstants(); - // value : info 的形式 - StringBuilder sb = new StringBuilder(); - for (BaseEnum baseEnum : enums) { - sb.append(baseEnum.getValue() + ":" + baseEnum.getDesc() + ","); - } - return sb.toString(); - } - - /** - * 获取与int Code相匹配的枚举类的info - * - * @param value 参数 - * @param enumClass 枚举类必须实现BaseEnum接口 - * @return String 如无匹配枚举则返回null - */ - public static String getEnumDescByValue(Integer value, Class enumClass) { - BaseEnum[] enums = enumClass.getEnumConstants(); - for (BaseEnum baseEnum : enums) { - if (baseEnum.equalsValue(value)) { - return baseEnum.getDesc(); - } - } - return null; - } - - /** - * 根据int类型的参数与获取枚举类的实例 - * - * @param value 参数 - * @param enumClass 枚举类必须实现BaseEnum接口 - * @return BaseEnum 无匹配值返回null - * @Author listen - */ - public static T getEnumByValue(Object value, Class enumClass) { - T[] enums = enumClass.getEnumConstants(); - for (T baseEnum : enums) { - if (baseEnum.equalsValue(value)) { - return baseEnum; - } - } - return null; - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartDigestUtil.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartDigestUtil.java deleted file mode 100644 index 902d5db3..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartDigestUtil.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.lab1024.smartadmin.util; - -import org.apache.commons.codec.digest.DigestUtils; - -public class SmartDigestUtil extends DigestUtils { - - /** - * md5加盐加密 - * - * @param salt - * @param password - * @return - */ - public static String encryptPassword(String salt, String password) { - return SmartDigestUtil.md5Hex(String.format(salt, password)); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartPageUtil.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartPageUtil.java deleted file mode 100644 index 2e1352c6..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartPageUtil.java +++ /dev/null @@ -1,97 +0,0 @@ -package net.lab1024.smartadmin.util; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import net.lab1024.smartadmin.common.domain.OrderItemDTO; -import net.lab1024.smartadmin.common.domain.PageParamDTO; -import net.lab1024.smartadmin.common.domain.PageResultDTO; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 分页工具类 - * - * @author GHQ - * @date 2017-12-23 16:40 - */ - -public class SmartPageUtil { - - public static PageResultDTO convert2PageResult(IPage page) { - PageResultDTO result = new PageResultDTO<>(); - result.setPageNum(page.getCurrent()); - result.setPageSize(page.getSize()); - result.setTotal(page.getTotal()); - result.setPages(page.getPages()); - result.setList(page.getRecords()); - return result; - } - - public static Page convert2QueryPage(PageParamDTO baseDTO) { - Page page = new Page<>(); - - List orders = baseDTO.getOrders(); - if (orders != null && !orders.isEmpty()) { - List orderItemList = orders.stream().map(SmartPageUtil::convertOrderItem).collect(Collectors.toList()); - page.setOrders(orderItemList); - } - page.setCurrent(baseDTO.getPageNum()); - page.setSize(baseDTO.getPageSize()); - if (null != baseDTO.getSearchCount()) { - page.setSearchCount(baseDTO.getSearchCount()); - } - return page; - } - - private static com.baomidou.mybatisplus.core.metadata.OrderItem convertOrderItem(OrderItemDTO orderItemDTO) { - if (orderItemDTO.isAsc()) { - return com.baomidou.mybatisplus.core.metadata.OrderItem.asc(orderItemDTO.getColumn()); - } else { - return com.baomidou.mybatisplus.core.metadata.OrderItem.desc(orderItemDTO.getColumn()); - } - } - - /** - * 转换为 PageResultDTO 对象 - * - * @param page - * @param sourceList 原list - * @param targetClazz 目标类 - * @return - * @author yandanyang - * @date 2018年5月16日 下午6:05:28 - */ - public static PageResultDTO convert2PageResult(IPage page, List sourceList, Class targetClazz) { - PageResultDTO pageResultDTO = setPage(page); - List records = SmartBeanUtil.copyList(sourceList, targetClazz); - page.setRecords(records); - pageResultDTO.setList(records); - return pageResultDTO; - } - - /** - * 转换为 PageResultDTO 对象 - * - * @param page - * @param sourceList list - * @return - * @author yandanyang - * @date 2018年5月16日 下午6:05:28 - */ - public static PageResultDTO convert2PageResult(IPage page, List sourceList) { - PageResultDTO pageResultDTO = setPage(page); - page.setRecords(sourceList); - pageResultDTO.setList(sourceList); - return pageResultDTO; - } - - private static PageResultDTO setPage(IPage page) { - PageResultDTO pageResultDTO = new PageResultDTO(); - pageResultDTO.setPageNum(page.getCurrent()); - pageResultDTO.setPageSize(page.getSize()); - pageResultDTO.setTotal(page.getTotal()); - pageResultDTO.setPages(page.getPages()); - return pageResultDTO; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartQuartzUtil.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartQuartzUtil.java deleted file mode 100644 index 14003e6d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartQuartzUtil.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.lab1024.smartadmin.util; - -import net.lab1024.smartadmin.module.support.quartz.constant.QuartzConst; -import org.apache.commons.lang3.StringUtils; -import org.quartz.JobKey; -import org.quartz.TriggerKey; - -/** - * [ ] - * - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2018 1024lab.netInc. All rights reserved. - * @date 2019/4/13 0013 下午 15:16 - * @since JDK1.8 - */ -public class SmartQuartzUtil { - - public static Long getTaskIdByJobKey(JobKey jobKey) { - String name = jobKey.getName(); - return Long.valueOf(StringUtils.replace(name, QuartzConst.JOB_KEY_PREFIX, "")); - } - - public static Integer getTaskIdByTriggerKey(TriggerKey triggerKey) { - String name = triggerKey.getName(); - return Integer.valueOf(StringUtils.replace(name, QuartzConst.TRIGGER_KEY_PREFIX, "")); - } - - /** - * 获取触发器key - */ - public static TriggerKey getTriggerKey(Long taskId) { - return TriggerKey.triggerKey(QuartzConst.TRIGGER_KEY_PREFIX + taskId); - } - - /** - * 获取jobKey - */ - public static JobKey getJobKey(Long taskId) { - return JobKey.jobKey(QuartzConst.JOB_KEY_PREFIX + taskId); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartRequestTokenUtil.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartRequestTokenUtil.java deleted file mode 100644 index 7ae5f5fc..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartRequestTokenUtil.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.lab1024.smartadmin.util; - -import net.lab1024.smartadmin.module.system.login.domain.RequestTokenBO; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.http.HttpServletRequest; -/** - * @author yandanyang - * @version 1.0 - * @company 1024lab.net - * @copyright (c) 2019 1024lab.netInc. All rights reserved. - * @date - * @since JDK1.8 - */ -public class SmartRequestTokenUtil { - - private static final String USER_KEY = "smart_admin_user"; - - private static ThreadLocal RequestUserThreadLocal = new ThreadLocal(); - - public static void setUser(HttpServletRequest request, RequestTokenBO requestToken) { - request.setAttribute(USER_KEY, requestToken); - RequestUserThreadLocal.set(requestToken); - } - - public static RequestTokenBO getThreadLocalUser() { - return RequestUserThreadLocal.get(); - } - - public static RequestTokenBO getRequestUser() { - RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); - if (requestAttributes != null) { - HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); - if (request != null) { - return (RequestTokenBO) request.getAttribute(USER_KEY); - } - } - return null; - } - - public static Long getRequestUserId() { - RequestTokenBO requestUser = getRequestUser(); - if (null == requestUser) { - return null; - } - return requestUser.getRequestUserId(); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartSendMailUtil.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartSendMailUtil.java deleted file mode 100644 index b5bee5f6..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/SmartSendMailUtil.java +++ /dev/null @@ -1,243 +0,0 @@ -package net.lab1024.smartadmin.util; - -import lombok.extern.slf4j.Slf4j; - -import javax.activation.DataHandler; -import javax.activation.DataSource; -import javax.mail.Authenticator; -import javax.mail.PasswordAuthentication; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.*; -import javax.mail.util.ByteArrayDataSource; -import java.io.InputStream; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.Properties; -import java.util.regex.Pattern; - -@Slf4j -public class SmartSendMailUtil { - - /** - * 邮箱正则表达式 - */ - static final Pattern pattern = Pattern.compile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"); - - public static void main(String[] args) throws Exception { - // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码) - // PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”), - // 对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。 - String myEmailAccount = "xxxxx@163.com"; - String myEmailPassword = "xxxxxx"; - // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com - // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com - String myEmailSMTPHost = "smtp.163.com"; - // 收件人邮箱(替换为自己知道的有效邮箱) - String[] toMailAccountList = new String[]{"421316927@qq.com"}; - SmartSendMailUtil.sendMail(myEmailAccount, myEmailPassword, "", toMailAccountList, "", myEmailSMTPHost, "测试发送邮件", "测试发送邮件"); - - } - - /** - * 发送文本邮件 - * - * @param sendMail 发件人邮箱 - * @param sendMailPwd 发件人密码 - * @param sendMailName 发件人昵称(可选) - * @param receiveMail 收件人邮箱 - * @param receiveMailName 收件人昵称(可选) - * @param sendSMTPHost 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com - * @param title 邮件主题 - * @param content 邮件正文 - * @author Administrator - * @date 2017年12月13日 下午1:51:38 - */ - public static void sendMail(String sendMail, String sendMailPwd, String sendMailName, String[] receiveMail, String receiveMailName, String sendSMTPHost, String title, String content) { - - Session session = createSession(sendSMTPHost); - // 3. 创建一封邮件 - MimeMessage message; - try { - message = createMimeMessage(session, sendMail, sendMailName, receiveMail, receiveMailName, title, content); - // 4. 根据 Session 获取邮件传输对象 - Transport transport = session.getTransport(); - - // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错 - // - // PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log, - // 仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误 - // 类型到对应邮件服务器的帮助网站上查看具体失败原因。 - // - // PS_02: 连接失败的原因通常为以下几点, 仔细检查代码: - // (1) 邮箱没有开启 SMTP 服务; - // (2) 邮箱密码错误, 例如某些邮箱开启了独立密码; - // (3) 邮箱服务器要求必须要使用 SSL 安全连接; - // (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务; - // (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。 - // - // PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。 - transport.connect(sendMail, sendMailPwd); - // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人 - transport.sendMessage(message, message.getAllRecipients()); - // 7. 关闭连接 - transport.close(); - } catch (Exception e) { - log.error("", e); - } - - } - - /** - * 发送带附件的邮件 - * - * @param sendMail 发件人邮箱 - * @param sendMailPwd 发件人密码 - * @param sendMailName 发件人昵称(可选) - * @param receiveMail 收件人邮箱 - * @param receiveMailName 收件人昵称(可选) - * @param sendSMTPHost 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com - * @param title 邮件主题 - * @param content 邮件正文 - * @author Administrator - * @date 2017年12月13日 下午1:51:38 - */ - public static void sendFileMail(String sendMail, String sendMailPwd, String sendMailName, String[] receiveMail, String receiveMailName, String sendSMTPHost, String title, String content, - InputStream is, String fileName, String port) { - - Session session = createSSLSession(sendSMTPHost, port, sendMailName, sendMailPwd); - // 3. 创建一封邮件 - MimeMessage message; - try { - message = createMimeMessage(session, sendMail, sendMailName, receiveMail, receiveMailName, title, content); - // 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容) - MimeMultipart mm = new MimeMultipart(); - MimeBodyPart text = new MimeBodyPart(); - text.setContent(content, "text/html;charset=UTF-8"); - mm.addBodyPart(text); - if (null != is && is.available() > 0) { - MimeBodyPart attachment = new MimeBodyPart(); - DataSource source = new ByteArrayDataSource(is, "application/msexcel"); - // 将附件数据添加到"节点" - attachment.setDataHandler(new DataHandler(source)); - // 设置附件的文件名(需要编码) - attachment.setFileName(MimeUtility.encodeText(fileName)); - // 10. 设置文本和 附件 的关系(合成一个大的混合"节点" / Multipart ) - // 如果有多个附件,可以创建多个多次添加 - mm.addBodyPart(attachment); - } - message.setContent(mm); - message.saveChanges(); - // 4. 根据 Session 获取邮件传输对象 - Transport transport = session.getTransport("smtp"); - transport.connect(sendSMTPHost, sendMail, sendMailPwd); - // // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人 - transport.sendMessage(message, message.getAllRecipients()); - // 7. 关闭连接 - } catch (Exception e) { - log.error("", e); - } - - } - - /** - * 创建session - * - * @author lidoudou - * @date 2019/2/16 14:59 - */ - private static Session createSSLSession(String sendSMTPHost, String port, String userName, String pwd) { - // 1. 创建参数配置, 用于连接邮件服务器的参数配置 - Properties props = new Properties(); // 参数配置 - - props.setProperty("mail.smtp.user", userName); - props.setProperty("mail.smtp.password", pwd); - props.setProperty("mail.smtp.host", sendSMTPHost); - props.setProperty("mail.smtp.port", port); - props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); - props.setProperty("mail.smtp.socketFactory.fallback", "false"); - props.setProperty("mail.smtp.socketFactory.port", port); - props.put("mail.smtp.auth", "true"); - - // 2. 根据配置创建会话对象, 用于和邮件服务器交互 - Session session = Session.getDefaultInstance(props, new Authenticator() { - //身份认证 - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(userName, pwd); - } - }); - session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log - return session; - } - - /** - * 创建session - * - * @author lidoudou - * @date 2019/2/16 14:59 - */ - private static Session createSession(String sendSMTPHost) { - // 1. 创建参数配置, 用于连接邮件服务器的参数配置 - Properties props = new Properties(); // 参数配置 - props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求) - props.setProperty("mail.smtp.host", sendSMTPHost); // 发件人的邮箱的 SMTP 服务器地址 - props.setProperty("mail.smtp.auth", "true"); // 需要请求认证 - // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启), - // 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误, - // 打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。 - /* - * // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接, // 需要改为对应邮箱的 SMTP 服务器的端口, - * 具体可查看对应邮箱服务的帮助, // QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看) final String smtpPort = "465"; - * props.setProperty("mail.smtp.port", smtpPort); - * props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); - * props.setProperty("mail.smtp.socketFactory.fallback", "false"); - * props.setProperty("mail.smtp.socketFactory.port", smtpPort); - */ - // 2. 根据配置创建会话对象, 用于和邮件服务器交互 - Session session = Session.getInstance(props); - session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log - return session; - } - - /** - * 创建一封只包含文本的简单邮件 - * - * @param session 和服务器交互的会话 - * @param sendMail 发件人邮箱 - * @param sendMailName 发件人昵称 - * @param receiveMail 收件人邮箱 - * @param receiveMailName 收件人昵称 - * @param title 邮件主题 - * @param content 邮件正文 - * @return - * @throws Exception - * @author Administrator - * @date 2017年12月13日 下午1:55:45 - */ - public static MimeMessage createMimeMessage(Session session, String sendMail, String sendMailName, String[] receiveMail, String receiveMailName, String title, String content) throws Exception { - // 1. 创建一封邮件 - MimeMessage message = new MimeMessage(session); - // 2. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称) - message.setFrom(new InternetAddress(sendMail, sendMailName, "UTF-8")); - // 3. To: 收件人(可以增加多个收件人、抄送、密送) - List to = new LinkedList<>(); - for (String s : receiveMail) { - if (pattern.matcher(s).matches()) { - to.add(new InternetAddress(s)); - } - } - //Address[] addresses = new Address[]{new InternetAddress(receiveMail),new InternetAddress(receiveMail)}; - message.addRecipients(MimeMessage.RecipientType.TO, to.toArray((new InternetAddress[to.size()]))); - // 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题) - message.setSubject(title, "UTF-8"); - // 5. Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容) - message.setContent(content, "text/html;charset=UTF-8"); - // 6. 设置发件时间 - message.setSentDate(new Date()); - // 7. 保存设置 - message.saveChanges(); - return message; - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartExcelFileType.java b/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartExcelFileType.java deleted file mode 100644 index 499e43db..00000000 --- a/smart-admin-service/smart-admin-api/src/main/java/net/lab1024/smartadmin/util/excel/SmartExcelFileType.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.lab1024.smartadmin.util.excel; - -/** - * @author zhuoda - */ -public enum SmartExcelFileType { - XLS, - XLSX - -} diff --git a/smart-admin-service/smart-admin-api/src/main/resources/dev/application.properties b/smart-admin-service/smart-admin-api/src/main/resources/dev/application.properties deleted file mode 100644 index b4468249..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/dev/application.properties +++ /dev/null @@ -1,123 +0,0 @@ -######################### server ################### -server.servlet.context-path=/smart-admin-api -server.port=10086 -spring.profiles.active=@profiles.active@ - -######################### tomcat ################### -server.tomcat.basedir=/home/logs/smart-admin/tomcat-logs -server.tomcat.accesslog.enabled=true -server.tomcat.accesslog.pattern=%t %{X-Forwarded-For}i %a "%r" %s %D (%D ms) - -######################### jackson ######################### -spring.jackson.serialization.write-enums-using-to-string=true -spring.jackson.deserialization.read-enums-using-to-string=true -spring.jackson.deserialization.fail-on-unknown-properties=false -spring.jackson.default-property-inclusion=always -spring.jackson.date-format=yyyy-MM-dd HH:mm:ss -spring.jackson.time-zone=GMT+8 -spring.jackson.serialization.write-dates-as-timestamps=false - -######################### http file ######################### -spring.servlet.multipart.max-file-size=30MB -spring.servlet.multipart.max-request-size=30MB -file-upload-service.path=/home/upload/ - -######################### database ######################### -spring.datasource.url=jdbc:p6spy:mysql://127.0.0.1:3306/smart-admin-dev?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC -spring.datasource.username=root -spring.datasource.password=Root.123 -spring.datasource.initial-size=2 -spring.datasource.min-idle=1 -spring.datasource.max-active=10 -spring.datasource.max-wait=60000 -spring.datasource.time-between-eviction-runs-millis=60000 -spring.datasource.min-evictable-idle-time-millis=300000 -spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver -spring.datasource.filters=stat -spring.datasource.druid.username=druid -spring.datasource.druid.password=123456 -spring.datasource.druid.login.enabled=false - -######################### redis ####################################### -spring.redis.database=0 -spring.redis.host=127.0.0.1 -spring.redis.port=6379 -spring.redis.timeout=10000ms -spring.redis.password= -spring.redis.lettuce.pool.max-active=10 -spring.redis.lettuce.pool.min-idle=5 -spring.redis.lettuce.pool.max-idle=10 -spring.redis.lettuce.pool.max-wait=30000ms - -########################## rest http pool ######################### -#\u6700\u5927\u8FDE\u63A5\u6570 -http.pool.max-total=10 -#\u5355\u8DEF\u7531\u6700\u5927\u8FDE\u63A5\u6570 -http.pool.default-max-per-route=5 -#\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E(response)\u7684\u65F6\u95F4 -http.pool.socket-timeout=8000 -#\u8FDE\u63A5\u4E0A\u670D\u52A1\u5668(\u63E1\u624B\u6210\u529F)\u7684\u65F6\u95F4 -http.pool.connect-timeout=8000 -#\u4ECE\u8FDE\u63A5\u6C60\u4E2D\u83B7\u53D6\u8FDE\u63A5\u7684\u8D85\u65F6\u65F6\u95F4 -http.pool.connection-request-timeout=8000 - -######################### mybatis\u914D\u7F6E ######################### -mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl -# mybatis-plus \u5B57\u6BB5\u9A7C\u5CF0\u81EA\u52A8\u8F6C\u6362 -mybatis-plus.configuration.map-underscore-to-camel-case=true -mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml -mybatis-plus.typeAliasesPackage=net.lab1024.smartadmin.*.*.domain.entity -mybatis-plus.global-config.refresh-mapper=true -mybatis-plus.global-config.db-column-underline=true - -######################### swagger ######################### -swagger.apiGroupName=smartAdmin -swagger.title=smartAdmin -swagger.description=smartAdmin -swagger.version=1.0 -swagger.serviceUrl=http://localhost:10086/smart-admin-api -swagger.packAge=net.lab1024.smartadmin.module - -######################### jwt ######################### -jwt.key=smart-admin-jwt-key - -########################## smart reload ######################### -smart-reload.thread-count=1 -smart-reload.time-interval=300 - -######################### cros ######################### -access-control-allow-origin=* - -######################### heart beat ######################### -heart-beat.delayHandlerTime=60000 -heart-beat.intervalTime=300000 - -######################### quartz ############################# -#\u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0 -spring.quartz.properties.org.quartz.scheduler.instanceName=devClusteredScheduler -spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO -#\u8FDC\u7A0B\u7BA1\u7406\u76F8\u5173\u7684\u914D\u7F6E,\u5168\u90E8\u5173\u95ED -spring.quartz.properties.org.quartz.scheduler.rmi.export=false -spring.quartz.properties.org.quartz.scheduler.rmi.proxy=false -#\u8DF3\u8FC7quartz\u7248\u672C\u68C0\u67E5 -spring.quartz.properties.org.quartz.scheduler.skipUpdateCheck=true -#\u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6301\u4E45\u5316 -spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX -spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate -spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_ -spring.quartz.properties.org.quartz.jobStore.isClustered=true -#\u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694, \u5F00\u53D1\u73AF\u5883\u6539\u4E3A\u4E8660\u79D2 -spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=60000 -spring.quartz.properties.org.quartz.jobStore.useProperties=false -#\u8C03\u5EA6\u7EBF\u7A0B -spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool -spring.quartz.properties.org.quartz.threadPool.threadCount=2 -spring.quartz.properties.org.quartz.threadPool.threadPriority=5 -spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true -spring.quartz.properties.org.quartz.threadPool.threadNamePrefix=quartz -spring.quartz.job-store-type=jdbc -#ALWAYS,EMBEDDED,NEVER -spring.quartz.jdbc.initialize-schema=NEVER -spring.quartz.jdbc.schema=classpath:sql/quartz_mysql_2.3.0.sql -#\u81EA\u52A8\u626B\u63CF\u4EFB\u52A1\u5355\u5E76\u53D1\u73B0\u6539\u52A8\u7684\u65F6\u95F4\u95F4\u9694,\u5355\u4F4D\u4E3A\u79D2 -org.quartz.plugin.jobInitializer.scanInterval = 300 diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/email/EmailMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/email/EmailMapper.xml deleted file mode 100644 index 6050de51..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/email/EmailMapper.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - delete from t_email where id = #{id} - - - - delete from t_email where id in - - #{item} - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/OrderOperateLogMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/OrderOperateLogMapper.xml deleted file mode 100644 index 46f92a00..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/OrderOperateLogMapper.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - INSERT INTO t_order_operate_log (order_id,order_type, operate_type, operate_content, operate_remark, employee_id, employee_name,ext_data,update_time,create_time) VALUES - - (#{item.orderId}, - #{item.orderType}, - #{item.operateType}, - #{item.operateContent}, - #{item.operateRemark}, - #{item.employeeId}, - #{item.employeeName}, - #{item.extData}, - #{item.updateTime} - #{item.createTime} - ) - - - - - diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/UserLoginLogMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/UserLoginLogMapper.xml deleted file mode 100644 index 87b0df3b..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/log/UserLoginLogMapper.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - delete from t_user_login_log where id = #{id} - - - - delete from t_user_login_log where id in - - #{item} - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/peony/PeonyMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/peony/PeonyMapper.xml deleted file mode 100644 index 4be1a0f5..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/business/peony/PeonyMapper.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - delete from t_peony where id = #{id} - - - - delete from t_peony where id in - - #{item} - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/codegenerator/TableMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/codegenerator/TableMapper.xml deleted file mode 100644 index 4af675b6..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/codegenerator/TableMapper.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/file/FileMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/file/FileMapper.xml deleted file mode 100644 index 04abb76d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/file/FileMapper.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - INSERT INTO t_file ( - module_id, - module_type, - file_name, - file_size, - file_type, - file_path, - creater_user, - file_location_type - ) - VALUES - - (#{item.moduleId},#{item.moduleType},#{item.fileName},#{item.fileSize},#{item.fileType},#{item.filePath},#{item.createrUser},#{item.createrUserType},#{item.fileLocationType}) - - - - - INSERT INTO t_file ( - module_id, - module_type, - file_name, - file_size, - file_type, - file_path, - creater_user, - file_location_type - ) - VALUES - - (#{item.moduleId},#{item.moduleType},#{item.fileName},#{item.fileSize},#{item.fileType},#{item.filePath},#{item.createrUser},#{item.createrUserType},#{item.fileLocationType}) - - - - - DELETE FROM t_file WHERE module_id =#{moduleId} - - - - DELETE FROM t_file WHERE module_id =#{moduleId} and module_type=#{moduleType} - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/idgenerator/IdGeneratorMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/idgenerator/IdGeneratorMapper.xml deleted file mode 100644 index df3b86c5..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/idgenerator/IdGeneratorMapper.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - update t_id_generator set last_number = #{lastNumber}, update_time = now() where id = #{generatorId} - - - - replace into `t_id_generator_record` (`generator_id`, `year`, `month`, `day`, `last_number`) values (#{generatorId}, #{year}, #{month}, #{day}, #{lastNumber}) - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/quartz/QuartzTaskLogMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/quartz/QuartzTaskLogMapper.xml deleted file mode 100644 index 43f25e05..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/quartz/QuartzTaskLogMapper.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - tl.id, - tl.task_id, - tl.task_name, - tl.task_params, - tl.process_status, - tl.process_duration, - tl.process_log, - tl.ip_address, - tl.update_time, - tl.create_time - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/quartz/QuartzTaskMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/quartz/QuartzTaskMapper.xml deleted file mode 100644 index 0bb88311..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/quartz/QuartzTaskMapper.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - t.id, - t.task_name, - t.task_bean, - t.task_params, - t.task_cron, - t.task_status, - t.remark, - t.update_time, - t.create_time - - - - - - - - UPDATE t_quartz_task t - set t.task_status = #{taskStatus} - WHERE t.id = #{taskId} - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/smartreload/ReloadItemMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/smartreload/ReloadItemMapper.xml deleted file mode 100644 index 03c1f67f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/smartreload/ReloadItemMapper.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/smartreload/ReloadResultMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/smartreload/ReloadResultMapper.xml deleted file mode 100644 index 6c0caba1..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/support/smartreload/ReloadResultMapper.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/department/DepartmentMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/department/DepartmentMapper.xml deleted file mode 100644 index 837a287c..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/department/DepartmentMapper.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - d.id, - d.name, - d.short_name, - d.manager_id, - d.parent_id, - d.sort, - d.update_time, - d.create_time - - - - - - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml deleted file mode 100644 index 2b13a478..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/employee/EmployeeMapper.xml +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - - - - e.id, - e.login_name, - e.login_pwd, - e.actual_name, - e.nick_name, - e.phone, - e.id_card, - e.birthday, - e.email, - e.department_id, - e.is_leave, - e.is_disabled, - e.remark, - e.is_delete, - e.update_time, - e.create_time - - - - - - - UPDATE t_employee e - set e.is_disabled = #{isDisabled} - WHERE id in - - #{item} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - UPDATE t_employee - SET login_pwd = #{password} - WHERE id = #{employeeId} - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/position/PositionMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/position/PositionMapper.xml deleted file mode 100644 index a7ef4cce..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/position/PositionMapper.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - id, - position_name, - remark, - update_time, - create_time - - - - - - - - - - INSERT INTO t_position_relation (position_id,employee_id) VALUES - - (#{item},#{batchDTO.employeeId}) - - - - - - DELETE FROM t_position_relation WHERE employee_id = #{employeeId} - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/privilege/PrivilegeMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/privilege/PrivilegeMapper.xml deleted file mode 100644 index 7d224b22..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/privilege/PrivilegeMapper.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - p.id, - p.type, - p.name, - p.key, - p.url, - p.sort, - p.parent_key, - p.update_time, - p.create_time - - - - - - - - - - DELETE FROM t_privilege - WHERE `key` IN - - #{item} - - - - - DELETE FROM t_privilege - WHERE parent_key IN - - #{item} - - - - - INSERT INTO t_privilege (`type`, `name`, `key`,url,sort,parent_key,create_time,update_time) VALUES - - ( - #{item.type}, - #{item.name}, - #{item.key}, - #{item.url}, - #{item.sort}, - #{item.parentKey}, - now(), - now() - ) - - - - - - UPDATE t_privilege - SET `type`=#{item.type},`name`=#{item.name},url=#{item.url},sort=#{item.sort},parent_key=#{item.parentKey},update_time=now() - WHERE `key` = #{item.key} - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/role/RolePrivilegeMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/role/RolePrivilegeMapper.xml deleted file mode 100644 index cb44911b..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/role/RolePrivilegeMapper.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - rp.id, - rp.role_id, - rp.privilege_key, - rp.update_time, - rp.create_time - - - - - DELETE FROM t_role_privilege - WHERE role_id = #{roleId} - - - - DELETE FROM t_role_privilege - WHERE privilege_key in - - #{item} - - - - - - INSERT INTO t_role_privilege (role_id, privilege_key, update_time, create_time) VALUES - - ( - #{item.roleId}, - #{item.privilegeKey}, - now(), - now() - ) - - - - - - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/systemconfig/SystemConfigMapper.xml b/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/systemconfig/SystemConfigMapper.xml deleted file mode 100644 index 1cebf85b..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/mapper/system/systemconfig/SystemConfigMapper.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/pre/application.properties b/smart-admin-service/smart-admin-api/src/main/resources/pre/application.properties deleted file mode 100644 index fb3de5e5..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/pre/application.properties +++ /dev/null @@ -1,121 +0,0 @@ -######################### server ################### -server.servlet.context-path=/smart-admin-api -server.port=10086 -spring.profiles.active=@profiles.active@ - -######################### tomcat ################### -server.tomcat.basedir=/home/logs/smart-admin/tomcat-logs -server.tomcat.accesslog.enabled=true -server.tomcat.accesslog.pattern=%t %{X-Forwarded-For}i %a "%r" %s %D (%D ms) - -######################### jackson ######################### -spring.jackson.serialization.write-enums-using-to-string=true -spring.jackson.deserialization.read-enums-using-to-string=true -spring.jackson.deserialization.fail-on-unknown-properties=false -spring.jackson.default-property-inclusion=always -spring.jackson.date-format=yyyy-MM-dd HH:mm:ss -spring.jackson.time-zone=GMT+8 -spring.jackson.serialization.write-dates-as-timestamps=false - -######################### http file ######################### -spring.servlet.multipart.max-file-size=30MB -spring.servlet.multipart.max-request-size=30MB -file-upload-service.path=/home/upload/ - -######################### database ######################### -spring.datasource.url=jdbc:mysql://127.0.0.1:3306/smart-admin-dev?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC -spring.datasource.username=root -spring.datasource.password=root -spring.datasource.initial-size=2 -spring.datasource.min-idle=1 -spring.datasource.max-active=10 -spring.datasource.max-wait=60000 -spring.datasource.time-between-eviction-runs-millis=60000 -spring.datasource.min-evictable-idle-time-millis=300000 -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.filters=stat -spring.datasource.druid.username=druid -spring.datasource.druid.password=123456 -spring.datasource.druid.login.enabled=false - -######################### redis ####################################### -spring.redis.database=0 -spring.redis.host=127.0.0.1 -spring.redis.port=6379 -spring.redis.timeout=10000ms -spring.redis.password= -spring.redis.lettuce.pool.max-active=10 -spring.redis.lettuce.pool.min-idle=5 -spring.redis.lettuce.pool.max-idle=10 -spring.redis.lettuce.pool.max-wait=30000ms - -########################## rest http pool ######################### -#\u6700\u5927\u8FDE\u63A5\u6570 -http.pool.max-total=10 -#\u5355\u8DEF\u7531\u6700\u5927\u8FDE\u63A5\u6570 -http.pool.default-max-per-route=5 -#\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E(response)\u7684\u65F6\u95F4 -http.pool.socket-timeout=8000 -#\u8FDE\u63A5\u4E0A\u670D\u52A1\u5668(\u63E1\u624B\u6210\u529F)\u7684\u65F6\u95F4 -http.pool.connect-timeout=8000 -#\u4ECE\u8FDE\u63A5\u6C60\u4E2D\u83B7\u53D6\u8FDE\u63A5\u7684\u8D85\u65F6\u65F6\u95F4 -http.pool.connection-request-timeout=8000 - -######################### mybatis\u914D\u7F6E ######################### -mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl -# mybatis-plus \u5B57\u6BB5\u9A7C\u5CF0\u81EA\u52A8\u8F6C\u6362 -mybatis-plus.configuration.map-underscore-to-camel-case=true -mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml -mybatis-plus.typeAliasesPackage=net.lab1024.smartadmin.*.*.domain.entity -mybatis-plus.global-config.refresh-mapper=true -mybatis-plus.global-config.db-column-underline=true - -######################### swagger ######################### -swagger.apiGroupName=smartAdmin -swagger.title=smartAdmin -swagger.description=smartAdmin -swagger.version=1.0 -swagger.serviceUrl=http://localhost:10086/smart-admin-api -swagger.packAge=net.lab1024.smartadmin.module - -######################### jwt ######################### -jwt.key=smart-admin-jwt-key - -########################## smart reload ######################### -smart-reload.thread-count=1 -smart-reload.time-interval=30 - -######################### cros ######################### -access-control-allow-origin=* - -######################### heart beat ######################### -heart-beat.delayHandlerTime=60000 -heart-beat.intervalTime=60000 - -######################### quartz ############################# -#\u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0 -spring.quartz.properties.org.quartz.scheduler.instanceName=devClusteredScheduler -spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO -#\u8FDC\u7A0B\u7BA1\u7406\u76F8\u5173\u7684\u914D\u7F6E,\u5168\u90E8\u5173\u95ED -spring.quartz.properties.org.quartz.scheduler.rmi.export=false -spring.quartz.properties.org.quartz.scheduler.rmi.proxy=false -#\u8DF3\u8FC7quartz\u7248\u672C\u68C0\u67E5 -spring.quartz.properties.org.quartz.scheduler.skipUpdateCheck=true -#\u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6301\u4E45\u5316 -spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX -spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate -spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_ -spring.quartz.properties.org.quartz.jobStore.isClustered=true -#\u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 -spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=10000 -spring.quartz.properties.org.quartz.jobStore.useProperties=false -#\u8C03\u5EA6\u7EBF\u7A0B -spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool -spring.quartz.properties.org.quartz.threadPool.threadCount=2 -spring.quartz.properties.org.quartz.threadPool.threadPriority=5 -spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true -spring.quartz.properties.org.quartz.threadPool.threadNamePrefix=quartz -spring.quartz.job-store-type=jdbc -#ALWAYS,EMBEDDED,NEVER -spring.quartz.jdbc.initialize-schema=NEVER -spring.quartz.jdbc.schema=classpath:sql/quartz_mysql_2.3.0.sql diff --git a/smart-admin-service/smart-admin-api/src/main/resources/pre/log4j2.xml b/smart-admin-service/smart-admin-api/src/main/resources/pre/log4j2.xml deleted file mode 100644 index f1942baf..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/pre/log4j2.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - - /home/logs/smart-admin/dev/logs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties b/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties deleted file mode 100644 index 94f75be2..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/prod/application.properties +++ /dev/null @@ -1,120 +0,0 @@ -######################### server ################### -server.servlet.context-path=/smart-admin-api -server.port=10088 -spring.profiles.active=@profiles.active@ - -######################### tomcat ################### -server.tomcat.basedir=/home/logs/smart-admin/tomcat-logs -server.tomcat.accesslog.enabled=true -server.tomcat.accesslog.pattern=%t %{X-Forwarded-For}i %a "%r" %s %D (%D ms) - -######################### jackson ######################### -spring.jackson.serialization.write-enums-using-to-string=true -spring.jackson.deserialization.read-enums-using-to-string=true -spring.jackson.deserialization.fail-on-unknown-properties=false -spring.jackson.default-property-inclusion=always -spring.jackson.date-format=yyyy-MM-dd HH:mm:ss -spring.jackson.time-zone=GMT+8 -spring.jackson.serialization.write-dates-as-timestamps=false - -######################### http file ######################### -spring.servlet.multipart.max-file-size=30MB -spring.servlet.multipart.max-request-size=30MB -file-upload-service.path=/home/upload/smart-admin-file - -######################### database ######################### -spring.datasource.url=jdbc:mysql://172.16.0.201:3306/smart-admin-prod?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true -spring.datasource.username=smart-admin -spring.datasource.password=Admin@123457 -spring.datasource.initial-size=2 -spring.datasource.min-idle=1 -spring.datasource.max-active=100 -spring.datasource.max-wait=60000 -spring.datasource.time-between-eviction-runs-millis=60000 -spring.datasource.min-evictable-idle-time-millis=300000 -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.filters=stat -spring.datasource.druid.username=druid -spring.datasource.druid.password=druid -spring.datasource.druid.login.enabled=false - -######################### redis ####################################### -spring.redis.database=13 -spring.redis.host=127.0.0.1 -spring.redis.port=6379 -spring.redis.timeout=10000ms -spring.redis.password=Gq123456@ -spring.redis.lettuce.pool.max-active=10 -spring.redis.lettuce.pool.min-idle=5 -spring.redis.lettuce.pool.max-idle=10 -spring.redis.lettuce.pool.max-wait=30000ms - -########################## rest http pool ######################### -#\u6700\u5927\u8FDE\u63A5\u6570 -http.pool.max-total=10 -#\u5355\u8DEF\u7531\u6700\u5927\u8FDE\u63A5\u6570 -http.pool.default-max-per-route=5 -#\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E(response)\u7684\u65F6\u95F4 -http.pool.socket-timeout=8000 -#\u8FDE\u63A5\u4E0A\u670D\u52A1\u5668(\u63E1\u624B\u6210\u529F)\u7684\u65F6\u95F4 -http.pool.connect-timeout=8000 -#\u4ECE\u8FDE\u63A5\u6C60\u4E2D\u83B7\u53D6\u8FDE\u63A5\u7684\u8D85\u65F6\u65F6\u95F4 -http.pool.connection-request-timeout=8000 - -######################### mybatis\u914D\u7F6E ######################### -mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl -# mybatis-plus \u5B57\u6BB5\u9A7C\u5CF0\u81EA\u52A8\u8F6C\u6362 -mybatis-plus.configuration.map-underscore-to-camel-case=true -mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml -mybatis-plus.typeAliasesPackage=net.lab1024.smartadmin.*.*.domain.entity -mybatis-plus.global-config.refresh-mapper=true -mybatis-plus.global-config.db-column-underline=true - -######################### swagger ######################### -swagger.apiGroupName=smartAdmin -swagger.title=smartAdmin -swagger.description=smartAdmin -swagger.version=1.0 -swagger.serviceUrl=http://localhost:10086/smart-admin-api -swagger.packAge=net.lab1024.smartadmin.module - -######################### jwt ######################### -jwt.key=smart-admin-jwt-key - -########################## smart reload ######################### -smart-reload.thread-count=2 -smart-reload.time-interval=30 -######################### cros ######################### -access-control-allow-origin=preview.smartadmin.1024lab.net -######################### heart beat ######################### -heart-beat.delayHandlerTime=60000 -heart-beat.intervalTime=60000 - -######################### quartz ############################# -#\u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0 -spring.quartz.properties.org.quartz.scheduler.instanceName=prodClusteredScheduler -spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO -#\u8FDC\u7A0B\u7BA1\u7406\u76F8\u5173\u7684\u914D\u7F6E,\u5168\u90E8\u5173\u95ED -spring.quartz.properties.org.quartz.scheduler.rmi.export=false -spring.quartz.properties.org.quartz.scheduler.rmi.proxy=false -#\u8DF3\u8FC7quartz\u7248\u672C\u68C0\u67E5 -spring.quartz.properties.org.quartz.scheduler.skipUpdateCheck=true -#\u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6301\u4E45\u5316 -spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX -spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate -spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_ -spring.quartz.properties.org.quartz.jobStore.isClustered=true -#\u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 -spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=10000 -spring.quartz.properties.org.quartz.jobStore.useProperties=false -#\u8C03\u5EA6\u7EBF\u7A0B -spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool -spring.quartz.properties.org.quartz.threadPool.threadCount=2 -spring.quartz.properties.org.quartz.threadPool.threadPriority=5 -spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true -spring.quartz.properties.org.quartz.threadPool.threadNamePrefix=quartz - -spring.quartz.job-store-type=jdbc -#ALWAYS,EMBEDDED,NEVER -spring.quartz.jdbc.initialize-schema=NEVER -spring.quartz.jdbc.schema=classpath:sql/quartz_mysql_2.3.0.sql diff --git a/smart-admin-service/smart-admin-api/src/main/resources/prod/log4j2.xml b/smart-admin-service/smart-admin-api/src/main/resources/prod/log4j2.xml deleted file mode 100644 index 4991f76e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/prod/log4j2.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - - /home/logs/smart-admin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/sit/application.properties b/smart-admin-service/smart-admin-api/src/main/resources/sit/application.properties deleted file mode 100644 index c7c426cf..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/sit/application.properties +++ /dev/null @@ -1,121 +0,0 @@ -######################### server ################### -server.servlet.context-path=/smart-admin-api -server.port=10086 -spring.profiles.active=@profiles.active@ - -######################### tomcat ################### -server.tomcat.basedir=/home/logs/smart-admin/tomcat-logs -server.tomcat.accesslog.enabled=true -server.tomcat.accesslog.pattern=%t %{X-Forwarded-For}i %a "%r" %s %D (%D ms) - -######################### jackson ######################### -spring.jackson.serialization.write-enums-using-to-string=true -spring.jackson.deserialization.read-enums-using-to-string=true -spring.jackson.deserialization.fail-on-unknown-properties=false -spring.jackson.default-property-inclusion=always -spring.jackson.date-format=yyyy-MM-dd HH:mm:ss -spring.jackson.time-zone=GMT+8 -spring.jackson.serialization.write-dates-as-timestamps=false - -######################### http file ######################### -spring.servlet.multipart.max-file-size=30MB -spring.servlet.multipart.max-request-size=30MB -file-upload-service.path=/home/upload/ - -######################### database ######################### -spring.datasource.url=jdbc:p6spy:mysql://127.0.0.1:3306/smart-admin-sit?autoReconnect=true&useServerPreparedStmts=false&rewriteBatchedStatements=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC -spring.datasource.username=root -spring.datasource.password=root -spring.datasource.initial-size=2 -spring.datasource.min-idle=1 -spring.datasource.max-active=10 -spring.datasource.max-wait=60000 -spring.datasource.time-between-eviction-runs-millis=60000 -spring.datasource.min-evictable-idle-time-millis=300000 -spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver -spring.datasource.filters=stat -spring.datasource.druid.username=druid -spring.datasource.druid.password=123456 -spring.datasource.druid.login.enabled=false - -######################### redis ####################################### -spring.redis.database=0 -spring.redis.host=127.0.0.1 -spring.redis.port=6379 -spring.redis.timeout=10000ms -spring.redis.password= -spring.redis.lettuce.pool.max-active=10 -spring.redis.lettuce.pool.min-idle=5 -spring.redis.lettuce.pool.max-idle=10 -spring.redis.lettuce.pool.max-wait=30000ms - -########################## rest http pool ######################### -#\u6700\u5927\u8FDE\u63A5\u6570 -http.pool.max-total=10 -#\u5355\u8DEF\u7531\u6700\u5927\u8FDE\u63A5\u6570 -http.pool.default-max-per-route=5 -#\u670D\u52A1\u5668\u8FD4\u56DE\u6570\u636E(response)\u7684\u65F6\u95F4 -http.pool.socket-timeout=8000 -#\u8FDE\u63A5\u4E0A\u670D\u52A1\u5668(\u63E1\u624B\u6210\u529F)\u7684\u65F6\u95F4 -http.pool.connect-timeout=8000 -#\u4ECE\u8FDE\u63A5\u6C60\u4E2D\u83B7\u53D6\u8FDE\u63A5\u7684\u8D85\u65F6\u65F6\u95F4 -http.pool.connection-request-timeout=8000 - -######################### mybatis\u914D\u7F6E ######################### -mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl -# mybatis-plus \u5B57\u6BB5\u9A7C\u5CF0\u81EA\u52A8\u8F6C\u6362 -mybatis-plus.configuration.map-underscore-to-camel-case=true -mybatis-plus.mapper-locations=classpath:/mapper/**/*.xml -mybatis-plus.typeAliasesPackage=net.lab1024.smartadmin.*.*.domain.entity -mybatis-plus.global-config.refresh-mapper=true -mybatis-plus.global-config.db-column-underline=true - -######################### swagger ######################### -swagger.apiGroupName=smartAdmin -swagger.title=smartAdmin -swagger.description=smartAdmin -swagger.version=1.0 -swagger.serviceUrl=http://localhost:10086/smart-admin-api -swagger.packAge=net.lab1024.smartadmin.module - -######################### jwt ######################### -jwt.key=smart-admin-jwt-key - -########################## smart reload ######################### -smart-reload.thread-count=1 -smart-reload.time-interval=120 - -######################### cros ######################### -access-control-allow-origin=* - -######################### heart beat ######################### -heart-beat.delayHandlerTime=60000 -heart-beat.intervalTime=300000 - -######################### quartz ############################# -#\u8C03\u5EA6\u6807\u8BC6\u540D \u96C6\u7FA4\u4E2D\u6BCF\u4E00\u4E2A\u5B9E\u4F8B\u90FD\u5FC5\u987B\u4F7F\u7528\u76F8\u540C\u7684\u540D\u79F0 -spring.quartz.properties.org.quartz.scheduler.instanceName=devClusteredScheduler -spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO -#\u8FDC\u7A0B\u7BA1\u7406\u76F8\u5173\u7684\u914D\u7F6E,\u5168\u90E8\u5173\u95ED -spring.quartz.properties.org.quartz.scheduler.rmi.export=false -spring.quartz.properties.org.quartz.scheduler.rmi.proxy=false -#\u8DF3\u8FC7quartz\u7248\u672C\u68C0\u67E5 -spring.quartz.properties.org.quartz.scheduler.skipUpdateCheck=true -#\u6570\u636E\u4FDD\u5B58\u65B9\u5F0F\u4E3A\u6301\u4E45\u5316 -spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX -spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate -spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_ -spring.quartz.properties.org.quartz.jobStore.isClustered=true -#\u8C03\u5EA6\u5B9E\u4F8B\u5931\u6548\u7684\u68C0\u67E5\u65F6\u95F4\u95F4\u9694 -spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=10000 -spring.quartz.properties.org.quartz.jobStore.useProperties=false -#\u8C03\u5EA6\u7EBF\u7A0B -spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool -spring.quartz.properties.org.quartz.threadPool.threadCount=2 -spring.quartz.properties.org.quartz.threadPool.threadPriority=5 -spring.quartz.properties.org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true -spring.quartz.properties.org.quartz.threadPool.threadNamePrefix=quartz -spring.quartz.job-store-type=jdbc -#ALWAYS,EMBEDDED,NEVER -spring.quartz.jdbc.initialize-schema=NEVER -spring.quartz.jdbc.schema=classpath:sql/quartz_mysql_2.3.0.sql diff --git a/smart-admin-service/smart-admin-api/src/main/resources/sit/log4j2.xml b/smart-admin-service/smart-admin-api/src/main/resources/sit/log4j2.xml deleted file mode 100644 index ac533c99..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/sit/log4j2.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - - /home/logs/smart-admin/dev/logs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/sit/spy.properties b/smart-admin-service/smart-admin-api/src/main/resources/sit/spy.properties deleted file mode 100644 index 22c91d1e..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/sit/spy.properties +++ /dev/null @@ -1,20 +0,0 @@ -#modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory -# \u81EA\u5B9A\u4E49\u65E5\u5FD7\u6253\u5370 -logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger -#\u65E5\u5FD7\u8F93\u51FA\u5230\u63A7\u5236\u53F0 -appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger -# \u4F7F\u7528\u65E5\u5FD7\u7CFB\u7EDF\u8BB0\u5F55 sql -#appender=com.p6spy.engine.spy.appender.Slf4JLogger -# \u8BBE\u7F6E p6spy driver \u4EE3\u7406 -deregisterdrivers=true -# \u53D6\u6D88JDBC URL\u524D\u7F00 -useprefix=true -# \u914D\u7F6E\u8BB0\u5F55 Log \u4F8B\u5916,\u53EF\u53BB\u6389\u7684\u7ED3\u679C\u96C6\u6709error,info,batch,debug,statement,commit,rollback,result,resultset. -#excludecategories=info,debug,result,commit,resultset -# \u65E5\u671F\u683C\u5F0F -dateformat=yyyy-MM-dd HH:mm:ss - -# \u662F\u5426\u5F00\u542F\u6162SQL\u8BB0\u5F55 -outagedetection=true -# \u6162SQL\u8BB0\u5F55\u6807\u51C6 2 \u79D2 -outagedetectioninterval=2 \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/sql/quartz_mysql_2.3.0.sql b/smart-admin-service/smart-admin-api/src/main/resources/sql/quartz_mysql_2.3.0.sql deleted file mode 100644 index 8968c23f..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/sql/quartz_mysql_2.3.0.sql +++ /dev/null @@ -1,179 +0,0 @@ -# -# In your Quartz properties file, you'll need to set -# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate -# -# -# By: Ron Cordell - roncordell -# I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM. - -DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; -DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; -DROP TABLE IF EXISTS QRTZ_LOCKS; -DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_TRIGGERS; -DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; -DROP TABLE IF EXISTS QRTZ_CALENDARS; - -CREATE TABLE QRTZ_JOB_DETAILS( -SCHED_NAME VARCHAR(120) NOT NULL, -JOB_NAME VARCHAR(190) NOT NULL, -JOB_GROUP VARCHAR(190) NOT NULL, -DESCRIPTION VARCHAR(250) NULL, -JOB_CLASS_NAME VARCHAR(250) NOT NULL, -IS_DURABLE VARCHAR(1) NOT NULL, -IS_NONCONCURRENT VARCHAR(1) NOT NULL, -IS_UPDATE_DATA VARCHAR(1) NOT NULL, -REQUESTS_RECOVERY VARCHAR(1) NOT NULL, -JOB_DATA BLOB NULL, -PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_TRIGGERS ( -SCHED_NAME VARCHAR(120) NOT NULL, -TRIGGER_NAME VARCHAR(190) NOT NULL, -TRIGGER_GROUP VARCHAR(190) NOT NULL, -JOB_NAME VARCHAR(190) NOT NULL, -JOB_GROUP VARCHAR(190) NOT NULL, -DESCRIPTION VARCHAR(250) NULL, -NEXT_FIRE_TIME BIGINT(13) NULL, -PREV_FIRE_TIME BIGINT(13) NULL, -PRIORITY INTEGER NULL, -TRIGGER_STATE VARCHAR(16) NOT NULL, -TRIGGER_TYPE VARCHAR(8) NOT NULL, -START_TIME BIGINT(13) NOT NULL, -END_TIME BIGINT(13) NULL, -CALENDAR_NAME VARCHAR(190) NULL, -MISFIRE_INSTR SMALLINT(2) NULL, -JOB_DATA BLOB NULL, -PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), -FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) -REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_SIMPLE_TRIGGERS ( -SCHED_NAME VARCHAR(120) NOT NULL, -TRIGGER_NAME VARCHAR(190) NOT NULL, -TRIGGER_GROUP VARCHAR(190) 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), -FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) -REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_CRON_TRIGGERS ( -SCHED_NAME VARCHAR(120) NOT NULL, -TRIGGER_NAME VARCHAR(190) NOT NULL, -TRIGGER_GROUP VARCHAR(190) NOT NULL, -CRON_EXPRESSION VARCHAR(120) NOT NULL, -TIME_ZONE_ID VARCHAR(80), -PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), -FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) -REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_SIMPROP_TRIGGERS - ( - SCHED_NAME VARCHAR(120) NOT NULL, - TRIGGER_NAME VARCHAR(190) NOT NULL, - TRIGGER_GROUP VARCHAR(190) NOT NULL, - STR_PROP_1 VARCHAR(512) NULL, - STR_PROP_2 VARCHAR(512) NULL, - STR_PROP_3 VARCHAR(512) 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) NULL, - BOOL_PROP_2 VARCHAR(1) NULL, - PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), - FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) - REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_BLOB_TRIGGERS ( -SCHED_NAME VARCHAR(120) NOT NULL, -TRIGGER_NAME VARCHAR(190) NOT NULL, -TRIGGER_GROUP VARCHAR(190) NOT NULL, -BLOB_DATA BLOB NULL, -PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP), -INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP), -FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) -REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_CALENDARS ( -SCHED_NAME VARCHAR(120) NOT NULL, -CALENDAR_NAME VARCHAR(190) NOT NULL, -CALENDAR BLOB NOT NULL, -PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS ( -SCHED_NAME VARCHAR(120) NOT NULL, -TRIGGER_GROUP VARCHAR(190) NOT NULL, -PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_FIRED_TRIGGERS ( -SCHED_NAME VARCHAR(120) NOT NULL, -ENTRY_ID VARCHAR(95) NOT NULL, -TRIGGER_NAME VARCHAR(190) NOT NULL, -TRIGGER_GROUP VARCHAR(190) NOT NULL, -INSTANCE_NAME VARCHAR(190) NOT NULL, -FIRED_TIME BIGINT(13) NOT NULL, -SCHED_TIME BIGINT(13) NOT NULL, -PRIORITY INTEGER NOT NULL, -STATE VARCHAR(16) NOT NULL, -JOB_NAME VARCHAR(190) NULL, -JOB_GROUP VARCHAR(190) NULL, -IS_NONCONCURRENT VARCHAR(1) NULL, -REQUESTS_RECOVERY VARCHAR(1) NULL, -PRIMARY KEY (SCHED_NAME,ENTRY_ID)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_SCHEDULER_STATE ( -SCHED_NAME VARCHAR(120) NOT NULL, -INSTANCE_NAME VARCHAR(190) NOT NULL, -LAST_CHECKIN_TIME BIGINT(13) NOT NULL, -CHECKIN_INTERVAL BIGINT(13) NOT NULL, -PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)) -ENGINE=InnoDB; - -CREATE TABLE QRTZ_LOCKS ( -SCHED_NAME VARCHAR(120) NOT NULL, -LOCK_NAME VARCHAR(40) NOT NULL, -PRIMARY KEY (SCHED_NAME,LOCK_NAME)) -ENGINE=InnoDB; - -CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY); -CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP); - -CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP); -CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP); -CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME); -CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP); -CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE); -CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE); -CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE); -CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME); -CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME); -CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME); -CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE); -CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE); - -CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME); -CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY); -CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP); -CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP); -CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP); -CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP); - -commit; diff --git a/smart-admin-service/smart-admin-api/src/main/resources/sql/smart-admin.sql b/smart-admin-service/smart-admin-api/src/main/resources/sql/smart-admin.sql deleted file mode 100644 index dfd8e8c1..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/sql/smart-admin.sql +++ /dev/null @@ -1,1588 +0,0 @@ --- -------------------------------------------------------- --- 主机: 127.0.0.1 --- 服务器版本: 8.0.20 - MySQL Community Server - GPL --- 服务器操作系统: Win64 --- HeidiSQL 版本: 11.0.0.5919 --- -------------------------------------------------------- - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET NAMES utf8 */; -/*!50503 SET NAMES utf8mb4 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; - - --- 导出 smart-admin-dev 的数据库结构 -DROP DATABASE IF EXISTS `smart-admin-dev`; -CREATE DATABASE IF NOT EXISTS `smart-admin-dev` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTION='N' */; -USE `smart-admin-dev`; - --- 导出 表 smart-admin-dev.t_department 结构 -DROP TABLE IF EXISTS `t_department`; -CREATE TABLE IF NOT EXISTS `t_department` ( - `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '部门主键id', - `name` varchar(50) NOT NULL COMMENT '部门名称', - `short_name` varchar(50) DEFAULT NULL COMMENT '部门简称', - `manager_id` int unsigned DEFAULT NULL COMMENT '部门负责人id', - `parent_id` int unsigned DEFAULT NULL COMMENT '部门的父级id', - `sort` int NOT NULL COMMENT '部门排序', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - KEY `parent_id` (`parent_id`) -) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门表'; - --- 正在导出表 smart-admin-dev.t_department 的数据:~4 rows (大约) -DELETE FROM `t_department`; -/*!40000 ALTER TABLE `t_department` DISABLE KEYS */; -INSERT INTO `t_department` (`id`, `name`, `short_name`, `manager_id`, `parent_id`, `sort`, `update_time`, `create_time`) VALUES - (1, '1024创新实验室', 'ZWGWL', 16, 0, 1, '2019-04-03 10:41:25', '2019-04-03 10:41:25'), - (2, '二级部门-2', NULL, 15, 1, 17, '2019-04-15 16:45:10', '2019-04-15 16:45:10'), - (4, '二级部门-1', '管理', 14, 1, 20, '2019-04-17 16:14:55', '2019-04-17 16:14:55'), - (8, '三级部门-1', NULL, NULL, 4, 8, '2019-04-25 12:25:52', '2019-04-25 12:25:52'), - (9, '四级部门-1', NULL, NULL, 8, 9, '2019-04-25 12:26:36', '2019-04-25 12:26:36'), - (10, '五级部门-1', NULL, NULL, 9, 10, '2019-04-25 12:26:49', '2019-04-25 12:26:49'), - (11, '六级部门-1', NULL, NULL, 10, 11, '2019-04-25 12:26:59', '2019-04-25 12:26:59'), - (12, '七级部门-1', NULL, NULL, 11, 12, '2019-04-25 12:27:18', '2019-04-25 12:27:18'), - (13, '八级部门-1', NULL, NULL, 12, 13, '2019-04-25 12:27:34', '2019-04-25 12:27:34'), - (14, '九级部门-1', NULL, NULL, 13, 14, '2019-04-25 12:27:47', '2019-04-25 12:27:47'), - (15, '十级部门-1', NULL, NULL, 14, 15, '2019-04-25 12:28:16', '2019-04-25 12:28:16'), - (16, '十一级部门部门部部门门嘻嘻哈哈-1', NULL, 13, 15, 16, '2019-04-25 14:56:40', '2019-04-25 14:56:40'), - (17, '信息中心', NULL, 16, 1, 4, '2019-04-26 11:53:50', '2019-04-26 11:53:50'), - (18, '测试部门', NULL, 16, 17, 18, '2019-04-26 11:54:06', '2019-04-26 11:54:06'), - (19, '张娇测试', NULL, NULL, 2, 22, '2019-04-26 14:36:18', '2019-04-26 14:36:18'), - (20, '子部门', NULL, NULL, 2, 23, '2019-04-26 14:36:28', '2019-04-26 14:36:28'), - (22, '张静如', NULL, 16, 1, 2, '2019-04-28 14:21:44', '2019-04-28 14:21:44'), - (23, '张静如2', NULL, 22, 4, 19, '2019-04-28 14:22:48', '2019-04-28 14:22:48'), - (24, '测试', NULL, 18, 23, 24, '2019-04-29 10:12:42', '2019-04-29 10:12:42'), - (25, '测试', NULL, 18, 23, 25, '2019-04-29 10:12:42', '2019-04-29 10:12:42'); -/*!40000 ALTER TABLE `t_department` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_email 结构 -DROP TABLE IF EXISTS `t_email`; -CREATE TABLE IF NOT EXISTS `t_email` ( - `id` int NOT NULL AUTO_INCREMENT, - `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '标题', - `to_emails` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '收件人', - `send_status` tinyint NOT NULL DEFAULT '0' COMMENT '发送状态 0未发送 1已发送', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '邮件内容', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- 正在导出表 smart-admin-dev.t_email 的数据:~56 rows (大约) -DELETE FROM `t_email`; -/*!40000 ALTER TABLE `t_email` DISABLE KEYS */; -INSERT INTO `t_email` (`id`, `title`, `to_emails`, `send_status`, `content`, `create_time`, `update_time`) VALUES - (20, '新增测试12345', '新增测试@11.com', 1, '

这是内容

', '2019-08-30 15:35:12', '2019-08-30 15:35:12'), - (21, 'b', 'asdf@33.com', 1, '

c

', '2019-09-06 14:25:33', '2019-09-06 14:25:33'), - (23, 'string', 'string', 0, 'string', '2019-09-06 06:55:01', '2019-09-06 06:55:01'), - (24, 'string', 'string', 0, 'string', '2019-09-06 06:55:01', '2019-09-06 06:55:01'), - (26, 'string', 'string', 0, 'string', '2019-09-06 07:01:32', '2019-09-06 07:01:32'), - (27, 'string', 'string', 0, 'string', '2019-09-06 07:01:32', '2019-09-06 07:01:32'), - (37, 'ewqwe', '适者生存@22.cc', 1, '

qweqwe

', '2019-11-09 10:00:46', '2019-11-09 10:00:46'), - (38, 'ewqwe', '适者生存@22.cc', 1, '

qweqwe

', '2019-11-09 10:00:49', '2019-11-09 10:00:49'), - (39, 'dsfds', 'dsfsd@qq.ccc', 1, '

fsdfs

', '2019-11-09 10:04:54', '2019-11-09 10:04:54'), - (40, 'dsfds', 'dsfsd@qq.ccc', 1, '

fsdfs

', '2019-11-09 10:04:57', '2019-11-09 10:04:57'), - (41, 'dsfds', 'dsfsd@qq.ccc', 1, '

fsdfs

', '2019-11-09 10:04:57', '2019-11-09 10:04:57'), - (42, 'dsfds', 'dsfsd@qq.ccc', 1, '

fsdfs

', '2019-11-09 10:04:58', '2019-11-09 10:04:58'), - (43, 'dsfds', 'dsfsd@qq.ccc', 1, '

fsdfs

', '2019-11-09 10:04:59', '2019-11-09 10:04:59'), - (44, 'dsfds', 'dsfsd@qq.ccc', 1, '

fsdfs

', '2019-11-09 10:04:59', '2019-11-09 10:04:59'), - (45, 'dsfds', 'dsfsd@qq.ccc', 1, '

fsdfs

', '2019-11-09 10:05:16', '2019-11-09 10:05:16'), - (46, 'dsfds', 'dsfsd@qq.ccc', 1, '

fsdfs

', '2019-11-09 10:06:29', '2019-11-09 10:06:29'), - (47, 'dsfds', 'dsfsd@qq.ccc', 1, '

fsdfs

', '2019-11-09 10:07:02', '2019-11-09 10:07:02'), - (48, 'dsfds', 'dsfsd@qq.ccc', 1, '

fsdfs

', '2019-11-09 10:07:16', '2019-11-09 10:07:16'), - (49, '2342', '11@ss.cc', 1, '

234234

', '2019-11-09 10:08:13', '2019-11-09 10:08:13'), - (50, '2342', '11@ss.cc', 1, '

234234

', '2019-11-09 10:08:30', '2019-11-09 10:08:30'), - (51, '2342', '11@ss.cc', 1, '

234234

', '2019-11-09 10:08:50', '2019-11-09 10:08:50'), - (52, '2342', '11@ss.cc', 1, '

234234

', '2019-11-09 10:09:09', '2019-11-09 10:09:09'), - (53, '2342', '11@ss.cc', 1, '

234234

', '2019-11-09 10:09:31', '2019-11-09 10:09:31'), - (54, '2342', '11@ss.cc', 1, '

234234

', '2019-11-09 10:12:24', '2019-11-09 10:12:24'), - (55, '2342', '11@ss.cc', 1, '

234234

', '2019-11-09 10:13:13', '2019-11-09 10:13:13'), - (56, 'asdasd', '3423@aqq.cc', 0, '

asdasd

', '2019-11-09 10:20:42', '2019-11-09 10:20:42'), - (57, 'asdasd', '3423@aqq.cc', 0, '

asdasd

', '2019-11-09 10:20:52', '2019-11-09 10:20:52'), - (58, 'asdasd', '3423@aqq.cc', 0, '

asdasd

', '2019-11-09 10:21:16', '2019-11-09 10:21:16'), - (59, 'asdasd', '3423@aqq.cc', 0, '

asdasd

', '2019-11-09 10:21:24', '2019-11-09 10:21:24'), - (60, 'asdasd', '3423@aqq.cc', 0, '

asdasd

', '2019-11-09 10:21:30', '2019-11-09 10:21:30'), - (61, 'asdasd', '3423@aqq.cc', 0, '

asdasd

', '2019-11-09 10:21:53', '2019-11-09 10:21:53'), - (62, 'a21312', '23423@qq.cc', 0, '

asdasdas

', '2019-11-09 10:23:40', '2019-11-09 10:23:40'), - (63, '11', '1234@qq.com', 0, '

23

', '2019-11-15 15:35:12', '2019-11-15 15:35:12'), - (64, '11', '1234@qq.com', 0, '

23

', '2019-11-15 15:35:15', '2019-11-15 15:35:15'), - (65, '11', '1234@qq.com', 0, '

23

', '2019-11-15 15:35:16', '2019-11-15 15:35:16'), - (66, 'eeee', '1234@qq.com', 0, '

    eee2233

', '2019-11-15 17:00:00', '2019-11-15 17:00:00'), - (67, 'eeee', '1234@qq.com', 0, '

    eee2233

', '2019-11-15 17:00:03', '2019-11-15 17:00:03'), - (68, 'eeee', '1234@qq.com', 0, '

    eee2233

', '2019-11-15 17:00:04', '2019-11-15 17:00:04'), - (69, '22223', '1017146812@qq.com', 0, '

    e34233

', '2019-11-15 17:00:33', '2019-11-15 17:00:33'), - (70, '22223', '1017146812@qq.com', 0, '

    e34233

', '2019-11-15 17:00:34', '2019-11-15 17:00:34'), - (71, '22223', '1017146812@qq.com', 0, '

    e34233

', '2019-11-15 17:00:34', '2019-11-15 17:00:34'), - (72, '22223', '12232', 0, '

    e34233

', '2019-11-15 17:00:49', '2019-11-15 17:00:49'), - (73, '22223', '12232@qq.com', 0, '

    e34233

', '2019-11-15 17:00:56', '2019-11-15 17:00:56'), - (74, 'dsasdasd', 'asdas@qq.com', 0, '

asdasd

', '2019-11-16 08:51:44', '2019-11-16 08:51:44'), - (75, 'dsasdasd', 'asdas@qq.com', 0, '

asdasd

', '2019-11-16 09:05:10', '2019-11-16 09:05:10'), - (76, 'dsasdasd', 'asdas@qq.com', 0, '

asdasd

', '2019-11-16 09:05:14', '2019-11-16 09:05:14'), - (77, 'dsasdasd', 'asdas@qq.com', 0, '

asdasd

', '2019-11-16 09:06:34', '2019-11-16 09:06:34'), - (78, 'dsasdasd', 'asdas@qq.com', 0, '

asdasd

', '2019-11-16 09:07:09', '2019-11-16 09:07:09'), - (79, 'dsasdasd', 'asdas@qq.com', 0, '

asdasd

', '2019-11-16 09:07:30', '2019-11-16 09:07:30'), - (80, 'dsasdasd', 'asdas@qq.com', 0, '

asdasd

', '2019-11-16 09:07:32', '2019-11-16 09:07:32'), - (81, 'dsasdasd', 'asdas@qq.com', 0, '

asdasd

', '2019-11-16 09:08:29', '2019-11-16 09:08:29'), - (82, 'sdfs', 'ss@ss.cc', 0, '

dsdsf

', '2019-11-16 09:08:46', '2019-11-16 09:08:46'), - (83, 'asdasd', 'asd@qq.vv', 0, '

asdas

', '2019-11-16 09:09:18', '2019-11-16 09:09:18'), - (84, 'asdasd', 'asd@qq.vv', 0, '

asdas

', '2019-11-16 09:09:42', '2019-11-16 09:09:42'), - (85, 'asdasd', 'asd@qq.vv', 0, '

asdas

', '2019-11-16 09:09:46', '2019-11-16 09:09:46'), - (86, 'dasdad', 'dasda@ss.cc', 1, '

dasasdas

', '2019-11-16 09:10:05', '2019-11-16 09:10:05'); -/*!40000 ALTER TABLE `t_email` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_employee 结构 -DROP TABLE IF EXISTS `t_employee`; -CREATE TABLE IF NOT EXISTS `t_employee` ( - `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', - `login_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录帐号', - `login_pwd` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录密码', - `actual_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '员工名称', - `nick_name` varchar(30) DEFAULT '' COMMENT '别名', - `phone` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '手机号码', - `id_card` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '身份证', - `birthday` date DEFAULT NULL COMMENT '出生日期', - `email` varchar(50) DEFAULT NULL COMMENT '邮箱', - `department_id` int unsigned NOT NULL COMMENT '部门id', - `is_leave` int NOT NULL DEFAULT '0' COMMENT '是否离职1是', - `is_disabled` int NOT NULL DEFAULT '0' COMMENT '是否被禁用 0否1是', - `remark` varchar(200) DEFAULT NULL COMMENT '备注', - `create_user` int unsigned NOT NULL COMMENT '创建者id', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `is_delete` int NOT NULL DEFAULT '0' COMMENT '是否删除0否 1是', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='员工表'; - --- 正在导出表 smart-admin-dev.t_employee 的数据:~28 rows (大约) -DELETE FROM `t_employee`; -/*!40000 ALTER TABLE `t_employee` DISABLE KEYS */; -INSERT INTO `t_employee` (`id`, `login_name`, `login_pwd`, `actual_name`, `nick_name`, `phone`, `id_card`, `birthday`, `email`, `department_id`, `is_leave`, `is_disabled`, `remark`, `create_user`, `update_time`, `create_time`, `is_delete`) VALUES - (1, 'sa', 'c655798e4648c540812a1b8f48759af7', '管理员', '15515515515', '13112312131', '410306199202020020', '1992-02-02', NULL, 1, 0, 0, NULL, 0, '2019-04-27 09:56:17', '2018-05-11 09:38:54', 0), - (11, 'role1', 'c655798e4648c540812a1b8f48759af7', '角色测试1', '', '18123245230', '', '1970-01-01', '', 4, 0, 0, NULL, 1, '2019-04-27 09:56:17', '2019-04-25 12:30:22', 0), - (12, 'role2', 'c655798e4648c540812a1b8f48759af7', '角色测试2', '', '18121451241', '', NULL, '', 4, 0, 0, NULL, 1, '2019-08-01 10:04:38', '2019-04-25 12:31:11', 0), - (13, 'lihaifan', 'c655798e4648c540812a1b8f48759af7', 'lihaifan', '', '18399485774', '', NULL, '', 1, 0, 0, NULL, 1, '2019-04-27 09:56:17', '2019-04-25 13:50:44', 0), - (14, 'lipeng', 'c655798e4648c540812a1b8f48759af7', '李鹏1', '', '13937988294', '', NULL, '', 2, 0, 0, NULL, 1, '2019-04-27 09:56:17', '2019-04-25 14:34:47', 0), - (15, 'huangwenli', 'c655798e4648c540812a1b8f48759af7', '黄文丽', '', '15515515515', '', NULL, '', 16, 0, 0, NULL, 1, '2019-04-27 09:56:17', '2019-04-26 10:05:05', 0), - (16, 'huangwenli1', 'c655798e4648c540812a1b8f48759af7', '黄文丽', '', '15515515515', '', NULL, '', 15, 0, 0, NULL, 1, '2019-04-27 14:04:19', '2019-04-26 10:25:04', 0), - (17, 'zhangjiao', 'c655798e4648c540812a1b8f48759af7', '张娇', '阿娇', '15670390391', '410305199102020020', '1991-02-02', '86484@qq.com', 19, 0, 0, NULL, 1, '2019-08-05 16:33:57', '2019-04-26 14:37:23', 0), - (18, 'zhangjiao1', 'c655798e4648c540812a1b8f48759af7', '张娇1', '', '15670390391', '', '2019-04-18', '6666@qq.com', 20, 0, 0, NULL, 1, '2019-08-05 16:33:57', '2019-04-26 14:45:55', 0), - (19, 'zhenxiaocang', 'c655798e4648c540812a1b8f48759af7', '珍小藏', '', '15670390391', '', NULL, '', 19, 0, 1, NULL, 1, '2019-09-09 08:34:35', '2019-04-26 14:46:57', 0), - (20, 'matengfei', 'c655798e4648c540812a1b8f48759af7', '马腾飞', '', '15670390393', '', NULL, '', 19, 0, 0, NULL, 1, '2019-08-05 16:33:57', '2019-04-26 14:47:24', 0), - (21, 'ceshi123', 'c655798e4648c540812a1b8f48759af7', '测试人员', '', '18829938477', '', NULL, '', 1, 0, 1, NULL, 13, '2019-04-27 09:56:17', '2019-04-27 09:38:07', 1), - (22, 'zhangjingru', 'c655798e4648c540812a1b8f48759af7', '张静如', '', '15600000000', '', NULL, '', 1, 0, 0, NULL, 1, '2019-09-04 09:06:47', '2019-04-28 14:05:03', 0), - (23, 'sdfsdfdsfsdfdsfdsf', 'c655798e4648c540812a1b8f48759af7', 'werewr', '', '15698585858', '', NULL, '', 19, 0, 0, NULL, 1, '2019-09-05 16:13:03', '2019-04-28 16:26:27', 0), - (25, 'shq2019', 'c655798e4648c540812a1b8f48759af7', 'shq', 'shq', '18798801298', '410281199309024040', '1993-09-02', '', 17, 0, 0, NULL, 1, '2019-08-05 16:33:57', '2019-05-05 09:13:41', 0), - (26, 'zhangjiao666', 'c655798e4648c540812a1b8f48759af7', 'tom我是五个字12', '', '15612345678', '', NULL, '', 18, 0, 0, NULL, 1, '2019-08-05 16:33:57', '2019-05-05 15:34:10', 0), - (28, 'dfsfgds', 'c655798e4648c540812a1b8f48759af7', 'fds', '', '15854127845', '', NULL, '', 22, 0, 1, NULL, 1, '2019-09-06 08:58:40', '2019-05-06 10:36:57', 0), - (29, 'abcabc', 'c655798e4648c540812a1b8f48759af7', 'abccba', 'aaabac', '13311112222', '', NULL, '', 17, 0, 0, NULL, 1, '2019-08-05 16:33:57', '2019-07-10 17:00:58', 0), - (30, 'gengweigang', 'c655798e4648c540812a1b8f48759af7', '耿为刚', 'geng', '15038588418', '', NULL, '', 17, 0, 0, NULL, 1, '2019-08-08 14:35:51', '2019-08-08 14:35:51', 0), - (31, 'gengweigang1', 'c655798e4648c540812a1b8f48759af7', '耿为刚1', '这是别名', '15038588418', '410322193312123232', '1933-12-12', '32@qq.com', 18, 0, 0, NULL, 30, '2019-08-23 09:27:22', '2019-08-23 09:25:50', 0), - (32, 'ceshi123', 'c655798e4648c540812a1b8f48759af7', '测试', '测试', '15670702651', '', NULL, '', 17, 0, 0, NULL, 1, '2019-09-04 09:05:48', '2019-09-03 11:48:04', 0), - (33, 'ceshi321', 'c655798e4648c540812a1b8f48759af7', '测试', '测试', '15670702651', '', NULL, '', 17, 0, 1, NULL, 1, '2019-09-03 15:51:16', '2019-09-03 11:49:17', 0), - (34, 'ceshi123321', 'c655798e4648c540812a1b8f48759af7', '123', '', '15600000000', '', NULL, '', 22, 0, 1, NULL, 1, '2019-09-06 08:58:37', '2019-09-04 09:13:54', 0), - (35, 'guoqingfeng', 'c655798e4648c540812a1b8f48759af7', '郭青枫', '', '15670702651', '', NULL, '', 18, 0, 0, NULL, 1, '2019-09-04 15:09:00', '2019-09-04 15:09:00', 0), - (36, 'li327263458', 'c655798e4648c540812a1b8f48759af7', 'lipeng', '', '13937988294', '', NULL, '', 17, 0, 0, NULL, 1, '2019-09-09 17:01:39', '2019-09-09 17:01:39', 0), - (37, 'test123', 'c655798e4648c540812a1b8f48759af7', 'test', '', '13211110201', '', NULL, '', 18, 0, 1, NULL, 1, '2019-11-14 16:08:08', '2019-11-08 09:32:39', 0), - (38, 'tiantian', 'c655798e4648c540812a1b8f48759af7', '天天管理员', '', '13574502368', '', NULL, '', 17, 0, 0, NULL, 1, '2019-11-14 02:08:08', '2019-11-08 11:09:46', 0), - (39, 'wang13211111', 'c655798e4648c540812a1b8f48759af7', 'ceshi111', 'dddd', '13244553212', '', NULL, '', 25, 0, 0, NULL, 38, '2019-11-15 17:14:34', '2019-11-15 17:03:04', 0); -/*!40000 ALTER TABLE `t_employee` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_file 结构 -DROP TABLE IF EXISTS `t_file`; -CREATE TABLE IF NOT EXISTS `t_file` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `module_id` varchar(50) NOT NULL COMMENT '相关业务id', - `module_type` varchar(50) NOT NULL COMMENT '相关业务类型', - `file_name` varchar(255) DEFAULT NULL COMMENT '文件名称', - `file_size` varchar(255) DEFAULT NULL COMMENT '文件大小', - `file_type` varchar(50) DEFAULT NULL COMMENT '文件类型,程序中枚举控制,文件类型:如身份证正面,三证合一等等', - `file_path` varchar(255) NOT NULL COMMENT '文件key,用于文件下载', - `file_location_type` int NOT NULL COMMENT '文件位置类型', - `creater_user` int NOT NULL COMMENT '创建人,即上传人', - `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '上次更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) USING BTREE, - KEY `module_id_module_type` (`module_id`,`module_type`) USING BTREE, - KEY `module_type` (`module_type`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC; - --- 正在导出表 smart-admin-dev.t_file 的数据:~23 rows (大约) -DELETE FROM `t_file`; -/*!40000 ALTER TABLE `t_file` DISABLE KEYS */; -INSERT INTO `t_file` (`id`, `module_id`, `module_type`, `file_name`, `file_size`, `file_type`, `file_path`, `file_location_type`, `creater_user`, `update_time`, `create_time`) VALUES - (1, '1', '1', '阿里云1.jpg', NULL, NULL, 'backUser/config/d1788b717be24f14ba526f25397b936f', 2, 1, NULL, '2019-07-05 10:38:15'), - (2, '2', '1', '1.jpg', NULL, NULL, 'backUser/config/8895ec770c4e4e558c6d9b54eb00dffc', 2, 1, '2019-07-18 09:20:59', '2019-07-18 09:20:25'), - (3, '3', '1', '随笔.txt', NULL, NULL, 'backUser/config/f5cbc4c9a56f4fa7ad0ba58b0aa5d169', 2, 1, NULL, '2019-07-18 09:22:47'), - (4, '3', '1', '1.jpg', NULL, NULL, 'backUser/config/2019071809245603e0a4e449a4bf3aa28ee731c309040.jpg', 1, 1, NULL, '2019-07-18 09:24:51'), - (6, '4', '1', '1.jpg', NULL, NULL, 'backUser/config/ddcb8214ba274dec9bb2c33e0e246391', 3, 1, NULL, '2019-07-19 16:19:43'), - (7, '5', '1', 'sql.txt', NULL, NULL, 'backUser/config/cfbdf9562c894405b5b6f64f71fa812a', 3, 1, NULL, '2019-07-19 17:41:55'), - (9, '1', '1', '20190912023241a6132f5713b54e1fb490f4ea88115747.md', NULL, NULL, 'backUser/config/20190912023241a6132f5713b54e1fb490f4ea88115747.md', 1, 1, '2019-09-12 15:25:35', '2019-09-12 14:32:42'), - (10, '1', '1', '201909120232499804998573f643ff8e58189d23485629.mjs', NULL, NULL, 'backUser/config/201909120232499804998573f643ff8e58189d23485629.mjs', 1, 1, '2019-09-12 15:25:19', '2019-09-12 14:32:50'), - (11, '1', '1', '201909120326564cdc8df7b8cc49cfb273926877f047f5.json', NULL, NULL, 'backUser/config/201909120326564cdc8df7b8cc49cfb273926877f047f5.json', 1, 1, NULL, '2019-09-12 15:26:56'), - (12, '1', '1', '201909120343357104b7f1cc684f5797ada35c06aba770.json', NULL, NULL, 'backUser/config/201909120343357104b7f1cc684f5797ada35c06aba770.json', 1, 1, NULL, '2019-09-12 15:43:36'), - (13, '1', '1', '201909120343427e408141a0ea467ea2e012f7086a6265.json', NULL, NULL, 'backUser/config/201909120343427e408141a0ea467ea2e012f7086a6265.json', 1, 1, NULL, '2019-09-12 15:43:42'), - (14, '1', '1', '20190912034543b4d3a061fb2e416c899fe2ff6b9327e0.ts', NULL, NULL, 'backUser/config/20190912034543b4d3a061fb2e416c899fe2ff6b9327e0.ts', 1, 1, NULL, '2019-09-12 15:45:43'), - (15, '1', '1', '20190912034550a5dc04ce79b14a1cb2bb76545c909aa8.md', NULL, NULL, 'backUser/config/20190912034550a5dc04ce79b14a1cb2bb76545c909aa8.md', 1, 1, NULL, '2019-09-12 15:45:51'), - (16, '1', '1', 'LICENCE', NULL, NULL, 'backUser/config/cc02b99c0ec548f1a2231b70b7d569b8', 2, 1, NULL, '2019-09-12 15:47:22'), - (17, '1', '1', 'bignumber.min.js', NULL, NULL, 'backUser/config/bda49e8ad6d242fe8735b2023dfbf125', 2, 1, NULL, '2019-09-12 15:47:29'), - (18, '1', '1', '20190912034880a881fa8fbc841bfb7194ff312bd1058.json', NULL, NULL, 'backUser/config/20190912034880a881fa8fbc841bfb7194ff312bd1058.json', 1, 1, NULL, '2019-09-12 15:48:08'), - (19, '1', '1', '20190912034816ece14084acf345a79396a0f4347c4e44.md', NULL, NULL, 'backUser/config/20190912034816ece14084acf345a79396a0f4347c4e44.md', 1, 1, NULL, '2019-09-12 15:48:16'), - (20, '1', '1', '20191024054412fac4b4e04c574c6eab71f91e13a8a0b6.jpg', NULL, NULL, 'backUser/config/20191024054412fac4b4e04c574c6eab71f91e13a8a0b6.jpg', 1, 1, NULL, '2019-10-24 17:44:13'), - (21, '1', '1', '20191106042073f7ef01bde3046bd8e01928f397230bd.jpg', NULL, NULL, 'backUser/config/20191106042073f7ef01bde3046bd8e01928f397230bd.jpg', 1, 1, NULL, '2019-11-06 02:20:13'), - (22, '1', '1', '201911130802024b8a2ebf80543a98241bb464682650d.jpg', NULL, NULL, 'backUser/config/201911130802024b8a2ebf80543a98241bb464682650d.jpg', 1, 1, NULL, '2019-11-13 06:02:01'), - (23, '1', '1', '20191113080210d1d98eea46364d268b2a03fa03f7a446.jpg', NULL, NULL, 'backUser/config/20191113080210d1d98eea46364d268b2a03fa03f7a446.jpg', 1, 1, NULL, '2019-11-13 06:02:14'), - (24, '1', '1', '20191115043844e92b25e70fb140a1885614b978469ca9.jpg', NULL, NULL, 'backUser/config/20191115043844e92b25e70fb140a1885614b978469ca9.jpg', 1, 38, NULL, '2019-11-15 02:38:45'), - (25, '1', '1', '20191116060546d3a2c703cb5546b3851612907cc3786f.png', NULL, NULL, 'backUser/config/20191116060546d3a2c703cb5546b3851612907cc3786f.png', 1, 1, NULL, '2019-11-16 10:05:47'); -/*!40000 ALTER TABLE `t_file` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_heart_beat_record 结构 -DROP TABLE IF EXISTS `t_heart_beat_record`; -CREATE TABLE IF NOT EXISTS `t_heart_beat_record` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '自增id', - `project_path` varchar(100) DEFAULT NULL COMMENT '项目名称', - `server_ip` varchar(200) DEFAULT NULL COMMENT '服务器ip', - `process_no` int DEFAULT NULL COMMENT '进程号', - `process_start_time` datetime DEFAULT NULL COMMENT '进程开启时间', - `heart_beat_time` datetime DEFAULT NULL COMMENT '心跳时间', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC; - --- 正在导出表 smart-admin-dev.t_heart_beat_record 的数据:~2 rows (大约) -DELETE FROM `t_heart_beat_record`; -/*!40000 ALTER TABLE `t_heart_beat_record` DISABLE KEYS */; -INSERT INTO `t_heart_beat_record` (`id`, `project_path`, `server_ip`, `process_no`, `process_start_time`, `heart_beat_time`) VALUES - (1, '/home/server/smart-admin/dev', '192.168.122.1;172.16.0.145', 14843, '2019-11-16 03:11:50', '2019-11-16 03:58:01'), - (2, 'F:\\codespace\\idea\\gangquan360\\foundation', '172.16.1.188;192.168.56.1', 227992, '2019-11-16 10:02:39', '2019-11-16 10:06:50'), - (3, 'E:\\codespace\\zhuoda', '192.168.8.188', 17564, '2020-12-14 07:11:12', '2020-12-14 07:13:34'), - (4, 'E:\\codespace\\zhuoda', '192.168.8.188', 15568, '2020-12-14 07:13:53', '2020-12-14 07:15:00'), - (5, 'E:\\codespace\\zhuoda', '192.168.8.188', 16548, '2020-12-14 07:16:07', '2020-12-14 07:17:14'); -/*!40000 ALTER TABLE `t_heart_beat_record` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_id_generator 结构 -DROP TABLE IF EXISTS `t_id_generator`; -CREATE TABLE IF NOT EXISTS `t_id_generator` ( - `id` int DEFAULT NULL, - `key_name` varchar(50) NOT NULL COMMENT '英文key', - `rule_format` varchar(500) NOT NULL COMMENT '规则格式。no_cycle没有周期, year_cycle 年周期, month_cycle月周期, day_cycle 日周期', - `rule_type` varchar(50) NOT NULL COMMENT '格式[yyyy]表示年,[mm]标识月,[dd]表示日,[nnn]表示三位数字', - `init_number` int NOT NULL DEFAULT '1' COMMENT '初始值', - `last_number` int DEFAULT NULL COMMENT '上次产生的id, 默认为空', - `remark` varchar(1000) NOT NULL COMMENT '备注', - `update_time` datetime DEFAULT NULL, - `create_time` datetime NOT NULL, - UNIQUE KEY `key_name` (`key_name`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='id生成器定义表'; - --- 正在导出表 smart-admin-dev.t_id_generator 的数据:~2 rows (大约) -DELETE FROM `t_id_generator`; -/*!40000 ALTER TABLE `t_id_generator` DISABLE KEYS */; -INSERT INTO `t_id_generator` (`id`, `key_name`, `rule_format`, `rule_type`, `init_number`, `last_number`, `remark`, `update_time`, `create_time`) VALUES - (2, 'goods_num', '[nnnnnnn]', 'NO_CYCLE', 1, NULL, '商品编号', '2019-04-09 09:48:04', '2019-03-29 14:14:12'), - (1, 'order', '[yyyy][mm][dd][nnnnn]', 'DAY_CYCLE', 1, 1, '订单编号', '2019-03-30 11:25:42', '2019-03-29 14:14:12'); -/*!40000 ALTER TABLE `t_id_generator` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_id_generator_record 结构 -DROP TABLE IF EXISTS `t_id_generator_record`; -CREATE TABLE IF NOT EXISTS `t_id_generator_record` ( - `generator_id` int NOT NULL, - `year` int NOT NULL, - `month` int NOT NULL, - `day` int NOT NULL, - `last_number` int NOT NULL, - PRIMARY KEY (`generator_id`,`year`,`month`,`day`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='id_generator记录表'; - --- 正在导出表 smart-admin-dev.t_id_generator_record 的数据:~5 rows (大约) -DELETE FROM `t_id_generator_record`; -/*!40000 ALTER TABLE `t_id_generator_record` DISABLE KEYS */; -INSERT INTO `t_id_generator_record` (`generator_id`, `year`, `month`, `day`, `last_number`) VALUES - (1, 2019, 3, 30, 1), - (2, 2019, 3, 30, 1), - (2, 2019, 4, 3, 2), - (2, 2019, 4, 8, 2), - (2, 2019, 4, 9, 1); -/*!40000 ALTER TABLE `t_id_generator_record` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_notice 结构 -DROP TABLE IF EXISTS `t_notice`; -CREATE TABLE IF NOT EXISTS `t_notice` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息标题', - `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息内容', - `deleted` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '删除状态:0未删除 0删除 ', - `send_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '发送状态 0未发送 1发送', - `create_user` bigint NOT NULL COMMENT '消息创建人', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=108 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- 正在导出表 smart-admin-dev.t_notice 的数据:~14 rows (大约) -DELETE FROM `t_notice`; -/*!40000 ALTER TABLE `t_notice` DISABLE KEYS */; -INSERT INTO `t_notice` (`id`, `title`, `content`, `deleted`, `send_status`, `create_user`, `create_time`, `update_time`) VALUES - (93, '大扫把', '晓冬吃大便', 1, 1, 1, '2019-07-13 17:54:13', '2019-07-13 17:54:21'), - (95, '4444444', '444444444444', 1, 1, 1, '2019-07-13 17:54:53', '2019-09-04 09:42:02'), - (96, '3434', '444444', 1, 1, 1, '2019-07-13 17:58:42', '2019-11-08 09:05:24'), - (97, '44444', '555555555555', 1, 1, 1, '2019-07-13 17:58:54', '2019-09-03 16:19:50'), - (98, '《青花瓷》', '素胚勾勒出青花笔锋浓转淡\n瓶身描绘的牡丹一如你初妆\n冉冉檀香透过窗心事我了然\n周杰伦 青花瓷\n周杰伦 青花瓷\n宣纸上走笔至此搁一半\n釉色渲染仕女图韵味被私藏\n而你嫣然的一笑如含苞待放\n你的美一缕飘散\n去到我去不了的地方\n天青色等烟雨 而我在等你\n炊烟袅袅升起 隔江千万里\n在瓶底书刻隶仿前朝的飘逸\n就当我为遇见你伏笔\n天青色等烟雨 而我在等你\n月色被打捞起 晕开了结局\n如传世的青花瓷自顾自美丽\n你眼带笑意\n色白花青的锦鲤跃然于碗底\n临摹宋体落款时却惦记着你\n你隐藏在窑烧里千年的秘密\n极细腻犹如绣花针落地\n篱外芭蕉惹骤雨门环惹铜绿\n而我路过那江南小镇惹了你\n在泼墨山水画里\n你从墨色深处被隐去\n天青色等烟雨 而我在等你\n炊烟袅袅升起 隔江千万里\n在瓶底书刻隶仿前朝的飘逸\n就当我为遇见你伏笔\n天青色等烟雨 而我在等你\n月色被打捞起 晕开了结局\n如传世的青花瓷自顾自美丽\n你眼带笑意\n天青色等烟雨 而我在等你\n炊烟袅袅升起 隔江千万里\n在瓶底书刻隶仿前朝的飘逸\n就当我为遇见你伏笔\n天青色等烟雨 而我在等你\n月色被打捞起 晕开了结局\n如传世的青花瓷自顾自美丽\n你眼带笑意 ', 1, 1, 1, '2019-08-05 16:36:44', '2019-09-02 17:53:12'), - (99, '1', '2', 1, 1, 30, '2019-08-08 14:53:58', '2019-08-08 14:54:07'), - (100, '呵呵', '呵呵', 1, 1, 1, '2019-08-20 16:52:53', '2019-09-02 17:46:59'), - (101, 'aa', 'bbcc', 1, 1, 30, '2019-08-23 09:51:01', '2019-08-23 09:51:28'), - (102, '1', '2', 0, 1, 1, '2019-09-05 14:28:10', '2019-09-05 14:28:10'), - (103, '12', '22', 0, 1, 1, '2019-09-05 14:29:30', '2019-09-05 14:29:30'), - (104, 'a', 'b', 1, 1, 30, '2019-09-06 14:21:18', '2019-09-06 14:24:07'), - (105, '22222222222', '1111', 0, 0, 1, '2019-11-07 19:05:56', '2019-11-07 19:05:56'), - (106, '423', '234', 0, 0, 37, '2019-11-08 21:48:19', '2019-11-08 21:48:19'), - (107, 'AAS', 's\'da\'ssdas', 1, 1, 1, '2019-11-13 19:06:55', '2019-11-14 09:07:06'); -/*!40000 ALTER TABLE `t_notice` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_notice_receive_record 结构 -DROP TABLE IF EXISTS `t_notice_receive_record`; -CREATE TABLE IF NOT EXISTS `t_notice_receive_record` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `notice_id` bigint NOT NULL COMMENT '消息id', - `employee_id` bigint NOT NULL COMMENT '用户id', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=141 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- 正在导出表 smart-admin-dev.t_notice_receive_record 的数据:~27 rows (大约) -DELETE FROM `t_notice_receive_record`; -/*!40000 ALTER TABLE `t_notice_receive_record` DISABLE KEYS */; -INSERT INTO `t_notice_receive_record` (`id`, `notice_id`, `employee_id`, `create_time`, `update_time`) VALUES - (114, 93, 1, '2019-07-13 17:54:16', '2019-07-13 17:54:16'), - (115, 95, 1, '2019-07-13 17:54:55', '2019-07-13 17:54:55'), - (116, 95, 22, '2019-07-13 17:58:03', '2019-07-13 17:58:03'), - (117, 93, 22, '2019-07-13 17:58:05', '2019-07-13 17:58:05'), - (118, 96, 1, '2019-07-13 17:58:44', '2019-07-13 17:58:44'), - (119, 97, 1, '2019-07-13 17:58:58', '2019-07-13 17:58:58'), - (120, 98, 1, '2019-08-05 16:37:01', '2019-08-05 16:37:01'), - (121, 99, 30, '2019-08-08 14:54:05', '2019-08-08 14:54:05'), - (122, 99, 1, '2019-08-08 15:15:44', '2019-08-08 15:15:44'), - (123, 100, 1, '2019-08-20 16:53:29', '2019-08-20 16:53:29'), - (124, 101, 30, '2019-08-23 09:51:11', '2019-08-23 09:51:11'), - (125, 101, 1, '2019-08-23 12:46:27', '2019-08-23 12:46:27'), - (126, 102, 1, '2019-09-05 14:28:32', '2019-09-05 14:28:32'), - (127, 104, 30, '2019-09-06 14:23:58', '2019-09-06 14:23:58'), - (128, 104, 1, '2019-09-06 15:25:13', '2019-09-06 15:25:13'), - (129, 101, 14, '2019-11-02 21:46:13', '2019-11-02 21:46:13'), - (130, 102, 14, '2019-11-02 21:46:14', '2019-11-02 21:46:14'), - (131, 104, 14, '2019-11-02 21:46:15', '2019-11-02 21:46:15'), - (132, 98, 14, '2019-11-02 21:46:18', '2019-11-02 21:46:18'), - (133, 103, 37, '2019-11-07 19:58:06', '2019-11-07 19:58:06'), - (134, 103, 1, '2019-11-07 20:03:54', '2019-11-07 20:03:54'), - (135, 107, 1, '2019-11-13 19:07:02', '2019-11-13 19:07:02'), - (136, 107, 38, '2019-11-15 02:11:04', '2019-11-15 02:11:04'), - (137, 104, 38, '2019-11-15 02:11:17', '2019-11-15 02:11:17'), - (138, 101, 38, '2019-11-15 02:26:33', '2019-11-15 02:26:33'), - (139, 98, 38, '2019-11-15 02:29:32', '2019-11-15 02:29:32'), - (140, 100, 38, '2019-11-15 03:19:18', '2019-11-15 03:19:18'); -/*!40000 ALTER TABLE `t_notice_receive_record` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_order_operate_log 结构 -DROP TABLE IF EXISTS `t_order_operate_log`; -CREATE TABLE IF NOT EXISTS `t_order_operate_log` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `order_id` int NOT NULL COMMENT '各种单据的id', - `order_type` int NOT NULL COMMENT '单据类型', - `operate_type` int NOT NULL COMMENT '操作类型', - `operate_content` text NOT NULL COMMENT '操作类型 对应的中文', - `operate_remark` text COMMENT '操作备注', - `employee_id` int NOT NULL COMMENT '员工id', - `employee_name` varchar(1000) NOT NULL COMMENT '员工名称', - `ext_data` text COMMENT '额外信息', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) USING BTREE, - KEY `order_id_order_type` (`order_id`,`order_type`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='各种单据操作记录\r\n'; - --- 正在导出表 smart-admin-dev.t_order_operate_log 的数据:~0 rows (大约) -DELETE FROM `t_order_operate_log`; -/*!40000 ALTER TABLE `t_order_operate_log` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_order_operate_log` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_peony 结构 -DROP TABLE IF EXISTS `t_peony`; -CREATE TABLE IF NOT EXISTS `t_peony` ( - `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID', - `kind` varchar(500) DEFAULT NULL COMMENT '品种', - `name` varchar(500) DEFAULT NULL COMMENT '名字', - `color` varchar(500) DEFAULT NULL COMMENT '颜色', - `image_url` text COMMENT '图片链接', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='牡丹花'; - --- 正在导出表 smart-admin-dev.t_peony 的数据:~3 rows (大约) -DELETE FROM `t_peony`; -/*!40000 ALTER TABLE `t_peony` DISABLE KEYS */; -INSERT INTO `t_peony` (`id`, `kind`, `name`, `color`, `image_url`, `create_time`, `update_time`) VALUES - (5, '复色类', '什样锦', '红色', 'https://bkimg.cdn.bcebos.com/pic/3c6d55fbb2fb43160ee185da2aa4462308f7d390?x-bce-process=image/watermark,g_7,image_d2F0ZXIvYmFpa2UxNTA=,xp_5,yp_5', '2020-04-06 22:02:32', '2020-04-06 22:03:30'), - (6, '绿色', '绿香球', '绿色', '11', '2020-04-06 22:14:35', '2020-04-06 22:17:51'), - (7, '墨紫色类', '冠世墨玉', '紫色', '34534534534', '2020-04-06 22:15:19', '2020-04-06 22:18:21'); -/*!40000 ALTER TABLE `t_peony` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_position 结构 -DROP TABLE IF EXISTS `t_position`; -CREATE TABLE IF NOT EXISTS `t_position` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `position_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '岗位名称', - `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '岗位描述', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='岗位表'; - --- 正在导出表 smart-admin-dev.t_position 的数据:~13 rows (大约) -DELETE FROM `t_position`; -/*!40000 ALTER TABLE `t_position` DISABLE KEYS */; -INSERT INTO `t_position` (`id`, `position_name`, `remark`, `update_time`, `create_time`) VALUES - (1, 'java develop', 'java develop is good job', '2019-07-03 15:18:45', '2019-07-03 15:18:45'), - (2, 'android develop', 'android develop is good job', '2019-07-04 16:11:11', '2019-07-04 16:11:00'), - (3, '测试岗位1', '这是内容11', '2019-09-02 16:39:33', '2019-07-10 14:03:50'), - (8, '测试岗位2', '测试岗位2.。', '2019-09-04 10:19:40', '2019-09-04 10:19:32'), - (9, '测试岗位3', '测试岗位3', '2019-09-05 14:39:43', '2019-09-05 14:39:43'), - (10, '测试岗位4', '测试岗位4', '2019-09-05 14:39:48', '2019-09-05 14:39:48'), - (11, '测试岗位5', '测试岗位5', '2019-09-05 14:39:53', '2019-09-05 14:39:53'), - (12, '测试岗位6', '测试岗位6', '2019-09-05 14:39:58', '2019-09-05 14:39:58'), - (13, '测试岗位7', '测试岗位7', '2019-09-05 14:40:03', '2019-09-05 14:40:03'), - (14, '测试岗位8', '测试岗位8', '2019-09-05 14:40:09', '2019-09-05 14:40:09'), - (15, '测试岗位9', '测试岗位9', '2019-09-05 14:40:19', '2019-09-05 14:40:19'), - (16, 'aaa22222', 'ddddddddddd', '2019-11-15 17:04:29', '2019-11-06 15:58:37'), - (17, 'ddd', 'fsdef', '2019-11-15 17:04:40', '2019-11-15 17:04:40'); -/*!40000 ALTER TABLE `t_position` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_position_relation 结构 -DROP TABLE IF EXISTS `t_position_relation`; -CREATE TABLE IF NOT EXISTS `t_position_relation` ( - `id` int unsigned NOT NULL AUTO_INCREMENT, - `position_id` int DEFAULT NULL COMMENT '岗位ID', - `employee_id` int DEFAULT NULL COMMENT '员工ID', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - KEY `job_id` (`position_id`) USING BTREE, - KEY `employee_id` (`employee_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='岗位关联表'; - --- 正在导出表 smart-admin-dev.t_position_relation 的数据:~27 rows (大约) -DELETE FROM `t_position_relation`; -/*!40000 ALTER TABLE `t_position_relation` DISABLE KEYS */; -INSERT INTO `t_position_relation` (`id`, `position_id`, `employee_id`, `update_time`, `create_time`) VALUES - (14, 1, 28, '2019-07-10 16:40:14', '2019-07-10 16:40:14'), - (18, 1, 29, '2019-07-11 10:18:22', '2019-07-11 10:18:22'), - (19, 3, 29, '2019-07-11 10:18:22', '2019-07-11 10:18:22'), - (20, 2, 29, '2019-07-11 10:18:22', '2019-07-11 10:18:22'), - (21, 1, 30, '2019-08-08 14:35:51', '2019-08-08 14:35:51'), - (22, 2, 30, '2019-08-08 14:35:51', '2019-08-08 14:35:51'), - (23, 3, 30, '2019-08-08 14:35:51', '2019-08-08 14:35:51'), - (26, 2, 31, '2019-08-23 09:26:44', '2019-08-23 09:26:44'), - (27, 3, 31, '2019-08-23 09:26:44', '2019-08-23 09:26:44'), - (28, 3, 32, '2019-09-04 09:05:47', '2019-09-04 09:05:47'), - (29, 2, 32, '2019-09-04 09:05:47', '2019-09-04 09:05:47'), - (30, 3, 22, '2019-09-04 09:06:46', '2019-09-04 09:06:46'), - (31, 2, 22, '2019-09-04 09:06:46', '2019-09-04 09:06:46'), - (35, 8, 35, '2019-09-04 15:09:00', '2019-09-04 15:09:00'), - (36, 3, 35, '2019-09-04 15:09:00', '2019-09-04 15:09:00'), - (37, 15, 23, '2019-09-05 16:13:02', '2019-09-05 16:13:02'), - (38, 14, 23, '2019-09-05 16:13:02', '2019-09-05 16:13:02'), - (39, 13, 23, '2019-09-05 16:13:02', '2019-09-05 16:13:02'), - (40, 3, 34, '2019-09-06 08:55:18', '2019-09-06 08:55:18'), - (41, 2, 34, '2019-09-06 08:55:18', '2019-09-06 08:55:18'), - (42, 1, 34, '2019-09-06 08:55:18', '2019-09-06 08:55:18'), - (43, 14, 36, '2019-09-09 17:01:39', '2019-09-09 17:01:39'), - (44, 3, 37, '2019-11-08 09:32:39', '2019-11-08 09:32:39'), - (46, 8, 38, '2019-11-14 16:08:05', '2019-11-14 16:08:05'), - (50, 16, 39, '2019-11-15 17:07:04', '2019-11-15 17:07:04'), - (51, 13, 39, '2019-11-15 17:07:04', '2019-11-15 17:07:04'), - (52, 14, 39, '2019-11-15 17:07:04', '2019-11-15 17:07:04'); -/*!40000 ALTER TABLE `t_position_relation` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_privilege 结构 -DROP TABLE IF EXISTS `t_privilege`; -CREATE TABLE IF NOT EXISTS `t_privilege` ( - `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '功能权限表主键id', - `type` tinyint NOT NULL COMMENT '1.菜单 2.功能点', - `name` varchar(50) NOT NULL COMMENT '菜单名称', - `key` varchar(1000) NOT NULL COMMENT '路由name 英文关键字', - `url` text COMMENT '路由path/type=3为API接口', - `sort` int NOT NULL DEFAULT '0' COMMENT '排序', - `parent_key` varchar(1000) DEFAULT NULL COMMENT '父级key', - `update_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `key` (`key`) USING BTREE, - KEY `type` (`type`) USING BTREE, - KEY `parent_key` (`parent_key`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8 COMMENT='权限功能表'; - --- 正在导出表 smart-admin-dev.t_privilege 的数据:~103 rows (大约) -DELETE FROM `t_privilege`; -/*!40000 ALTER TABLE `t_privilege` DISABLE KEYS */; -INSERT INTO `t_privilege` (`id`, `type`, `name`, `key`, `url`, `sort`, `parent_key`, `update_time`, `create_time`) VALUES - (1, 1, '人员管理', 'Employee', '/employee', 20, 'System', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (2, 1, '角色管理', 'RoleManage', '/employee/role', 21, 'Employee', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (3, 1, '岗位管理', 'PositionList', '/employee/position', 22, 'Employee', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (4, 1, '员工管理', 'RoleEmployeeManage', '/employee/role-employee-manage', 23, 'Employee', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (5, 1, '系统设置', 'SystemSetting', '/system-setting', 29, 'System', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (6, 1, '系统参数', 'SystemConfig', '/system-setting/system-config', 30, 'SystemSetting', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (8, 1, '菜单设置', 'SystemPrivilege', '/system-setting/system-privilege', 31, 'SystemSetting', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (9, 1, '消息管理', 'Notice', '/notice', 10, 'Business', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (10, 1, '通知管理', 'NoticeList', '/notice/notice-list', 11, 'Notice', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (11, 1, '个人消息', 'PersonNotice', '/notice/person-notice', 12, 'Notice', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (12, 1, '邮件管理', 'Email', '/email', 4, 'Business', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (13, 1, '邮件管理', 'EmailList', '/email/email-list', 5, 'Email', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (14, 1, '发送邮件', 'SendMail', '/email/send-mail', 6, 'Email', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (15, 1, '用户日志', 'UserLog', '/user-log', 26, 'System', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (16, 1, '用户操作日志', 'UserOperateLog', '/user-log/user-operate-log', 27, 'UserLog', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (17, 1, '用户登录日志', 'UserLoginLog', '/user-log/user-login-log', 28, 'UserLog', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (18, 1, '系统监控', 'Monitor', '/monitor', 37, 'Support', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (19, 1, '在线人数', 'OnlineUser', '/monitor/online-user', 38, 'Monitor', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (20, 1, 'SQL监控', 'Sql', '/monitor/sql', 39, 'Monitor', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (21, 1, '定时任务', 'Task', '/task', 42, 'Support', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (22, 1, '任务管理', 'TaskList', '/system-setting/task-list', 43, 'Task', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (23, 1, '动态加载', 'Reload', '/reload', 40, 'Support', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (24, 1, 'SmartReload', 'SmartReloadList', '/reload/smart-reload-list', 41, 'Reload', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (25, 1, '接口文档', 'ApiDoc', '/api-doc', 33, 'Support', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (26, 1, 'Swagger接口文档', 'Swagger', '/api-doc/swagger', 34, 'ApiDoc', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (27, 1, '三级路由', 'ThreeRouter', '/three-router', 14, 'Business', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (28, 1, '三级菜单', 'LevelTwo', '/three-router/level-two', 15, 'ThreeRouter', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (30, 1, '三级菜单子哈', 'RoleTwoTwo', '/three-router/level-two/level-three2', 17, 'LevelTwo', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (31, 1, '二级菜单', 'RoleOneOne', '/three-router/level-two2', 18, 'ThreeRouter', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (32, 1, 'KeepAlive', 'KeepAlive', '/keep-alive', 7, 'Business', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (33, 1, 'KeepAlive列表', 'KeepAliveContentList', '/keep-alive/content-list', 8, 'KeepAlive', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (34, 1, 'KeepAlive表单', 'KeepAliveAddContent', '/keep-alive/add-content', 9, 'KeepAlive', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (35, 1, '心跳服务', 'HeartBeat', '/heart-beat', 35, 'Support', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (36, 1, '心跳服务', 'HeartBeatList', '/heart-beat/heart-beat-list', 36, 'HeartBeat', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (37, 1, '文件服务', 'File', '/file', 24, 'System', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (38, 1, '文件列表', 'FileList', '/file/file-list', 25, 'File', '2020-12-14 15:16:26', '2019-11-01 11:28:07'), - (39, 2, '添加角色', 'add-role', 'roleController.addRole', 0, 'RoleManage', '2019-11-01 11:47:29', '2019-11-01 11:47:29'), - (40, 2, '删除角色', 'delete-role', 'roleController.deleteRole', 1, 'RoleManage', '2019-11-01 11:47:43', '2019-11-01 11:47:43'), - (41, 2, '编辑角色', 'update-role', 'roleController.updateRole', 2, 'RoleManage', '2019-11-01 11:47:55', '2019-11-01 11:47:55'), - (42, 2, '修改角色权限', 'update-role-privilege', 'rolePrivilegeController.updateRolePrivilege', 3, 'RoleManage', '2019-11-01 11:48:09', '2019-11-01 11:48:09'), - (43, 2, '添加成员', 'add-employee-role', 'roleEmployeeController.addEmployeeList', 4, 'RoleManage', '2019-11-05 10:38:11', '2019-11-05 10:38:11'), - (44, 2, '查询成员', 'search-employee-list', 'roleEmployeeController.listAllEmployeeRoleId,roleEmployeeController.listEmployeeByName,roleController.getAllRole,rolePrivilegeController.listPrivilegeByRoleId', 7, 'RoleManage', '2019-11-05 10:39:04', '2019-11-05 10:39:04'), - (45, 2, '移除成员', 'delete-employee-role', 'roleEmployeeController.removeEmployee', 5, 'RoleManage', '2019-11-05 10:40:09', '2019-11-05 10:40:09'), - (46, 2, '批量移除', 'delete-employee-role-batch', 'roleEmployeeController.removeEmployeeList', 6, 'RoleManage', '2019-11-05 10:40:27', '2019-11-05 10:40:27'), - (47, 2, '查询数据范围', 'query-data-scope', 'dataScopeController.dataScopeList,dataScopeController.dataScopeListByRole,rolePrivilegeController.listPrivilegeByRoleId,privilegeController.queryAll,privilegeController.getAllUrl', 8, 'RoleManage', '2019-11-05 10:40:57', '2019-11-05 10:40:57'), - (48, 2, '更新数据范围', 'update-data-scope', 'dataScopeController.dataScopeBatchSet', 9, 'RoleManage', '2019-11-05 10:41:03', '2019-11-05 10:41:03'), - (49, 2, '查询', 'search-position', 'positionController.queryJobById,positionController.getJobPage', 0, 'PositionList', '2019-11-05 10:41:30', '2019-11-05 10:41:30'), - (50, 2, '添加', 'add-position', 'positionController.addJob', 1, 'PositionList', '2019-11-05 10:41:40', '2019-11-05 10:41:40'), - (51, 2, '修改', 'update-position', 'positionController.updateJob', 2, 'PositionList', '2019-11-05 10:41:49', '2019-11-05 10:41:49'), - (52, 2, '删除', 'delete-position', 'positionController.removeJob', 3, 'PositionList', '2019-11-05 10:41:57', '2019-11-05 10:41:57'), - (53, 2, '添加部门', 'add-department', 'departmentController.addDepartment', 0, 'RoleEmployeeManage', '2019-11-05 11:11:18', '2019-11-05 11:11:18'), - (54, 2, '编辑部门', 'update-department', 'departmentController.updateDepartment', 1, 'RoleEmployeeManage', '2019-11-05 11:11:29', '2019-11-05 11:11:29'), - (55, 2, '删除部门', 'delete-department', 'departmentController.delDepartment', 2, 'RoleEmployeeManage', '2019-11-05 11:11:48', '2019-11-05 11:11:48'), - (56, 2, '查询', 'search-department', 'departmentController.listAll,departmentController.getDepartment,departmentController.listDepartmentEmployee,departmentController.listDepartment,employeeController.query', 3, 'RoleEmployeeManage', '2019-11-05 11:12:09', '2019-11-05 11:12:09'), - (57, 2, '添加成员', 'add-employee', 'employeeController.addEmployee', 4, 'RoleEmployeeManage', '2019-11-05 17:06:23', '2019-11-05 17:06:23'), - (58, 2, '编辑成员', 'update-employee', 'employeeController.updateEmployee', 5, 'RoleEmployeeManage', '2019-11-05 17:06:57', '2019-11-05 17:06:57'), - (59, 2, '禁用', 'disabled-employee', 'employeeController.updateStatus', 6, 'RoleEmployeeManage', '2019-11-05 17:14:35', '2019-11-05 17:14:35'), - (60, 2, '批量操作', 'disabled-employee-batch', 'employeeController.batchUpdateStatus', 7, 'RoleEmployeeManage', '2019-11-05 17:19:23', '2019-11-05 17:19:23'), - (61, 2, '员工角色编辑', 'update-employee-role', 'employeeController.updateRoles', 8, 'RoleEmployeeManage', '2019-11-05 17:21:15', '2019-11-05 17:21:15'), - (62, 2, '重置密码', 'reset-employee-password', 'employeeController.resetPasswd', 10, 'RoleEmployeeManage', '2019-11-05 17:22:13', '2019-11-05 17:22:13'), - (63, 2, '删除员工', 'delete-employee', 'employeeController.deleteEmployeeById', 9, 'RoleEmployeeManage', '2019-11-05 17:22:27', '2019-11-05 17:22:27'), - (64, 2, '查询系统参数', 'system-params-search', 'systemConfigController.selectByKey,systemConfigController.getListByGroup,systemConfigController.getSystemConfigPage', 0, 'SystemConfig', '2019-11-05 17:23:41', '2019-11-05 17:23:41'), - (65, 2, '添加系统参数', 'system-params-add', 'systemConfigController.addSystemConfig', 1, 'SystemConfig', '2019-11-05 17:26:00', '2019-11-05 17:26:00'), - (66, 2, '修改系统参数', 'system-config-update', 'systemConfigController.updateSystemConfig', 2, 'SystemConfig', '2019-11-05 17:26:07', '2019-11-05 17:26:07'), - (67, 2, '搜索系统参数', 'system-config-search', 'systemConfigController.selectByKey,systemConfigController.getListByGroup,systemConfigController.getSystemConfigPage', 3, 'SystemConfig', '2019-11-05 17:26:44', '2019-11-05 17:26:44'), - (69, 2, '编辑', 'privilege-main-update', 'privilegeController.menuBatchSave,privilegeController.functionSaveOrUpdate', 1, 'SystemPrivilege', '2020-12-14 15:17:11', '2019-11-05 17:27:28'), - (70, 2, '查询', 'privilege-main-search', 'privilegeController.queryAll,privilegeController.getAllUrl,privilegeController.functionQuery', 3, 'SystemPrivilege', '2020-12-14 15:17:11', '2019-11-05 17:28:45'), - (71, 2, '查询', 'notice-query', 'noticeController.queryReceiveByPage,noticeController.queryUnreadByPage,noticeController.queryByPage,noticeController.detail', 0, 'NoticeList', '2019-11-05 17:30:16', '2019-11-05 17:30:16'), - (72, 2, '添加', 'notice-add', 'noticeController.add', 1, 'NoticeList', '2019-11-05 17:30:28', '2019-11-05 17:30:28'), - (73, 2, '修改', 'notice-edit', 'noticeController.update', 2, 'NoticeList', '2019-11-05 17:31:24', '2019-11-05 17:31:24'), - (74, 2, '删除', 'notice-delete', 'noticeController.delete', 3, 'NoticeList', '2019-11-06 11:12:32', '2019-11-06 11:12:32'), - (75, 2, '详情', 'notice-detail', 'noticeController.detail', 4, 'NoticeList', '2019-11-06 11:12:44', '2019-11-06 11:12:44'), - (76, 2, '发送', 'notice-send', 'noticeController.send', 5, 'NoticeList', '2019-11-06 11:12:51', '2019-11-06 11:12:51'), - (77, 2, '查询', 'person-notice-query', 'noticeController.queryReceiveByPage,noticeController.queryUnreadByPage,noticeController.queryByPage', 0, 'PersonNotice', '2019-11-06 11:13:27', '2019-11-06 11:13:27'), - (78, 2, '详情', 'person-notice-detail', 'noticeController.detail', 1, 'PersonNotice', '2019-11-06 11:13:35', '2019-11-06 11:13:35'), - (79, 2, '查询', 'email-query', 'emailController.queryByPage,emailController.detail', 0, 'EmailList', '2019-11-06 11:13:49', '2019-11-06 11:13:49'), - (80, 2, '新增', 'email-add', 'emailController.add', 1, 'EmailList', '2019-11-06 11:14:02', '2019-11-06 11:14:02'), - (81, 2, '编辑', 'email-update', 'emailController.update', 2, 'EmailList', '2019-11-06 11:14:08', '2019-11-06 11:14:08'), - (82, 2, '删除', 'email-delete', 'emailController.delete', 3, 'EmailList', '2019-11-06 11:14:16', '2019-11-06 11:14:16'), - (83, 2, '发送', 'email-send', 'emailController.send', 0, 'SendMail', '2019-11-06 11:14:40', '2019-11-06 11:14:40'), - (84, 2, '查询', 'user-operate-log-search', 'userOperateLogController.queryByPage', 0, 'UserOperateLog', '2019-11-06 11:15:04', '2019-11-06 11:15:04'), - (85, 2, '详情', 'user-operate-log-detail', 'userOperateLogController.detail', 1, 'UserOperateLog', '2019-11-06 11:15:16', '2019-11-06 11:15:16'), - (86, 2, '删除', 'user-operate-log-delete', 'userOperateLogController.delete', 2, 'UserOperateLog', '2019-11-06 11:15:25', '2019-11-06 11:15:25'), - (87, 2, '查询', 'user-login-log-search', 'userLoginLogController.queryByPage', 0, 'UserLoginLog', '2019-11-06 11:15:43', '2019-11-06 11:15:43'), - (88, 2, '删除', 'user-login-log-delete', 'userLoginLogController.delete', 1, 'UserLoginLog', '2019-11-06 11:15:49', '2019-11-06 11:15:49'), - (89, 2, '查询', 'online-user-search', 'userLoginLogController.queryUserOnLine', 0, 'OnlineUser', '2019-11-06 11:16:05', '2019-11-06 11:16:05'), - (90, 2, '查询任务', 'task-search', 'quartzController.query', 0, 'TaskList', '2019-11-06 11:16:24', '2019-11-06 11:16:24'), - (91, 2, '刷新任务', 'task-refresh', 'quartzController.query', 1, 'TaskList', '2019-11-06 11:16:50', '2019-11-06 11:16:50'), - (92, 2, '添加任务', 'task-add', 'quartzController.saveOrUpdateTask', 2, 'TaskList', '2019-11-06 11:17:04', '2019-11-06 11:17:04'), - (93, 2, '编辑任务', 'task-update', 'quartzController.saveOrUpdateTask', 3, 'TaskList', '2019-11-06 11:17:17', '2019-11-06 11:17:17'), - (94, 2, '暂停任务', 'task-pause', 'quartzController.pauseTask', 4, 'TaskList', '2019-11-06 11:17:25', '2019-11-06 11:17:25'), - (95, 2, '恢复任务', 'task-resume', 'quartzController.resumeTask', 5, 'TaskList', '2019-11-06 11:17:31', '2019-11-06 11:17:31'), - (96, 2, '立即运行任务', 'task-run', 'quartzController.runTask', 6, 'TaskList', '2019-11-06 11:17:38', '2019-11-06 11:17:38'), - (97, 2, '查看任务日志', 'task-query-log', 'quartzController.queryLog', 7, 'TaskList', '2019-11-06 11:17:47', '2019-11-06 11:17:47'), - (98, 2, '删除任务', 'task-delete', 'quartzController.deleteTask', 8, 'TaskList', '2019-11-06 11:17:53', '2019-11-06 11:17:53'), - (99, 2, '查询', 'smart-reload-search', 'smartReloadController.listAllReloadItem', 0, 'SmartReloadList', '2019-11-06 11:18:06', '2019-11-06 11:18:06'), - (100, 2, '执行reload', 'smart-reload-update', 'smartReloadController.updateByTag', 1, 'SmartReloadList', '2019-11-06 11:18:14', '2019-11-06 11:18:14'), - (101, 2, '查看执行结果', 'smart-reload-result', 'smartReloadController.queryReloadResult', 2, 'SmartReloadList', '2019-11-06 11:18:19', '2019-11-06 11:18:19'), - (102, 2, '查询任务', 'heart-beat-query', 'heartBeatController.query', 0, 'HeartBeatList', '2019-11-06 11:18:38', '2019-11-06 11:18:38'), - (103, 2, '查询', 'file-filePage-query', 'fileController.queryListByPage,fileController.localGetFile,fileController.downLoadById', 0, 'FileList', '2019-11-06 11:19:06', '2019-11-06 11:19:06'), - (104, 2, '上传', 'file-filePage-upload', 'fileController.qiNiuUpload,fileController.localUpload,fileController.aliYunUpload,fileController.saveFile', 1, 'FileList', '2019-11-06 11:19:36', '2019-11-06 11:19:36'), - (105, 2, '下载', 'file-filePage-download', 'fileController.downLoadById', 2, 'FileList', '2019-11-16 10:05:02', '2019-11-16 10:05:02'), - (106, 1, '业务功能', 'Business', '/business', 0, NULL, '2020-12-14 15:16:26', '2020-12-14 15:16:26'), - (107, 1, '牡丹管理', 'Peony', '/peony', 1, 'Business', '2020-12-14 15:16:26', '2020-12-14 15:16:26'), - (108, 1, '牡丹花列表', 'PeonyList', '/peony/peony-list', 2, 'Peony', '2020-12-14 15:16:26', '2020-12-14 15:16:26'), - (109, 1, '牡丹花列表1', 'PeonyList1', '/peony/peony-list1', 3, 'Peony', '2020-12-14 15:16:26', '2020-12-14 15:16:26'), - (110, 1, '消息详情', 'NoticeDetail', '/notice/notice-detail', 13, 'Notice', '2020-12-14 15:16:26', '2020-12-14 15:16:26'), - (111, 1, '三级菜单子颗粒', 'ThreeLevelRouterView', '/three-router/level-two/level-three1', 16, 'LevelTwo', '2020-12-14 15:16:26', '2020-12-14 15:16:26'), - (112, 1, '系统设置', 'System', '/system', 19, NULL, '2020-12-14 15:16:26', '2020-12-14 15:16:26'), - (113, 1, '开发专用', 'Support', '/support', 32, NULL, '2020-12-14 15:16:26', '2020-12-14 15:16:26'), - (114, 2, '查询', 'peony-list-query', '', 1, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), - (115, 2, '新增', 'peony-list-add', '', 2, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), - (116, 2, '编辑', 'peony-list-update', '', 3, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), - (117, 2, '批量删除', 'peony-list-batch-delete', '', 4, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), - (118, 2, '批量导出', 'peony-list-batch-export', '', 5, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), - (119, 2, '导出全部', 'peony-list-export-all', '', 6, 'PeonyList', '2020-12-14 15:16:30', '2020-12-14 15:16:30'), - (120, 2, '查询', 'peony1-list-query', '', 1, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), - (121, 2, '新增', 'peony1-list-add', '', 2, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), - (122, 2, '编辑', 'peony1-list-update', '', 3, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), - (123, 2, '批量删除', 'peony1-list-batch-delete', '', 4, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), - (124, 2, '批量导出', 'peony1-list-batch-export', '', 5, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), - (125, 2, '导出全部', 'peony1-list-export-all', '', 6, 'PeonyList1', '2020-12-14 15:16:33', '2020-12-14 15:16:33'), - (126, 2, '批量保存功能点', 'privilege-batch-save-points', 'privilegeController.functionSaveOrUpdate', 1, 'SystemPrivilege', '2020-12-14 15:17:11', '2020-12-14 15:17:11'); -/*!40000 ALTER TABLE `t_privilege` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_quartz_task 结构 -DROP TABLE IF EXISTS `t_quartz_task`; -CREATE TABLE IF NOT EXISTS `t_quartz_task` ( - `id` int NOT NULL AUTO_INCREMENT, - `task_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务名称', - `task_bean` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'spring bean名称', - `task_params` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '任务参数', - `task_cron` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '运行cron表达式', - `task_status` tinyint NOT NULL DEFAULT '0' COMMENT '任务状态0:正常,1:暂停', - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- 正在导出表 smart-admin-dev.t_quartz_task 的数据:~5 rows (大约) -DELETE FROM `t_quartz_task`; -/*!40000 ALTER TABLE `t_quartz_task` DISABLE KEYS */; -INSERT INTO `t_quartz_task` (`id`, `task_name`, `task_bean`, `task_params`, `task_cron`, `task_status`, `remark`, `update_time`, `create_time`) VALUES - (9, '2312332', 'exampleTask', '21314', '*/5 * * * * ?', 1, NULL, '2019-09-06 14:41:55', '2019-04-19 15:24:26'), - (13, '567', 'exampleTask', 'ads', '*/5 * * * * ?', 1, NULL, '2019-09-04 16:37:25', '2019-04-23 15:32:17'), - (21, '11', 'exampleTask', '11', '*/5 * * * * ?', 1, NULL, '2019-09-04 16:37:30', '2019-04-26 17:29:21'), - (22, '33', 'exampleTask', '333', '*/5 * * * * ?', 1, NULL, '2019-04-26 17:29:36', '2019-04-26 17:29:36'), - (23, '1', 'exampleTask', '3', '*/5 * * * * ?', 0, NULL, '2019-09-05 17:21:12', '2019-04-26 17:29:50'); -/*!40000 ALTER TABLE `t_quartz_task` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_quartz_task_log 结构 -DROP TABLE IF EXISTS `t_quartz_task_log`; -CREATE TABLE IF NOT EXISTS `t_quartz_task_log` ( - `id` int NOT NULL AUTO_INCREMENT, - `task_id` int NOT NULL COMMENT '任务id', - `task_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务名称', - `task_params` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '任务参数', - `process_status` tinyint NOT NULL COMMENT '任务处理状态0:成功,1:失败', - `process_duration` bigint NOT NULL DEFAULT '0' COMMENT '运行时长', - `process_log` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '日志', - `ip_address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运行主机ip', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=732881 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- 正在导出表 smart-admin-dev.t_quartz_task_log 的数据:~11 rows (大约) -DELETE FROM `t_quartz_task_log`; -/*!40000 ALTER TABLE `t_quartz_task_log` DISABLE KEYS */; -INSERT INTO `t_quartz_task_log` (`id`, `task_id`, `task_name`, `task_params`, `process_status`, `process_duration`, `process_log`, `ip_address`, `update_time`, `create_time`) VALUES - (732870, 9, '231233', '2131', 0, 5, NULL, '127.0.0.1', '2019-05-05 15:28:01', '2019-05-05 15:28:01'), - (732871, 9, '231233', '2131', 0, 32, NULL, '172.16.0.145', '2019-05-05 15:54:40', '2019-05-05 15:54:40'), - (732872, 22, '33', '333', 0, 31, NULL, '172.16.0.145', '2019-05-07 16:20:31', '2019-05-07 16:20:31'), - (732873, 9, '231233', '2131', 0, 304, NULL, '172.16.0.145', '2019-08-02 09:29:36', '2019-08-02 09:29:36'), - (732874, 9, '231233', '2131', 0, 24, NULL, '172.16.0.145', '2019-08-08 16:48:49', '2019-08-08 16:48:49'), - (732875, 9, '231233', '2131', 0, 147, NULL, '172.16.0.145', '2019-08-23 09:41:08', '2019-08-23 09:41:08'), - (732876, 9, '231233', '2131', 0, 610, NULL, '172.16.0.145', '2019-08-26 16:16:34', '2019-08-26 16:16:34'), - (732877, 9, '2312332', '2131', 0, 27, NULL, '172.16.0.145', '2019-09-05 14:34:51', '2019-09-05 14:34:51'), - (732878, 9, '2312332', '2131', 0, 5, NULL, '172.16.0.145', '2019-09-05 17:18:17', '2019-09-05 17:18:17'), - (732879, 9, '2312332', '2131', 0, 1, NULL, '172.16.0.145', '2019-09-05 17:20:15', '2019-09-05 17:20:15'), - (732880, 9, '2312332', '2131', 0, 5, NULL, '172.16.0.145', '2019-09-06 14:42:04', '2019-09-06 14:42:04'); -/*!40000 ALTER TABLE `t_quartz_task_log` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_reload_item 结构 -DROP TABLE IF EXISTS `t_reload_item`; -CREATE TABLE IF NOT EXISTS `t_reload_item` ( - `tag` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '项名称', - `args` varchar(255) DEFAULT NULL COMMENT '参数 可选', - `identification` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '运行标识', - `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`tag`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- 正在导出表 smart-admin-dev.t_reload_item 的数据:~0 rows (大约) -DELETE FROM `t_reload_item`; -/*!40000 ALTER TABLE `t_reload_item` DISABLE KEYS */; -INSERT INTO `t_reload_item` (`tag`, `args`, `identification`, `update_time`, `create_time`) VALUES - ('system_config', '234', 'xxxx', '2019-11-14 16:46:21', '2019-04-18 11:48:27'); -/*!40000 ALTER TABLE `t_reload_item` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_reload_result 结构 -DROP TABLE IF EXISTS `t_reload_result`; -CREATE TABLE IF NOT EXISTS `t_reload_result` ( - `tag` varchar(255) NOT NULL, - `identification` varchar(255) NOT NULL COMMENT '运行标识', - `args` varchar(255) DEFAULT NULL, - `result` tinyint unsigned NOT NULL COMMENT '是否成功 ', - `exception` text, - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- 正在导出表 smart-admin-dev.t_reload_result 的数据:~127 rows (大约) -DELETE FROM `t_reload_result`; -/*!40000 ALTER TABLE `t_reload_result` DISABLE KEYS */; -INSERT INTO `t_reload_result` (`tag`, `identification`, `args`, `result`, `exception`, `create_time`) VALUES - ('system_config', '23', '', 1, NULL, '2019-09-07 17:26:04'), - ('system_config', '23', '', 1, NULL, '2019-09-07 17:28:16'), - ('system_config', '23', '', 1, NULL, '2019-09-07 17:35:39'), - ('system_config', '23', '', 1, NULL, '2019-09-07 17:42:58'), - ('system_config', '23', '', 1, NULL, '2019-09-09 08:30:13'), - ('system_config', '23', '', 1, NULL, '2019-09-11 10:38:19'), - ('system_config', '23', '', 1, NULL, '2019-09-11 10:42:46'), - ('system_config', '23', '', 1, NULL, '2019-09-11 10:49:27'), - ('system_config', '23', '', 1, NULL, '2019-09-11 11:09:10'), - ('system_config', '23', '', 1, NULL, '2019-09-11 11:10:06'), - ('system_config', '23', '', 1, NULL, '2019-09-11 11:18:17'), - ('system_config', '23', '', 1, NULL, '2019-09-11 11:41:18'), - ('system_config', '23', '', 1, NULL, '2019-09-11 11:45:41'), - ('system_config', '23', '', 1, NULL, '2019-09-11 11:46:37'), - ('system_config', '23', '', 1, NULL, '2019-09-11 11:50:35'), - ('system_config', '23', '', 1, NULL, '2019-09-11 14:55:00'), - ('system_config', '23', '', 1, NULL, '2019-09-11 15:26:19'), - ('system_config', '23', '', 1, NULL, '2019-09-11 15:35:51'), - ('system_config', '23', '', 1, NULL, '2019-09-11 15:36:19'), - ('system_config', '23', '', 1, NULL, '2019-09-11 15:36:53'), - ('system_config', '23', '', 1, NULL, '2019-09-11 15:37:58'), - ('system_config', '23', '', 1, NULL, '2019-09-11 15:41:37'), - ('system_config', '23', '', 1, NULL, '2019-09-16 10:12:29'), - ('system_config', '23', '', 1, NULL, '2019-09-20 17:14:08'), - ('system_config', '23', '', 1, NULL, '2019-09-20 17:18:24'), - ('system_config', '23', '', 1, NULL, '2019-09-20 17:23:07'), - ('system_config', '23', '', 1, NULL, '2019-09-20 17:24:17'), - ('system_config', '23', '', 1, NULL, '2019-09-20 17:30:17'), - ('system_config', '23', '', 1, NULL, '2019-09-20 17:31:40'), - ('system_config', '23', '', 1, NULL, '2019-09-20 17:32:34'), - ('system_config', '23', '', 1, NULL, '2019-09-20 17:52:31'), - ('system_config', '23', '', 1, NULL, '2019-09-20 17:55:10'), - ('system_config', '23', '', 1, NULL, '2019-09-20 17:55:47'), - ('system_config', '23', '', 1, NULL, '2019-09-20 17:58:49'), - ('system_config', '23', '', 1, NULL, '2019-09-21 10:53:47'), - ('system_config', '23', '', 1, NULL, '2019-09-22 18:24:21'), - ('system_config', '23', '', 1, NULL, '2019-09-24 09:04:42'), - ('system_config', '23', '', 1, NULL, '2019-10-15 11:06:12'), - ('system_config', '23', '', 1, NULL, '2019-10-15 11:22:10'), - ('system_config', '23', '', 1, NULL, '2019-10-15 16:42:16'), - ('system_config', '23', '', 1, NULL, '2019-10-19 15:18:54'), - ('system_config', '23', '', 1, NULL, '2019-10-19 16:50:10'), - ('system_config', '23', '', 1, NULL, '2019-10-21 15:52:25'), - ('system_config', '23', '', 1, NULL, '2019-10-23 10:24:38'), - ('system_config', '23', '', 1, NULL, '2019-10-23 10:28:45'), - ('system_config', '23', '', 1, NULL, '2019-10-23 16:35:45'), - ('system_config', '23', '', 1, NULL, '2019-10-23 16:38:48'), - ('system_config', '23', '', 1, NULL, '2019-10-25 08:52:22'), - ('system_config', '23', '', 1, NULL, '2019-10-28 16:04:30'), - ('system_config', '23', '', 1, NULL, '2019-10-30 19:59:24'), - ('system_config', '23', '', 1, NULL, '2019-10-31 14:29:26'), - ('system_config', '23', '', 1, NULL, '2019-10-31 14:35:38'), - ('system_config', '23', '', 1, NULL, '2019-10-31 15:58:39'), - ('system_config', '23', '', 1, NULL, '2019-10-31 17:34:48'), - ('system_config', '23', '', 1, NULL, '2019-11-01 11:23:26'), - ('system_config', '23', '', 1, NULL, '2019-11-01 14:55:34'), - ('system_config', '23', '', 1, NULL, '2019-11-02 08:49:44'), - ('system_config', '23', '', 1, NULL, '2019-11-02 09:40:52'), - ('system_config', '23', '', 1, NULL, '2019-11-02 09:42:48'), - ('system_config', '23', '', 1, NULL, '2019-11-02 09:47:38'), - ('system_config', '23', '', 1, NULL, '2019-11-02 09:50:57'), - ('system_config', '23', '', 1, NULL, '2019-11-02 09:51:32'), - ('system_config', '23', '', 1, NULL, '2019-11-02 09:51:48'), - ('system_config', '23', '', 1, NULL, '2019-11-02 15:48:21'), - ('system_config', '23', '', 1, NULL, '2019-11-02 20:48:44'), - ('system_config', '23', '', 1, NULL, '2019-11-02 21:27:50'), - ('system_config', '23', '', 1, NULL, '2019-11-03 22:10:32'), - ('system_config', '23', '', 1, NULL, '2019-11-03 22:10:32'), - ('system_config', '23', '', 1, NULL, '2019-11-04 09:10:24'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-05 10:24:51'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 11:22:42'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 11:25:54'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 11:27:04'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 11:28:00'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 11:34:06'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 11:34:43'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 11:53:11'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 11:56:05'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 13:52:39'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 15:29:29'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 16:05:36'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 16:06:13'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 16:13:22'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 16:19:38'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 16:21:37'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-06 16:22:23'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-08 08:50:08'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-08 13:37:34'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-09 08:35:08'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-09 08:54:38'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-09 09:00:32'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-09 09:01:24'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-09 09:24:16'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-09 09:26:46'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-09 09:43:13'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-09 09:44:48'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-09 10:28:30'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-09 11:24:19'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-11 09:40:42'), - ('system_config', '23', '4234234', 1, NULL, '2019-11-13 17:25:42'), - ('system_config', '23343', '2423', 1, NULL, '2019-11-13 20:29:19'), - ('system_config', '23343', '2423', 1, NULL, '2019-11-13 20:29:23'), - ('system_config', '23343', '234', 1, NULL, '2019-11-14 11:43:57'), - ('system_config', '23343', '234', 1, NULL, '2019-11-14 11:50:18'), - ('system_config', '23343', '234', 1, NULL, '2019-11-14 11:51:13'), - ('system_config', '23343', '234', 1, NULL, '2019-11-14 11:52:03'), - ('system_config', '23343', '234', 1, NULL, '2019-11-14 11:53:02'), - ('system_config', '23343', '234', 1, NULL, '2019-11-14 13:49:11'), - ('system_config', '23343', '234', 1, NULL, '2019-11-14 13:51:05'), - ('system_config', '23343', '234', 1, NULL, '2019-11-14 13:53:53'), - ('system_config', '23343', '234', 1, NULL, '2019-11-14 13:55:57'), - ('system_config', '23343', '234', 1, NULL, '2019-11-14 16:15:44'), - ('system_config', '23343', '234', 1, NULL, '2019-11-14 16:39:36'), - ('system_config', '23343234234', '234', 1, NULL, '2019-11-14 16:41:05'), - ('system_config', '23343234234', '234', 1, NULL, '2019-11-14 16:41:05'), - ('system_config', 'aaaa', '234', 1, NULL, '2019-11-14 16:41:20'), - ('system_config', 'aaaa', '234', 1, NULL, '2019-11-14 16:41:25'), - ('system_config', '111', '234', 1, NULL, '2019-11-14 16:43:20'), - ('system_config', '111', '234', 1, NULL, '2019-11-14 16:44:13'), - ('system_config', 'xxxx', '234', 1, NULL, '2019-11-14 16:46:26'), - ('system_config', 'xxxx', '234', 1, NULL, '2019-11-14 16:46:39'), - ('system_config', 'xxxx', '234', 1, NULL, '2019-11-14 16:48:47'), - ('system_config', 'xxxx', '234', 1, NULL, '2019-11-15 14:39:55'), - ('system_config', 'xxxx', '234', 1, NULL, '2019-11-16 08:47:43'), - ('system_config', 'xxxx', '234', 1, NULL, '2019-11-16 17:12:10'), - ('system_config', 'xxxx', '234', 1, NULL, '2019-11-16 18:02:57'), - ('system_config', 'xxxx', '234', 1, NULL, '2020-12-14 15:09:53'), - ('system_config', 'xxxx', '234', 1, NULL, '2020-12-14 15:13:33'), - ('system_config', 'xxxx', '234', 1, NULL, '2020-12-14 15:14:09'), - ('system_config', 'xxxx', '234', 1, NULL, '2020-12-14 15:16:23'); -/*!40000 ALTER TABLE `t_reload_result` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_role 结构 -DROP TABLE IF EXISTS `t_role`; -CREATE TABLE IF NOT EXISTS `t_role` ( - `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', - `role_name` varchar(20) NOT NULL COMMENT '角色名称', - `remark` varchar(255) DEFAULT NULL COMMENT '角色描述', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=50 DEFAULT CHARSET=utf8 COMMENT='角色表'; - --- 正在导出表 smart-admin-dev.t_role 的数据:~14 rows (大约) -DELETE FROM `t_role`; -/*!40000 ALTER TABLE `t_role` DISABLE KEYS */; -INSERT INTO `t_role` (`id`, `role_name`, `remark`, `update_time`, `create_time`) VALUES - (1, '管理员', '', '2019-06-21 12:09:34', '2019-06-21 12:09:34'), - (34, '销售', '', '2019-08-30 09:30:50', '2019-08-30 09:30:50'), - (35, '总经理', '', '2019-08-30 09:31:05', '2019-08-30 09:31:05'), - (36, '董事长', '', '2019-08-30 09:31:11', '2019-08-30 09:31:11'), - (37, '财务', '', '2019-08-30 09:31:16', '2019-08-30 09:31:16'), - (38, '运营', '', '2019-08-30 09:31:22', '2019-08-30 09:31:22'), - (40, '测试角色1', '测试角色1', '2019-09-05 15:05:38', '2019-09-05 15:05:38'), - (41, '测试角色2', '测试角色2', '2019-09-05 15:05:43', '2019-09-05 15:05:43'), - (42, '测试角色3', '测试角色3', '2019-09-05 15:05:49', '2019-09-05 15:05:49'), - (43, '测试角色4', '测试角色4', '2019-09-05 15:05:56', '2019-09-05 15:05:56'), - (45, '测试角色6', '测试角色6', '2019-09-05 15:06:06', '2019-09-05 15:06:06'), - (46, '测试角色7', '测试角色7', '2019-09-05 15:06:18', '2019-09-05 15:06:18'), - (47, '测试角色8', '测试角色8', '2019-09-05 15:06:25', '2019-09-05 15:06:25'), - (48, '测试角色9', '测试角色9', '2019-11-15 17:06:11', '2019-09-05 15:06:30'); -/*!40000 ALTER TABLE `t_role` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_role_data_scope 结构 -DROP TABLE IF EXISTS `t_role_data_scope`; -CREATE TABLE IF NOT EXISTS `t_role_data_scope` ( - `id` int NOT NULL AUTO_INCREMENT, - `data_scope_type` int NOT NULL COMMENT '数据范围id', - `view_type` int NOT NULL COMMENT '数据范围类型', - `role_id` int NOT NULL COMMENT '角色id', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- 正在导出表 smart-admin-dev.t_role_data_scope 的数据:~4 rows (大约) -DELETE FROM `t_role_data_scope`; -/*!40000 ALTER TABLE `t_role_data_scope` DISABLE KEYS */; -INSERT INTO `t_role_data_scope` (`id`, `data_scope_type`, `view_type`, `role_id`, `update_time`, `create_time`) VALUES - (5, 0, 2, 9, '2019-04-29 15:01:04', '2019-04-29 15:01:04'), - (14, 0, 2, 40, '2019-09-05 15:25:37', '2019-09-05 15:25:37'), - (15, 0, 0, 1, '2019-09-06 08:35:45', '2019-09-06 08:35:45'), - (16, 0, 3, 34, '2019-11-06 16:08:02', '2019-11-06 16:08:02'); -/*!40000 ALTER TABLE `t_role_data_scope` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_role_employee 结构 -DROP TABLE IF EXISTS `t_role_employee`; -CREATE TABLE IF NOT EXISTS `t_role_employee` ( - `id` int NOT NULL AUTO_INCREMENT, - `role_id` int NOT NULL COMMENT '角色id', - `employee_id` int NOT NULL COMMENT '员工id', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=214 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色员工功能表'; - --- 正在导出表 smart-admin-dev.t_role_employee 的数据:~25 rows (大约) -DELETE FROM `t_role_employee`; -/*!40000 ALTER TABLE `t_role_employee` DISABLE KEYS */; -INSERT INTO `t_role_employee` (`id`, `role_id`, `employee_id`, `update_time`, `create_time`) VALUES - (121, 38, 22, '2019-09-04 09:23:09', '2019-09-04 09:23:09'), - (130, 1, 30, '2019-09-05 15:32:40', '2019-09-05 15:32:40'), - (131, 1, 17, '2019-09-05 15:32:40', '2019-09-05 15:32:40'), - (132, 1, 26, '2019-09-05 15:32:40', '2019-09-05 15:32:40'), - (135, 1, 12, '2019-09-05 15:32:40', '2019-09-05 15:32:40'), - (136, 1, 11, '2019-09-05 15:32:40', '2019-09-05 15:32:40'), - (137, 1, 16, '2019-09-05 15:32:40', '2019-09-05 15:32:40'), - (138, 1, 18, '2019-09-05 15:32:40', '2019-09-05 15:32:40'), - (139, 1, 19, '2019-09-05 15:32:40', '2019-09-05 15:32:40'), - (140, 1, 20, '2019-09-05 15:32:40', '2019-09-05 15:32:40'), - (141, 1, 23, '2019-09-05 15:32:40', '2019-09-05 15:32:40'), - (147, 1, 35, '2019-09-06 09:00:27', '2019-09-06 09:00:27'), - (148, 40, 35, '2019-09-06 09:00:27', '2019-09-06 09:00:27'), - (165, 40, 32, '2019-11-08 10:39:35', '2019-11-08 10:39:35'), - (166, 34, 32, '2019-11-08 10:39:35', '2019-11-08 10:39:35'), - (167, 38, 32, '2019-11-08 10:39:35', '2019-11-08 10:39:35'), - (168, 38, 36, '2019-11-08 10:40:16', '2019-11-08 10:40:16'), - (169, 40, 36, '2019-11-08 10:40:16', '2019-11-08 10:40:16'), - (170, 37, 36, '2019-11-08 10:40:16', '2019-11-08 10:40:16'), - (174, 38, 37, '2019-11-08 11:05:39', '2019-11-08 11:05:39'), - (175, 42, 37, '2019-11-08 11:05:39', '2019-11-08 11:05:39'), - (188, 1, 1, '2019-11-15 16:05:33', '2019-11-15 16:05:33'), - (211, 40, 38, '2019-11-15 16:54:54', '2019-11-15 16:54:54'), - (212, 34, 29, '2019-11-16 18:04:04', '2019-11-16 18:04:04'), - (213, 45, 29, '2019-11-16 18:04:04', '2019-11-16 18:04:04'); -/*!40000 ALTER TABLE `t_role_employee` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_role_privilege 结构 -DROP TABLE IF EXISTS `t_role_privilege`; -CREATE TABLE IF NOT EXISTS `t_role_privilege` ( - `id` int NOT NULL AUTO_INCREMENT, - `role_id` int NOT NULL COMMENT '角色id', - `privilege_key` varchar(1000) NOT NULL COMMENT '权限key', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=10835 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色权限功能表'; - --- 正在导出表 smart-admin-dev.t_role_privilege 的数据:~322 rows (大约) -DELETE FROM `t_role_privilege`; -/*!40000 ALTER TABLE `t_role_privilege` DISABLE KEYS */; -INSERT INTO `t_role_privilege` (`id`, `role_id`, `privilege_key`, `update_time`, `create_time`) VALUES - (3506, 48, 'search-position', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3507, 48, 'add-position', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3508, 48, 'update-position', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3509, 48, 'delete-position', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3510, 48, 'add-role', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3511, 48, 'delete-role', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3512, 48, 'update-role', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3513, 48, 'update-role-privilege', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3514, 48, 'add-employee-role', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3515, 48, 'delete-employee-role', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3516, 48, 'delete-employee-role-batch', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3517, 48, 'search-employee-list', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3518, 48, 'query-data-scope', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3519, 48, 'update-data-scope', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3520, 48, 'add-department', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3521, 48, 'update-department', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3522, 48, 'delete-department', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3523, 48, 'search-department', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3524, 48, 'add-employee', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3525, 48, 'update-employee', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3526, 48, 'delete-employee', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3527, 48, 'disabled-employee', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3528, 48, 'reset-employee-password', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3529, 48, 'set-employee-role', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3530, 48, 'disabled-employee-batch', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3531, 48, 'update-employee-role', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3533, 48, 'system-params-search', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3534, 48, 'system-params-add', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3535, 48, 'system-config-update', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3536, 48, 'system-config-search', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3537, 48, 'privilegeMainSearch', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3538, 48, 'privilegeMainUpdate', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3539, 48, 'task-search', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3540, 48, 'task-refresh', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3541, 48, 'task-add', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3542, 48, 'task-update', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3543, 48, 'task-pause', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3544, 48, 'task-resume', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3545, 48, 'task-run', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3546, 48, 'task-query-log', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3547, 48, 'task-delete', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3548, 48, 'systemCodeVersionsQuery', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3552, 48, 'roleOneTwo-add', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3555, 48, 'apiDocument', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3557, 48, 'reload', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3559, 48, 'smart-reload-search', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3560, 48, 'smart-reload-update', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3561, 48, 'smart-reload-result', '2019-09-06 15:28:07', '2019-09-06 15:28:07'), - (3575, 45, 'task-search', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3576, 45, 'task-refresh', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3577, 45, 'task-add', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3578, 45, 'task-update', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3579, 45, 'task-pause', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3580, 45, 'task-resume', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3581, 45, 'task-run', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3582, 45, 'task-query-log', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3583, 45, 'task-delete', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3586, 45, 'add-role', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3587, 45, 'delete-role', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3588, 45, 'update-role', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3589, 45, 'update-role-privilege', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3590, 45, 'add-employee-role', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3591, 45, 'delete-employee-role', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3592, 45, 'delete-employee-role-batch', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3593, 45, 'search-employee-list', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3594, 45, 'query-data-scope', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3595, 45, 'update-data-scope', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3597, 45, 'search-position', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3598, 45, 'add-position', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3599, 45, 'update-position', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3600, 45, 'delete-position', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3602, 45, 'add-department', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3603, 45, 'set-employee-role', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3604, 45, 'update-department', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3605, 45, 'delete-department', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3606, 45, 'search-department', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3607, 45, 'add-employee', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3608, 45, 'update-employee', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3609, 45, 'disabled-employee', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3610, 45, 'disabled-employee-batch', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3611, 45, 'update-employee-role', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3612, 45, 'delete-employee', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (3613, 45, 'reset-employee-password', '2019-09-06 15:28:17', '2019-09-06 15:28:17'), - (8112, 41, 'SystemSetting', '2019-11-08 11:21:22', '2019-11-08 11:21:22'), - (8113, 41, 'SystemPrivilege', '2019-11-08 11:21:22', '2019-11-08 11:21:22'), - (8114, 41, 'privilege-main-update', '2019-11-08 11:21:22', '2019-11-08 11:21:22'), - (8115, 41, 'privilege-main-search', '2019-11-08 11:21:22', '2019-11-08 11:21:22'), - (8549, 35, 'SystemSetting', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8550, 35, 'SystemConfig', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8551, 35, 'SystemPrivilege', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8552, 35, 'Notice', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8553, 35, 'NoticeList', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8554, 35, 'PersonNotice', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8555, 35, 'Email', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8556, 35, 'EmailList', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8557, 35, 'UserLog', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8558, 35, 'UserOperateLog', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8559, 35, 'UserLoginLog', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8560, 35, 'system-config-search', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8561, 35, 'privilege-main-update', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8562, 35, 'privilege-main-search', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8563, 35, 'notice-query', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8564, 35, 'notice-add', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8565, 35, 'notice-edit', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8566, 35, 'notice-delete', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8567, 35, 'person-notice-query', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8568, 35, 'person-notice-detail', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8569, 35, 'email-query', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8570, 35, 'email-add', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8571, 35, 'email-update', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8572, 35, 'user-operate-log-search', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8573, 35, 'user-login-log-search', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (8574, 35, 'system-config-update', '2019-11-15 15:47:52', '2019-11-15 15:47:52'), - (9005, 37, 'SystemSetting', '2019-11-15 16:33:09', '2019-11-15 16:33:09'), - (9006, 37, 'SystemConfig', '2019-11-15 16:33:09', '2019-11-15 16:33:09'), - (9007, 37, 'system-params-search', '2019-11-15 16:33:09', '2019-11-15 16:33:09'), - (9008, 37, 'system-params-add', '2019-11-15 16:33:09', '2019-11-15 16:33:09'), - (9009, 37, 'system-config-update', '2019-11-15 16:33:09', '2019-11-15 16:33:09'), - (9368, 34, 'SystemSetting', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9369, 34, 'SystemConfig', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9370, 34, 'SystemPrivilege', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9371, 34, 'system-params-search', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9372, 34, 'system-params-add', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9373, 34, 'privilege-main-search', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9374, 34, 'Task', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9375, 34, 'TaskList', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9376, 34, 'task-search', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9377, 34, 'task-refresh', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9378, 34, 'task-add', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9379, 34, 'task-update', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9380, 34, 'task-pause', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9381, 34, 'task-resume', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9382, 34, 'task-run', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9383, 34, 'task-query-log', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9384, 34, 'task-delete', '2019-11-15 16:45:39', '2019-11-15 16:45:39'), - (9536, 42, 'Task', '2019-11-15 16:50:40', '2019-11-15 16:50:40'), - (9537, 42, 'TaskList', '2019-11-15 16:50:40', '2019-11-15 16:50:40'), - (9538, 42, 'task-search', '2019-11-15 16:50:40', '2019-11-15 16:50:40'), - (9539, 42, 'task-add', '2019-11-15 16:50:40', '2019-11-15 16:50:40'), - (9540, 42, 'task-update', '2019-11-15 16:50:40', '2019-11-15 16:50:40'), - (9541, 42, 'task-query-log', '2019-11-15 16:50:40', '2019-11-15 16:50:40'), - (9674, 38, 'Employee', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9675, 38, 'PositionList', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9676, 38, 'SystemSetting', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9677, 38, 'SystemConfig', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9678, 38, 'Notice', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9679, 38, 'PersonNotice', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9680, 38, 'Email', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9681, 38, 'EmailList', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9682, 38, 'SendMail', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9683, 38, 'Monitor', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9684, 38, 'OnlineUser', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9685, 38, 'Task', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9686, 38, 'TaskList', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9687, 38, 'KeepAlive', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9688, 38, 'KeepAliveContentList', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9689, 38, 'HeartBeat', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9690, 38, 'HeartBeatList', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9691, 38, 'File', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9692, 38, 'FileList', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9693, 38, 'search-position', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9694, 38, 'system-params-search', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9695, 38, 'system-config-update', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9696, 38, 'system-config-search', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9697, 38, 'person-notice-query', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9698, 38, 'person-notice-detail', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9699, 38, 'email-query', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9700, 38, 'email-send', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9701, 38, 'online-user-search', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9702, 38, 'task-search', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9703, 38, 'heart-beat-query', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9704, 38, 'file-filePage-query', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9705, 38, 'file-filePage-upload', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (9706, 38, 'task-refresh', '2019-11-15 16:53:47', '2019-11-15 16:53:47'), - (10585, 40, 'Employee', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10586, 40, 'RoleManage', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10587, 40, 'PositionList', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10588, 40, 'RoleEmployeeManage', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10589, 40, 'SystemSetting', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10590, 40, 'SystemConfig', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10591, 40, 'SystemPrivilege', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10592, 40, 'Notice', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10593, 40, 'NoticeList', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10594, 40, 'PersonNotice', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10595, 40, 'Email', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10596, 40, 'SendMail', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10597, 40, 'Task', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10598, 40, 'TaskList', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10599, 40, 'add-role', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10600, 40, 'delete-role', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10601, 40, 'update-role', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10602, 40, 'update-role-privilege', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10603, 40, 'add-employee-role', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10604, 40, 'search-employee-list', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10605, 40, 'delete-employee-role', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10606, 40, 'delete-employee-role-batch', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10607, 40, 'query-data-scope', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10608, 40, 'update-data-scope', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10609, 40, 'search-position', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10610, 40, 'add-position', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10611, 40, 'update-position', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10612, 40, 'search-department', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10613, 40, 'system-params-add', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10614, 40, 'system-config-search', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10615, 40, 'privilege-main-search', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10616, 40, 'notice-query', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10617, 40, 'notice-add', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10618, 40, 'notice-edit', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10619, 40, 'notice-delete', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10620, 40, 'notice-detail', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10621, 40, 'notice-send', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10622, 40, 'person-notice-query', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10623, 40, 'email-send', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10624, 40, 'task-search', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10625, 40, 'task-refresh', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10626, 40, 'task-add', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10627, 40, 'task-update', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10628, 40, 'task-query-log', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10629, 40, 'task-delete', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10630, 40, 'delete-department', '2019-11-15 17:19:42', '2019-11-15 17:19:42'), - (10733, 1, 'Employee', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10734, 1, 'RoleManage', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10735, 1, 'PositionList', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10736, 1, 'RoleEmployeeManage', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10737, 1, 'SystemSetting', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10738, 1, 'SystemConfig', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10739, 1, 'SystemPrivilege', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10740, 1, 'Notice', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10741, 1, 'NoticeList', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10742, 1, 'PersonNotice', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10743, 1, 'Email', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10744, 1, 'EmailList', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10745, 1, 'SendMail', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10746, 1, 'UserLog', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10747, 1, 'UserOperateLog', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10748, 1, 'UserLoginLog', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10749, 1, 'Monitor', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10750, 1, 'OnlineUser', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10751, 1, 'Sql', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10752, 1, 'Task', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10753, 1, 'TaskList', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10754, 1, 'Reload', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10755, 1, 'SmartReloadList', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10756, 1, 'ApiDoc', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10757, 1, 'Swagger', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10758, 1, 'ThreeRouter', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10759, 1, 'LevelTwo', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10761, 1, 'RoleTwoTwo', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10762, 1, 'RoleOneOne', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10763, 1, 'KeepAlive', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10764, 1, 'KeepAliveContentList', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10765, 1, 'KeepAliveAddContent', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10766, 1, 'HeartBeat', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10767, 1, 'HeartBeatList', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10768, 1, 'File', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10769, 1, 'FileList', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10770, 1, 'add-role', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10771, 1, 'delete-role', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10772, 1, 'update-role', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10773, 1, 'update-role-privilege', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10774, 1, 'add-employee-role', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10775, 1, 'search-employee-list', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10776, 1, 'delete-employee-role', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10777, 1, 'delete-employee-role-batch', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10778, 1, 'query-data-scope', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10779, 1, 'update-data-scope', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10780, 1, 'search-position', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10781, 1, 'add-position', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10782, 1, 'update-position', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10783, 1, 'delete-position', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10784, 1, 'add-department', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10785, 1, 'update-department', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10786, 1, 'delete-department', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10787, 1, 'search-department', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10788, 1, 'add-employee', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10789, 1, 'update-employee', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10790, 1, 'disabled-employee', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10791, 1, 'disabled-employee-batch', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10792, 1, 'update-employee-role', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10793, 1, 'reset-employee-password', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10794, 1, 'delete-employee', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10795, 1, 'system-params-search', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10796, 1, 'system-params-add', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10797, 1, 'system-config-update', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10798, 1, 'system-config-search', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10799, 1, 'privilege-main-update', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10800, 1, 'privilege-main-search', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10801, 1, 'notice-query', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10802, 1, 'notice-add', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10803, 1, 'notice-edit', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10804, 1, 'notice-delete', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10805, 1, 'notice-detail', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10806, 1, 'notice-send', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10807, 1, 'person-notice-query', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10808, 1, 'person-notice-detail', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10809, 1, 'email-query', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10810, 1, 'email-add', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10811, 1, 'email-update', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10812, 1, 'email-delete', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10813, 1, 'email-send', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10814, 1, 'user-operate-log-search', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10815, 1, 'user-operate-log-detail', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10816, 1, 'user-operate-log-delete', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10817, 1, 'user-login-log-search', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10818, 1, 'user-login-log-delete', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10819, 1, 'online-user-search', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10820, 1, 'task-search', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10821, 1, 'task-refresh', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10822, 1, 'task-add', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10823, 1, 'task-update', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10824, 1, 'task-pause', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10825, 1, 'task-resume', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10826, 1, 'task-run', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10827, 1, 'task-query-log', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10828, 1, 'task-delete', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10829, 1, 'smart-reload-search', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10830, 1, 'smart-reload-update', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10831, 1, 'smart-reload-result', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10832, 1, 'heart-beat-query', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10833, 1, 'file-filePage-query', '2019-11-16 18:04:10', '2019-11-16 18:04:10'), - (10834, 1, 'file-filePage-upload', '2019-11-16 18:04:10', '2019-11-16 18:04:10'); -/*!40000 ALTER TABLE `t_role_privilege` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_system_config 结构 -DROP TABLE IF EXISTS `t_system_config`; -CREATE TABLE IF NOT EXISTS `t_system_config` ( - `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', - `config_name` varchar(255) NOT NULL COMMENT '参数名字', - `config_key` varchar(255) NOT NULL COMMENT '参数key', - `config_value` text NOT NULL, - `config_group` varchar(255) NOT NULL COMMENT '参数类别', - `is_using` int NOT NULL COMMENT '是否使用0 否 1 是', - `remark` varchar(255) DEFAULT NULL, - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '上次修改时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC; - --- 正在导出表 smart-admin-dev.t_system_config 的数据:~8 rows (大约) -DELETE FROM `t_system_config`; -/*!40000 ALTER TABLE `t_system_config` DISABLE KEYS */; -INSERT INTO `t_system_config` (`id`, `config_name`, `config_key`, `config_value`, `config_group`, `is_using`, `remark`, `update_time`, `create_time`) VALUES - (1, '超级管理员', 'employee_superman', '12,13,1', 'employee', 1, '123r8566456', '2019-11-14 16:40:48', '2018-08-18 16:28:03'), - (13, '本地上传URL前缀', 'local_upload_url_prefix', 'http://172.16.0.145/smartAdmin/file/', 'upload', 1, '', '2019-09-04 16:23:49', '2019-04-26 17:06:53'), - (14, '阿里云上传配置', 'ali_oss', '{"accessKeyId":"","accessKeySecret":"","bucketName":"sit","endpoint":"http://oss-cn-beijing.aliyuncs.com"}', 'upload', 1, 'eefwfwfds', '2019-11-16 18:04:30', '2019-05-11 18:00:06'), - (15, '邮件发配置', 'email_config', '{"password":"smartadmin","smtpHost":"smtp.163.com","username":"smartadmin1024@163.com"}', 'email', 1, NULL, '2019-09-04 16:42:17', '2019-05-13 16:57:48'), - (16, '七牛云上传配置', 'qi_niu_oss', '{"accessKeyId":"rX7HgY1ZLpUD25JrA-uwMM_jj-","accessKeySecret":"","bucketName":"sun-smart-admin","endpoint":"http://puvpyay08.bkt.clouddn.com"}', 'upload', 1, NULL, '2019-11-16 18:04:42', '2019-07-19 16:05:56'), - (17, 'test', 'ww_1', 'ewr', '3', 1, 'testoo', '2019-11-08 09:43:36', '2019-11-08 09:27:19'), - (18, '4234', '42342', '423423', '23423', 1, '423423111111111111111111111111111111111111423423111111111111111111111111111111111111423423111111111111111111111111111111111111423423111111111111111111111111111111111111423423111111111111111111111111111111111111', '2019-11-14 14:58:39', '2019-11-14 11:22:49'), - (19, 'test323@', 'test', '123456', '11_', 1, 'gggggg', '2019-11-15 16:24:52', '2019-11-15 16:24:52'); -/*!40000 ALTER TABLE `t_system_config` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_user_login_log 结构 -DROP TABLE IF EXISTS `t_user_login_log`; -CREATE TABLE IF NOT EXISTS `t_user_login_log` ( - `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', - `user_id` int NOT NULL COMMENT '员工id', - `user_name` varchar(50) NOT NULL COMMENT '用户名', - `remote_ip` varchar(50) DEFAULT NULL COMMENT '用户ip', - `remote_port` int DEFAULT NULL COMMENT '用户端口', - `remote_browser` varchar(100) DEFAULT NULL COMMENT '浏览器', - `remote_os` varchar(50) DEFAULT NULL COMMENT '操作系统', - `login_status` tinyint NOT NULL COMMENT '登录状态 0 失败 1成功', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`), - KEY `customer_id` (`user_id`) USING BTREE, - KEY `auditor_id` (`remote_browser`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1743 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户登录日志'; - --- 正在导出表 smart-admin-dev.t_user_login_log 的数据:~122 rows (大约) -DELETE FROM `t_user_login_log`; -/*!40000 ALTER TABLE `t_user_login_log` DISABLE KEYS */; -INSERT INTO `t_user_login_log` (`id`, `user_id`, `user_name`, `remote_ip`, `remote_port`, `remote_browser`, `remote_os`, `login_status`, `update_time`, `create_time`) VALUES - (1501, 30, '耿为刚', '172.16.1.234', 61406, 'Chrome', 'Windows 10', 1, '2019-09-06 14:19:47', '2019-09-06 14:19:47'), - (1502, 30, '耿为刚', '172.16.1.234', 61405, 'Chrome', 'Windows 10', 1, '2019-09-06 14:20:46', '2019-09-06 14:20:46'), - (1503, 30, '耿为刚', '172.16.1.234', 62213, 'Chrome', 'Windows 10', 1, '2019-09-06 14:28:50', '2019-09-06 14:28:50'), - (1505, 30, '耿为刚', '172.16.1.234', 62478, 'Chrome', 'Windows 10', 1, '2019-09-06 14:32:57', '2019-09-06 14:32:57'), - (1506, 1, '管理员', '127.0.0.1', 55613, 'Chrome', 'Windows 10', 1, '2019-09-06 14:35:48', '2019-09-06 14:35:48'), - (1507, 1, '管理员', '172.16.1.234', 63132, 'Chrome', 'Windows 10', 1, '2019-09-06 14:38:43', '2019-09-06 14:38:43'), - (1508, 30, '耿为刚', '172.16.1.234', 63132, 'Chrome', 'Windows 10', 1, '2019-09-06 14:41:36', '2019-09-06 14:41:36'), - (1509, 1, '管理员', '172.16.1.234', 63332, 'Chrome', 'Windows 10', 1, '2019-09-06 14:42:37', '2019-09-06 14:42:37'), - (1511, 1, '管理员', '172.16.1.166', 29923, 'Chrome', 'Windows 10', 1, '2019-09-06 15:09:22', '2019-09-06 15:09:22'), - (1512, 1, '管理员', '172.16.1.113', 58150, 'Chrome', 'Windows 7', 1, '2019-09-06 15:23:31', '2019-09-06 15:23:31'), - (1513, 1, '管理员', '172.16.1.166', 31226, 'Chrome', 'Windows 10', 1, '2019-09-06 15:24:51', '2019-09-06 15:24:51'), - (1514, 1, '管理员', '172.16.1.113', 58300, 'Chrome', 'Windows 7', 1, '2019-09-06 15:25:04', '2019-09-06 15:25:04'), - (1515, 1, '管理员', '172.16.1.113', 58300, 'Chrome', 'Windows 7', 1, '2019-09-06 15:25:26', '2019-09-06 15:25:26'), - (1516, 1, '管理员', '172.16.1.166', 31243, 'Chrome', 'Windows 10', 1, '2019-09-06 15:25:29', '2019-09-06 15:25:29'), - (1517, 1, '管理员', '172.16.1.221', 61458, 'Chrome', 'Windows 10', 1, '2019-09-06 15:27:07', '2019-09-06 15:27:07'), - (1518, 1, '管理员', '172.16.1.166', 31243, 'Chrome', 'Windows 10', 1, '2019-09-06 15:27:09', '2019-09-06 15:27:09'), - (1519, 1, '管理员', '172.16.1.113', 58300, 'Chrome', 'Windows 7', 1, '2019-09-06 15:27:10', '2019-09-06 15:27:10'), - (1520, 1, '管理员', '172.16.1.166', 31551, 'Chrome', 'Windows 10', 1, '2019-09-06 15:30:01', '2019-09-06 15:30:01'), - (1521, 1, '管理员', '172.16.4.160', 50527, 'Chrome', 'Windows 10', 1, '2019-09-06 15:50:20', '2019-09-06 15:50:20'), - (1522, 1, '管理员', '172.16.1.166', 36381, 'Chrome', 'Windows 10', 1, '2019-09-06 16:20:46', '2019-09-06 16:20:46'), - (1523, 1, '管理员', '172.16.1.166', 40039, 'Chrome', 'Windows 10', 1, '2019-09-06 17:02:33', '2019-09-06 17:02:33'), - (1524, 1, '管理员', '172.16.1.166', 41014, 'Chrome', 'Windows 10', 1, '2019-09-06 17:16:09', '2019-09-06 17:16:09'), - (1525, 1, '管理员', '172.16.1.188', 56577, 'Chrome', 'Windows 7', 1, '2019-09-07 08:36:31', '2019-09-07 08:36:31'), - (1526, 1, '管理员', '172.16.1.48', 60852, 'Chrome', 'Windows 10', 1, '2019-09-07 08:45:02', '2019-09-07 08:45:02'), - (1527, 1, '管理员', '172.16.4.85', 4818, 'Chrome', 'Windows 10', 1, '2019-09-07 09:04:44', '2019-09-07 09:04:44'), - (1528, 1, '管理员', '172.16.4.85', 5230, 'Chrome', 'Windows 10', 1, '2019-09-07 09:25:41', '2019-09-07 09:25:41'), - (1529, 1, '管理员', '172.16.1.166', 10251, 'Chrome', 'Windows 10', 1, '2019-09-07 10:15:20', '2019-09-07 10:15:20'), - (1530, 1, '管理员', '172.16.1.48', 63877, 'Chrome', 'Windows 10', 1, '2019-09-07 11:26:19', '2019-09-07 11:26:19'), - (1531, 1, '管理员', '172.16.1.166', 26667, 'Chrome', 'Windows 10', 1, '2019-09-07 14:08:15', '2019-09-07 14:08:15'), - (1532, 1, '管理员', '172.16.4.85', 10604, 'Chrome', 'Windows 10', 1, '2019-09-07 14:08:33', '2019-09-07 14:08:33'), - (1533, 1, '管理员', '172.16.4.85', 10604, 'Chrome', 'Windows 10', 1, '2019-09-07 14:08:50', '2019-09-07 14:08:50'), - (1534, 1, '管理员', '172.16.1.166', 26812, 'Chrome', 'Windows 10', 1, '2019-09-07 14:14:09', '2019-09-07 14:14:09'), - (1535, 1, '管理员', '172.16.1.188', 52924, 'Chrome', 'Windows 7', 1, '2019-09-07 14:37:16', '2019-09-07 14:37:16'), - (1536, 1, '管理员', '172.16.1.188', 56721, 'Chrome', 'Windows 7', 1, '2019-09-07 14:49:37', '2019-09-07 14:49:37'), - (1537, 1, '管理员', '172.16.1.188', 52839, 'Chrome', 'Windows 7', 1, '2019-09-07 15:33:04', '2019-09-07 15:33:04'), - (1538, 1, '管理员', '172.16.1.166', 32489, 'Chrome', 'Windows 10', 1, '2019-09-07 15:48:02', '2019-09-07 15:48:02'), - (1539, 1, '管理员', '172.16.1.166', 32847, 'Chrome', 'Windows 10', 1, '2019-09-07 15:52:25', '2019-09-07 15:52:25'), - (1540, 1, '管理员', '172.16.1.166', 33456, 'Chrome', 'Windows 10', 1, '2019-09-07 16:00:01', '2019-09-07 16:00:01'), - (1541, 1, '管理员', '172.16.1.188', 61015, 'Chrome', 'Windows 7', 1, '2019-09-07 17:05:49', '2019-09-07 17:05:49'), - (1542, 1, '管理员', '127.0.0.1', 51566, 'Chrome', 'Windows 7', 1, '2019-09-07 17:31:20', '2019-09-07 17:31:20'), - (1543, 1, '管理员', '127.0.0.1', 54228, 'Chrome', 'Windows 7', 1, '2019-09-07 17:41:12', '2019-09-07 17:41:12'), - (1544, 1, '管理员', '127.0.0.1', 54957, 'Chrome', 'Windows 7', 1, '2019-09-07 17:43:21', '2019-09-07 17:43:21'), - (1545, 1, '管理员', '172.16.4.85', 2336, 'Chrome', 'Windows 10', 1, '2019-09-07 18:25:51', '2019-09-07 18:25:51'), - (1546, 1, '管理员', '127.0.0.1', 52161, 'Chrome', 'Windows 7', 1, '2019-09-09 08:30:47', '2019-09-09 08:30:47'), - (1547, 1, '管理员', '172.16.4.85', 5903, 'Chrome', 'Windows 10', 1, '2019-09-09 08:47:47', '2019-09-09 08:47:47'), - (1548, 1, '管理员', '172.16.1.243', 55673, 'Chrome', 'Windows 10', 1, '2019-09-09 11:25:02', '2019-09-09 11:25:02'), - (1549, 1, '管理员', '172.16.4.85', 4672, 'Chrome', 'Windows 10', 1, '2019-09-09 11:25:34', '2019-09-09 11:25:34'), - (1550, 1, '管理员', '172.16.1.188', 61186, 'Chrome', 'Windows 7', 1, '2019-09-09 11:39:24', '2019-09-09 11:39:24'), - (1551, 1, '管理员', '172.16.4.85', 3032, 'Chrome', 'Windows 10', 1, '2019-09-09 14:17:53', '2019-09-09 14:17:53'), - (1552, 1, '管理员', '172.16.4.85', 5829, 'Chrome', 'Windows 10', 1, '2019-09-09 14:54:27', '2019-09-09 14:54:27'), - (1553, 1, '管理员', '172.16.1.166', 23398, 'Chrome', 'Windows 10', 1, '2019-09-09 15:06:50', '2019-09-09 15:06:50'), - (1554, 1, '管理员', '172.16.5.60', 61094, 'Chrome', 'Windows 10', 1, '2019-09-09 15:20:50', '2019-09-09 15:20:50'), - (1555, 1, '管理员', '172.16.4.85', 10566, 'Chrome', 'Windows 10', 1, '2019-09-09 15:51:22', '2019-09-09 15:51:22'), - (1556, 1, '管理员', '172.16.1.166', 32190, 'Chrome', 'Windows 10', 1, '2019-09-09 17:00:59', '2019-09-09 17:00:59'), - (1557, 1, '管理员', '172.16.5.60', 54502, 'Chrome', 'Windows 10', 1, '2019-09-10 09:10:48', '2019-09-10 09:10:48'), - (1558, 1, '管理员', '172.16.4.85', 10659, 'Chrome', 'Windows 10', 1, '2019-09-10 09:21:48', '2019-09-10 09:21:48'), - (1559, 1, '管理员', '172.16.4.85', 3363, 'Chrome', 'Windows 10', 1, '2019-09-10 10:56:23', '2019-09-10 10:56:23'), - (1560, 1, '管理员', '172.16.4.85', 4460, 'Chrome', 'Windows 10', 1, '2019-09-10 14:23:44', '2019-09-10 14:23:44'), - (1561, 1, '管理员', '172.16.4.85', 7344, 'Chrome', 'Windows 10', 1, '2019-09-10 14:59:52', '2019-09-10 14:59:52'), - (1562, 1, '管理员', '172.16.5.89', 49996, 'Chrome', 'Windows 10', 1, '2019-09-10 18:08:04', '2019-09-10 18:08:04'), - (1563, 1, '管理员', '172.16.1.38', 50152, 'Chrome', 'Windows 10', 1, '2019-09-11 10:19:27', '2019-09-11 10:19:27'), - (1564, 1, '管理员', '172.16.1.38', 50173, 'Chrome', 'Windows 10', 1, '2019-09-11 10:20:38', '2019-09-11 10:20:38'), - (1565, 1, '管理员', '172.16.4.141', 60881, 'Chrome', 'Windows 10', 1, '2019-09-11 14:52:02', '2019-09-11 14:52:02'), - (1566, 1, '管理员', '172.16.4.93', 52688, 'Chrome', 'Windows 10', 1, '2019-09-11 15:15:14', '2019-09-11 15:15:14'), - (1567, 1, '管理员', '172.16.5.127', 54993, 'Chrome', 'Windows 10', 1, '2019-09-12 14:29:58', '2019-09-12 14:29:58'), - (1568, 1, '管理员', '172.16.5.127', 57424, 'Chrome', 'Windows 10', 1, '2019-09-12 15:26:46', '2019-09-12 15:26:46'), - (1569, 1, '管理员', '172.16.5.127', 58073, 'Chrome', 'Windows 10', 1, '2019-09-12 15:41:54', '2019-09-12 15:41:54'), - (1570, 1, '管理员', '172.16.5.146', 63230, 'Chrome', 'Windows 10', 1, '2019-09-16 10:17:15', '2019-09-16 10:17:15'), - (1571, 1, '管理员', '172.16.5.146', 52857, 'Chrome', 'Windows 10', 1, '2019-09-16 11:17:18', '2019-09-16 11:17:18'), - (1572, 1, '管理员', '172.16.1.190', 64527, 'Chrome', 'Windows 10', 1, '2019-09-19 14:06:45', '2019-09-19 14:06:45'), - (1573, 1, '管理员', '127.0.0.1', 53267, 'Chrome', 'Windows 7', 1, '2019-09-20 17:24:33', '2019-09-20 17:24:33'), - (1574, 1, '管理员', '127.0.0.1', 53267, 'Chrome', 'Windows 7', 1, '2019-09-20 17:24:43', '2019-09-20 17:24:43'), - (1575, 1, '管理员', '127.0.0.1', 53267, 'Chrome', 'Windows 7', 1, '2019-09-20 17:24:59', '2019-09-20 17:24:59'), - (1576, 1, '管理员', '127.0.0.1', 53267, 'Chrome', 'Windows 7', 1, '2019-09-20 17:26:05', '2019-09-20 17:26:05'), - (1577, 1, '管理员', '127.0.0.1', 60612, 'Chrome', 'Windows 7', 1, '2019-09-20 17:56:06', '2019-09-20 17:56:06'), - (1578, 1, '管理员', '172.16.1.202', 58066, 'Chrome', 'Windows 7', 1, '2019-09-22 18:25:03', '2019-09-22 18:25:03'), - (1579, 1, '管理员', '172.16.1.48', 52290, 'Chrome', 'Windows 10', 1, '2019-09-23 16:01:16', '2019-09-23 16:01:16'), - (1580, 1, '管理员', '172.16.4.141', 60997, 'Chrome', 'Windows 10', 1, '2019-09-23 17:16:55', '2019-09-23 17:16:55'), - (1581, 1, '管理员', '172.16.5.146', 53246, 'Chrome', 'Windows 10', 1, '2019-09-23 17:54:14', '2019-09-23 17:54:14'), - (1582, 1, '管理员', '127.0.0.1', 51987, 'Chrome', 'Windows 7', 1, '2019-09-24 09:16:37', '2019-09-24 09:16:37'), - (1583, 1, '管理员', '172.16.1.202', 55724, 'Chrome', 'Windows 7', 1, '2019-09-24 12:57:39', '2019-09-24 12:57:39'), - (1584, 1, '管理员', '172.16.1.166', 51876, 'Chrome', 'Windows 10', 1, '2019-09-24 16:24:37', '2019-09-24 16:24:37'), - (1585, 1, '管理员', '172.16.1.202', 51648, 'Chrome', 'Windows 7', 1, '2019-09-24 19:26:39', '2019-09-24 19:26:39'), - (1586, 1, '管理员', '172.16.1.234', 60984, 'Chrome', 'Windows 10', 1, '2019-09-26 10:52:07', '2019-09-26 10:52:07'), - (1587, 1, '管理员', '172.16.1.234', 63440, 'Chrome', 'Windows 10', 1, '2019-09-26 11:30:54', '2019-09-26 11:30:54'), - (1588, 1, '管理员', '172.16.1.202', 51956, 'Chrome', 'Windows 7', 1, '2019-09-27 20:55:08', '2019-09-27 20:55:08'), - (1589, 1, '管理员', '172.16.1.48', 56166, 'Chrome', 'Windows 10', 1, '2019-09-30 08:59:13', '2019-09-30 08:59:13'), - (1590, 1, '管理员', '172.16.1.202', 51448, 'Chrome', 'Windows 7', 1, '2019-09-30 09:00:13', '2019-09-30 09:00:13'), - (1591, 1, '管理员', '172.16.1.188', 62679, 'Chrome', 'Windows 7', 1, '2019-10-15 11:25:26', '2019-10-15 11:25:26'), - (1592, 1, '管理员', '172.16.1.234', 54034, 'Chrome', 'Windows 10', 1, '2019-10-18 10:47:14', '2019-10-18 10:47:14'), - (1593, 1, '管理员', '172.16.1.234', 64515, 'Chrome', 'Windows 10', 1, '2019-10-18 13:32:10', '2019-10-18 13:32:10'), - (1594, 1, '管理员', '172.16.1.234', 50211, 'Chrome', 'Windows 10', 1, '2019-10-18 13:56:19', '2019-10-18 13:56:19'), - (1595, 1, '管理员', '172.16.1.234', 55469, 'Chrome', 'Windows 10', 1, '2019-10-18 14:56:24', '2019-10-18 14:56:24'), - (1596, 1, '管理员', '172.16.1.234', 56392, 'Chrome', 'Windows 10', 1, '2019-10-18 15:08:25', '2019-10-18 15:08:25'), - (1597, 1, '管理员', '172.16.1.234', 60896, 'Chrome', 'Windows 10', 1, '2019-10-18 16:14:15', '2019-10-18 16:14:15'), - (1598, 1, '管理员', '172.16.1.234', 50590, 'Chrome', 'Windows 10', 1, '2019-10-19 08:38:54', '2019-10-19 08:38:54'), - (1599, 1, '管理员', '172.16.1.166', 4879, 'Chrome', 'Windows 10', 1, '2019-10-19 09:19:08', '2019-10-19 09:19:08'), - (1600, 1, '管理员', '172.16.1.188', 62895, 'Chrome', 'Windows 7', 1, '2019-10-19 13:49:29', '2019-10-19 13:49:29'), - (1601, 1, '管理员', '172.16.1.234', 58144, 'Chrome', 'Windows 10', 1, '2019-10-19 14:55:50', '2019-10-19 14:55:50'), - (1602, 1, '管理员', '127.0.0.1', 61033, 'Chrome', 'Windows 7', 1, '2019-10-19 15:19:38', '2019-10-19 15:19:38'), - (1603, 1, '管理员', '172.16.1.188', 58944, 'Chrome', 'Windows 7', 1, '2019-10-19 16:48:49', '2019-10-19 16:48:49'), - (1604, 1, '管理员', '172.16.1.188', 63950, 'Chrome', 'Windows 7', 1, '2019-10-21 08:10:38', '2019-10-21 08:10:38'), - (1605, 1, '管理员', '172.16.1.188', 64899, 'Chrome', 'Windows 7', 1, '2019-10-21 08:17:40', '2019-10-21 08:17:40'), - (1606, 1, '管理员', '172.16.1.221', 53180, 'Chrome', 'Windows 10', 1, '2019-10-21 15:52:36', '2019-10-21 15:52:36'), - (1607, 1, '管理员', '172.16.1.221', 56067, 'Chrome', 'Windows 10', 1, '2019-10-23 10:19:39', '2019-10-23 10:19:39'), - (1608, 1, '管理员', '172.16.1.221', 57692, 'Chrome', 'Windows 10', 1, '2019-10-23 16:36:39', '2019-10-23 16:36:39'), - (1609, 1, '管理员', '172.16.1.188', 57180, 'Chrome', 'Windows 7', 1, '2019-10-24 08:26:21', '2019-10-24 08:26:21'), - (1610, 1, '管理员', '172.16.0.196', 61409, 'Chrome', 'Windows 10', 1, '2019-10-24 08:26:55', '2019-10-24 08:26:55'), - (1611, 1, '管理员', '172.16.1.234', 51906, 'Chrome', 'Windows 10', 1, '2019-10-24 15:56:50', '2019-10-24 15:56:50'), - (1612, 1, '管理员', '172.16.1.234', 56793, 'Chrome', 'Windows 10', 1, '2019-10-24 17:04:54', '2019-10-24 17:04:54'), - (1613, 30, '耿为刚', '172.16.1.234', 60368, 'Chrome', 'Windows 10', 1, '2019-10-24 17:51:13', '2019-10-24 17:51:13'), - (1614, 1, '管理员', '172.16.1.234', 60368, 'Chrome', 'Windows 10', 1, '2019-10-24 17:51:56', '2019-10-24 17:51:56'), - (1615, 30, '耿为刚', '172.16.1.234', 60589, 'Chrome 65', 'Windows 10', 1, '2019-10-24 17:52:52', '2019-10-24 17:52:52'), - (1616, 1, '管理员', '172.16.1.234', 52998, 'Chrome', 'Windows 10', 1, '2019-10-25 09:28:13', '2019-10-25 09:28:13'), - (1617, 1, '管理员', '172.16.1.234', 54948, 'Chrome', 'Windows 10', 1, '2019-10-25 10:01:34', '2019-10-25 10:01:34'), - (1618, 1, '管理员', '172.16.1.234', 56800, 'Chrome', 'Windows 10', 1, '2019-10-25 10:32:53', '2019-10-25 10:32:53'), - (1619, 1, '管理员', '127.0.0.1', 59071, 'Chrome', 'Windows 7', 1, '2019-10-28 16:05:21', '2019-10-28 16:05:21'), - (1620, 1, '管理员', '127.0.0.1', 60106, 'Chrome', 'Windows 7', 1, '2019-10-28 16:11:29', '2019-10-28 16:11:29'), - (1621, 1, '管理员', '127.0.0.1', 63479, 'Chrome', 'Windows 7', 1, '2019-10-28 16:28:59', '2019-10-28 16:28:59'), - (1622, 1, '管理员', '127.0.0.1', 63479, 'Chrome', 'Windows 7', 1, '2019-10-28 16:29:55', '2019-10-28 16:29:55'), - (1623, 1, '管理员', '127.0.0.1', 57588, 'Chrome', 'Windows 7', 1, '2019-10-29 15:37:03', '2019-10-29 15:37:03'), - (1741, 1, '管理员', '127.0.0.1', 54621, 'Chrome', 'Windows 7', 1, '2019-11-16 18:03:45', '2019-11-16 18:03:45'), - (1742, 1, '管理员', '127.0.0.1', 60932, 'Chrome 8', 'Windows 10', 1, '2020-12-14 15:14:55', '2020-12-14 15:14:55'); -/*!40000 ALTER TABLE `t_user_login_log` ENABLE KEYS */; - --- 导出 表 smart-admin-dev.t_user_operate_log 结构 -DROP TABLE IF EXISTS `t_user_operate_log`; -CREATE TABLE IF NOT EXISTS `t_user_operate_log` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', - `user_id` int NOT NULL COMMENT '用户id', - `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名称', - `module` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作模块', - `content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '操作内容', - `url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '请求路径', - `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '请求方法', - `param` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '请求参数', - `result` tinyint DEFAULT NULL COMMENT '请求结果 0失败 1成功', - `fail_reason` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '失败原因', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=75 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - --- 正在导出表 smart-admin-dev.t_user_operate_log 的数据:~32 rows (大约) -DELETE FROM `t_user_operate_log`; -/*!40000 ALTER TABLE `t_user_operate_log` DISABLE KEYS */; -INSERT INTO `t_user_operate_log` (`id`, `user_id`, `user_name`, `module`, `content`, `url`, `method`, `param`, `result`, `fail_reason`, `update_time`, `create_time`) VALUES - (1, 1, '管理员', '管理端-角色权限', '获取角色可选的功能权限', '/smart-admin-api/privilege/listPrivilegeByRoleId/0', 'com.gangquan360.smartadmin.module.role.roleprivilege.RolePrivilegeController.listPrivilegeByRoleId', 'Long[0]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (2, 1, '管理员', '管理端-角色', '获取所有角色', '/smart-admin-api/role/getAll', 'com.gangquan360.smartadmin.module.role.basic.RoleController.getAllRole', '', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (3, 1, '管理员', '管理端-角色权限', '获取角色可选的功能权限', '/smart-admin-api/privilege/listPrivilegeByRoleId/1', 'com.gangquan360.smartadmin.module.role.roleprivilege.RolePrivilegeController.listPrivilegeByRoleId', 'Long[1]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (4, 1, '管理员', '管理端-岗位', '分页查询所有岗位', '/smart-admin-api/position/getListPage', 'com.gangquan360.smartadmin.module.position.PositionController.getJobPage', 'PositionQueryDTO[{"pageNum":1,"pageSize":10,"positionName":"","searchCount":true,"sort":false}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (5, 1, '管理员', '管理端-角色', '获取所有角色', '/smart-admin-api/role/getAll', 'com.gangquan360.smartadmin.module.role.basic.RoleController.getAllRole', '', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (6, 1, '管理员', '管理端-部门', '根据部门名称查询部门及员工列表', '/smart-admin-api/department/listEmployeeByDepartmentName', 'com.gangquan360.smartadmin.module.department.DepartmentController.listDepartmentEmployee', 'String[""]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (7, 1, '管理员', '管理端-部门', '查询部门及员工列表', '/smart-admin-api/department/listEmployee', 'com.gangquan360.smartadmin.module.department.DepartmentController.listDepartmentEmployee', '', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (8, 1, '管理员', '管理端-用户', '员工管理查询', '/smart-admin-api/employee/query', 'com.gangquan360.smartadmin.module.employee.EmployeeController.query', 'EmployeeQueryDTO[{"isDelete":0,"isDisabled":0,"keyword":"","pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (9, 1, '管理员', '管理端-用户', '员工重置密码', '/smart-admin-api/employee/resetPasswd/29', 'com.gangquan360.smartadmin.module.employee.EmployeeController.resetPasswd', 'Integer[29]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (10, 1, '管理员', '管理端-用户', '员工管理查询', '/smart-admin-api/employee/query', 'com.gangquan360.smartadmin.module.employee.EmployeeController.query', 'EmployeeQueryDTO[{"isDelete":0,"isDisabled":0,"keyword":"","pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (11, 1, '管理员', '管理端-角色用户', '通过员工id获取所有角色以及员工具有的角色', '/smart-admin-api/role/getRoles/29', 'com.gangquan360.smartadmin.module.role.roleemployee.RoleEmployeeController.getRoleByEmployeeId', 'Long[29]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (12, 1, '管理员', '管理端-用户', '单个员工角色授权', '/smart-admin-api/employee/updateRoles', 'com.gangquan360.smartadmin.module.employee.EmployeeController.updateRoles', 'EmployeeUpdateRolesDTO[{"employeeId":29,"roleIds":[34,45]}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (13, 1, '管理员', '管理端-用户', '员工管理查询', '/smart-admin-api/employee/query', 'com.gangquan360.smartadmin.module.employee.EmployeeController.query', 'EmployeeQueryDTO[{"isDelete":0,"isDisabled":0,"keyword":"","pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (14, 1, '管理员', '管理端-角色权限', '更新角色权限', '/smart-admin-api/privilege/updateRolePrivilege', 'com.gangquan360.smartadmin.module.role.roleprivilege.RolePrivilegeController.updateRolePrivilege', 'RolePrivilegeDTO[{"privilegeKeyList":["Employee","RoleManage","PositionList","RoleEmployeeManage","SystemSetting","SystemConfig","SystemPrivilege","Notice","NoticeList","PersonNotice","Email","EmailList","SendMail","UserLog","UserOperateLog","UserLoginLog","Monitor","OnlineUser","Sql","Task","TaskList","Reload","SmartReloadList","ApiDoc","Swagger","ThreeRouter","LevelTwo","RoleOneTwo","RoleTwoTwo","RoleOneOne","KeepAlive","KeepAliveContentList","KeepAliveAddContent","HeartBeat","HeartBeatList","File","FileList","add-role","delete-role","update-role","update-role-privilege","add-employee-role","search-employee-list","delete-employee-role","delete-employee-role-batch","query-data-scope","update-data-scope","search-position","add-position","update-position","delete-position","add-department","update-department","delete-department","search-department","add-employee","update-employee","disabled-employee","disabled-employee-batch","update-employee-role","reset-employee-password","delete-employee","system-params-search","system-params-add","system-config-update","system-config-search","privilege-main-update","privilege-main-search","notice-query","notice-add","notice-edit","notice-delete","notice-detail","notice-send","person-notice-query","person-notice-detail","email-query","email-add","email-update","email-delete","email-send","user-operate-log-search","user-operate-log-detail","user-operate-log-delete","user-login-log-search","user-login-log-delete","online-user-search","task-search","task-refresh","task-add","task-update","task-pause","task-resume","task-run","task-query-log","task-delete","smart-reload-search","smart-reload-update","smart-reload-result","heart-beat-query","file-filePage-query","file-filePage-upload"],"roleId":1}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (15, 1, '管理员', '管理端-角色权限', '获取角色可选的功能权限', '/smart-admin-api/privilege/listPrivilegeByRoleId/1', 'com.gangquan360.smartadmin.module.role.roleprivilege.RolePrivilegeController.listPrivilegeByRoleId', 'Long[1]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (16, 1, '管理员', '管理端-系统配置', '分页查询所有系统配置', '/smart-admin-api/systemConfig/getListPage', 'com.gangquan360.smartadmin.module.systemconfig.SystemConfigController.getSystemConfigPage', 'SystemConfigQueryDTO[{"key":"","pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (17, 1, '管理员', '管理端-系统配置', '修改配置参数', '/smart-admin-api/systemConfig/update', 'com.gangquan360.smartadmin.module.systemconfig.SystemConfigController.updateSystemConfig', 'SystemConfigUpdateDTO[{"configGroup":"upload","configKey":"ali_oss","configName":"阿里云上传配置","configValue":"{\\"accessKeyId\\":\\"\\",\\"accessKeySecret\\":\\"\\",\\"bucketName\\":\\"sit\\",\\"endpoint\\":\\"http://oss-cn-beijing.aliyuncs.com\\"}","id":14,"remark":"eefwfwfds"}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (18, 1, '管理员', '管理端-系统配置', '分页查询所有系统配置', '/smart-admin-api/systemConfig/getListPage', 'com.gangquan360.smartadmin.module.systemconfig.SystemConfigController.getSystemConfigPage', 'SystemConfigQueryDTO[{"key":"","pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (19, 1, '管理员', '管理端-系统配置', '修改配置参数', '/smart-admin-api/systemConfig/update', 'com.gangquan360.smartadmin.module.systemconfig.SystemConfigController.updateSystemConfig', 'SystemConfigUpdateDTO[{"configGroup":"upload","configKey":"qi_niu_oss","configName":"七牛云上传配置","configValue":"{\\"accessKeyId\\":\\"rX7HgY1ZLpUD25JrA-uwMM_jj-\\",\\"accessKeySecret\\":\\"\\",\\"bucketName\\":\\"sun-smart-admin\\",\\"endpoint\\":\\"http://puvpyay08.bkt.clouddn.com\\"}","id":16}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (20, 1, '管理员', '管理端-系统配置', '分页查询所有系统配置', '/smart-admin-api/systemConfig/getListPage', 'com.gangquan360.smartadmin.module.systemconfig.SystemConfigController.getSystemConfigPage', 'SystemConfigQueryDTO[{"key":"","pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (21, 1, '管理员', '通用-权限', '获取所有请求路径', '/smart-admin-api/privilege/getAllUrl', 'com.gangquan360.smartadmin.module.privilege.controller.PrivilegeController.getAllUrl', '', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (22, 1, '管理员', '通用-权限', '查询所有菜单项', '/smart-admin-api/privilege/menu/queryAll', 'com.gangquan360.smartadmin.module.privilege.controller.PrivilegeController.queryAll', '', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (23, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/FileList', 'com.gangquan360.smartadmin.module.privilege.controller.PrivilegeController.functionQuery', 'String["FileList"]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (24, 1, '管理员', '通用-权限', '保存更新功能点', '/smart-admin-api/privilege/function/saveOrUpdate', 'com.gangquan360.smartadmin.module.privilege.controller.PrivilegeController.functionSaveOrUpdate', 'PrivilegeFunctionDTO[{"functionKey":"file-filePage-download","functionName":"下载","menuKey":"FileList","sort":2,"url":"fileController.downLoadById"}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (25, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/FileList', 'com.gangquan360.smartadmin.module.privilege.controller.PrivilegeController.functionQuery', 'String["FileList"]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (26, 1, '管理员', '通用-邮件发送', '分页查询', '/smart-admin-api/email/page/query', 'com.gangquan360.smartadmin.module.email.EmailController.queryByPage', 'EmailQueryDTO[{"endDate":"","pageNum":1,"pageSize":10,"searchCount":true,"startDate":""}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (27, 1, '管理员', '管理端-用户操作日志', '分页查询', '/smart-admin-api/userOperateLog/page/query', 'com.gangquan360.smartadmin.module.log.useroperatelog.UserOperateLogController.queryByPage', 'UserOperateLogQueryDTO[{"endDate":"","pageNum":1,"pageSize":10,"searchCount":true,"sort":false,"startDate":"","userName":""}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (28, 1, '管理员', '管理端-用户登录日志', '分页查询用户登录日志', '/smart-admin-api/userLoginLog/page/query', 'com.gangquan360.smartadmin.module.log.userloginlog.UserLoginLogController.queryByPage', 'UserLoginLogQueryDTO[{"endDate":"","pageNum":1,"pageSize":10,"searchCount":true,"sort":false,"startDate":"","userName":""}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (29, 1, '管理员', '管理端-用户登录日志', '查询员工在线状态', '/smart-admin-api/userOnLine/query', 'com.gangquan360.smartadmin.module.log.userloginlog.UserLoginLogController.queryUserOnLine', 'EmployeeQueryDTO[{"actualName":"","employeeIds":[1],"isDelete":0,"pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (30, 1, '管理员', '管理端-任务调度', '查询任务', '/smart-admin-api/quartz/task/query', 'com.gangquan360.smartadmin.module.quartz.controller.QuartzController.query', 'QuartzQueryDTO[{"pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (31, 1, '管理员', '管理端-smart reload', '获取全部Smart-reload项', '/smart-admin-api/smartReload/all', 'com.gangquan360.smartadmin.module.smartreload.SmartReloadController.listAllReloadItem', '', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (32, 1, '管理员', '通用-心跳服务', '查询心跳记录 @author zhuoda', '/smart-admin-api/heartBeat/query', 'com.gangquan360.smartadmin.module.heartbeat.HeartBeatController.query', 'PageParamDTO[{"pageNum":1,"pageSize":10}]', 1, NULL, '2019-11-01 00:00:00', '2019-11-01 00:00:00'), - (33, 1, '管理员', '通用-权限', '获取所有请求路径', '/smart-admin-api/privilege/getAllUrl', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.getAllUrl', '', 1, NULL, '2020-12-14 15:15:06', '2020-12-14 15:15:06'), - (34, 1, '管理员', '通用-权限', '查询所有菜单项', '/smart-admin-api/privilege/menu/queryAll', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.queryAll', '', 1, NULL, '2020-12-14 15:15:06', '2020-12-14 15:15:06'), - (35, 1, '管理员', '通用-权限', '菜单批量保存', '/smart-admin-api/privilege/menu/batchSaveMenu', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.menuBatchSave', 'ValidateList[[{"menuKey":"Business","menuName":"业务功能","sort":0,"type":1,"url":"/business"},{"menuKey":"Peony","menuName":"牡丹管理","parentKey":"Business","sort":0,"type":1,"url":"/peony"},{"menuKey":"PeonyList","menuName":"牡丹花列表","parentKey":"Peony","sort":0,"type":1,"url":"/peony/peony-list"},{"menuKey":"PeonyList1","menuName":"牡丹花列表1","parentKey":"Peony","sort":0,"type":1,"url":"/peony/peony-list1"},{"menuKey":"Email","menuName":"邮件管理","parentKey":"Business","sort":0,"type":1,"url":"/email"},{"menuKey":"EmailList","menuName":"邮件管理","parentKey":"Email","sort":0,"type":1,"url":"/email/email-list"},{"menuKey":"SendMail","menuName":"发送邮件","parentKey":"Email","sort":0,"type":1,"url":"/email/send-mail"},{"menuKey":"KeepAlive","menuName":"KeepAlive","parentKey":"Business","sort":0,"type":1,"url":"/keep-alive"},{"menuKey":"KeepAliveContentList","menuName":"KeepAlive列表","parentKey":"KeepAlive","sort":0,"type":1,"url":"/keep-alive/content-list"},{"menuKey":"KeepAliveAddContent","menuName":"KeepAlive表单","parentKey":"KeepAlive","sort":0,"type":1,"url":"/keep-alive/add-content"},{"menuKey":"Notice","menuName":"消息管理","parentKey":"Business","sort":0,"type":1,"url":"/notice"},{"menuKey":"NoticeList","menuName":"通知管理","parentKey":"Notice","sort":0,"type":1,"url":"/notice/notice-list"},{"menuKey":"PersonNotice","menuName":"个人消息","parentKey":"Notice","sort":0,"type":1,"url":"/notice/person-notice"},{"menuKey":"NoticeDetail","menuName":"消息详情","parentKey":"Notice","sort":0,"type":1,"url":"/notice/notice-detail"},{"menuKey":"ThreeRouter","menuName":"三级路由","parentKey":"Business","sort":0,"type":1,"url":"/three-router"},{"menuKey":"LevelTwo","menuName":"三级菜单","parentKey":"ThreeRouter","sort":0,"type":1,"url":"/three-router/level-two"},{"menuKey":"ThreeLevelRouterView","menuName":"三级菜单子颗粒","parentKey":"LevelTwo","sort":0,"type":1,"url":"/three-router/level-two/level-three1"},{"menuKey":"RoleTwoTwo","menuName":"三级菜单子哈","parentKey":"LevelTwo","sort":0,"type":1,"url":"/three-router/level-two/level-three2"},{"menuKey":"RoleOneOne","menuName":"二级菜单","parentKey":"ThreeRouter","sort":0,"type":1,"url":"/three-router/level-two2"},{"menuKey":"System","menuName":"系统设置","sort":0,"type":1,"url":"/system"},{"menuKey":"Employee","menuName":"人员管理","parentKey":"System","sort":0,"type":1,"url":"/employee"},{"menuKey":"RoleManage","menuName":"角色管理","parentKey":"Employee","sort":0,"type":1,"url":"/employee/role"},{"menuKey":"PositionList","menuName":"岗位管理","parentKey":"Employee","sort":0,"type":1,"url":"/employee/position"},{"menuKey":"RoleEmployeeManage","menuName":"员工管理","parentKey":"Employee","sort":0,"type":1,"url":"/employee/role-employee-manage"},{"menuKey":"File","menuName":"文件服务","parentKey":"System","sort":0,"type":1,"url":"/file"},{"menuKey":"FileList","menuName":"文件列表","parentKey":"File","sort":0,"type":1,"url":"/file/file-list"},{"menuKey":"UserLog","menuName":"用户日志","parentKey":"System","sort":0,"type":1,"url":"/user-log"},{"menuKey":"UserOperateLog","menuName":"用户操作日志","parentKey":"UserLog","sort":0,"type":1,"url":"/user-log/user-operate-log"},{"menuKey":"UserLoginLog","menuName":"用户登录日志","parentKey":"UserLog","sort":0,"type":1,"url":"/user-log/user-login-log"},{"menuKey":"SystemSetting","menuName":"系统设置","parentKey":"System","sort":0,"type":1,"url":"/system-setting"},{"menuKey":"SystemConfig","menuName":"系统参数","parentKey":"SystemSetting","sort":0,"type":1,"url":"/system-setting/system-config"},{"menuKey":"SystemPrivilege","menuName":"菜单设置","parentKey":"SystemSetting","sort":0,"type":1,"url":"/system-setting/system-privilege"},{"menuKey":"Support","menuName":"开发专用","sort":0,"type":1,"url":"/support"},{"menuKey":"ApiDoc","menuName":"接口文档","parentKey":"Support","sort":0,"type":1,"url":"/api-doc"},{"menuKey":"Swagger","menuName":"Swagger接口文档","parentKey":"ApiDoc","sort":0,"type":1,"url":"/api-doc/swagger"},{"menuKey":"HeartBeat","menuName":"心跳服务","parentKey":"Support","sort":0,"type":1,"url":"/heart-beat"},{"menuKey":"HeartBeatList","menuName":"心跳服务","parentKey":"HeartBeat","sort":0,"type":1,"url":"/heart-beat/heart-beat-list"},{"menuKey":"Monitor","menuName":"系统监控","parentKey":"Support","sort":0,"type":1,"url":"/monitor"},{"menuKey":"OnlineUser","menuName":"在线人数","parentKey":"Monitor","sort":0,"type":1,"url":"/monitor/online-user"},{"menuKey":"Sql","menuName":"SQL监控","parentKey":"Monitor","sort":0,"type":1,"url":"/monitor/sql"},{"menuKey":"Reload","menuName":"动态加载","parentKey":"Support","sort":0,"type":1,"url":"/reload"},{"menuKey":"SmartReloadList","menuName":"SmartReload","parentKey":"Reload","sort":0,"type":1,"url":"/reload/smart-reload-list"},{"menuKey":"Task","menuName":"定时任务","parentKey":"Support","sort":0,"type":1,"url":"/task"},{"menuKey":"TaskList","menuName":"任务管理","parentKey":"Task","sort":0,"type":1,"url":"/system-setting/task-list"}]]', 1, NULL, '2020-12-14 15:15:07', '2020-12-14 15:15:07'), - (36, 1, '管理员', '通用-权限', '查询所有菜单项', '/smart-admin-api/privilege/menu/queryAll', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.queryAll', '', 1, NULL, '2020-12-14 15:15:07', '2020-12-14 15:15:07'), - (37, 1, '管理员', '管理端-用户登录', '获取session', '/smart-admin-api/session/get', 'net.lab1024.smartadmin.module.system.login.LoginController.getSession', '', 1, NULL, '2020-12-14 15:15:29', '2020-12-14 15:15:29'), - (38, 1, '管理员', '通用-权限', '获取所有请求路径', '/smart-admin-api/privilege/getAllUrl', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.getAllUrl', '', 1, NULL, '2020-12-14 15:16:25', '2020-12-14 15:16:25'), - (39, 1, '管理员', '通用-权限', '查询所有菜单项', '/smart-admin-api/privilege/menu/queryAll', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.queryAll', '', 1, NULL, '2020-12-14 15:16:25', '2020-12-14 15:16:25'), - (40, 1, '管理员', '通用-权限', '菜单批量保存', '/smart-admin-api/privilege/menu/batchSaveMenu', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.menuBatchSave', 'ValidateList[[{"menuKey":"Business","menuName":"业务功能","sort":0,"type":1,"url":"/business"},{"menuKey":"Peony","menuName":"牡丹管理","parentKey":"Business","sort":1,"type":1,"url":"/peony"},{"menuKey":"PeonyList","menuName":"牡丹花列表","parentKey":"Peony","sort":2,"type":1,"url":"/peony/peony-list"},{"menuKey":"PeonyList1","menuName":"牡丹花列表1","parentKey":"Peony","sort":3,"type":1,"url":"/peony/peony-list1"},{"menuKey":"Email","menuName":"邮件管理","parentKey":"Business","sort":4,"type":1,"url":"/email"},{"menuKey":"EmailList","menuName":"邮件管理","parentKey":"Email","sort":5,"type":1,"url":"/email/email-list"},{"menuKey":"SendMail","menuName":"发送邮件","parentKey":"Email","sort":6,"type":1,"url":"/email/send-mail"},{"menuKey":"KeepAlive","menuName":"KeepAlive","parentKey":"Business","sort":7,"type":1,"url":"/keep-alive"},{"menuKey":"KeepAliveContentList","menuName":"KeepAlive列表","parentKey":"KeepAlive","sort":8,"type":1,"url":"/keep-alive/content-list"},{"menuKey":"KeepAliveAddContent","menuName":"KeepAlive表单","parentKey":"KeepAlive","sort":9,"type":1,"url":"/keep-alive/add-content"},{"menuKey":"Notice","menuName":"消息管理","parentKey":"Business","sort":10,"type":1,"url":"/notice"},{"menuKey":"NoticeList","menuName":"通知管理","parentKey":"Notice","sort":11,"type":1,"url":"/notice/notice-list"},{"menuKey":"PersonNotice","menuName":"个人消息","parentKey":"Notice","sort":12,"type":1,"url":"/notice/person-notice"},{"menuKey":"NoticeDetail","menuName":"消息详情","parentKey":"Notice","sort":13,"type":1,"url":"/notice/notice-detail"},{"menuKey":"ThreeRouter","menuName":"三级路由","parentKey":"Business","sort":14,"type":1,"url":"/three-router"},{"menuKey":"LevelTwo","menuName":"三级菜单","parentKey":"ThreeRouter","sort":15,"type":1,"url":"/three-router/level-two"},{"menuKey":"ThreeLevelRouterView","menuName":"三级菜单子颗粒","parentKey":"LevelTwo","sort":16,"type":1,"url":"/three-router/level-two/level-three1"},{"menuKey":"RoleTwoTwo","menuName":"三级菜单子哈","parentKey":"LevelTwo","sort":17,"type":1,"url":"/three-router/level-two/level-three2"},{"menuKey":"RoleOneOne","menuName":"二级菜单","parentKey":"ThreeRouter","sort":18,"type":1,"url":"/three-router/level-two2"},{"menuKey":"System","menuName":"系统设置","sort":19,"type":1,"url":"/system"},{"menuKey":"Employee","menuName":"人员管理","parentKey":"System","sort":20,"type":1,"url":"/employee"},{"menuKey":"RoleManage","menuName":"角色管理","parentKey":"Employee","sort":21,"type":1,"url":"/employee/role"},{"menuKey":"PositionList","menuName":"岗位管理","parentKey":"Employee","sort":22,"type":1,"url":"/employee/position"},{"menuKey":"RoleEmployeeManage","menuName":"员工管理","parentKey":"Employee","sort":23,"type":1,"url":"/employee/role-employee-manage"},{"menuKey":"File","menuName":"文件服务","parentKey":"System","sort":24,"type":1,"url":"/file"},{"menuKey":"FileList","menuName":"文件列表","parentKey":"File","sort":25,"type":1,"url":"/file/file-list"},{"menuKey":"UserLog","menuName":"用户日志","parentKey":"System","sort":26,"type":1,"url":"/user-log"},{"menuKey":"UserOperateLog","menuName":"用户操作日志","parentKey":"UserLog","sort":27,"type":1,"url":"/user-log/user-operate-log"},{"menuKey":"UserLoginLog","menuName":"用户登录日志","parentKey":"UserLog","sort":28,"type":1,"url":"/user-log/user-login-log"},{"menuKey":"SystemSetting","menuName":"系统设置","parentKey":"System","sort":29,"type":1,"url":"/system-setting"},{"menuKey":"SystemConfig","menuName":"系统参数","parentKey":"SystemSetting","sort":30,"type":1,"url":"/system-setting/system-config"},{"menuKey":"SystemPrivilege","menuName":"菜单设置","parentKey":"SystemSetting","sort":31,"type":1,"url":"/system-setting/system-privilege"},{"menuKey":"Support","menuName":"开发专用","sort":32,"type":1,"url":"/support"},{"menuKey":"ApiDoc","menuName":"接口文档","parentKey":"Support","sort":33,"type":1,"url":"/api-doc"},{"menuKey":"Swagger","menuName":"Swagger接口文档","parentKey":"ApiDoc","sort":34,"type":1,"url":"/api-doc/swagger"},{"menuKey":"HeartBeat","menuName":"心跳服务","parentKey":"Support","sort":35,"type":1,"url":"/heart-beat"},{"menuKey":"HeartBeatList","menuName":"心跳服务","parentKey":"HeartBeat","sort":36,"type":1,"url":"/heart-beat/heart-beat-list"},{"menuKey":"Monitor","menuName":"系统监控","parentKey":"Support","sort":37,"type":1,"url":"/monitor"},{"menuKey":"OnlineUser","menuName":"在线人数","parentKey":"Monitor","sort":38,"type":1,"url":"/monitor/online-user"},{"menuKey":"Sql","menuName":"SQL监控","parentKey":"Monitor","sort":39,"type":1,"url":"/monitor/sql"},{"menuKey":"Reload","menuName":"动态加载","parentKey":"Support","sort":40,"type":1,"url":"/reload"},{"menuKey":"SmartReloadList","menuName":"SmartReload","parentKey":"Reload","sort":41,"type":1,"url":"/reload/smart-reload-list"},{"menuKey":"Task","menuName":"定时任务","parentKey":"Support","sort":42,"type":1,"url":"/task"},{"menuKey":"TaskList","menuName":"任务管理","parentKey":"Task","sort":43,"type":1,"url":"/system-setting/task-list"}]]', 1, NULL, '2020-12-14 15:16:26', '2020-12-14 15:16:26'), - (41, 1, '管理员', '通用-权限', '查询所有菜单项', '/smart-admin-api/privilege/menu/queryAll', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.queryAll', '', 1, NULL, '2020-12-14 15:16:26', '2020-12-14 15:16:26'), - (42, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PeonyList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PeonyList"]', 1, NULL, '2020-12-14 15:16:28', '2020-12-14 15:16:28'), - (43, 1, '管理员', '通用-权限', '批量保存功能点', '/smart-admin-api/privilege/function/batchSave', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.batchSaveFunctionList', 'ValidateList[[{"functionKey":"peony-list-query","functionName":"查询","menuKey":"PeonyList","sort":1},{"functionKey":"peony-list-add","functionName":"新增","menuKey":"PeonyList","sort":2},{"functionKey":"peony-list-update","functionName":"编辑","menuKey":"PeonyList","sort":3},{"functionKey":"peony-list-batch-delete","functionName":"批量删除","menuKey":"PeonyList","sort":4},{"functionKey":"peony-list-batch-export","functionName":"批量导出","menuKey":"PeonyList","sort":5},{"functionKey":"peony-list-export-all","functionName":"导出全部","menuKey":"PeonyList","sort":6}]]', 1, NULL, '2020-12-14 15:16:30', '2020-12-14 15:16:30'), - (44, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PeonyList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PeonyList"]', 1, NULL, '2020-12-14 15:16:30', '2020-12-14 15:16:30'), - (45, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PeonyList1', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PeonyList1"]', 1, NULL, '2020-12-14 15:16:32', '2020-12-14 15:16:32'), - (46, 1, '管理员', '通用-权限', '批量保存功能点', '/smart-admin-api/privilege/function/batchSave', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.batchSaveFunctionList', 'ValidateList[[{"functionKey":"peony1-list-query","functionName":"查询","menuKey":"PeonyList1","sort":1},{"functionKey":"peony1-list-add","functionName":"新增","menuKey":"PeonyList1","sort":2},{"functionKey":"peony1-list-update","functionName":"编辑","menuKey":"PeonyList1","sort":3},{"functionKey":"peony1-list-batch-delete","functionName":"批量删除","menuKey":"PeonyList1","sort":4},{"functionKey":"peony1-list-batch-export","functionName":"批量导出","menuKey":"PeonyList1","sort":5},{"functionKey":"peony1-list-export-all","functionName":"导出全部","menuKey":"PeonyList1","sort":6}]]', 1, NULL, '2020-12-14 15:16:33', '2020-12-14 15:16:33'), - (47, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PeonyList1', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PeonyList1"]', 1, NULL, '2020-12-14 15:16:33', '2020-12-14 15:16:33'), - (48, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/EmailList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["EmailList"]', 1, NULL, '2020-12-14 15:16:34', '2020-12-14 15:16:34'), - (49, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SendMail', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SendMail"]', 1, NULL, '2020-12-14 15:16:36', '2020-12-14 15:16:36'), - (50, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/KeepAliveContentList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["KeepAliveContentList"]', 1, NULL, '2020-12-14 15:16:38', '2020-12-14 15:16:38'), - (51, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/KeepAliveAddContent', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["KeepAliveAddContent"]', 1, NULL, '2020-12-14 15:16:38', '2020-12-14 15:16:38'), - (52, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/NoticeList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["NoticeList"]', 1, NULL, '2020-12-14 15:16:40', '2020-12-14 15:16:40'), - (53, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PersonNotice', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PersonNotice"]', 1, NULL, '2020-12-14 15:16:41', '2020-12-14 15:16:41'), - (54, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/NoticeDetail', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["NoticeDetail"]', 1, NULL, '2020-12-14 15:16:42', '2020-12-14 15:16:42'), - (55, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/ThreeLevelRouterView', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["ThreeLevelRouterView"]', 1, NULL, '2020-12-14 15:16:44', '2020-12-14 15:16:44'), - (56, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/RoleManage', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["RoleManage"]', 1, NULL, '2020-12-14 15:16:47', '2020-12-14 15:16:47'), - (57, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/PositionList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["PositionList"]', 1, NULL, '2020-12-14 15:16:48', '2020-12-14 15:16:48'), - (58, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/RoleEmployeeManage', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["RoleEmployeeManage"]', 1, NULL, '2020-12-14 15:16:53', '2020-12-14 15:16:53'), - (59, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/FileList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["FileList"]', 1, NULL, '2020-12-14 15:17:00', '2020-12-14 15:17:00'), - (60, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/UserOperateLog', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["UserOperateLog"]', 1, NULL, '2020-12-14 15:17:03', '2020-12-14 15:17:03'), - (61, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/UserLoginLog', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["UserLoginLog"]', 1, NULL, '2020-12-14 15:17:03', '2020-12-14 15:17:03'), - (62, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SystemConfig', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SystemConfig"]', 1, NULL, '2020-12-14 15:17:04', '2020-12-14 15:17:04'), - (63, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SystemPrivilege', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SystemPrivilege"]', 1, NULL, '2020-12-14 15:17:06', '2020-12-14 15:17:06'), - (64, 1, '管理员', '通用-权限', '批量保存功能点', '/smart-admin-api/privilege/function/batchSave', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.batchSaveFunctionList', 'ValidateList[[{"functionKey":"privilege-main-update","functionName":"编辑","menuKey":"SystemPrivilege","sort":1},{"functionKey":"privilege-batch-save-points","functionName":"批量保存功能点","menuKey":"SystemPrivilege","sort":2},{"functionKey":"privilege-main-search","functionName":"查询","menuKey":"SystemPrivilege","sort":3}]]', 1, NULL, '2020-12-14 15:17:11', '2020-12-14 15:17:11'), - (65, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SystemPrivilege', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SystemPrivilege"]', 1, NULL, '2020-12-14 15:17:11', '2020-12-14 15:17:11'), - (66, 1, '管理员', '通用-权限', '保存更新功能点', '/smart-admin-api/privilege/function/saveOrUpdate', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionSaveOrUpdate', 'PrivilegeFunctionDTO[{"functionKey":"privilege-batch-save-points","functionName":"批量保存功能点","menuKey":"SystemPrivilege","sort":1,"url":"privilegeController.functionSaveOrUpdate"}]', 1, NULL, '2020-12-14 15:17:30', '2020-12-14 15:17:30'), - (67, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SystemPrivilege', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SystemPrivilege"]', 1, NULL, '2020-12-14 15:17:30', '2020-12-14 15:17:30'), - (68, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/Swagger', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["Swagger"]', 1, NULL, '2020-12-14 15:17:36', '2020-12-14 15:17:36'), - (69, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/HeartBeatList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["HeartBeatList"]', 1, NULL, '2020-12-14 15:17:37', '2020-12-14 15:17:37'), - (70, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/SmartReloadList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["SmartReloadList"]', 1, NULL, '2020-12-14 15:17:42', '2020-12-14 15:17:42'), - (71, 1, '管理员', '通用-权限', '查询菜单功能点', '/smart-admin-api/privilege/function/query/TaskList', 'net.lab1024.smartadmin.module.system.privilege.controller.PrivilegeController.functionQuery', 'String["TaskList"]', 1, NULL, '2020-12-14 15:17:43', '2020-12-14 15:17:43'), - (72, 1, '管理员', '通用-邮件发送', '分页查询', '/smart-admin-api/email/page/query', 'net.lab1024.smartadmin.module.business.email.EmailController.queryByPage', 'EmailQueryDTO[{"endDate":"","pageNum":1,"pageSize":10,"searchCount":true,"startDate":""}]', 1, NULL, '2020-12-14 15:17:57', '2020-12-14 15:17:57'), - (73, 1, '管理员', '管理端-用户登录', '获取session', '/smart-admin-api/session/get', 'net.lab1024.smartadmin.module.system.login.LoginController.getSession', '', 1, NULL, '2020-12-14 15:18:14', '2020-12-14 15:18:14'), - (74, 1, '管理员', '管理端-用户登录', '获取session', '/smart-admin-api/session/get', 'net.lab1024.smartadmin.module.system.login.LoginController.getSession', '', 1, NULL, '2020-12-14 15:18:27', '2020-12-14 15:18:27'); -/*!40000 ALTER TABLE `t_user_operate_log` ENABLE KEYS */; - -/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; -/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/AddDTO.java.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/AddDTO.java.vm deleted file mode 100644 index 03da7773..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/AddDTO.java.vm +++ /dev/null @@ -1,36 +0,0 @@ -package ${basePackage}.module.${modulePackage}.domain.dto; - -import lombok.Data; -#foreach ($dtoImport in $dtoImports) -$dtoImport -#end -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; - -/** - * 新建 [ ${tableDesc} ] - * - * @author ${author} - * @version 1.0 - * @company ${company} - * @copyright (c) 2018 ${company}Inc. All rights reserved. - * @date ${date} - * @since JDK1.8 - */ -@Data -public class ${moduleClass}AddDTO { -#foreach ($column in $columnList) -#if($column.fieldName != 'id') -#if($column.fieldType == 'Date') - @ApiModelProperty("${column.columnDesc}") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private $column.fieldType $column.fieldName; -#else - @ApiModelProperty("${column.columnDesc}") - private $column.fieldType $column.fieldName; -#end - -#end -#end - -} diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Controller.java.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Controller.java.vm deleted file mode 100644 index 1dfbe2ed..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Controller.java.vm +++ /dev/null @@ -1,88 +0,0 @@ -package ${basePackage}.module.${modulePackage}.controller; - -import ${basePackage}.common.domain.PageResultDTO; -import ${basePackage}.common.controller.BaseController; -import ${basePackage}.common.domain.ResponseDTO; -import ${basePackage}.common.domain.ValidateList; -import ${basePackage}.module.${modulePackage}.domain.dto.${moduleClass}AddDTO; -import ${basePackage}.module.${modulePackage}.domain.dto.${moduleClass}UpdateDTO; -import ${basePackage}.module.${modulePackage}.domain.dto.${moduleClass}QueryDTO; -import ${basePackage}.module.${modulePackage}.domain.vo.${moduleClass}VO; -import ${basePackage}.module.${modulePackage}.domain.vo.${moduleClass}ExcelVO; -import ${basePackage}.module.${modulePackage}.service.${moduleClass}Service; -import cn.afterturn.easypoi.excel.ExcelExportUtil; -import cn.afterturn.easypoi.excel.entity.ExportParams; -import org.apache.poi.ss.usermodel.Workbook; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletResponse; -import java.util.List; - -/** - * [ ${tableDesc} ] - * - * @author ${author} - * @version 1.0 - * @company ${company} - * @copyright (c) ${company}Inc. All rights reserved. - * @date ${date} - * @since JDK1.8 - */ -@RestController -@Api(tags = {"${tableDesc}"}) -public class ${moduleClass}Controller extends BaseController { - - @Autowired - private ${moduleClass}Service ${moduleVar}Service; - - @ApiOperation(value = "分页查询${tableDesc}",notes = "@author ${author}") - @PostMapping("/${moduleVar}/page/query") - public ResponseDTO> queryByPage(@RequestBody ${moduleClass}QueryDTO queryDTO) { - return ${moduleVar}Service.queryByPage(queryDTO); - } - - @ApiOperation(value = "添加${tableDesc}",notes = "@author ${author}") - @PostMapping("/${moduleVar}/add") - public ResponseDTO add(@RequestBody @Validated ${moduleClass}AddDTO addTO){ - return ${moduleVar}Service.add(addTO); - } - - @ApiOperation(value="修改${tableDesc}",notes = "@author ${author}") - @PostMapping("/${moduleVar}/update") - public ResponseDTO update(@RequestBody @Validated ${moduleClass}UpdateDTO updateDTO){ - return ${moduleVar}Service.update(updateDTO); - } - - @ApiOperation(value="批量删除${tableDesc}",notes = "@author ${author}") - @PostMapping("/${moduleVar}/deleteByIds") - public ResponseDTO delete(@RequestBody @Validated ValidateList idList) { - return ${moduleVar}Service.deleteByIds(idList); - } - - @ApiOperation(value = "批量导出", notes = "@author ${author}") - @PostMapping("/${moduleVar}/export/batch") - public void batchExport(@RequestBody @Validated ValidateList idList, HttpServletResponse response) { - //查询数据 - List<${moduleClass}ExcelVO> ${moduleVar}List = ${moduleVar}Service.queryBatchExportData(idList); - //导出操作 - ExportParams ex = new ExportParams("${tableDesc}", "Sheet1"); - Workbook workbook = ExcelExportUtil.exportExcel(ex, ${moduleClass}ExcelVO.class, ${moduleVar}List); - downloadExcel("${tableDesc}", workbook, response); - } - - @ApiOperation(value = "导出全部", notes = "@author ${author}") - @PostMapping("/${moduleVar}/export/all") - public void exportAll(@RequestBody @Validated ${moduleClass}QueryDTO queryDTO, HttpServletResponse response) { - //查询数据 - List<${moduleClass}ExcelVO> ${moduleVar}List = ${moduleVar}Service.queryAllExportData(queryDTO); - //导出操作 - ExportParams ex = new ExportParams("${tableDesc}", "Sheet1"); - Workbook workbook = ExcelExportUtil.exportExcel(ex, ${moduleClass}ExcelVO.class, ${moduleVar}List); - downloadExcel("${tableDesc}", workbook, response); - } - -} diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Dao.java.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Dao.java.vm deleted file mode 100644 index b19db804..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Dao.java.vm +++ /dev/null @@ -1,64 +0,0 @@ -package ${basePackage}.module.${modulePackage}.dao; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.core.metadata.IPage; -import ${basePackage}.module.${modulePackage}.domain.dto.${moduleClass}QueryDTO; -import ${basePackage}.module.${modulePackage}.domain.entity.${moduleClass}Entity; -import ${basePackage}.module.${modulePackage}.domain.vo.${moduleClass}VO; -import ${basePackage}.module.${modulePackage}.domain.vo.${moduleClass}ExcelVO; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * [ ${tableDesc} ] - * - * @author ${author} - * @version 1.0 - * @company ${company} - * @copyright (c) ${company}Inc. All rights reserved. - * @date ${date} - * @since JDK1.8 - */ -@Mapper -@Component -public interface ${moduleClass}Dao extends BaseMapper<${moduleClass}Entity> { - - /** - * 分页查询 - * @param queryDTO - * @return ${moduleClass}VO - */ - IPage<${moduleClass}VO> queryByPage(Page page, @Param("queryDTO") ${moduleClass}QueryDTO queryDTO); - - /** - * 根据id删除 - * @param id - * @return - */ - void deleteById(@Param("id")Long id); - - /** - * 根据id批量删除 - * @param idList - * @return - */ - void deleteByIdList(@Param("idList") List idList); - - /** - * 查询所有导出数据 - * @param queryDTO - * @return - */ - List<${moduleClass}ExcelVO> queryAllExportData(@Param("queryDTO")${moduleClass}QueryDTO queryDTO); - - /** - * 查询批量导出数据 - * @param idList - * @return - */ - List<${moduleClass}ExcelVO> queryBatchExportData(@Param("idList")List idList); -} diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Dao.xml.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Dao.xml.vm deleted file mode 100644 index 5e64e4bc..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Dao.xml.vm +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - delete from ${tableName} where id = #{id} - - - - delete from ${tableName} where id in - - #{item} - - - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Entity.java.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Entity.java.vm deleted file mode 100644 index ca7e7e6d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Entity.java.vm +++ /dev/null @@ -1,33 +0,0 @@ -package ${basePackage}.module.${modulePackage}.domain.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import ${basePackage}.common.domain.BaseEntity; -#foreach ($entityImport in $entityImports) -$entityImport -#end -import lombok.Data; - -/** - * [ ${tableDesc} ] - * - * @author ${author} - * @version 1.0 - * @company ${company} - * @copyright (c) ${company}Inc. All rights reserved. - * @date ${date} - * @since JDK1.8 - */ -@Data -@TableName("${tableName}") -public class ${moduleClass}Entity extends BaseEntity{ -#foreach ($column in $columnList) - -#if($column.columnName != 'id' && $column.fieldName != 'updateTime' && $column.fieldName != 'createTime') - /** - * $column.columnDesc - */ - private $column.fieldType $column.fieldName; -#end -#end - -} diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/ExcelVO.java.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/ExcelVO.java.vm deleted file mode 100644 index fa4e7e0a..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/ExcelVO.java.vm +++ /dev/null @@ -1,33 +0,0 @@ -package ${basePackage}.module.${modulePackage}.domain.vo; - -import cn.afterturn.easypoi.excel.annotation.Excel; -import lombok.Data; -#foreach ($dtoImport in $dtoImports) -$dtoImport -#end - -/** - * [ ${tableDesc} ] - * - * @author ${author} - * @version 1.0 - * @company ${company} - * @copyright (c) ${company}Inc. All rights reserved. - * @date ${date} - * @since JDK1.8 - */ -@Data -public class ${moduleClass}ExcelVO { -#foreach ($column in $columnList) -#if($column.fieldType == 'Date') - @Excel(name = "${column.columnDesc}", format = "yyyy-MM-dd HH:mm:ss") - private $column.fieldType $column.fieldName; -#else - @Excel(name = "${column.columnDesc}") - private $column.fieldType $column.fieldName; -#end - -#end - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/QueryDTO.java.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/QueryDTO.java.vm deleted file mode 100644 index 44815d4d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/QueryDTO.java.vm +++ /dev/null @@ -1,45 +0,0 @@ -package ${basePackage}.module.${modulePackage}.domain.dto; - -import ${basePackage}.common.domain.PageParamDTO; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import java.util.Date; -#foreach ($queryImport in $queryImports) -$queryImport -#end - -/** - * [ ${tableDesc} ] - * - * @author ${author} - * @version 1.0 - * @company ${company} - * @copyright (c) ${company}Inc. All rights reserved. - * @date ${date} - * @since JDK1.8 - */ -@Data -public class ${moduleClass}QueryDTO extends PageParamDTO { -#foreach ($queryField in $queryFieldList) - -#if($queryField.sqlOperate == 'in') - @ApiModelProperty("${queryField.columnDesc}") - private List<${queryField.fieldType}> ${queryField.fieldName}List; -#else - @ApiModelProperty("${queryField.columnDesc}") - private ${queryField.fieldType} ${queryField.fieldName}; -#end -#end - - @ApiModelProperty("创建时间-开始") - private Date createTimeBegin; - - @ApiModelProperty("创建时间-截止") - private Date createTimeEnd; - - @ApiModelProperty("上次更新时间-开始") - private Date updateTimeBegin; - - @ApiModelProperty("上次更新创建时间-开始") - private Date updateTimeEnd; -} diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Service.java.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Service.java.vm deleted file mode 100644 index ca3b939d..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/Service.java.vm +++ /dev/null @@ -1,108 +0,0 @@ -package ${basePackage}.module.${modulePackage}.service; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import ${basePackage}.common.domain.PageResultDTO; -import ${basePackage}.common.domain.ResponseDTO; -import ${basePackage}.module.${modulePackage}.dao.${moduleClass}Dao; -import ${basePackage}.module.${modulePackage}.domain.dto.${moduleClass}AddDTO; -import ${basePackage}.module.${modulePackage}.domain.dto.${moduleClass}UpdateDTO; -import ${basePackage}.module.${modulePackage}.domain.dto.${moduleClass}QueryDTO; -import ${basePackage}.module.${modulePackage}.domain.entity.${moduleClass}Entity; -import ${basePackage}.module.${modulePackage}.domain.vo.${moduleClass}VO; -import ${basePackage}.module.${modulePackage}.domain.vo.${moduleClass}ExcelVO; -import ${basePackage}.util.SmartPageUtil; -import ${basePackage}.util.SmartBeanUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * [ ${tableDesc} ] - * - * @author ${author} - * @version 1.0 - * @company ${company} - * @copyright (c) ${company}Inc. All rights reserved. - * @date ${date} - * @since JDK1.8 - */ -@Service -public class ${moduleClass}Service { - - @Autowired - private ${moduleClass}Dao ${moduleVar}Dao; - - /** - * 根据id查询 - */ - public ${moduleClass}Entity getById(Long id){ - return ${moduleVar}Dao.selectById(id); - } - - /** - * 分页查询 - * @author ${author} - * @date ${date} - */ - public ResponseDTO> queryByPage(${moduleClass}QueryDTO queryDTO) { - Page page = SmartPageUtil.convert2QueryPage(queryDTO); - IPage<${moduleClass}VO> voList = ${moduleVar}Dao.queryByPage(page, queryDTO); - PageResultDTO<${moduleClass}VO> pageResultDTO = SmartPageUtil.convert2PageResult(voList); - return ResponseDTO.succData(pageResultDTO); - } - - /** - * 添加 - * @author ${author} - * @date ${date} - */ - public ResponseDTO add(${moduleClass}AddDTO addDTO) { - ${moduleClass}Entity entity = SmartBeanUtil.copy(addDTO, ${moduleClass}Entity.class); - ${moduleVar}Dao.insert(entity); - return ResponseDTO.succ(); - } - - /** - * 编辑 - * @author ${author} - * @date ${date} - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO update(${moduleClass}UpdateDTO updateDTO) { - ${moduleClass}Entity entity = SmartBeanUtil.copy(updateDTO, ${moduleClass}Entity.class); - ${moduleVar}Dao.updateById(entity); - return ResponseDTO.succ(); - } - - /** - * 删除 - * @author ${author} - * @date ${date} - */ - @Transactional(rollbackFor = Exception.class) - public ResponseDTO deleteByIds(List idList) { - ${moduleVar}Dao.deleteByIdList(idList); - return ResponseDTO.succ(); - } - - /** - * 查询全部导出对象 - * @author ${author} - * @date ${date} - */ - public List<${moduleClass}ExcelVO> queryAllExportData(${moduleClass}QueryDTO queryDTO) { - return ${moduleVar}Dao.queryAllExportData( queryDTO); - } - - /** - * 批量查询导出对象 - * @author ${author} - * @date ${date} - */ - public List<${moduleClass}ExcelVO> queryBatchExportData(List idList) { - return ${moduleVar}Dao.queryBatchExportData(idList); - } -} diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/UpdateDTO.java.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/UpdateDTO.java.vm deleted file mode 100644 index e96cc501..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/UpdateDTO.java.vm +++ /dev/null @@ -1,20 +0,0 @@ -package ${basePackage}.module.${modulePackage}.domain.dto; - -import lombok.Data; - -/** - * 更新 [ ${tableDesc} ] - * - * @author ${author} - * @version 1.0 - * @company ${company} - * @copyright (c) 2018 ${company}Inc. All rights reserved. - * @date ${date} - * @since JDK1.8 - */ -@Data -public class ${moduleClass}UpdateDTO extends ${moduleClass}AddDTO { - - private Long id; - -} diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/VO.java.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/VO.java.vm deleted file mode 100644 index b7a5ea53..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/java/VO.java.vm +++ /dev/null @@ -1,35 +0,0 @@ -package ${basePackage}.module.${modulePackage}.domain.vo; - -import lombok.Data; -#foreach ($dtoImport in $dtoImports) -$dtoImport -#end -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.annotations.ApiModelProperty; - -/** - * [ ${tableDesc} ] - * - * @author ${author} - * @version 1.0 - * @company ${company} - * @copyright (c) ${company}Inc. All rights reserved. - * @date ${date} - * @since JDK1.8 - */ -@Data -public class ${moduleClass}VO { -#foreach ($column in $columnList) -#if($column.fieldType == 'Date') - @ApiModelProperty("${column.columnDesc}") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private $column.fieldType $column.fieldName; -#else - @ApiModelProperty("${column.columnDesc}") - private $column.fieldType $column.fieldName; -#end - -#end - - -} diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/Api.js.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/Api.js.vm deleted file mode 100644 index 858f2366..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/Api.js.vm +++ /dev/null @@ -1,28 +0,0 @@ -import { postAxios, getAxios, postDownloadAxios } from '@/lib/http'; - -export const ${moduleVar}Api = { - // 添加${tableDesc} @author ${author} - add${moduleClass}: (data) => { - return postAxios('/${moduleVar}/add', data); - }, - // 分页查询${tableDesc} @author ${author} - query${moduleClass}: (data) => { - return postAxios('/${moduleVar}/page/query', data); - }, - // 批量删除${tableDesc} @author ${author} - batchDelete${moduleClass}: (idList) => { - return postAxios('/${moduleVar}/deleteByIds', idList); - }, - // 修改${tableDesc} @author ${author} - update${moduleClass}: (data) => { - return postAxios('/${moduleVar}/update',data); - }, - // 导出全部 @author ${author} - exportAll:(data)=>{ - return postDownloadAxios('/${moduleVar}/export/all',data); - }, - // 批量导出 @author ${author} - batchExport: (idList) => { - return postDownloadAxios('/${moduleVar}/export/batch', idList); - }, -}; diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/List.vue.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/List.vue.vm deleted file mode 100644 index 3bc635f4..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/List.vue.vm +++ /dev/null @@ -1,439 +0,0 @@ - - - diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/ListForm.vue.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/ListForm.vue.vm deleted file mode 100644 index 558dfcb0..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/ListForm.vue.vm +++ /dev/null @@ -1,132 +0,0 @@ - - \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/Router.js.vm b/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/Router.js.vm deleted file mode 100644 index 00d5ed6c..00000000 --- a/smart-admin-service/smart-admin-api/src/main/resources/templates/codegenerator/web/Router.js.vm +++ /dev/null @@ -1,32 +0,0 @@ -import Main from '@/components/main'; -// ${tableName}路由 -export const ${moduleVar} = [ - { - path: '/${webModuleName}', - name: '${moduleClass}', - component: Main, - meta: { - title: '${tableDesc}管理', - icon: 'icon iconfont iconyoujianguanli' - }, - children: [ - // ${tableDesc}列表 - { - path: '/${webModuleName}/${webModuleName}-list', - name: '${moduleClass}List', - meta: { - title: '${tableDesc}列表', - privilege: [ - { title: '查询', name: '${webModuleName}-list-query' }, - { title: '新增', name: '${webModuleName}-list-add' }, - { title: '编辑', name: '${webModuleName}-list-update' }, - { title: '批量删除', name: '${webModuleName}-list-batch-delete' }, - { title: '批量导出', name: '${webModuleName}-list-batch-export' }, - { title: '导出全部', name: '${webModuleName}-list-export-all' } - ] - }, - component: () => import('@/views/business/${webModuleName}/${webModuleName}-list.vue') - } - ] - } -]; diff --git a/smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/BaseTest.java b/smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/BaseTest.java deleted file mode 100644 index 6d681a15..00000000 --- a/smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/BaseTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.lab1024.smartadmin; - -import org.junit.After; -import org.junit.Before; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -/** - * 测试基类 - * - * @author lizongliang - * @date 2017/09/29 10:54 - */ -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SmartAdminApplication.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class BaseTest { - - @Before - public void before() { - System.out.println("测试开始------------------"); - } - - @After - public void after() { - System.out.println("测试结束------------------"); - } -} diff --git a/smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/SmartAdminApplicationTests.java b/smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/SmartAdminApplicationTests.java deleted file mode 100644 index d140b88b..00000000 --- a/smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/SmartAdminApplicationTests.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.lab1024.smartadmin; - -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SmartAdminApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class SmartAdminApplicationTests { - -} \ No newline at end of file diff --git a/smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/module/support/codegenerator/CodeGeneratorServiceTest.java b/smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/module/support/codegenerator/CodeGeneratorServiceTest.java deleted file mode 100644 index e824cf51..00000000 --- a/smart-admin-service/smart-admin-api/src/test/java/net/lab1024/smartadmin/module/support/codegenerator/CodeGeneratorServiceTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.lab1024.smartadmin.module.support.codegenerator; - -import net.lab1024.smartadmin.BaseTest; -import net.lab1024.smartadmin.module.support.codegenerator.constant.SqlOperateTypeEnum; -import net.lab1024.smartadmin.module.support.codegenerator.domain.CodeGeneratorDTO; -import net.lab1024.smartadmin.module.support.codegenerator.domain.CodeGeneratorQueryColumnDTO; -import net.lab1024.smartadmin.module.support.codegenerator.service.CodeGeneratorService; -import com.google.common.collect.Lists; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.List; - -/** - * IdGeneratorService Tester. - * - * @author zhuoda - * @version 1.0 - */ -public class CodeGeneratorServiceTest extends BaseTest { - - @Autowired - private CodeGeneratorService codeGeneratorService; - - @Test - public void testGenerate() throws Exception { - /** - * !!! 所有查询条件均包含了createTime和updateTime的 范围查询 !!! - */ - - // t_peony 牡丹花表 - - //搜索字段 kind, 使用like搜索 - CodeGeneratorQueryColumnDTO kind = CodeGeneratorQueryColumnDTO.builder() - .columnName("kind") - .sqlOperate(SqlOperateTypeEnum.LIKE).build(); - //搜索字段 kind, 使用 == 搜索 - CodeGeneratorQueryColumnDTO id = CodeGeneratorQueryColumnDTO.builder() - .columnName("id") - .sqlOperate(SqlOperateTypeEnum.EQUALS).build(); - //搜索字段 name, 使用like搜索 - CodeGeneratorQueryColumnDTO name = CodeGeneratorQueryColumnDTO.builder() - .columnName("name") - .sqlOperate(SqlOperateTypeEnum.LIKE).build(); - //搜索字段 color, 使用like搜索 - CodeGeneratorQueryColumnDTO color = CodeGeneratorQueryColumnDTO.builder() - .columnName("color") - .sqlOperate(SqlOperateTypeEnum.LIKE).build(); - - List queryColumnList = Lists.newArrayList(id, kind, name, color); - - CodeGeneratorDTO codeGenerator = CodeGeneratorDTO.builder() - .author("卓大")//class 注释作者 - .company("1024创新实验室( www.1024lab.net )")//class注释公司名字 - .tableName("t_peony")//表名 - .tablePrefix("t_")//表名前缀 - .basePackage("net.lab1024.smartadmin")//包名 - .modulePackage("business.peony")//业务子包名 - .queryColumnList(queryColumnList)//加入搜搜字段 - .build();//构建 - - //当需要代码生成的时候,请将注释去掉 -// codeGeneratorService.codeGenerator(codeGenerator); - } - -} diff --git a/smart-admin-web/.babelrc b/smart-admin-web/.babelrc deleted file mode 100644 index 2a818842..00000000 --- a/smart-admin-web/.babelrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "presets": [ - "@vue/app" - ] -} diff --git a/smart-admin-web/.editorconfig b/smart-admin-web/.editorconfig deleted file mode 100644 index 9d08a1a8..00000000 --- a/smart-admin-web/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true diff --git a/smart-admin-web/.env.development b/smart-admin-web/.env.development deleted file mode 100644 index 746c33a9..00000000 --- a/smart-admin-web/.env.development +++ /dev/null @@ -1,4 +0,0 @@ -NODE_ENV=development -VUE_APP_TYPE=dev -VUE_APP_URL=http://127.0.0.1:10086/smart-admin-api/ -VUE_APP_SOCKET_URL=ws://127.0.0.1:10086/smart-admin-api/ diff --git a/smart-admin-web/.env.local b/smart-admin-web/.env.local deleted file mode 100644 index 746c33a9..00000000 --- a/smart-admin-web/.env.local +++ /dev/null @@ -1,4 +0,0 @@ -NODE_ENV=development -VUE_APP_TYPE=dev -VUE_APP_URL=http://127.0.0.1:10086/smart-admin-api/ -VUE_APP_SOCKET_URL=ws://127.0.0.1:10086/smart-admin-api/ diff --git a/smart-admin-web/.env.prod b/smart-admin-web/.env.prod deleted file mode 100644 index d90edfe9..00000000 --- a/smart-admin-web/.env.prod +++ /dev/null @@ -1,8 +0,0 @@ -NODE_ENV=production -VUE_APP_TYPE=prod -VUE_APP_URL=http://preview.smartadmin.1024lab.net/smart-admin-api/ -VUE_APP_SOCKET_URL=ws://preview.smartadmin.1024lab.net/smart-admin-api/ - -// VUE_APP_URL=http://127.0.0.1:10086/smart-admin-api/ -// VUE_APP_SOCKET_URL=ws://127.0.0.1:10086/smart-admin-api/ - diff --git a/smart-admin-web/.env.sit b/smart-admin-web/.env.sit deleted file mode 100644 index ac2ac140..00000000 --- a/smart-admin-web/.env.sit +++ /dev/null @@ -1,3 +0,0 @@ -NODE_ENV=production -VUE_APP_TYPE=sit -VUE_APP_URL=http://172.16.0.145:10086/smart-admin-api/ diff --git a/smart-admin-web/.eslintrc.js b/smart-admin-web/.eslintrc.js deleted file mode 100644 index 28180441..00000000 --- a/smart-admin-web/.eslintrc.js +++ /dev/null @@ -1,34 +0,0 @@ -module.exports = { - root: true, - "extends": [ - "plugin:vue/essential", - "@vue/standard" - ], - rules: { - "generator-star-spacing": "off", //生成器函数*的前后空格 - // allow debugger during development - "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off", - "vue/no-parsing-error": [2, { - "x-invalid-end-tag": false - }], - "no-const-assign": 2, //禁止修改const声明的变量 - "no-unused-vars": [0, { //禁止声明变量后却不使用 - // 允许声明未使用变量 - "vars": "all", - // 参数不检查 - "args": "none" - }], - "quotes": [2, "single"], //单引号 - "singleQuote": true, - "indent": 2, //缩进量 - "no-var": 2, //禁用var,用let和const代替 - "camelcase": 2, //强制驼峰法命名 - "eqeqeq": 1, //要求使用 === 和 !== 代替 == 和 != 操作符 - "no-eq-null": 2, //禁止对null使用==或!=运算符 - "no-sequences": 0, //禁用逗号操作符 - "semi": [2, "always"] //强制分号 - }, - parserOptions: { - parser: "babel-eslint" - } -} diff --git a/smart-admin-web/.gitignore b/smart-admin-web/.gitignore deleted file mode 100644 index a1009cf5..00000000 --- a/smart-admin-web/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -.DS_Store -node_modules -/dist - -/tests/e2e/videos/ -/tests/e2e/screenshots/ - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw* - -build/env.js diff --git a/smart-admin-web/.travis.yml b/smart-admin-web/.travis.yml deleted file mode 100644 index 07c971f8..00000000 --- a/smart-admin-web/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: stable -script: npm run lint -notifications: - email: false diff --git a/smart-admin-web/README.md b/smart-admin-web/README.md deleted file mode 100644 index fe637c03..00000000 --- a/smart-admin-web/README.md +++ /dev/null @@ -1,13 +0,0 @@ -### 启动讲解 - -###### 配置vscode -将 /vscode/settings.json文件配置到vscode中 - -###### 启动 -1 安装依赖: - -`npm install` - -2 运行本地环境 - -`npm run local` \ No newline at end of file diff --git a/smart-admin-web/cypress.json b/smart-admin-web/cypress.json deleted file mode 100644 index 470c7201..00000000 --- a/smart-admin-web/cypress.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "pluginsFile": "tests/e2e/plugins/index.js" -} diff --git a/smart-admin-web/doc/notice.txt b/smart-admin-web/doc/notice.txt deleted file mode 100644 index 8184781f..00000000 --- a/smart-admin-web/doc/notice.txt +++ /dev/null @@ -1,2 +0,0 @@ -1 login-form.vue 去掉登录帐号提示 -2 login-form.vue 修改默认登录绑定帐号 \ No newline at end of file diff --git a/smart-admin-web/package-lock.json b/smart-admin-web/package-lock.json deleted file mode 100644 index 86b799c5..00000000 --- a/smart-admin-web/package-lock.json +++ /dev/null @@ -1,15500 +0,0 @@ -{ - "name": "smart-admin", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@antv/adjust": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/@antv/adjust/download/@antv/adjust-0.1.1.tgz", - "integrity": "sha1-4mOrDhoZQaZIhC/Ahs9lp+O3Xpg=", - "requires": { - "@antv/util": "~1.3.1" - } - }, - "@antv/attr": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/@antv/attr/download/@antv/attr-0.1.2.tgz", - "integrity": "sha1-LusSL8qvhRoth0mrx8YFGdP3fjc=", - "requires": { - "@antv/util": "~1.3.1" - } - }, - "@antv/component": { - "version": "0.3.9", - "resolved": "https://registry.npm.taobao.org/@antv/component/download/@antv/component-0.3.9.tgz", - "integrity": "sha1-7VYcY5t3OM4D/2OoZvWeJR3oKhc=", - "requires": { - "@antv/attr": "~0.1.2", - "@antv/g": "~3.3.5", - "@antv/util": "~1.3.1", - "wolfy87-eventemitter": "~5.1.0" - }, - "dependencies": { - "@antv/g": { - "version": "3.3.6", - "resolved": "https://registry.npm.taobao.org/@antv/g/download/@antv/g-3.3.6.tgz", - "integrity": "sha1-Ef7Z3cntTloqokS3yKu5gqAD8gE=", - "requires": { - "@antv/gl-matrix": "~2.7.1", - "@antv/util": "~1.3.1", - "d3-ease": "~1.0.3", - "d3-interpolate": "~1.1.5", - "d3-timer": "~1.0.6", - "wolfy87-eventemitter": "~5.1.0" - } - } - } - }, - "@antv/coord": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/@antv/coord/download/@antv/coord-0.1.0.tgz", - "integrity": "sha1-SKgK420HVS+WZX5/gJUifGPwwKk=", - "requires": { - "@antv/util": "~1.3.1" - } - }, - "@antv/g": { - "version": "3.4.10", - "resolved": "https://registry.npm.taobao.org/@antv/g/download/@antv/g-3.4.10.tgz", - "integrity": "sha1-57YWqiGxesUYUNAzMypa+N6P4BU=", - "requires": { - "@antv/gl-matrix": "~2.7.1", - "@antv/util": "~1.3.1", - "d3-ease": "~1.0.3", - "d3-interpolate": "~1.1.5", - "d3-timer": "~1.0.6", - "detect-browser": "^5.1.0" - } - }, - "@antv/g2": { - "version": "3.5.17", - "resolved": "https://registry.npm.taobao.org/@antv/g2/download/@antv/g2-3.5.17.tgz", - "integrity": "sha1-Asi6xhDSHSi04jYAvHbEjn9ZyRk=", - "requires": { - "@antv/adjust": "~0.1.0", - "@antv/attr": "~0.1.2", - "@antv/component": "~0.3.3", - "@antv/coord": "~0.1.0", - "@antv/g": "~3.4.10", - "@antv/scale": "~0.1.1", - "@antv/util": "~1.3.1", - "venn.js": "~0.2.20", - "wolfy87-eventemitter": "~5.1.0" - } - }, - "@antv/gl-matrix": { - "version": "2.7.1", - "resolved": "https://registry.npm.taobao.org/@antv/gl-matrix/download/@antv/gl-matrix-2.7.1.tgz", - "integrity": "sha1-rLjjf3qz3wE0WrpDcteUK+QuuhQ=" - }, - "@antv/scale": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/@antv/scale/download/@antv/scale-0.1.5.tgz", - "integrity": "sha1-JDJm6LkEfPZLL9/ED5g0zwhGSW4=", - "requires": { - "@antv/util": "~1.3.1", - "fecha": "~2.3.3" - } - }, - "@antv/util": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/@antv/util/download/@antv/util-1.3.1.tgz", - "integrity": "sha1-MKNLIB/5Em7A1YxyyBZqnD5kTM0=", - "requires": { - "@antv/gl-matrix": "^2.7.1" - } - }, - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.10.4.tgz?cache=0&sync_timestamp=1593521174697&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.10.4.tgz", - "integrity": "sha1-Fo2ho26Q2miujUnA8bSMfGJJITo=", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/core": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/core/download/@babel/core-7.10.5.tgz?cache=0&sync_timestamp=1594750809694&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fcore%2Fdownload%2F%40babel%2Fcore-7.10.5.tgz", - "integrity": "sha1-HxXizKitmh14o43bphL158270zA=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.5", - "@babel/types": "^7.10.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/generator/download/@babel/generator-7.10.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fgenerator%2Fdownload%2F%40babel%2Fgenerator-7.10.5.tgz", - "integrity": "sha1-G5A1VLyMWD7o0l8eiWlzLmuCmmk=", - "dev": true, - "requires": { - "@babel/types": "^7.10.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.10.4.tgz", - "integrity": "sha1-W/DUlaP3V6w72ki1vzs7ownHK6M=", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha1-uwt18xv5jL+f8UPBrleLhydK4aM=", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.10.5.tgz?cache=0&sync_timestamp=1594751493358&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-create-class-features-plugin%2Fdownload%2F%40babel%2Fhelper-create-class-features-plugin-7.10.5.tgz", - "integrity": "sha1-n2FEa6gOgkCwpchcb9rIRZ1vJZ0=", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.10.5", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.10.4.tgz", - "integrity": "sha1-/dYNiFJGWaC2lZwFeZJeQlcU87g=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-regex": "^7.10.4", - "regexpu-core": "^4.7.0" - } - }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/helper-define-map/download/@babel/helper-define-map-7.10.5.tgz?cache=0&sync_timestamp=1594751492980&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-define-map%2Fdownload%2F%40babel%2Fhelper-define-map-7.10.5.tgz", - "integrity": "sha1-tTwQ23imQIABUmkrEzkxR6y5uzA=", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.10.4.tgz?cache=0&sync_timestamp=1593522841702&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-explode-assignable-expression%2Fdownload%2F%40babel%2Fhelper-explode-assignable-expression-7.10.4.tgz", - "integrity": "sha1-QKHNkXv/Eoj2malKdbN6Gi29jHw=", - "dev": true, - "requires": { - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-function-name/download/@babel/helper-function-name-7.10.4.tgz?cache=0&sync_timestamp=1593521218775&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-function-name%2Fdownload%2F%40babel%2Fhelper-function-name-7.10.4.tgz", - "integrity": "sha1-0tOyDFmtjEcRL6fSqUvAnV74Lxo=", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.10.4.tgz?cache=0&sync_timestamp=1593522827189&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-get-function-arity%2Fdownload%2F%40babel%2Fhelper-get-function-arity-7.10.4.tgz", - "integrity": "sha1-mMHL6g4jMvM/mkZhuM4VBbLBm6I=", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.10.4.tgz?cache=0&sync_timestamp=1593521259807&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-hoist-variables%2Fdownload%2F%40babel%2Fhelper-hoist-variables-7.10.4.tgz", - "integrity": "sha1-1JsAHR1aaMpeZgTdoBpil/fJOB4=", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.10.5.tgz?cache=0&sync_timestamp=1594751492273&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-member-expression-to-functions%2Fdownload%2F%40babel%2Fhelper-member-expression-to-functions-7.10.5.tgz", - "integrity": "sha1-Fy9W56Y+eBEvOgQFXyQ2WvcC5+4=", - "dev": true, - "requires": { - "@babel/types": "^7.10.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-module-imports/download/@babel/helper-module-imports-7.10.4.tgz", - "integrity": "sha1-TFxUvgS9MWcKc4J5fXW5+i5bViA=", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.10.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-module-transforms%2Fdownload%2F%40babel%2Fhelper-module-transforms-7.10.5.tgz", - "integrity": "sha1-EgwnHAszU2c/zf2MBT2zxUSiYNY=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.10.4.tgz?cache=0&sync_timestamp=1593522827576&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-optimise-call-expression%2Fdownload%2F%40babel%2Fhelper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha1-UNyWQT1ZT5lad5BZBbBYk813lnM=", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha1-L3WoMSadT2d95JmG3/WZJ1M883U=", - "dev": true - }, - "@babel/helper-regex": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/helper-regex/download/@babel/helper-regex-7.10.5.tgz?cache=0&sync_timestamp=1594751487108&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-regex%2Fdownload%2F%40babel%2Fhelper-regex-7.10.5.tgz", - "integrity": "sha1-Mt+7eYmQc8QVVXBToZvQVarlCuA=", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.10.4.tgz?cache=0&sync_timestamp=1593521228698&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-remap-async-to-generator%2Fdownload%2F%40babel%2Fhelper-remap-async-to-generator-7.10.4.tgz", - "integrity": "sha1-/Oi+pOlpC76SMFbe0h5UtOi2jtU=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.10.4.tgz", - "integrity": "sha1-1YXNk4jqBuYDHkzUS2cTy+rZ5s8=", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-simple-access/download/@babel/helper-simple-access-7.10.4.tgz?cache=0&sync_timestamp=1593521217867&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-simple-access%2Fdownload%2F%40babel%2Fhelper-simple-access-7.10.4.tgz", - "integrity": "sha1-D1zNopRSd6KnotOoIeFTle3PNGE=", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.10.4.tgz?cache=0&sync_timestamp=1593522826673&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-split-export-declaration%2Fdownload%2F%40babel%2Fhelper-split-export-declaration-7.10.4.tgz", - "integrity": "sha1-LHBXbqo7VgmyTLmdsoiMw/xCUdE=", - "dev": true, - "requires": { - "@babel/types": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.10.4.tgz?cache=0&sync_timestamp=1593522843594&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.10.4.tgz", - "integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI=", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.10.4.tgz?cache=0&sync_timestamp=1593522949000&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhelper-wrap-function%2Fdownload%2F%40babel%2Fhelper-wrap-function-7.10.4.tgz", - "integrity": "sha1-im9wHqsP8592W1oc/vQJmQ5iS4c=", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/helpers/download/@babel/helpers-7.10.4.tgz", - "integrity": "sha1-Kr6w1yGv98Cpc3a54fb2XXpHUEQ=", - "dev": true, - "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.10.4.tgz?cache=0&sync_timestamp=1593522962210&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.10.4.tgz", - "integrity": "sha1-fRvf1ldTU4+r5sOFls23bZrGAUM=", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.10.5.tgz?cache=0&sync_timestamp=1594750823758&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.10.5.tgz", - "integrity": "sha1-58a/Wn3v+VfOyfBLVR4nYpCdgms=", - "dev": true - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.10.5.tgz?cache=0&sync_timestamp=1594751487997&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-async-generator-functions%2Fdownload%2F%40babel%2Fplugin-proposal-async-generator-functions-7.10.5.tgz", - "integrity": "sha1-NJHKvy98F5q4IGBs7Cf+0V4OhVg=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4", - "@babel/plugin-syntax-async-generators": "^7.8.0" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.10.4.tgz", - "integrity": "sha1-ozv2Mto5ClnHqMVwBF0RFc13iAc=", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-decorators/download/@babel/plugin-proposal-decorators-7.10.5.tgz?cache=0&sync_timestamp=1594751494194&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-proposal-decorators%2Fdownload%2F%40babel%2Fplugin-proposal-decorators-7.10.5.tgz", - "integrity": "sha1-QomLukeLxLGuJCpwOpU6etNQ/7Q=", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-decorators": "^7.10.4" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.10.4.tgz", - "integrity": "sha1-WT5ZxjUoFgIzvTIbGuvgggwjQds=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.0" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.10.4.tgz", - "integrity": "sha1-UBKawha5pqVbOFP92SPnS/VTpMA=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.10.4" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.10.4.tgz", - "integrity": "sha1-Mck4MJ0kp4pJ1o/av/qoY3WFVN0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.10.4.tgz", - "integrity": "sha1-RIPNpTBBzjQTt/4vAAImZd36p10=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-decorators/download/@babel/plugin-syntax-decorators-7.10.4.tgz", - "integrity": "sha1-aFMIWyxCn50yLQL1pjUBjN6yNgw=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.10.4.tgz?cache=0&sync_timestamp=1593522939386&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-jsx%2Fdownload%2F%40babel%2Fplugin-syntax-jsx-7.10.4.tgz", - "integrity": "sha1-Oauq48v3EMQ3PYQpSE5rohNAFmw=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz?cache=0&sync_timestamp=1578950070697&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-syntax-object-rest-spread%2Fdownload%2F%40babel%2Fplugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.10.4.tgz?cache=0&sync_timestamp=1593522807583&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-arrow-functions%2Fdownload%2F%40babel%2Fplugin-transform-arrow-functions-7.10.4.tgz", - "integrity": "sha1-4ilg135pfHT0HFAdRNc9v4pqZM0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.10.4.tgz?cache=0&sync_timestamp=1593522851748&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-async-to-generator%2Fdownload%2F%40babel%2Fplugin-transform-async-to-generator-7.10.4.tgz", - "integrity": "sha1-QaUBfknrbzzak5KlHu8pQFskWjc=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.10.4.tgz?cache=0&sync_timestamp=1593521910347&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-block-scoped-functions%2Fdownload%2F%40babel%2Fplugin-transform-block-scoped-functions-7.10.4.tgz", - "integrity": "sha1-GvpZV0T3XkOpGvc7DZmOz+Trwug=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.10.5.tgz?cache=0&sync_timestamp=1594751488558&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-block-scoping%2Fdownload%2F%40babel%2Fplugin-transform-block-scoping-7.10.5.tgz", - "integrity": "sha1-uBuKr++/5o8PZffvOXuezmimA30=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.10.4.tgz?cache=0&sync_timestamp=1593521236444&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-classes%2Fdownload%2F%40babel%2Fplugin-transform-classes-7.10.4.tgz", - "integrity": "sha1-QFE2rys+IYvEoZJiKLyRerGgrcc=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.10.4.tgz?cache=0&sync_timestamp=1593522921161&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-computed-properties%2Fdownload%2F%40babel%2Fplugin-transform-computed-properties-7.10.4.tgz", - "integrity": "sha1-ne2DqBboLe0o1S1LTsvdgQzfwOs=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.10.4.tgz", - "integrity": "sha1-cN3Ss9G+qD0BUJ6bsl3bOnT8heU=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.10.4.tgz", - "integrity": "sha1-RpwgYhBcHragQOr0+sS0iAeDle4=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.10.4.tgz", - "integrity": "sha1-aX5Qyf7hQ4D+hD0fMGspVhdDHkc=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.10.4.tgz?cache=0&sync_timestamp=1593521230232&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-exponentiation-operator%2Fdownload%2F%40babel%2Fplugin-transform-exponentiation-operator-7.10.4.tgz", - "integrity": "sha1-WuM4xX+M9AAb2zVgeuZrktZlry4=", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.10.4.tgz", - "integrity": "sha1-wIiS6IGdOl2ykDGxFa9RHbv+uuk=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.10.4.tgz", - "integrity": "sha1-akZ4gOD8ljhRS6NpERgR3b4mRLc=", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.10.4.tgz", - "integrity": "sha1-n0K6CEEQChNfInEtDjkcRi9XHzw=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.10.5.tgz?cache=0&sync_timestamp=1594751493579&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-amd%2Fdownload%2F%40babel%2Fplugin-transform-modules-amd-7.10.5.tgz", - "integrity": "sha1-G5zdrwXZ6Is6rTOcs+RFxPAgqbE=", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.10.4.tgz", - "integrity": "sha1-ZmZ8Pu2h6/eJbUHx8WsXEFovvKA=", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.10.5.tgz?cache=0&sync_timestamp=1594751492758&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-systemjs%2Fdownload%2F%40babel%2Fplugin-transform-modules-systemjs-7.10.5.tgz", - "integrity": "sha1-YnAJnIVAZmgbrp4F+H4bnK2+jIU=", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.10.5", - "@babel/helper-plugin-utils": "^7.10.4", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.10.4.tgz?cache=0&sync_timestamp=1593522937615&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-modules-umd%2Fdownload%2F%40babel%2Fplugin-transform-modules-umd-7.10.4.tgz", - "integrity": "sha1-moSB/oG4JGVLOgtl2j34nz0hg54=", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", - "integrity": "sha1-eLTZeIELbzvPA/njGPL8DtQa7LY=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.10.4.tgz?cache=0&sync_timestamp=1593522495673&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-new-target%2Fdownload%2F%40babel%2Fplugin-transform-new-target-7.10.4.tgz", - "integrity": "sha1-kJfXU8t7Aky3OBo7LlLpUTqcaIg=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.10.4.tgz", - "integrity": "sha1-1xRsTROUM+emUm+IjGZ+MUoJOJQ=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.10.5.tgz?cache=0&sync_timestamp=1594751489267&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-parameters%2Fdownload%2F%40babel%2Fplugin-transform-parameters-7.10.5.tgz", - "integrity": "sha1-WdM51Y0LGVBDX0BD504lEABeLEo=", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.10.4.tgz?cache=0&sync_timestamp=1593521089707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-regenerator%2Fdownload%2F%40babel%2Fplugin-transform-regenerator-7.10.4.tgz", - "integrity": "sha1-IBXlnYOQdOdoON4hWdtCGWb9i2M=", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-runtime/download/@babel/plugin-transform-runtime-7.10.5.tgz?cache=0&sync_timestamp=1594751489022&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-runtime%2Fdownload%2F%40babel%2Fplugin-transform-runtime-7.10.5.tgz", - "integrity": "sha1-Ozm3skgw4MLY/3pEif5c+Z+6zoY=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", - "semver": "^5.5.1" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.10.4.tgz", - "integrity": "sha1-n9Jexc3VVbt/Rz5ebuHJce7eTdY=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.10.4.tgz?cache=0&sync_timestamp=1593522927458&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-spread%2Fdownload%2F%40babel%2Fplugin-transform-spread-7.10.4.tgz", - "integrity": "sha1-TiyF6g1quu4bJNz7uuQm/o1nTP8=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.10.4.tgz", - "integrity": "sha1-jziJ7oZXWBEwop2cyR18c7fEoo0=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-regex": "^7.10.4" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.10.5.tgz?cache=0&sync_timestamp=1594751489580&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-template-literals%2Fdownload%2F%40babel%2Fplugin-transform-template-literals-7.10.5.tgz", - "integrity": "sha1-eLxdYmpmQtszEtnQ8AH152Of3ow=", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.10.4.tgz", - "integrity": "sha1-lQnxp+7DHE7b/+E3wWzDP/C8W/w=", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.10.4.tgz?cache=0&sync_timestamp=1593522855498&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fplugin-transform-unicode-regex%2Fdownload%2F%40babel%2Fplugin-transform-unicode-regex-7.10.4.tgz", - "integrity": "sha1-5W1x+SgvrG2wnIJ0IFVXbV5tgKg=", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/preset-env": { - "version": "7.3.4", - "resolved": "https://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.3.4.tgz", - "integrity": "sha1-iHzzi20jyC8ZtRNSmL2xYAYuM+E=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.3.4", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.3.4", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.3.4", - "@babel/plugin-transform-classes": "^7.3.4", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.2.0", - "@babel/plugin-transform-dotall-regex": "^7.2.0", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.2.0", - "@babel/plugin-transform-function-name": "^7.2.0", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.2.0", - "@babel/plugin-transform-modules-systemjs": "^7.3.4", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0", - "@babel/plugin-transform-new-target": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.3.4", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.2.0", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.2.0", - "browserslist": "^4.3.4", - "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", - "semver": "^5.3.0" - } - }, - "@babel/runtime": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.10.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.10.5.tgz", - "integrity": "sha1-MD2L1EDs1aSR6uYRf9M2dphnTFw=", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs2": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/runtime-corejs2/download/@babel/runtime-corejs2-7.10.5.tgz?cache=0&sync_timestamp=1594751489791&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fruntime-corejs2%2Fdownload%2F%40babel%2Fruntime-corejs2-7.10.5.tgz", - "integrity": "sha1-jaoc7MwEaOXC4V8STj9RwrMDO0k=", - "dev": true, - "requires": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.10.4.tgz", - "integrity": "sha1-MlGZbEIA68cdGo/EBfupQPNrong=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - } - }, - "@babel/traverse": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/traverse/download/@babel/traverse-7.10.5.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftraverse%2Fdownload%2F%40babel%2Ftraverse-7.10.5.tgz", - "integrity": "sha1-d85GT1sli+Jlr2GNj93wU28gtWQ=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.10.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.10.4", - "@babel/parser": "^7.10.5", - "@babel/types": "^7.10.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.10.5", - "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.10.5.tgz?cache=0&sync_timestamp=1594750825865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.10.5.tgz", - "integrity": "sha1-2Irn4v3oa/v+hR1Nga+nCpl7XRU=", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npm.taobao.org/@hapi/address/download/@hapi/address-2.1.4.tgz?cache=0&sync_timestamp=1593993745797&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Faddress%2Fdownload%2F%40hapi%2Faddress-2.1.4.tgz", - "integrity": "sha1-XWftQ/P9QaadS5/3tW58DR0KgeU=", - "dev": true - }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/@hapi/bourne/download/@hapi/bourne-1.3.2.tgz", - "integrity": "sha1-CnCVreoGckPOMoPhtWuKj0U7JCo=", - "dev": true - }, - "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npm.taobao.org/@hapi/hoek/download/@hapi/hoek-8.5.1.tgz", - "integrity": "sha1-/elgZMpEbeyMVajC8TCVewcMbgY=", - "dev": true - }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npm.taobao.org/@hapi/joi/download/@hapi/joi-15.1.1.tgz", - "integrity": "sha1-xnW4pxKW8Cgz+NbSQ7NMV7jOGdc=", - "dev": true, - "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" - } - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npm.taobao.org/@hapi/topo/download/@hapi/topo-3.1.6.tgz?cache=0&sync_timestamp=1593916080558&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40hapi%2Ftopo%2Fdownload%2F%40hapi%2Ftopo-3.1.6.tgz", - "integrity": "sha1-aNk1+j6uf91asNf5U/MgXYsr/Ck=", - "dev": true, - "requires": { - "@hapi/hoek": "^8.3.0" - } - }, - "@intervolga/optimize-cssnano-plugin": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/@intervolga/optimize-cssnano-plugin/download/@intervolga/optimize-cssnano-plugin-1.0.6.tgz", - "integrity": "sha1-vnx4RhKLiPapsdEmGgrQbrXA/fg=", - "dev": true, - "requires": { - "cssnano": "^4.0.0", - "cssnano-preset-default": "^4.0.0", - "postcss": "^7.0.0" - } - }, - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz", - "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=", - "dev": true, - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz", - "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=", - "dev": true - }, - "@soda/friendly-errors-webpack-plugin": { - "version": "1.7.1", - "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.7.1.tgz", - "integrity": "sha1-cG9kvLSouWQrSK46zkRMcDNNYV0=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "error-stack-parser": "^2.0.0", - "string-width": "^2.0.0" - } - }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/@types/color-name/download/@types/color-name-1.1.1.tgz", - "integrity": "sha1-HBJhu+qhCoBVu8XYq4S3sq/IRqA=", - "dev": true - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npm.taobao.org/@types/glob/download/@types/glob-7.1.3.tgz", - "integrity": "sha1-5rqA82t9qtLGhazZJmOC5omFwYM=", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npm.taobao.org/@types/json-schema/download/@types/json-schema-7.0.5.tgz?cache=0&sync_timestamp=1591720749429&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.5.tgz", - "integrity": "sha1-3M5EMOZLRDuolF8CkPtWStW6xt0=", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npm.taobao.org/@types/json5/download/@types/json5-0.0.29.tgz?cache=0&sync_timestamp=1588201498029&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fjson5%2Fdownload%2F%40types%2Fjson5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npm.taobao.org/@types/minimatch/download/@types/minimatch-3.0.3.tgz", - "integrity": "sha1-PcoOPzOyAPx9ETnAzZbBJoyt/Z0=", - "dev": true - }, - "@types/node": { - "version": "14.0.24", - "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-14.0.24.tgz?cache=0&sync_timestamp=1595281751560&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-14.0.24.tgz", - "integrity": "sha1-sPhvWFZPoCooto+LVdTN7ELjudY=", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/@types/normalize-package-data/download/@types/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-5IbQ2XOW15vu3QpuM/RTT/a0lz4=", - "dev": true - }, - "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npm.taobao.org/@types/q/download/@types/q-1.5.4.tgz", - "integrity": "sha1-FZJUFOCtLNdlv+9YhC9+JqesyyQ=", - "dev": true - }, - "@vue/babel-helper-vue-jsx-merge-props": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.0.0.tgz", - "integrity": "sha1-BI/leZWNpAj7eosqPsBQtQpmEEA=", - "dev": true - }, - "@vue/babel-plugin-transform-vue-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-plugin-transform-vue-jsx/download/@vue/babel-plugin-transform-vue-jsx-1.1.2.tgz", - "integrity": "sha1-wKPm78Ai515CR7RIqPxrhvA+kcA=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "html-tags": "^2.0.0", - "lodash.kebabcase": "^4.1.1", - "svg-tags": "^1.0.0" - } - }, - "@vue/babel-preset-app": { - "version": "3.12.1", - "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-app/download/@vue/babel-preset-app-3.12.1.tgz", - "integrity": "sha1-JMR3BS8HjzD9t3NRA7FN0fosv+E=", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-decorators": "^7.1.0", - "@babel/plugin-syntax-dynamic-import": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.4.0", - "@babel/preset-env": "^7.0.0 < 7.4.0", - "@babel/runtime": "^7.0.0", - "@babel/runtime-corejs2": "^7.2.0", - "@vue/babel-preset-jsx": "^1.0.0", - "babel-plugin-dynamic-import-node": "^2.2.0", - "babel-plugin-module-resolver": "3.2.0", - "core-js": "^2.6.5" - } - }, - "@vue/babel-preset-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-preset-jsx/download/@vue/babel-preset-jsx-1.1.2.tgz", - "integrity": "sha1-LhaetMIE6jfKZsLqhaiAv8mdTyA=", - "dev": true, - "requires": { - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", - "@vue/babel-sugar-functional-vue": "^1.1.2", - "@vue/babel-sugar-inject-h": "^1.1.2", - "@vue/babel-sugar-v-model": "^1.1.2", - "@vue/babel-sugar-v-on": "^1.1.2" - } - }, - "@vue/babel-sugar-functional-vue": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-functional-vue/download/@vue/babel-sugar-functional-vue-1.1.2.tgz", - "integrity": "sha1-9+JPugnm8e5wEEVgqICAV1VfGpo=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@vue/babel-sugar-inject-h": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-inject-h/download/@vue/babel-sugar-inject-h-1.1.2.tgz", - "integrity": "sha1-ilJ2ttji7Rb/yAeKrZQjYnTm7fA=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0" - } - }, - "@vue/babel-sugar-v-model": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-model/download/@vue/babel-sugar-v-model-1.1.2.tgz", - "integrity": "sha1-H/b9G4ACI/ycsehNzrXlLXN6gZI=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", - "camelcase": "^5.0.0", - "html-tags": "^2.0.0", - "svg-tags": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - } - } - }, - "@vue/babel-sugar-v-on": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/babel-sugar-v-on/download/@vue/babel-sugar-v-on-1.1.2.tgz", - "integrity": "sha1-su+ZuPL6sJ++rSWq1w70Lhz1sTs=", - "dev": true, - "requires": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.1.2", - "camelcase": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - } - } - }, - "@vue/cli-overlay": { - "version": "3.12.1", - "resolved": "https://registry.npm.taobao.org/@vue/cli-overlay/download/@vue/cli-overlay-3.12.1.tgz?cache=0&sync_timestamp=1592976328085&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcli-overlay%2Fdownload%2F%40vue%2Fcli-overlay-3.12.1.tgz", - "integrity": "sha1-vf3o9xI1YasG5OTGC4VMxQkvWrE=", - "dev": true - }, - "@vue/cli-plugin-babel": { - "version": "3.12.1", - "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-babel/download/@vue/cli-plugin-babel-3.12.1.tgz", - "integrity": "sha1-mnkVnejNCGsBP6bXijmDCy4uxwY=", - "dev": true, - "requires": { - "@babel/core": "^7.0.0", - "@vue/babel-preset-app": "^3.12.1", - "@vue/cli-shared-utils": "^3.12.1", - "babel-loader": "^8.0.5", - "webpack": "^4.0.0" - } - }, - "@vue/cli-plugin-eslint": { - "version": "3.12.1", - "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-eslint/download/@vue/cli-plugin-eslint-3.12.1.tgz", - "integrity": "sha1-MCxGOGfzjnkLuZbq/fcVnHgtyM8=", - "dev": true, - "requires": { - "@vue/cli-shared-utils": "^3.12.1", - "babel-eslint": "^10.0.1", - "eslint": "^4.19.1", - "eslint-loader": "^2.1.2", - "eslint-plugin-vue": "^4.7.1", - "globby": "^9.2.0", - "webpack": "^4.0.0", - "yorkie": "^2.0.0" - } - }, - "@vue/cli-plugin-unit-mocha": { - "version": "3.12.1", - "resolved": "https://registry.npm.taobao.org/@vue/cli-plugin-unit-mocha/download/@vue/cli-plugin-unit-mocha-3.12.1.tgz?cache=0&sync_timestamp=1592978125871&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcli-plugin-unit-mocha%2Fdownload%2F%40vue%2Fcli-plugin-unit-mocha-3.12.1.tgz", - "integrity": "sha1-lwxTZHW/RwqoVLDUzEFO2bJCZjY=", - "dev": true, - "requires": { - "@vue/cli-shared-utils": "^3.12.1", - "jsdom": "^13.2.0", - "jsdom-global": "^3.0.2", - "mocha": "^5.2.0", - "mocha-webpack": "^2.0.0-beta.0" - } - }, - "@vue/cli-service": { - "version": "3.12.1", - "resolved": "https://registry.npm.taobao.org/@vue/cli-service/download/@vue/cli-service-3.12.1.tgz", - "integrity": "sha1-EyILHBiSVOfAAzkN8ykIb5tud+Y=", - "dev": true, - "requires": { - "@intervolga/optimize-cssnano-plugin": "^1.0.5", - "@soda/friendly-errors-webpack-plugin": "^1.7.1", - "@vue/cli-overlay": "^3.12.1", - "@vue/cli-shared-utils": "^3.12.1", - "@vue/component-compiler-utils": "^3.0.0", - "@vue/preload-webpack-plugin": "^1.1.0", - "@vue/web-component-wrapper": "^1.2.0", - "acorn": "^6.1.1", - "acorn-walk": "^6.1.1", - "address": "^1.0.3", - "autoprefixer": "^9.5.1", - "browserslist": "^4.5.4", - "cache-loader": "^2.0.1", - "case-sensitive-paths-webpack-plugin": "^2.2.0", - "chalk": "^2.4.2", - "cli-highlight": "^2.1.0", - "clipboardy": "^2.0.0", - "cliui": "^5.0.0", - "copy-webpack-plugin": "^4.6.0", - "css-loader": "^1.0.1", - "cssnano": "^4.1.10", - "current-script-polyfill": "^1.0.0", - "debug": "^4.1.1", - "default-gateway": "^5.0.2", - "dotenv": "^7.0.0", - "dotenv-expand": "^5.1.0", - "escape-string-regexp": "^1.0.5", - "file-loader": "^3.0.1", - "fs-extra": "^7.0.1", - "globby": "^9.2.0", - "hash-sum": "^1.0.2", - "html-webpack-plugin": "^3.2.0", - "launch-editor-middleware": "^2.2.1", - "lodash.defaultsdeep": "^4.6.1", - "lodash.mapvalues": "^4.6.0", - "lodash.transform": "^4.6.0", - "mini-css-extract-plugin": "^0.8.0", - "minimist": "^1.2.0", - "ora": "^3.4.0", - "portfinder": "^1.0.20", - "postcss-loader": "^3.0.0", - "read-pkg": "^5.0.0", - "semver": "^6.0.0", - "slash": "^2.0.0", - "source-map-url": "^0.4.0", - "ssri": "^6.0.1", - "string.prototype.padend": "^3.0.0", - "terser-webpack-plugin": "^1.2.3", - "thread-loader": "^2.1.2", - "url-loader": "^1.1.2", - "vue-loader": "^15.7.0", - "webpack": "^4.0.0", - "webpack-bundle-analyzer": "^3.3.0", - "webpack-chain": "^4.11.0", - "webpack-dev-server": "^3.4.1", - "webpack-merge": "^4.2.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz", - "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1586886301819&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz", - "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - } - } - }, - "@vue/cli-shared-utils": { - "version": "3.12.1", - "resolved": "https://registry.npm.taobao.org/@vue/cli-shared-utils/download/@vue/cli-shared-utils-3.12.1.tgz", - "integrity": "sha1-vPB2KH3a3uu7l8anSN/p/1DsjfA=", - "dev": true, - "requires": { - "@hapi/joi": "^15.0.1", - "chalk": "^2.4.1", - "execa": "^1.0.0", - "launch-editor": "^2.2.1", - "lru-cache": "^5.1.1", - "node-ipc": "^9.1.1", - "open": "^6.3.0", - "ora": "^3.4.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.7", - "semver": "^6.0.0", - "string.prototype.padstart": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1586886301819&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@vue/component-compiler-utils": { - "version": "3.1.2", - "resolved": "https://registry.npm.taobao.org/@vue/component-compiler-utils/download/@vue/component-compiler-utils-3.1.2.tgz", - "integrity": "sha1-ghOl/zIC+fITf+VTcPnouWVggcM=", - "dev": true, - "requires": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.14", - "postcss-selector-parser": "^6.0.2", - "prettier": "^1.18.2", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427569171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "@vue/eslint-config-standard": { - "version": "3.0.5", - "resolved": "https://registry.npm.taobao.org/@vue/eslint-config-standard/download/@vue/eslint-config-standard-3.0.5.tgz", - "integrity": "sha1-fWroCerskJk8YDPZVD9I9oe56/E=", - "dev": true, - "requires": { - "eslint-config-standard": "^12.0.0-alpha.0", - "eslint-plugin-import": "^2.11.0", - "eslint-plugin-node": "^6.0.1", - "eslint-plugin-promise": "^3.7.0", - "eslint-plugin-standard": "^3.1.0" - } - }, - "@vue/preload-webpack-plugin": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/@vue/preload-webpack-plugin/download/@vue/preload-webpack-plugin-1.1.1.tgz", - "integrity": "sha1-GHI1MNME9EMCHaIpLW7JUCgmEEo=", - "dev": true - }, - "@vue/test-utils": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/@vue/test-utils/download/@vue/test-utils-1.0.3.tgz", - "integrity": "sha1-WHxN2bQktmAi8YjBm8YF2izpHG8=", - "dev": true, - "requires": { - "dom-event-types": "^1.0.0", - "lodash": "^4.17.15", - "pretty": "^2.0.0" - } - }, - "@vue/web-component-wrapper": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/@vue/web-component-wrapper/download/@vue/web-component-wrapper-1.2.0.tgz", - "integrity": "sha1-uw5G8VhafiibTuYGfcxaauYvHdE=", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ast/download/@webassemblyjs/ast-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fast%2Fdownload%2F%40webassemblyjs%2Fast-1.9.0.tgz", - "integrity": "sha1-vYUGBLQEJFmlpBzX0zjL7Wle2WQ=", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/floating-point-hex-parser/download/@webassemblyjs/floating-point-hex-parser-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Ffloating-point-hex-parser%2Fdownload%2F%40webassemblyjs%2Ffloating-point-hex-parser-1.9.0.tgz", - "integrity": "sha1-PD07Jxvd/ITesA9xNEQ4MR1S/7Q=", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-api-error/download/@webassemblyjs/helper-api-error-1.9.0.tgz", - "integrity": "sha1-ID9nbjM7lsnaLuqzzO8zxFkotqI=", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-buffer/download/@webassemblyjs/helper-buffer-1.9.0.tgz?cache=0&sync_timestamp=1580600188490&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-buffer%2Fdownload%2F%40webassemblyjs%2Fhelper-buffer-1.9.0.tgz", - "integrity": "sha1-oUQtJpxf6yP8vJ73WdrDVH8p3gA=", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-code-frame/download/@webassemblyjs/helper-code-frame-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-code-frame%2Fdownload%2F%40webassemblyjs%2Fhelper-code-frame-1.9.0.tgz", - "integrity": "sha1-ZH+Iks0gQ6gqwMjF51w28dkVnyc=", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-fsm/download/@webassemblyjs/helper-fsm-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-fsm%2Fdownload%2F%40webassemblyjs%2Fhelper-fsm-1.9.0.tgz", - "integrity": "sha1-wFJWtxJEIUZx9LCOwQitY7cO3bg=", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-module-context/download/@webassemblyjs/helper-module-context-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-module-context%2Fdownload%2F%40webassemblyjs%2Fhelper-module-context-1.9.0.tgz", - "integrity": "sha1-JdiIS3aDmHGgimxvgGw5ee9xLwc=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-bytecode/download/@webassemblyjs/helper-wasm-bytecode-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-wasm-bytecode%2Fdownload%2F%40webassemblyjs%2Fhelper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha1-T+2L6sm4wU+MWLcNEk1UndH+V5A=", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/helper-wasm-section/download/@webassemblyjs/helper-wasm-section-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fhelper-wasm-section%2Fdownload%2F%40webassemblyjs%2Fhelper-wasm-section-1.9.0.tgz", - "integrity": "sha1-WkE41aYpK6GLBMWuSXF+QWeWU0Y=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/ieee754/download/@webassemblyjs/ieee754-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fieee754%2Fdownload%2F%40webassemblyjs%2Fieee754-1.9.0.tgz", - "integrity": "sha1-Fceg+6roP7JhQ7us9tbfFwKtOeQ=", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/leb128/download/@webassemblyjs/leb128-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fleb128%2Fdownload%2F%40webassemblyjs%2Fleb128-1.9.0.tgz", - "integrity": "sha1-8Zygt2ptxVYjoJz/p2noOPoeHJU=", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/utf8/download/@webassemblyjs/utf8-1.9.0.tgz", - "integrity": "sha1-BNM7Y2945qaBMifoJAL3Y3tiKas=", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-edit/download/@webassemblyjs/wasm-edit-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-edit%2Fdownload%2F%40webassemblyjs%2Fwasm-edit-1.9.0.tgz", - "integrity": "sha1-P+bXnT8PkiGDqoYALELdJWz+6c8=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-gen/download/@webassemblyjs/wasm-gen-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-gen%2Fdownload%2F%40webassemblyjs%2Fwasm-gen-1.9.0.tgz", - "integrity": "sha1-ULxw7Gje2OJ2OwGhQYv0NJGnpJw=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-opt/download/@webassemblyjs/wasm-opt-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-opt%2Fdownload%2F%40webassemblyjs%2Fwasm-opt-1.9.0.tgz", - "integrity": "sha1-IhEYHlsxMmRDzIES658LkChyGmE=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wasm-parser/download/@webassemblyjs/wasm-parser-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwasm-parser%2Fdownload%2F%40webassemblyjs%2Fwasm-parser-1.9.0.tgz", - "integrity": "sha1-nUjkSCbfSmWYKUqmyHRp1kL/9l4=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-parser/download/@webassemblyjs/wast-parser-1.9.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwast-parser%2Fdownload%2F%40webassemblyjs%2Fwast-parser-1.9.0.tgz", - "integrity": "sha1-MDERXXmsW9JhVWzsw/qQo+9FGRQ=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npm.taobao.org/@webassemblyjs/wast-printer/download/@webassemblyjs/wast-printer-1.9.0.tgz?cache=0&sync_timestamp=1580599638157&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40webassemblyjs%2Fwast-printer%2Fdownload%2F%40webassemblyjs%2Fwast-printer-1.9.0.tgz", - "integrity": "sha1-STXVTIX+9jewDOn1I3dFHQDUeJk=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/@xtuc/ieee754/download/@xtuc/ieee754-1.2.0.tgz", - "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npm.taobao.org/@xtuc/long/download/@xtuc/long-4.2.2.tgz", - "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=", - "dev": true - }, - "abab": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/abab/download/abab-2.0.3.tgz", - "integrity": "sha1-Yj4gdeAustPyR15J+ZyRhGRnkHo=", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz", - "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-6.4.1.tgz?cache=0&sync_timestamp=1591869432510&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-6.4.1.tgz", - "integrity": "sha1-Ux5Yuj9RudrLmmZGyk3r9bFMpHQ=", - "dev": true - }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npm.taobao.org/acorn-globals/download/acorn-globals-4.3.4.tgz", - "integrity": "sha1-n6GSat3BHJcwjE5m163Q1Awycuc=", - "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "optional": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-3.3.0.tgz?cache=0&sync_timestamp=1591869432510&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true, - "optional": true - } - } - }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npm.taobao.org/acorn-walk/download/acorn-walk-6.2.0.tgz", - "integrity": "sha1-Ejy487hMIXHx9/slJhWxx4prGow=", - "dev": true - }, - "address": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/address/download/address-1.1.2.tgz?cache=0&sync_timestamp=1588851806210&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faddress%2Fdownload%2Faddress-1.1.2.tgz", - "integrity": "sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY=", - "dev": true - }, - "adler-32": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/adler-32/download/adler-32-1.2.0.tgz", - "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=", - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.0.1.tgz?cache=0&sync_timestamp=1570167911603&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faggregate-error%2Fdownload%2Faggregate-error-3.0.1.tgz", - "integrity": "sha1-2y/nJG5Tb0DZtUQqOeEX191qJOA=", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.3.tgz", - "integrity": "sha1-GMWvOKER3etPJpe9eNaKvByr1wY=", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/ajv-errors/download/ajv-errors-1.0.1.tgz", - "integrity": "sha1-81mGrOuRr63sQQL72FAUlQzvpk0=", - "dev": true - }, - "ajv-keywords": { - "version": "3.5.1", - "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.1.tgz", - "integrity": "sha1-uDyonF1C1pAx9CTK1JqtoCNsaVc=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/alphanum-sort/download/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npm.taobao.org/ansi-colors/download/ansi-colors-3.2.4.tgz", - "integrity": "sha1-46PaS/uubIapwoViXeEkojQCb78=", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz", - "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=", - "dev": true, - "optional": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npm.taobao.org/ansi-html/download/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "any-observable": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/any-observable/download/any-observable-0.2.0.tgz", - "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", - "dev": true - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/any-promise/download/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", - "dev": true - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.1.tgz", - "integrity": "sha1-xV7PAhheJGklk5kxDBc84xIzsUI=", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "app-root-path": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/app-root-path/download/app-root-path-2.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fapp-root-path%2Fdownload%2Fapp-root-path-2.2.1.tgz", - "integrity": "sha1-0N9KaC7kCCc1g9Q/b3npiSYkvJo=", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=", - "dev": true - }, - "arch": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/arch/download/arch-2.1.2.tgz", - "integrity": "sha1-DFK75zRLtPomDEQ9LLrZwA/y8L8=", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/array-equal/download/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-flatten%2Fdownload%2Farray-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/array-includes/download/array-includes-3.1.1.tgz", - "integrity": "sha1-zdZ+aFK9+cEhVGB4ZzIlXtJFk0g=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/array-uniq/download/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/array.prototype.flat/download/array.prototype.flat-1.2.3.tgz", - "integrity": "sha1-DegrQmsDGNv9uUAInjiwQ9N/bHs=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz", - "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npm.taobao.org/asn1.js/download/asn1.js-4.10.1.tgz", - "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/assert/download/assert-1.5.0.tgz", - "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npm.taobao.org/util/download/util-0.10.3.tgz?cache=0&sync_timestamp=1588238457176&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil%2Fdownload%2Futil-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/assertion-error/download/assertion-error-1.1.0.tgz", - "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npm.taobao.org/async/download/async-2.6.3.tgz", - "integrity": "sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8=", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz", - "integrity": "sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz?cache=0&sync_timestamp=1574272018408&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync-limiter%2Fdownload%2Fasync-limiter-1.0.1.tgz", - "integrity": "sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=", - "dev": true - }, - "async-validator": { - "version": "1.12.2", - "resolved": "https://registry.npm.taobao.org/async-validator/download/async-validator-1.12.2.tgz", - "integrity": "sha1-vq5nHnF00pOLe0tp0vt+cit/1yw=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz", - "integrity": "sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=", - "dev": true - }, - "autoprefixer": { - "version": "9.8.5", - "resolved": "https://registry.npm.taobao.org/autoprefixer/download/autoprefixer-9.8.5.tgz?cache=0&sync_timestamp=1594444612318&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fautoprefixer%2Fdownload%2Fautoprefixer-9.8.5.tgz", - "integrity": "sha1-LCJd4indr+HRQkwCeR0MPhDMzKo=", - "dev": true, - "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001097", - "colorette": "^1.2.0", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npm.taobao.org/aws4/download/aws4-1.10.0.tgz", - "integrity": "sha1-oXs6jqgRBg501H0wYSJACtRJeuI=", - "dev": true - }, - "axios": { - "version": "0.18.1", - "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.18.1.tgz", - "integrity": "sha1-/z8N4ue10YDnV62YAA8Qgbh7zqM=", - "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-2.0.4.tgz", - "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM=" - } - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - } - } - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npm.taobao.org/babel-eslint/download/babel-eslint-10.1.0.tgz", - "integrity": "sha1-aWjlaKkQt4+zd5zdi2rC9HmUMjI=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - } - }, - "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npm.taobao.org/babel-loader/download/babel-loader-8.1.0.tgz", - "integrity": "sha1-xhHVESvVIJq+i5+oTD5NolJ18cM=", - "dev": true, - "requires": { - "find-cache-dir": "^2.1.0", - "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", - "schema-utils": "^2.6.5" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npm.taobao.org/babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha1-hP2hnJduxcbe/vV/lCez3vZuF6M=", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-module-resolver": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/babel-plugin-module-resolver/download/babel-plugin-module-resolver-3.2.0.tgz", - "integrity": "sha1-3fpeMB47mqEthSqZefGLN4gf9ac=", - "dev": true, - "requires": { - "find-babel-config": "^1.1.0", - "glob": "^7.1.2", - "pkg-up": "^2.0.0", - "reselect": "^3.0.1", - "resolve": "^1.4.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz?cache=0&sync_timestamp=1584052597708&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", - "dev": true - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz", - "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true - } - } - }, - "base64-arraybuffer": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/base64-arraybuffer/download/base64-arraybuffer-0.2.0.tgz", - "integrity": "sha1-S5RPrAGRqlkHr+LYyZnMxXzoD0U=" - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/base64-js/download/base64-js-1.3.1.tgz", - "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/batch/download/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "batch-processor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/batch-processor/download/batch-processor-1.0.0.tgz", - "integrity": "sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bfj": { - "version": "6.1.2", - "resolved": "https://registry.npm.taobao.org/bfj/download/bfj-6.1.2.tgz", - "integrity": "sha1-MlyGGoIryzWKQceKM7jm4ght3n8=", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "check-types": "^8.0.3", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", - "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", - "dev": true - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.1.0.tgz?cache=0&sync_timestamp=1593261363626&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.1.0.tgz", - "integrity": "sha1-MPpAyef+B9vIlWeM0ocCTeokHdk=", - "dev": true, - "optional": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz", - "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz", - "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", - "dev": true - }, - "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-5.1.2.tgz", - "integrity": "sha1-yWhpAtPJoncp9DqxD515wgBNp7A=", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz", - "integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npm.taobao.org/bonjour/download/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - }, - "dependencies": { - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-flatten%2Fdownload%2Farray-flatten-2.1.2.tgz", - "integrity": "sha1-JO+AoowaiTYX4hSbDG0NeIKTsJk=", - "dev": true - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npm.taobao.org/boom/download/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz", - "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/brorand/download/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/browser-process-hrtime/download/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha1-PJtLfXgsgSHlbxAQbYTA0P/JRiY=", - "dev": true - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/browser-stdout/download/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/browserify-aes/download/browserify-aes-1.2.0.tgz", - "integrity": "sha1-Mmc0ZC9APavDADIJhTu3CtQo70g=", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/browserify-cipher/download/browserify-cipher-1.0.1.tgz", - "integrity": "sha1-jWR0wbhwv9q807z8wZNKEOlPFfA=", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/browserify-des/download/browserify-des-1.0.2.tgz", - "integrity": "sha1-OvTx9Zg5QDVy8cZiBDdfen9wPpw=", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/browserify-rsa/download/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/browserify-sign/download/browserify-sign-4.2.0.tgz", - "integrity": "sha1-VF0LGwfmssmSEQgr8bEsznoLDhE=", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/browserify-zlib/download/browserify-zlib-0.2.0.tgz", - "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.13.0", - "resolved": "https://registry.npm.taobao.org/browserslist/download/browserslist-4.13.0.tgz?cache=0&sync_timestamp=1593912387376&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrowserslist%2Fdownload%2Fbrowserslist-4.13.0.tgz", - "integrity": "sha1-QlVsugEeGwondbYRy6ao7KGOlA0=", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001093", - "electron-to-chromium": "^1.3.488", - "escalade": "^3.0.1", - "node-releases": "^1.1.58" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npm.taobao.org/buffer/download/buffer-4.9.2.tgz?cache=0&sync_timestamp=1588706716358&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbuffer%2Fdownload%2Fbuffer-4.9.2.tgz", - "integrity": "sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz", - "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/buffer-indexof/download/buffer-indexof-1.1.1.tgz", - "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/buffer-xor/download/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/builtin-status-codes/download/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbytes%2Fdownload%2Fbytes-3.1.0.tgz", - "integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY=", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-12.0.4.tgz?cache=0&sync_timestamp=1594429684526&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-12.0.4.tgz", - "integrity": "sha1-ZovL0QWutfHZL+JVcOyVJcj6pAw=", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz", - "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cache-loader": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/cache-loader/download/cache-loader-2.0.1.tgz", - "integrity": "sha1-V1j0GmLXwjlB48PHAW5vrrA6ywc=", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.0", - "normalize-path": "^3.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/call-me-maybe/download/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", - "dev": true - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/caller-callsite/download/caller-callsite-2.0.0.tgz?cache=0&sync_timestamp=1562668933683&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaller-callsite%2Fdownload%2Fcaller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - }, - "dependencies": { - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - } - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/caller-path/download/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "optional": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true, - "optional": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz?cache=0&sync_timestamp=1576748709736&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz", - "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001104", - "resolved": "https://registry.npm.taobao.org/caniuse-lite/download/caniuse-lite-1.0.30001104.tgz?cache=0&sync_timestamp=1595226955587&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-lite%2Fdownload%2Fcaniuse-lite-1.0.30001104.tgz", - "integrity": "sha1-Tj1bOx3Tw1KfEMt/UZxiuj5Xn10=", - "dev": true - }, - "case-sensitive-paths-webpack-plugin": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/case-sensitive-paths-webpack-plugin/download/case-sensitive-paths-webpack-plugin-2.3.0.tgz", - "integrity": "sha1-I6xhPMmoVuT4j/i7c7u16YmCXPc=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "cfb": { - "version": "1.0.8", - "resolved": "https://registry.npm.taobao.org/cfb/download/cfb-1.0.8.tgz?cache=0&sync_timestamp=1594276069691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcfb%2Fdownload%2Fcfb-1.0.8.tgz", - "integrity": "sha1-d/ITST1pfXVP2cD1UR6rWtctAs8=", - "requires": { - "commander": "^2.14.1", - "printj": "~1.1.2" - } - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/chai/download/chai-4.2.0.tgz", - "integrity": "sha1-dgqnLPION5XoSxKHfODoNzeqKeU=", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npm.taobao.org/chardet/download/chardet-0.4.2.tgz?cache=0&sync_timestamp=1594010705529&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchardet%2Fdownload%2Fchardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true, - "optional": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/check-error/download/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "check-types": { - "version": "8.0.3", - "resolved": "https://registry.npm.taobao.org/check-types/download/check-types-8.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcheck-types%2Fdownload%2Fcheck-types-8.0.3.tgz", - "integrity": "sha1-M1bMoZyIlUTy16le1JzlCKDs9VI=", - "dev": true - }, - "chokidar": { - "version": "3.4.1", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-3.4.1.tgz?cache=0&sync_timestamp=1594864731636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.4.1.tgz", - "integrity": "sha1-6QW97PEOqgoLHbDGZEgcxMvCK6E=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz", - "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz", - "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz", - "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", - "dev": true, - "optional": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz", - "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/chownr/download/chownr-1.1.4.tgz", - "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/chrome-trace-event/download/chrome-trace-event-1.0.2.tgz", - "integrity": "sha1-I0CQ7pfH1K0aLEvq4nUF3v/GCKQ=", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/ci-info/download/ci-info-1.6.0.tgz", - "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/cipher-base/download/cipher-base-1.0.4.tgz", - "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npm.taobao.org/circular-json/download/circular-json-0.3.3.tgz", - "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", - "dev": true, - "optional": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz", - "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz", - "integrity": "sha1-UHtd59l7SO5T2ErbAWD/YhY4D3g=", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/clean-stack/download/clean-stack-2.2.0.tgz?cache=0&sync_timestamp=1592035230294&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclean-stack%2Fdownload%2Fclean-stack-2.2.0.tgz", - "integrity": "sha1-7oRy27Ep5yezHooQpCfe6d/kAIs=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-highlight": { - "version": "2.1.4", - "resolved": "https://registry.npm.taobao.org/cli-highlight/download/cli-highlight-2.1.4.tgz?cache=0&sync_timestamp=1573948719956&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-highlight%2Fdownload%2Fcli-highlight-2.1.4.tgz", - "integrity": "sha1-CYy2Qs8X9CrcHBFF4H+WDsTXUis=", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "highlight.js": "^9.6.0", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^5.1.1", - "yargs": "^15.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-5.0.0.tgz", - "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.2.1.tgz", - "integrity": "sha1-kK51xCTQCNJiTFvynq0xd+v881k=", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-3.0.0.tgz", - "integrity": "sha1-P3PCv1JlkfV0zEksUeJFY0n4ROQ=", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-6.0.0.tgz", - "integrity": "sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz", - "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz", - "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", - "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz", - "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz", - "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", - "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1594559696906&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz", - "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", - "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", - "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", - "dev": true - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-5.1.1.tgz", - "integrity": "sha1-9o5OW6GFKsLK3AD0VV//bCq7YXg=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", - "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz", - "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-4.2.0.tgz", - "integrity": "sha1-lSGCxGzHssMT0VluYjmSvRY7crU=", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-6.0.0.tgz", - "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz", - "integrity": "sha1-aOMlkd9z4lrRxLSRCKLsUHliv9E=", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-6.2.0.tgz", - "integrity": "sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-15.4.1.tgz?cache=0&sync_timestamp=1594421046064&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-15.4.1.tgz", - "integrity": "sha1-DYehbeAa7p2L7Cv7909nhRcw9Pg=", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-18.1.3.tgz?cache=0&sync_timestamp=1595125190020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-18.1.3.tgz", - "integrity": "sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A=", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "cli-spinners": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/cli-spinners/download/cli-spinners-2.4.0.tgz?cache=0&sync_timestamp=1595080565423&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-spinners%2Fdownload%2Fcli-spinners-2.4.0.tgz", - "integrity": "sha1-xiVtsha4eM+6RyDnGc7Hz3JoXX8=", - "dev": true - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/cli-truncate/download/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, - "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/cli-width/download/cli-width-2.2.1.tgz", - "integrity": "sha1-sEM9C06chH7xiGik7xb9X8gnHEg=", - "dev": true, - "optional": true - }, - "clipboard": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/clipboard/download/clipboard-2.0.6.tgz", - "integrity": "sha1-UpISlu7A/fd+rRdJQhshyWhkc3Y=", - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, - "clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/clipboardy/download/clipboardy-2.3.0.tgz", - "integrity": "sha1-PCkDZQxo5GqRs4iYW8J3QofbopA=", - "dev": true, - "requires": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-2.2.0.tgz?cache=0&sync_timestamp=1588494180082&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-wsl%2Fdownload%2Fis-wsl-2.2.0.tgz", - "integrity": "sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - } - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/clone/download/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clonedeep": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/clonedeep/download/clonedeep-2.0.0.tgz", - "integrity": "sha1-jOygd39He78x/oyHGq9jo5C7wnI=" - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "optional": true - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz", - "integrity": "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM=", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codemirror": { - "version": "5.56.0", - "resolved": "https://registry.npm.taobao.org/codemirror/download/codemirror-5.56.0.tgz", - "integrity": "sha1-Z1ZA/MeAEFzSLT+qc4tdfqZCb2E=" - }, - "codemirror-spell-checker": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/codemirror-spell-checker/download/codemirror-spell-checker-1.1.2.tgz", - "integrity": "sha1-HGYPkIlIPMtRE7m6nKGcP0mTNx4=", - "requires": { - "typo-js": "*" - } - }, - "codepage": { - "version": "1.14.0", - "resolved": "https://registry.npm.taobao.org/codepage/download/codepage-1.14.0.tgz", - "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", - "requires": { - "commander": "~2.14.1", - "exit-on-epipe": "~1.0.1" - }, - "dependencies": { - "commander": { - "version": "2.14.1", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.14.1.tgz?cache=0&sync_timestamp=1595168173997&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.14.1.tgz", - "integrity": "sha1-IjUSPjevjKPGXfRbAm29NXsBuao=" - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npm.taobao.org/color/download/color-3.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolor%2Fdownload%2Fcolor-3.1.2.tgz", - "integrity": "sha1-aBSOf4XUGtdknF+oyBBvCY0inhA=", - "dev": true, - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npm.taobao.org/color-string/download/color-string-1.5.3.tgz", - "integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=", - "dev": true, - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/colorette/download/colorette-1.2.1.tgz?cache=0&sync_timestamp=1593955829055&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolorette%2Fdownload%2Fcolorette-1.2.1.tgz", - "integrity": "sha1-TQuSEyXBT6+SYzCGpTbbbolWSxs=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1595168173997&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz", - "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz", - "integrity": "sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz?cache=0&sync_timestamp=1578286264482&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcompressible%2Fdownload%2Fcompressible-2.0.18.tgz", - "integrity": "sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o=", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcompression%2Fdownload%2Fcompression-1.7.4.tgz", - "integrity": "sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48=", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbytes%2Fdownload%2Fbytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "compression-webpack-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/compression-webpack-plugin/download/compression-webpack-plugin-3.1.0.tgz?cache=0&sync_timestamp=1589291140068&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcompression-webpack-plugin%2Fdownload%2Fcompression-webpack-plugin-3.1.0.tgz", - "integrity": "sha1-n1EBcqe1+uWq07ZwZS6L15l67so=", - "dev": true, - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.0.0", - "neo-async": "^2.5.0", - "schema-utils": "^2.6.1", - "serialize-javascript": "^2.1.2", - "webpack-sources": "^1.0.1" - }, - "dependencies": { - "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1594429684526&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz", - "integrity": "sha1-qAAMIWlwiQgvhSh6GuxuOCAkpxw=", - "dev": true, - "requires": { - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" - } - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz", - "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz", - "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", - "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz?cache=0&sync_timestamp=1587567875186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-3.1.0.tgz", - "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1594559696906&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz", - "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", - "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-3.0.0.tgz", - "integrity": "sha1-1wTZr4orpoTiYA2aIVmD1BQal50=", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", - "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", - "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz", - "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1586886301819&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-2.1.2.tgz", - "integrity": "sha1-7OxTsOAxe9yV73arcHS3OEeF+mE=", - "dev": true - }, - "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-7.1.0.tgz", - "integrity": "sha1-ksJBv23oI2W1x/tL126XVSLhKU0=", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" - } - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz", - "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "condense-newlines": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/condense-newlines/download/condense-newlines-0.2.1.tgz", - "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-whitespace": "^0.3.0", - "kind-of": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npm.taobao.org/config-chain/download/config-chain-1.1.12.tgz", - "integrity": "sha1-D96NCRIA616AjK8l/mGMAvSOTvo=", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/connect-history-api-fallback/download/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/console-browserify/download/console-browserify-1.2.0.tgz", - "integrity": "sha1-ZwY871fOts9Jk6KrOlWECujEkzY=", - "dev": true - }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.15.1.tgz", - "integrity": "sha1-IasEMjXHGgfUXZqtmFk7DbpWurc=", - "dev": true, - "requires": { - "bluebird": "^3.1.1" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/constants-browserify/download/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/contains-path/download/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcontent-disposition%2Fdownload%2Fcontent-disposition-0.5.3.tgz", - "integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", - "dev": true - }, - "contour_plot": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/contour_plot/download/contour_plot-0.0.1.tgz", - "integrity": "sha1-R1hw8DK44zhBKqX8UHiA8L9JXHc=" - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/convert-source-map/download/convert-source-map-1.7.0.tgz", - "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz", - "integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/copy-concurrently/download/copy-concurrently-1.0.5.tgz", - "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "4.6.0", - "resolved": "https://registry.npm.taobao.org/copy-webpack-plugin/download/copy-webpack-plugin-4.6.0.tgz", - "integrity": "sha1-5/QN2KaEd9QF3Rt6hUquMksVi64=", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "minimatch": "^3.0.4", - "p-limit": "^1.0.0", - "serialize-javascript": "^1.4.0" - }, - "dependencies": { - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-10.0.4.tgz?cache=0&sync_timestamp=1594429684526&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-10.0.4.tgz", - "integrity": "sha1-ZFI2eZnv+dQYiu/ZoU6dfGomNGA=", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npm.taobao.org/globby/download/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427569171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz?cache=0&sync_timestamp=1587567875186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-1.3.0.tgz", - "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-2.0.0.tgz", - "integrity": "sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8=", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.9.1.tgz", - "integrity": "sha1-z8IArvd7YAxH2pu4FJyUPnmML9s=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-5.3.0.tgz", - "integrity": "sha1-ujhyycbTOgcEp9cf8EXl7EiZnQY=", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "core-js": { - "version": "2.6.11", - "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-2.6.11.tgz?cache=0&sync_timestamp=1586450269267&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-2.6.11.tgz", - "integrity": "sha1-OIMUafmSK97Y7iHJ3EaYXgOZMIw=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-5.2.1.tgz", - "integrity": "sha1-BA9yaAnFked6F8CjYmykW08Wixo=", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "countup": { - "version": "1.8.2", - "resolved": "https://registry.npm.taobao.org/countup/download/countup-1.8.2.tgz", - "integrity": "sha1-AhzMam+WRUDGsn7WRoGvJ/tV8BA=" - }, - "crc-32": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/crc-32/download/crc-32-1.2.0.tgz", - "integrity": "sha1-yy224puIUI4y2d0OwWk+e0Ghggg=", - "requires": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.3.tgz", - "integrity": "sha1-yREbbzMEXEaX8UR4f5JUzcd8Rf8=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/create-hash/download/create-hash-1.2.0.tgz", - "integrity": "sha1-iJB4rxGmN1a8+1m9IhmWvjqe8ZY=", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npm.taobao.org/create-hmac/download/create-hmac-1.1.7.tgz", - "integrity": "sha1-aRcMeLOrlXFHsriwRXLkfq0iQ/8=", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cropperjs": { - "version": "1.5.7", - "resolved": "https://registry.npm.taobao.org/cropperjs/download/cropperjs-1.5.7.tgz", - "integrity": "sha1-tlAZcluuHGKF6IH7ZhshQfpXAls=" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", - "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npm.taobao.org/cryptiles/download/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npm.taobao.org/crypto-browserify/download/crypto-browserify-3.12.0.tgz", - "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npm.taobao.org/css-color-names/download/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/css-declaration-sorter/download/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha1-wZiUD2OnbX42wecQGLABchBUyyI=", - "dev": true, - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-line-break": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/css-line-break/download/css-line-break-1.1.1.tgz", - "integrity": "sha1-1em90peEAJnrBQPHMQ/TSSegJu8=", - "requires": { - "base64-arraybuffer": "^0.2.0" - } - }, - "css-loader": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/css-loader/download/css-loader-1.0.1.tgz?cache=0&sync_timestamp=1592056914630&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-loader%2Fdownload%2Fcss-loader-1.0.1.tgz", - "integrity": "sha1-aIW7UjOzXsR7AGBX2gHMZAtref4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash": "^4.17.11", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-6.0.23.tgz?cache=0&sync_timestamp=1591102414113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-6.0.23.tgz", - "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-2.1.0.tgz", - "integrity": "sha1-ajRlM1ZjWTSoG6ymjQJVQyEF2+8=", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/css-select-base-adapter/download/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha1-Oy/0lyzDYquIVhUHqVQIoUMhNdc=", - "dev": true - }, - "css-selector-tokenizer": { - "version": "0.7.2", - "resolved": "https://registry.npm.taobao.org/css-selector-tokenizer/download/css-selector-tokenizer-0.7.2.tgz", - "integrity": "sha1-EeXifJpI2QKE8i1FBhwwPXolrYc=", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2", - "regexpu-core": "^4.6.0" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.37.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-tree%2Fdownload%2Fcss-tree-1.0.0-alpha.37.tgz", - "integrity": "sha1-mL69YsTB2flg7DQM+fdSLjBwmiI=", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "css-what": { - "version": "3.3.0", - "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-3.3.0.tgz", - "integrity": "sha1-EP7Glqns4uWRrHctdZqsq6w4zTk=", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", - "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", - "dev": true - }, - "cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npm.taobao.org/cssfilter/download/cssfilter-0.0.10.tgz", - "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npm.taobao.org/cssnano/download/cssnano-4.1.10.tgz", - "integrity": "sha1-CsQfCxPRPUZUh+ERt3jULaYxuLI=", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npm.taobao.org/cssnano-preset-default/download/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha1-UexmLM/KD4izltzZZ5zbkxvhf3Y=", - "dev": true, - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/cssnano-util-get-arguments/download/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", - "dev": true - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/cssnano-util-get-match/download/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", - "dev": true - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/cssnano-util-raw-cache/download/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha1-sm1f1fcqEd/np4RvtMZyYPlr8oI=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/cssnano-util-same-parent/download/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha1-V0CC+yhZ0ttDOFWDXZqEVuoYu/M=", - "dev": true - }, - "csso": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/csso/download/csso-4.0.3.tgz?cache=0&sync_timestamp=1585052130344&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsso%2Fdownload%2Fcsso-4.0.3.tgz", - "integrity": "sha1-DZmF3IUsfMKyys+74QeQFNGo6QM=", - "dev": true, - "requires": { - "css-tree": "1.0.0-alpha.39" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npm.taobao.org/css-tree/download/css-tree-1.0.0-alpha.39.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-tree%2Fdownload%2Fcss-tree-1.0.0-alpha.39.tgz", - "integrity": "sha1-K/8//huz93bPfu/ZHuXLp3oUnus=", - "dev": true, - "requires": { - "mdn-data": "2.0.6", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/mdn-data/download/mdn-data-2.0.6.tgz?cache=0&sync_timestamp=1593510420945&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmdn-data%2Fdownload%2Fmdn-data-2.0.6.tgz", - "integrity": "sha1-hS3GD8ql2qLoz2yRicRA7T4EKXg=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npm.taobao.org/cssom/download/cssom-0.3.8.tgz?cache=0&sync_timestamp=1573719337707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcssom%2Fdownload%2Fcssom-0.3.8.tgz", - "integrity": "sha1-nxJ29bK0Y/IRTT8sdSUK+MGjb0o=", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/cssstyle/download/cssstyle-1.4.0.tgz?cache=0&sync_timestamp=1588171504463&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcssstyle%2Fdownload%2Fcssstyle-1.4.0.tgz", - "integrity": "sha1-nTEyginTxWXGHlhrAgQaKPzNzPE=", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "current-script-polyfill": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/current-script-polyfill/download/current-script-polyfill-1.0.0.tgz", - "integrity": "sha1-8xz35PPiGLBybnOMqSoC00iO9hU=", - "dev": true - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "d3-color": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/d3-color/download/d3-color-1.4.1.tgz", - "integrity": "sha1-xSACv4hGraRCTVXZeYL+8m6zvIo=" - }, - "d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/d3-dispatch/download/d3-dispatch-1.0.6.tgz", - "integrity": "sha1-ANN7zuTdjNl3Kd2JOgrCnKq6XVg=" - }, - "d3-ease": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/d3-ease/download/d3-ease-1.0.6.tgz?cache=0&sync_timestamp=1592460740468&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fd3-ease%2Fdownload%2Fd3-ease-1.0.6.tgz", - "integrity": "sha1-69ttoi36wKIiIvLU2gb2bEFqDsA=" - }, - "d3-interpolate": { - "version": "1.1.6", - "resolved": "https://registry.npm.taobao.org/d3-interpolate/download/d3-interpolate-1.1.6.tgz", - "integrity": "sha1-LPOVriOBgE3wiqG/dmt/l7X2j7Y=", - "requires": { - "d3-color": "1" - } - }, - "d3-selection": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/d3-selection/download/d3-selection-1.4.1.tgz", - "integrity": "sha1-mO7bvghfvaW6+i+ePzovTX1iKpg=" - }, - "d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npm.taobao.org/d3-timer/download/d3-timer-1.0.10.tgz", - "integrity": "sha1-3+dripF0iDGxO22ceT/71QjdneU=" - }, - "d3-transition": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/d3-transition/download/d3-transition-1.3.2.tgz", - "integrity": "sha1-qY7yFRvo2GAFQ0NMHKgBQK4js5g=", - "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/data-urls/download/data-urls-1.1.0.tgz", - "integrity": "sha1-Fe4Fgrql4iu1nHcUDaj5x2lju/4=", - "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npm.taobao.org/date-fns/download/date-fns-1.30.1.tgz?cache=0&sync_timestamp=1594999213209&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdate-fns%2Fdownload%2Fdate-fns-1.30.1.tgz", - "integrity": "sha1-LnG/CxGRU9u0zE6I2epaz7UNwFw=", - "dev": true - }, - "dayjs": { - "version": "1.8.29", - "resolved": "https://registry.npm.taobao.org/dayjs/download/dayjs-1.8.29.tgz?cache=0&sync_timestamp=1593707172703&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdayjs%2Fdownload%2Fdayjs-1.8.29.tgz", - "integrity": "sha1-XSPjQd5r+9IGwBE20vsPAYd4IPU=" - }, - "de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz", - "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz?cache=0&sync_timestamp=1580010393599&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decimal.js": { - "version": "10.2.0", - "resolved": "https://registry.npm.taobao.org/decimal.js/download/decimal.js-10.2.0.tgz", - "integrity": "sha1-OUZhE6ngNhEdAvgkibX9awte0jE=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npm.taobao.org/dedent/download/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/deep-eql/download/deep-eql-3.0.1.tgz", - "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/deep-equal/download/deep-equal-1.1.1.tgz", - "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-2.2.1.tgz", - "integrity": "sha1-XT/yKgHAD2RUBaL7wX0HeKGAEXA=" - }, - "default-gateway": { - "version": "5.0.5", - "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-5.0.5.tgz?cache=0&sync_timestamp=1590419212936&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdefault-gateway%2Fdownload%2Fdefault-gateway-5.0.5.tgz", - "integrity": "sha1-T9a9XShV05s0zFpZUFSG6ar8mxA=", - "dev": true, - "requires": { - "execa": "^3.3.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz", - "integrity": "sha1-9zqFudXUHQRVUcF34ogtSshXKKY=", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/execa/download/execa-3.4.0.tgz?cache=0&sync_timestamp=1594145237072&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-3.4.0.tgz", - "integrity": "sha1-wI7UVQ72XYWPrCaf/IVyRG8364k=", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-5.1.0.tgz", - "integrity": "sha1-ASA83JJZf5uQkGfD5lbMH008Tck=", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-2.0.0.tgz", - "integrity": "sha1-venDJoDW+uBBKdasnZIc54FfeOM=", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz", - "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-4.0.1.tgz", - "integrity": "sha1-t+zR5e1T2o43pV4cImnguX7XSOo=", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-5.1.0.tgz", - "integrity": "sha1-//DzyRYX/mK7UBiWNumayKbfe+U=", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-2.0.1.tgz", - "integrity": "sha1-vW/KqcVZoJa2gIBvTWV7Pw8kBWE=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz?cache=0&sync_timestamp=1574441431664&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-3.1.1.tgz", - "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz", - "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz", - "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz?cache=0&sync_timestamp=1574116262707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-2.0.2.tgz", - "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/defaults/download/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/define-properties/download/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz", - "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/defined/download/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/del/download/del-4.1.1.tgz", - "integrity": "sha1-no8RciLqRKMf86FWwEm5kFKp8LQ=", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npm.taobao.org/globby/download/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/delegate/download/delegate-3.2.0.tgz", - "integrity": "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/des.js/download/des.js-1.0.1.tgz", - "integrity": "sha1-U4IULhvcU/hdhtU+X0qn3rkeCEM=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-browser": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/detect-browser/download/detect-browser-5.1.1.tgz?cache=0&sync_timestamp=1592803473542&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdetect-browser%2Fdownload%2Fdetect-browser-5.1.1.tgz", - "integrity": "sha1-qADbkdP9YNCGFmn1mE8b6f++AJw=" - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/detect-node/download/detect-node-2.0.4.tgz", - "integrity": "sha1-AU7o+PZpxcWAI9pkuBecCDooxGw=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npm.taobao.org/diff/download/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npm.taobao.org/diffie-hellman/download/diffie-hellman-5.0.3.tgz", - "integrity": "sha1-QOjumPVaIUlgcUaSHGPhrl89KHU=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/dir-glob/download/dir-glob-2.2.2.tgz", - "integrity": "sha1-+gnwaUFTyJGLGLoN6vrpR2n8UMQ=", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/dns-equal/download/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/dns-packet/download/dns-packet-1.3.1.tgz", - "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/dns-txt/download/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-2.1.0.tgz", - "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=", - "dev": true, - "optional": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/dom-converter/download/dom-converter-0.2.0.tgz", - "integrity": "sha1-ZyGp2u4uKTaClVtq/kFncWJ7t2g=", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-event-types": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/dom-event-types/download/dom-event-types-1.0.0.tgz", - "integrity": "sha1-WDCgop4b+Df+UKcM2ApZcjKBPK4=", - "dev": true - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.2.tgz?cache=0&sync_timestamp=1589067578490&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.2.2.tgz", - "integrity": "sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.0.1.tgz", - "integrity": "sha1-H4vf6R9aeAYydOgDtL3O326U+U0=", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz", - "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=", - "dev": true - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz", - "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/domexception/download/domexception-1.0.1.tgz?cache=0&sync_timestamp=1576355459111&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomexception%2Fdownload%2Fdomexception-1.0.1.tgz", - "integrity": "sha1-k3RCZEymoxJh7zbj7Gd/6AVYLJA=", - "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz", - "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.7.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomutils%2Fdownload%2Fdomutils-1.7.0.tgz", - "integrity": "sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.2.0.tgz?cache=0&sync_timestamp=1572621117377&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.2.0.tgz", - "integrity": "sha1-w07MKVVtxF8fTCJpe29JBODMT8s=", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/dotenv/download/dotenv-7.0.0.tgz", - "integrity": "sha1-or481Sc2ZzIG6KhftSEO6ilijnw=", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/dotenv-expand/download/dotenv-expand-5.1.0.tgz", - "integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=", - "dev": true - }, - "dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/dotignore/download/dotignore-0.1.2.tgz", - "integrity": "sha1-+ULyIA0ow6dvvdbw7p8yV8ii6QU=", - "requires": { - "minimatch": "^3.0.4" - } - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/duplexer/download/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npm.taobao.org/duplexify/download/duplexify-3.7.1.tgz", - "integrity": "sha1-Kk31MX9sz9kfhtb9JdjYoQO4gwk=", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "e-guide-layer": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/e-guide-layer/download/e-guide-layer-0.1.1.tgz", - "integrity": "sha1-AcGvAJqak9CQaSnWAFGrHH6I/V8=", - "requires": { - "core-js": "^3.6.5", - "normalize.css": "^8.0.1", - "vue": "^2.6.11" - }, - "dependencies": { - "core-js": { - "version": "3.8.1", - "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-3.8.1.tgz?cache=0&sync_timestamp=1607215997560&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcore-js%2Fdownload%2Fcore-js-3.8.1.tgz", - "integrity": "sha1-9RUjZorIopTRKFw7nbRAJf2mbUc=" - } - } - }, - "easy-stack": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/easy-stack/download/easy-stack-1.0.0.tgz", - "integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "echarts": { - "version": "4.8.0", - "resolved": "https://registry.npm.taobao.org/echarts/download/echarts-4.8.0.tgz", - "integrity": "sha1-ssHPuSKbE9No7hBPyO6mALV01MQ=", - "requires": { - "zrender": "4.3.1" - } - }, - "editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npm.taobao.org/editorconfig/download/editorconfig-0.15.3.tgz", - "integrity": "sha1-vvhMTnX7jcsM5c7o79UcFZmb78U=", - "dev": true, - "requires": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427569171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz", - "integrity": "sha1-SGYSh1c9zFPjZsehrlLDoSDuybo=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.502", - "resolved": "https://registry.npm.taobao.org/electron-to-chromium/download/electron-to-chromium-1.3.502.tgz?cache=0&sync_timestamp=1595302504119&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felectron-to-chromium%2Fdownload%2Felectron-to-chromium-1.3.502.tgz", - "integrity": "sha1-alXpk+9goB+9whUu9eR+4AyIXJg=", - "dev": true - }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/elegant-spinner/download/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true - }, - "element-resize-detector": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/element-resize-detector/download/element-resize-detector-1.2.1.tgz", - "integrity": "sha1-sDBRlER6SGMVXljxMyOgrvMIUdE=", - "requires": { - "batch-processor": "1.0.0" - } - }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npm.taobao.org/elliptic/download/elliptic-6.5.3.tgz?cache=0&sync_timestamp=1592492805287&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Felliptic%2Fdownload%2Felliptic-6.5.3.tgz", - "integrity": "sha1-y1nrLv2vc6C9eMzXAVpirW4Pk9Y=", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-8.0.0.tgz", - "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", - "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz", - "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/enhanced-resolve/download/enhanced-resolve-4.3.0.tgz?cache=0&sync_timestamp=1594972300336&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fenhanced-resolve%2Fdownload%2Fenhanced-resolve-4.3.0.tgz", - "integrity": "sha1-O4BvO/r8HsfeaVUe+TzKRsFwQSY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.5.0.tgz?cache=0&sync_timestamp=1570537491040&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmemory-fs%2Fdownload%2Fmemory-fs-0.5.0.tgz", - "integrity": "sha1-MkwBKIuIZSlm0WHbd4OHIIRajjw=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/entities/download/entities-2.0.3.tgz?cache=0&sync_timestamp=1591227679482&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-2.0.3.tgz", - "integrity": "sha1-XEh+V0Krk8Fau12iJ1m4WQ7AO38=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz", - "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "error-stack-parser": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/error-stack-parser/download/error-stack-parser-2.0.6.tgz?cache=0&sync_timestamp=1578288503034&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ferror-stack-parser%2Fdownload%2Ferror-stack-parser-2.0.6.tgz", - "integrity": "sha1-WpmnB716TFinl5AtSNgoA+3mqtg=", - "dev": true, - "requires": { - "stackframe": "^1.1.1" - } - }, - "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npm.taobao.org/es-abstract/download/es-abstract-1.17.6.tgz?cache=0&sync_timestamp=1592109199190&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fes-abstract%2Fdownload%2Fes-abstract-1.17.6.tgz", - "integrity": "sha1-kUIHFweFeyysx7iey2cDFsPi1So=", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "dependencies": { - "is-regex": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-regex/download/is-regex-1.1.0.tgz", - "integrity": "sha1-7OOOOJ5JDfDcIcrqK9WW+Yf3Z/8=", - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/es-to-primitive/download/es-to-primitive-1.2.1.tgz", - "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/escalade/download/escalade-3.0.2.tgz?cache=0&sync_timestamp=1594743037384&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescalade%2Fdownload%2Fescalade-3.0.2.tgz", - "integrity": "sha1-algNcO24eIDyK0yR0NVgeN9pYsQ=", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1587627107924&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npm.taobao.org/escodegen/download/escodegen-1.14.3.tgz?cache=0&sync_timestamp=1592866195968&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescodegen%2Fdownload%2Fescodegen-1.14.3.tgz", - "integrity": "sha1-TnuB+6YVgdyXWC7XjKt/Do1j9QM=", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true, - "optional": true - } - } - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npm.taobao.org/eslint/download/eslint-4.19.1.tgz?cache=0&sync_timestamp=1595098868314&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint%2Fdownload%2Feslint-4.19.1.tgz", - "integrity": "sha1-MtHWU+HZBAiFS/spbwdux+GGowA=", - "dev": true, - "optional": true, - "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "optional": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-3.7.3.tgz", - "integrity": "sha1-u1ByANPRf2AkdjYWC0gmKEsQhTU=", - "dev": true, - "optional": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.1.0.tgz?cache=0&sync_timestamp=1591599666712&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true, - "optional": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true, - "optional": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427569171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "optional": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true, - "optional": true - } - } - }, - "eslint-config-standard": { - "version": "12.0.0", - "resolved": "https://registry.npm.taobao.org/eslint-config-standard/download/eslint-config-standard-12.0.0.tgz?cache=0&sync_timestamp=1584727519567&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-config-standard%2Fdownload%2Feslint-config-standard-12.0.0.tgz", - "integrity": "sha1-Y4tMZdsL1aQTGflruh8V3a0hB9k=", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npm.taobao.org/eslint-import-resolver-node/download/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha1-hf+oGULCUBLYIxCW3fZ5wDBCxxc=", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "eslint-loader": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/eslint-loader/download/eslint-loader-2.2.1.tgz", - "integrity": "sha1-KLnBLaVAV68IReKmEScBova/gzc=", - "dev": true, - "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" - } - }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npm.taobao.org/eslint-module-utils/download/eslint-module-utils-2.6.0.tgz", - "integrity": "sha1-V569CU9Wr3eX0ZyYZsnJSGYpv6Y=", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-cypress": { - "version": "2.11.1", - "resolved": "https://registry.npm.taobao.org/eslint-plugin-cypress/download/eslint-plugin-cypress-2.11.1.tgz", - "integrity": "sha1-qUXid0uIIR4scGoFnUMeJitcKGI=", - "dev": true, - "requires": { - "globals": "^11.12.0" - } - }, - "eslint-plugin-import": { - "version": "2.22.0", - "resolved": "https://registry.npm.taobao.org/eslint-plugin-import/download/eslint-plugin-import-2.22.0.tgz?cache=0&sync_timestamp=1593237313662&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-import%2Fdownload%2Feslint-plugin-import-2.22.0.tgz", - "integrity": "sha1-kvdzb+H94+Led2I8g43Zkv9f+34=", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - } - } - }, - "eslint-plugin-node": { - "version": "6.0.1", - "resolved": "https://registry.npm.taobao.org/eslint-plugin-node/download/eslint-plugin-node-6.0.1.tgz?cache=0&sync_timestamp=1585396050025&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-node%2Fdownload%2Feslint-plugin-node-6.0.1.tgz", - "integrity": "sha1-vxlkIpgGQ3kxXXpLKnWTc3b6BeQ=", - "dev": true, - "requires": { - "ignore": "^3.3.6", - "minimatch": "^3.0.4", - "resolve": "^1.3.3", - "semver": "^5.4.1" - } - }, - "eslint-plugin-promise": { - "version": "3.8.0", - "resolved": "https://registry.npm.taobao.org/eslint-plugin-promise/download/eslint-plugin-promise-3.8.0.tgz", - "integrity": "sha1-ZevyeoRePB6db2pWIt3TgBaUtiE=", - "dev": true - }, - "eslint-plugin-standard": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/eslint-plugin-standard/download/eslint-plugin-standard-3.1.0.tgz", - "integrity": "sha1-Kp4hJZukxHwC1TstDJE11LECLUc=", - "dev": true - }, - "eslint-plugin-vue": { - "version": "4.7.1", - "resolved": "https://registry.npm.taobao.org/eslint-plugin-vue/download/eslint-plugin-vue-4.7.1.tgz?cache=0&sync_timestamp=1595148924086&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-plugin-vue%2Fdownload%2Feslint-plugin-vue-4.7.1.tgz", - "integrity": "sha1-yCm5/GJYLBiXtaC5Sv1E7MpRHmM=", - "dev": true, - "optional": true, - "requires": { - "vue-eslint-parser": "^2.0.3" - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz", - "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=", - "dev": true - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npm.taobao.org/espree/download/espree-3.5.4.tgz?cache=0&sync_timestamp=1595033675028&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fespree%2Fdownload%2Fespree-3.5.4.tgz", - "integrity": "sha1-sPRHGHyKi+2US4FaZgvd9d610ac=", - "dev": true, - "optional": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-5.7.4.tgz?cache=0&sync_timestamp=1591869432510&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-5.7.4.tgz", - "integrity": "sha1-Po2KmUfQWZoXltECJddDL0pKz14=", - "dev": true, - "optional": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesprima%2Fdownload%2Fesprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/esquery/download/esquery-1.3.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesquery%2Fdownload%2Fesquery-1.3.1.tgz", - "integrity": "sha1-t4tYKKqOIU4p+3TE1bdS4cAz2lc=", - "dev": true, - "optional": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-5.1.0.tgz?cache=0&sync_timestamp=1586996117385&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-5.1.0.tgz", - "integrity": "sha1-N0MJ05/ZNa5QDnuS6Ka0xyDllkI=", - "dev": true, - "optional": true - } - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz", - "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1586996117385&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz", - "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz?cache=0&sync_timestamp=1564535492241&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesutils%2Fdownload%2Fesutils-2.0.3.tgz", - "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "event-pubsub": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/event-pubsub/download/event-pubsub-4.3.0.tgz", - "integrity": "sha1-9o2Ba8KfHsAsU53FjI3UDOcss24=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npm.taobao.org/eventemitter3/download/eventemitter3-4.0.4.tgz?cache=0&sync_timestamp=1589283150629&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feventemitter3%2Fdownload%2Feventemitter3-4.0.4.tgz", - "integrity": "sha1-tUY6zmNaCD0Bi9x8kXtMXxCoU4Q=", - "dev": true - }, - "events": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/events/download/events-3.1.0.tgz?cache=0&sync_timestamp=1578498298945&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fevents%2Fdownload%2Fevents-3.1.0.tgz", - "integrity": "sha1-hCea8bNMt1qoi/X/KR9tC9mzGlk=", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npm.taobao.org/eventsource/download/eventsource-1.0.7.tgz", - "integrity": "sha1-j7xyyT/NNAiAkLwKTmT0tc7m2NA=", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/evp_bytestokey/download/evp_bytestokey-1.0.3.tgz", - "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/execa/download/execa-1.0.0.tgz?cache=0&sync_timestamp=1594145237072&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-1.0.0.tgz", - "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/exit-hook/download/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/exit-on-epipe/download/exit-on-epipe-1.0.1.tgz", - "integrity": "sha1-C92S6H1ShdJn2qgXHQ6wYVlolpI=" - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz?cache=0&sync_timestamp=1585185316222&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexpress%2Fdownload%2Fexpress-4.17.1.tgz", - "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/external-editor/download/external-editor-2.2.0.tgz?cache=0&sync_timestamp=1562602052556&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexternal-editor%2Fdownload%2Fexternal-editor-2.2.0.tgz", - "integrity": "sha1-BFURz9jRM/OEZnPRBHwVTiFK09U=", - "dev": true, - "optional": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz", - "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz?cache=0&sync_timestamp=1591599666712&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-3.1.3.tgz", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", - "dev": true - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npm.taobao.org/fast-glob/download/fast-glob-2.2.7.tgz", - "integrity": "sha1-aVOFfDr6R1//ku5gFdUtpwpM050=", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/fastparse/download/fastparse-1.1.2.tgz", - "integrity": "sha1-kXKMWllC7O2FMSg8eUQe5BIsNak=", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fecha": { - "version": "2.3.3", - "resolved": "https://registry.npm.taobao.org/fecha/download/fecha-2.3.3.tgz", - "integrity": "sha1-lI50FX3xoy/RsSw6PDzctuydls0=" - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.2.tgz", - "integrity": "sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "optional": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "optional": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-loader": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/file-loader/download/file-loader-3.0.1.tgz", - "integrity": "sha1-+OC6C1mZGLUa3+RdZtHnca1WD6o=", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz", - "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=", - "dev": true, - "optional": true - }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npm.taobao.org/filesize/download/filesize-3.6.1.tgz", - "integrity": "sha1-CQuz7gG2+AGoqL6Z0xcQs0Irsxc=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz", - "integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "find-babel-config": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/find-babel-config/download/find-babel-config-1.2.0.tgz", - "integrity": "sha1-qbezF+tbmGDNqdVHQKjIM3oig6I=", - "dev": true, - "requires": { - "json5": "^0.5.1", - "path-exists": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz?cache=0&sync_timestamp=1586046271069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-2.1.0.tgz", - "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-parent-dir": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/find-parent-dir/download/find-parent-dir-0.3.0.tgz", - "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-1.3.4.tgz", - "integrity": "sha1-LC73dSXMKSkAff/6HdMUqpyd7m8=", - "dev": true, - "optional": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz?cache=0&sync_timestamp=1581229865753&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.6.3.tgz", - "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/flush-write-stream/download/flush-write-stream-1.1.1.tgz", - "integrity": "sha1-jdfYc6G6vCB9lOrQwuDkQnbr8ug=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "fmin": { - "version": "0.0.2", - "resolved": "https://registry.npm.taobao.org/fmin/download/fmin-0.0.2.tgz", - "integrity": "sha1-Wbu0DUP/3ByUzQClaMQflfGXMBc=", - "requires": { - "contour_plot": "^0.0.1", - "json2module": "^0.0.3", - "rollup": "^0.25.8", - "tape": "^4.5.1", - "uglify-js": "^2.6.2" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.5.10.tgz?cache=0&sync_timestamp=1592518281721&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.5.10.tgz", - "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", - "requires": { - "debug": "=3.1.0" - } - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npm.taobao.org/for-each/download/for-each-0.3.3.tgz", - "integrity": "sha1-abRH6IoKXTLD5whPPxcQA0shN24=", - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz?cache=0&sync_timestamp=1573184298867&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffor-in%2Fdownload%2Ffor-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz", - "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "frac": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/frac/download/frac-1.1.2.tgz", - "integrity": "sha1-PXT39keMiKG1AgMG10fcYxPHTQs=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/from2/download/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npm.taobao.org/fs-extra/download/fs-extra-7.0.1.tgz", - "integrity": "sha1-TxicRKoSO4lfcigE9V6iPq3DSOk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/fs-minipass/download/fs-minipass-2.1.0.tgz?cache=0&sync_timestamp=1579628584498&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs-minipass%2Fdownload%2Ffs-minipass-2.1.0.tgz", - "integrity": "sha1-f1A2/b8SxjwWkZDL5BmchSJx+fs=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npm.taobao.org/fs-write-stream-atomic/download/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.1.3.tgz?cache=0&sync_timestamp=1588787369955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.1.3.tgz", - "integrity": "sha1-+3OHA66NL5/pAMM4Nt3r7ouX8j4=", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true, - "optional": true - }, - "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npm.taobao.org/gensync/download/gensync-1.0.0-beta.1.tgz", - "integrity": "sha1-WPQ2H/mH5f9uHnohCCeqNx6qwmk=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-1.0.3.tgz", - "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/get-func-name/download/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/get-own-enumerable-property-symbols/download/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha1-tf3nfyLL4185C04ImSLFC85u9mQ=", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-4.1.0.tgz", - "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz?cache=0&sync_timestamp=1573078079496&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-7.1.6.tgz", - "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.1.tgz", - "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/glob-to-regexp/download/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz", - "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", - "dev": true - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npm.taobao.org/globby/download/globby-9.2.0.tgz", - "integrity": "sha1-/QKacGxwPSm90XD0tts6P3p8tj0=", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-4.0.6.tgz", - "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", - "dev": true - } - } - }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/good-listener/download/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "requires": { - "delegate": "^3.1.2" - } - }, - "gq-plus": { - "version": "2.1.5", - "resolved": "https://registry.npm.taobao.org/gq-plus/download/gq-plus-2.1.5.tgz", - "integrity": "sha1-xGkLE10oAAukXd7nuopA10RvVJM=", - "requires": { - "async-validator": "^1.10.0", - "axios": "^0.15.3", - "deepmerge": "^2.2.1", - "element-resize-detector": "^1.2.0", - "js-calendar": "^1.2.3", - "lodash.throttle": "^4.1.1", - "popper.js": "^1.14.6", - "tinycolor2": "^1.4.1", - "v-click-outside-x": "^3.5.6" - }, - "dependencies": { - "axios": { - "version": "0.15.3", - "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.15.3.tgz", - "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=", - "requires": { - "follow-redirects": "1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/follow-redirects/download/follow-redirects-1.0.0.tgz?cache=0&sync_timestamp=1592518281721&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.0.0.tgz", - "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=", - "requires": { - "debug": "^2.2.0" - } - } - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz?cache=0&sync_timestamp=1588086924019&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgraceful-fs%2Fdownload%2Fgraceful-fs-4.2.4.tgz", - "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npm.taobao.org/growl/download/growl-1.10.5.tgz", - "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", - "dev": true - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/gzip-size/download/gzip-size-5.1.1.tgz", - "integrity": "sha1-y5vuaS+HwGErIyhAqHOQTkwTUnQ=", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - } - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/handle-thing/download/handle-thing-2.0.1.tgz", - "integrity": "sha1-hX95zjWVgMNA1DCBzGSJcNC7I04=", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz", - "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.1.tgz", - "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/hash-base/download/hash-base-3.1.0.tgz", - "integrity": "sha1-VcOB2eBuHSmXqIO0o/3f5/DTrzM=", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz", - "integrity": "sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=", - "dev": true - } - } - }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhash-sum%2Fdownload%2Fhash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npm.taobao.org/hash.js/download/hash.js-1.1.7.tgz", - "integrity": "sha1-C6vKU46NTuSg+JiNaIZlN6ADz0I=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/hawk/download/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/he/download/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/hex-color-regex/download/hex-color-regex-1.1.0.tgz", - "integrity": "sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4=", - "dev": true - }, - "highlight.js": { - "version": "9.18.1", - "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.18.1.tgz", - "integrity": "sha1-7SGqAB/mJSuxCj121HVzxlOf4Tw=" - }, - "highlight.js-async-webpack": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/highlight.js-async-webpack/download/highlight.js-async-webpack-1.0.4.tgz", - "integrity": "sha1-wGtnv5nwSQRdYrdW5YVbCRLsYWw=" - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/hmac-drbg/download/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npm.taobao.org/hoek/download/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true, - "optional": true - }, - "hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/hoopy/download/hoopy-0.1.4.tgz", - "integrity": "sha1-YJIH1mEQADOpqUAq096mdzgcGx0=", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.8.tgz?cache=0&sync_timestamp=1594428020608&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhosted-git-info%2Fdownload%2Fhosted-git-info-2.8.8.tgz", - "integrity": "sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg=", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npm.taobao.org/hpack.js/download/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/hsl-regex/download/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/hsla-regex/download/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.2.tgz", - "integrity": "sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c=", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/html-encoding-sniffer/download/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.3.1.tgz", - "integrity": "sha1-+5oaS1sUxdq6gtPjTGrk/nAaDkQ=", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npm.taobao.org/html-minifier/download/html-minifier-3.5.21.tgz", - "integrity": "sha1-0AQOBUcw41TbAIRjWTGUAVIS0gw=", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.17.1.tgz?cache=0&sync_timestamp=1595168173997&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.17.1.tgz", - "integrity": "sha1-vXerfebelCBc6sxy8XFtKfIKd78=", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/he/download/he-1.2.0.tgz", - "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-3.4.10.tgz?cache=0&sync_timestamp=1592744803278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-3.4.10.tgz", - "integrity": "sha1-mtlWPY6zrN+404WX0q8dgV9qdV8=", - "dev": true, - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz?cache=0&sync_timestamp=1595168173997&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.19.0.tgz", - "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", - "dev": true - } - } - } - } - }, - "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", - "dev": true - }, - "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz?cache=0&sync_timestamp=1588268411154&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-webpack-plugin%2Fdownload%2Fhtml-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", - "dev": true, - "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-3.2.0.tgz", - "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-0.5.1.tgz?cache=0&sync_timestamp=1586046271069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.0.tgz", - "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - } - } - }, - "html2canvas": { - "version": "1.0.0-rc.5", - "resolved": "https://registry.npm.taobao.org/html2canvas/download/html2canvas-1.0.0-rc.5.tgz", - "integrity": "sha1-TuPKyfbiCg+gwvNab5nJYK5+xME=", - "requires": { - "css-line-break": "1.1.1" - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz", - "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", - "dev": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz?cache=0&sync_timestamp=1591227679482&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-1.1.2.tgz", - "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npm.taobao.org/http-deceiver/download/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1593407710477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz", - "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npm.taobao.org/http-proxy/download/http-proxy-1.18.1.tgz", - "integrity": "sha1-QBVB8FNIhLv5UmAzTnL4juOXZUk=", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npm.taobao.org/http-proxy-middleware/download/http-proxy-middleware-0.19.1.tgz?cache=0&sync_timestamp=1594312982456&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-proxy-middleware%2Fdownload%2Fhttp-proxy-middleware-0.19.1.tgz", - "integrity": "sha1-GDx9xKoUeRUDBkmMIQza+WCApDo=", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/https-browserify/download/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/human-signals/download/human-signals-1.1.1.tgz?cache=0&sync_timestamp=1584198662293&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhuman-signals%2Fdownload%2Fhuman-signals-1.1.1.tgz", - "integrity": "sha1-xbHNFPUK6uCatsWf5jujOV/k36M=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-6.0.23.tgz?cache=0&sync_timestamp=1591102414113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-6.0.23.tgz", - "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/iferr/download/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-3.3.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-3.3.10.tgz", - "integrity": "sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM=", - "dev": true - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/import-cwd/download/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "dependencies": { - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/import-from/download/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/import-local/download/import-local-2.0.0.tgz", - "integrity": "sha1-VQcL44pZk88Y72236WH1vuXFoJ0=", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-4.0.0.tgz", - "integrity": "sha1-Yk+PRJfWGbLZdoUx1Y9BIoVNclE=", - "dev": true - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz", - "integrity": "sha1-xM78qo5RBRwqQLos6KPScpWvlGc=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz", - "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npm.taobao.org/inquirer/download/inquirer-3.3.0.tgz?cache=0&sync_timestamp=1594661205347&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finquirer%2Fdownload%2Finquirer-3.3.0.tgz", - "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=", - "dev": true, - "optional": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "optional": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/internal-ip/download/internal-ip-4.3.0.tgz", - "integrity": "sha1-hFRSuq2dLKO2nGNaE3rLmg2tCQc=", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - }, - "dependencies": { - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npm.taobao.org/default-gateway/download/default-gateway-4.2.0.tgz?cache=0&sync_timestamp=1590419212936&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdefault-gateway%2Fdownload%2Fdefault-gateway-4.2.0.tgz", - "integrity": "sha1-FnEEx1AMIRX23WmwpTa7jtcgVSs=", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - } - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/interpret/download/interpret-1.4.0.tgz", - "integrity": "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4=", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finvariant%2Fdownload%2Finvariant-2.2.4.tgz", - "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-2.0.0.tgz?cache=0&sync_timestamp=1589565904735&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Finvert-kv%2Fdownload%2Finvert-kv-2.0.0.tgz", - "integrity": "sha1-c5P1r6Weyf9fZ6J2INEcIm4+7AI=", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npm.taobao.org/ip/download/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/ip-regex/download/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.9.1.tgz", - "integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM=", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/is-arguments/download/is-arguments-1.0.4.tgz", - "integrity": "sha1-P6+WbHy6D/Q3+zH2JQCC/PBEjPM=" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz", - "integrity": "sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" - }, - "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/is-callable/download/is-callable-1.2.0.tgz?cache=0&sync_timestamp=1591427607174&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-callable%2Fdownload%2Fis-callable-1.2.0.tgz", - "integrity": "sha1-gzNlYLVKOONeOi33r9BFTWkUaLs=" - }, - "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/is-ci/download/is-ci-1.2.1.tgz", - "integrity": "sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw=", - "dev": true, - "requires": { - "ci-info": "^1.5.0" - } - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-color-stop/download/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-date-object/download/is-date-object-1.0.2.tgz?cache=0&sync_timestamp=1576729182289&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-date-object%2Fdownload%2Fis-date-object-1.0.2.tgz", - "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz", - "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz", - "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/is-directory/download/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-docker": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-docker/download/is-docker-2.0.0.tgz", - "integrity": "sha1-LLDfDnXi0GT+GGTDfN6st7Lc8ls=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-finite/download/is-finite-1.1.0.tgz", - "integrity": "sha1-kEE1x3+0LAZB1qobzbxNqo2ggvM=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz", - "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-2.0.0.tgz", - "integrity": "sha1-Rz+wXZc3BeP9liBUUBjKjiLvSYI=", - "dev": true - }, - "is-observable": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/is-observable/download/is-observable-0.2.0.tgz", - "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", - "dev": true, - "requires": { - "symbol-observable": "^0.2.2" - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/is-path-cwd/download/is-path-cwd-2.2.0.tgz", - "integrity": "sha1-Z9Q7gmZKe1GR/ZEZEn6zAASKn9s=", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-path-in-cwd/download/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha1-v+Lcomxp85cmWkAJljYCk1oFOss=", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-path-inside/download/is-path-inside-2.1.0.tgz", - "integrity": "sha1-fJgQWH1lmkDSe8201WFuqwWUlLI=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-plain-obj/download/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz?cache=0&sync_timestamp=1595290593289&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-plain-object%2Fdownload%2Fis-plain-object-2.0.4.tgz", - "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/is-promise/download/is-promise-2.2.2.tgz?cache=0&sync_timestamp=1588001830257&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-promise%2Fdownload%2Fis-promise-2.2.2.tgz", - "integrity": "sha1-OauVnMv5p3TPB597QMeib3YxNfE=", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/is-regex/download/is-regex-1.0.5.tgz", - "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", - "requires": { - "has": "^1.0.3" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-regexp/download/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-resolvable/download/is-resolvable-1.1.0.tgz", - "integrity": "sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-stream/download/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/is-string/download/is-string-1.0.5.tgz", - "integrity": "sha1-QEk+0ZjvP/R3uMf5L2ROyCpc06Y=", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/is-svg/download/is-svg-3.0.0.tgz", - "integrity": "sha1-kyHb0pwhLlypnE+peUxxS8r6L3U=", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/is-symbol/download/is-symbol-1.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-symbol%2Fdownload%2Fis-symbol-1.0.3.tgz", - "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-whitespace": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/is-whitespace/download/is-whitespace-0.3.0.tgz", - "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz", - "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz?cache=0&sync_timestamp=1588494180082&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-wsl%2Fdownload%2Fis-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "iview": { - "version": "3.5.4", - "resolved": "https://registry.npm.taobao.org/iview/download/iview-3.5.4.tgz", - "integrity": "sha1-1Ra5LnO2F/Lcf0WDH5kFnWmTL4I=", - "requires": { - "async-validator": "^1.12.2", - "deepmerge": "^2.2.1", - "element-resize-detector": "^1.2.0", - "js-calendar": "^1.2.3", - "lodash.throttle": "^4.1.1", - "popper.js": "^1.14.6", - "tinycolor2": "^1.4.1", - "v-click-outside-x": "^4.0.19" - }, - "dependencies": { - "v-click-outside-x": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/v-click-outside-x/download/v-click-outside-x-4.1.0.tgz?cache=0&sync_timestamp=1579043108278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fv-click-outside-x%2Fdownload%2Fv-click-outside-x-4.1.0.tgz", - "integrity": "sha1-voJmgOLSVmaooYUzKSnUYkSqJEc=" - } - } - }, - "javascript-stringify": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/javascript-stringify/download/javascript-stringify-1.6.0.tgz", - "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=", - "dev": true - }, - "jest-get-type": { - "version": "21.2.0", - "resolved": "https://registry.npm.taobao.org/jest-get-type/download/jest-get-type-21.2.0.tgz", - "integrity": "sha1-9jdqudtLYNgeOfMHScbEZvQNSiM=", - "dev": true - }, - "jest-validate": { - "version": "21.2.1", - "resolved": "https://registry.npm.taobao.org/jest-validate/download/jest-validate-21.2.1.tgz?cache=0&sync_timestamp=1592925336825&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjest-validate%2Fdownload%2Fjest-validate-21.2.1.tgz", - "integrity": "sha1-zAy8plPNVJN7pPKhEXlndFMN08c=", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^21.2.0", - "leven": "^2.1.0", - "pretty-format": "^21.2.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "jquery": { - "version": "2.2.4", - "resolved": "https://registry.npm.taobao.org/jquery/download/jquery-2.2.4.tgz", - "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=" - }, - "js-beautify": { - "version": "1.11.0", - "resolved": "https://registry.npm.taobao.org/js-beautify/download/js-beautify-1.11.0.tgz", - "integrity": "sha1-r7hz3EfViYY2AJPctplR6LzV3tI=", - "dev": true, - "requires": { - "config-chain": "^1.1.12", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "mkdirp": "~1.0.3", - "nopt": "^4.0.3" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-1.0.4.tgz?cache=0&sync_timestamp=1587535418745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-1.0.4.tgz", - "integrity": "sha1-PrXtYmInVteaXw4qIh3+utdcL34=", - "dev": true - } - } - }, - "js-calendar": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/js-calendar/download/js-calendar-1.2.3.tgz", - "integrity": "sha1-pYOwZEtOaVujlPNE0QPbzHp6fT4=" - }, - "js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/js-cookie/download/js-cookie-2.2.1.tgz", - "integrity": "sha1-aeEG3F1YBolFYpAqpbrsN0Tpsrg=" - }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npm.taobao.org/js-levenshtein/download/js-levenshtein-1.1.6.tgz", - "integrity": "sha1-xs7ljrNVA3LfjeuF+tXOZs4B1Z0=", - "dev": true - }, - "js-message": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/js-message/download/js-message-1.0.5.tgz", - "integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=", - "dev": true - }, - "js-queue": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/js-queue/download/js-queue-2.0.0.tgz", - "integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=", - "dev": true, - "requires": { - "easy-stack": "^1.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz", - "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.0.tgz?cache=0&sync_timestamp=1590172122543&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-yaml%2Fdownload%2Fjs-yaml-3.14.0.tgz", - "integrity": "sha1-p6NBcPJqIbsWJCTYray0ETpp5II=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "13.2.0", - "resolved": "https://registry.npm.taobao.org/jsdom/download/jsdom-13.2.0.tgz?cache=0&sync_timestamp=1594341172783&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsdom%2Fdownload%2Fjsdom-13.2.0.tgz", - "integrity": "sha1-saDb2twlVDUmK+jqNyPS26DX6zo=", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.0.9", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.5", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - } - }, - "jsdom-global": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/jsdom-global/download/jsdom-global-3.0.2.tgz", - "integrity": "sha1-a9KZwTsMRiay2iwDk81DhdYGrLk=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz", - "integrity": "sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/json-parse-better-errors/download/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true, - "optional": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json2module": { - "version": "0.0.3", - "resolved": "https://registry.npm.taobao.org/json2module/download/json2module-0.0.3.tgz", - "integrity": "sha1-APtfSpt638PwZHwpyxe80Zeb6bI=", - "requires": { - "rw": "^1.3.2" - } - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npm.taobao.org/json3/download/json3-3.3.3.tgz", - "integrity": "sha1-f8EON1/FrkLEcFpcwKpvYr4wW4E=", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-2.1.3.tgz?cache=0&sync_timestamp=1586046271069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-2.1.3.tgz", - "integrity": "sha1-ybD3+pIzv+WAf+ZvzzpWF+1ZfUM=", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npm.taobao.org/jsonify/download/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz", - "integrity": "sha1-TIzkQRh6Bhx0dPuHygjipjgZSJI=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "launch-editor": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/launch-editor/download/launch-editor-2.2.1.tgz", - "integrity": "sha1-hxtaPuOdZoD8wm03kwtu7aidsMo=", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "shell-quote": "^1.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "launch-editor-middleware": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/launch-editor-middleware/download/launch-editor-middleware-2.2.1.tgz", - "integrity": "sha1-4UsH5scVSwpLhqD9NFeE5FgEwVc=", - "dev": true, - "requires": { - "launch-editor": "^2.2.1" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-2.0.0.tgz", - "integrity": "sha1-bvXS32DlL4LrIopMNz6NHzlyU88=", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "less": { - "version": "2.7.3", - "resolved": "https://registry.npm.taobao.org/less/download/less-2.7.3.tgz?cache=0&sync_timestamp=1594913896834&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fless%2Fdownload%2Fless-2.7.3.tgz", - "integrity": "sha1-zBJg9RyQCp7A2R+2mYE54CUHtjs=", - "dev": true, - "requires": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.2.11", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "2.81.0", - "source-map": "^0.5.3" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/assert-plus/download/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/har-schema/download/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz?cache=0&sync_timestamp=1590596706367&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", - "dev": true, - "optional": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npm.taobao.org/request/download/request-2.81.0.tgz?cache=0&sync_timestamp=1581439006948&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frequest%2Fdownload%2Frequest-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.3.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftough-cookie%2Fdownload%2Ftough-cookie-2.3.4.tgz", - "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", - "dev": true, - "optional": true, - "requires": { - "punycode": "^1.4.1" - } - } - } - }, - "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/less-loader/download/less-loader-4.1.0.tgz?cache=0&sync_timestamp=1593787586071&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fless-loader%2Fdownload%2Fless-loader-4.1.0.tgz", - "integrity": "sha1-LBNSxbCaT4QQFJAnT9UWdN5BNj4=", - "dev": true, - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^3.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/clone/download/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/leven/download/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "lint-staged": { - "version": "6.1.1", - "resolved": "https://registry.npm.taobao.org/lint-staged/download/lint-staged-6.1.1.tgz?cache=0&sync_timestamp=1592387031001&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flint-staged%2Fdownload%2Flint-staged-6.1.1.tgz", - "integrity": "sha1-zQjE2bjMwtNxmNHEfOd9Ir5s8yQ=", - "dev": true, - "requires": { - "app-root-path": "^2.0.0", - "chalk": "^2.1.0", - "commander": "^2.11.0", - "cosmiconfig": "^4.0.0", - "debug": "^3.1.0", - "dedent": "^0.7.0", - "execa": "^0.8.0", - "find-parent-dir": "^0.3.0", - "is-glob": "^4.0.0", - "jest-validate": "^21.1.0", - "listr": "^0.13.0", - "lodash": "^4.17.4", - "log-symbols": "^2.0.0", - "minimatch": "^3.0.0", - "npm-which": "^3.0.1", - "p-map": "^1.1.1", - "path-is-inside": "^1.0.2", - "pify": "^3.0.0", - "staged-git-files": "1.0.0", - "stringify-object": "^3.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-4.0.0.tgz", - "integrity": "sha1-dgORVJWAu9LfHlYrwXexPCkJctw=", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npm.taobao.org/execa/download/execa-0.8.0.tgz?cache=0&sync_timestamp=1594145237072&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427569171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-1.2.0.tgz", - "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "listr": { - "version": "0.13.0", - "resolved": "https://registry.npm.taobao.org/listr/download/listr-0.13.0.tgz", - "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "figures": "^1.7.0", - "indent-string": "^2.1.0", - "is-observable": "^0.2.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.4.0", - "listr-verbose-renderer": "^0.4.0", - "log-symbols": "^1.0.2", - "log-update": "^1.0.2", - "ora": "^0.2.3", - "p-map": "^1.1.1", - "rxjs": "^5.4.2", - "stream-to-observable": "^0.2.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "cli-spinners": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/cli-spinners/download/cli-spinners-0.1.2.tgz?cache=0&sync_timestamp=1595080565423&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcli-spinners%2Fdownload%2Fcli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", - "dev": true - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/figures/download/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "ora": { - "version": "0.2.3", - "resolved": "https://registry.npm.taobao.org/ora/download/ora-0.2.3.tgz?cache=0&sync_timestamp=1594997498208&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fora%2Fdownload%2Fora-0.2.3.tgz", - "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "cli-cursor": "^1.0.2", - "cli-spinners": "^0.1.2", - "object-assign": "^4.0.1" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-1.2.0.tgz", - "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - } - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/listr-silent-renderer/download/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true - }, - "listr-update-renderer": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/listr-update-renderer/download/listr-update-renderer-0.4.0.tgz", - "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^1.0.2", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/figures/download/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/indent-string/download/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - } - } - }, - "listr-verbose-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/listr-verbose-renderer/download/listr-verbose-renderer-0.4.1.tgz", - "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-cursor": "^1.0.2", - "date-fns": "^1.27.2", - "figures": "^1.7.0" - }, - "dependencies": { - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/figures/download/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - } - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-fs-cache": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/loader-fs-cache/download/loader-fs-cache-1.0.3.tgz", - "integrity": "sha1-8IZXZG1gcHi+LwoDL4vWndbyd9k=", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/loader-runner/download/loader-runner-2.4.0.tgz?cache=0&sync_timestamp=1593786163963&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Floader-runner%2Fdownload%2Floader-runner-2.4.0.tgz", - "integrity": "sha1-7UcGa/5TTX6ExMe5mYwqdWB9k1c=", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz", - "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz?cache=0&sync_timestamp=1586046271069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-1.0.1.tgz", - "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.19.tgz?cache=0&sync_timestamp=1594226805918&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.19.tgz", - "integrity": "sha1-5I3e2+MLMyF4PFtDAfvTU7weSks=" - }, - "lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npm.taobao.org/lodash.defaultsdeep/download/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha1-US6b1yHSctlOPTpjZT+hdRZ0HKY=", - "dev": true - }, - "lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/lodash.kebabcase/download/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", - "dev": true - }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npm.taobao.org/lodash.mapvalues/download/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npm.taobao.org/lodash.sortby/download/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/lodash.throttle/download/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" - }, - "lodash.transform": { - "version": "4.6.0", - "resolved": "https://registry.npm.taobao.org/lodash.transform/download/lodash.transform-4.6.0.tgz", - "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npm.taobao.org/lodash.uniq/download/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/log-symbols/download/log-symbols-2.2.0.tgz", - "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", - "dev": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "log-update": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/log-update/download/log-update-1.0.2.tgz?cache=0&sync_timestamp=1582186637481&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flog-update%2Fdownload%2Flog-update-1.0.2.tgz", - "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", - "dev": true, - "requires": { - "ansi-escapes": "^1.0.0", - "cli-cursor": "^1.0.2" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/cli-cursor/download/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - } - } - }, - "loglevel": { - "version": "1.6.8", - "resolved": "https://registry.npm.taobao.org/loglevel/download/loglevel-1.6.8.tgz", - "integrity": "sha1-iiX7ddCSIw7NRFcnDYC1TigBEXE=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz", - "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz?cache=0&sync_timestamp=1594427569171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-5.1.1.tgz", - "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz?cache=0&sync_timestamp=1587567875186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-2.1.0.tgz", - "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npm.taobao.org/map-age-cleaner/download/map-age-cleaner-0.1.3.tgz", - "integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "marked": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/marked/download/marked-1.1.1.tgz?cache=0&sync_timestamp=1594690149591&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmarked%2Fdownload%2Fmarked-1.1.1.tgz", - "integrity": "sha1-5dYbaYQiENXfV7BYVuDJFXJwPmo=" - }, - "mavon-editor": { - "version": "2.9.0", - "resolved": "https://registry.npm.taobao.org/mavon-editor/download/mavon-editor-2.9.0.tgz", - "integrity": "sha1-5Ru83N4YuSNjM6nOsS/tLYRUKQA=", - "requires": { - "highlight.js": "^9.11.0", - "highlight.js-async-webpack": "^1.0.4", - "xss": "^1.0.6" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npm.taobao.org/md5.js/download/md5.js-1.3.5.tgz", - "integrity": "sha1-tdB7jjIW4+J81yjXL3DR5qNCAF8=", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/mdn-data/download/mdn-data-2.0.4.tgz?cache=0&sync_timestamp=1593510420945&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmdn-data%2Fdownload%2Fmdn-data-2.0.4.tgz", - "integrity": "sha1-aZs8OKxvHXKAkaZGULZdOIUC/Vs=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npm.taobao.org/mem/download/mem-4.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmem%2Fdownload%2Fmem-4.3.0.tgz", - "integrity": "sha1-Rhr0l7xK4JYIzbLmDu+2m/90QXg=", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-2.1.0.tgz", - "integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=", - "dev": true - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npm.taobao.org/memory-fs/download/memory-fs-0.4.1.tgz?cache=0&sync_timestamp=1570537491040&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmemory-fs%2Fdownload%2Fmemory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", - "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/merge-stream/download/merge-stream-2.0.0.tgz", - "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/merge2/download/merge2-1.4.1.tgz", - "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz", - "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/miller-rabin/download/miller-rabin-4.0.1.tgz", - "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npm.taobao.org/mime/download/mime-2.4.6.tgz?cache=0&sync_timestamp=1590596706367&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-2.4.6.tgz", - "integrity": "sha1-5bQHyQ20QvK+tbFiNz0Htpr/pNE=", - "dev": true - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.44.0.tgz", - "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.27.tgz?cache=0&sync_timestamp=1587700357245&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.27.tgz", - "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz", - "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "0.8.2", - "resolved": "https://registry.npm.taobao.org/mini-css-extract-plugin/download/mini-css-extract-plugin-0.8.2.tgz?cache=0&sync_timestamp=1576856580721&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmini-css-extract-plugin%2Fdownload%2Fmini-css-extract-plugin-0.8.2.tgz", - "integrity": "sha1-qHXhab6yfIivd92WJ3HJ7tw9oWE=", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/normalize-url/download/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/minimalistic-assert/download/minimalistic-assert-1.0.1.tgz", - "integrity": "sha1-LhlN4ERibUoQ5/f7wAznPoPk1cc=", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/minimalistic-crypto-utils/download/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" - }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npm.taobao.org/minipass/download/minipass-3.1.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminipass%2Fdownload%2Fminipass-3.1.3.tgz", - "integrity": "sha1-fUL/HzljVILhX5zbUxhN7r1YFf0=", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-4.0.0.tgz", - "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/minipass-collect/download/minipass-collect-1.0.2.tgz", - "integrity": "sha1-IrgTv3Rdxu26JXa5QAIq1u3Ixhc=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/minipass-flush/download/minipass-flush-1.0.5.tgz", - "integrity": "sha1-gucTXX6JpQ/+ZGEKeHlTxMTLs3M=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/minipass-pipeline/download/minipass-pipeline-1.2.3.tgz", - "integrity": "sha1-VfeDkwfXSFnW6K2pw+vnLOwhajQ=", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-3.0.0.tgz", - "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz", - "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz", - "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz?cache=0&sync_timestamp=1587535418745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.5.tgz", - "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/mocha/download/mocha-5.2.0.tgz", - "integrity": "sha1-bYrlCPWRZ/lA8rWzxKYSrlDJCuY=", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.15.1.tgz?cache=0&sync_timestamp=1595168173997&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.15.1.tgz", - "integrity": "sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.2.tgz?cache=0&sync_timestamp=1573078079496&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz?cache=0&sync_timestamp=1587535418745&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmkdirp%2Fdownload%2Fmkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.4.0.tgz", - "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "mocha-webpack": { - "version": "2.0.0-beta.0", - "resolved": "https://registry.npm.taobao.org/mocha-webpack/download/mocha-webpack-2.0.0-beta.0.tgz", - "integrity": "sha1-2F/Jpw+CpK1ZW3cCoRgWBd+llUk=", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "chalk": "^2.3.0", - "chokidar": "^2.0.2", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "interpret": "^1.0.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "lodash": "^4.3.0", - "memory-fs": "^0.4.1", - "nodent-runtime": "^3.0.3", - "normalize-path": "^2.0.1", - "progress": "^2.0.0", - "source-map-support": "^0.5.0", - "strip-ansi": "^4.0.0", - "toposort": "^1.0.0", - "yargs": "^11.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1593261363626&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", - "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1594864731636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", - "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", - "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", - "dev": true - } - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-4.1.0.tgz", - "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz?cache=0&sync_timestamp=1588787369955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.13.tgz", - "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npm.taobao.org/globby/download/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz?cache=0&sync_timestamp=1584985910691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.19.tgz?cache=0&sync_timestamp=1587719517036&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.19.tgz", - "integrity": "sha1-qYti+G3K9PZzmWSMCFKRq56P7WE=", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-11.1.1.tgz?cache=0&sync_timestamp=1594421046064&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-11.1.1.tgz", - "integrity": "sha1-UFLv40RqTfXtZpyZWIbMDxNwJ2Y=", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - } - } - }, - "moment": { - "version": "2.27.0", - "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.27.0.tgz?cache=0&sync_timestamp=1592516115109&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.27.0.tgz", - "integrity": "sha1-i/9OPiaiNiIN/j423nVrbrqgEF0=" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/move-concurrently/download/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npm.taobao.org/multicast-dns/download/multicast-dns-6.2.3.tgz", - "integrity": "sha1-oOx72QVcQoL3kMPIL04o2zsxsik=", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/multicast-dns-service-types/download/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true, - "optional": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npm.taobao.org/mz/download/mz-2.7.0.tgz", - "integrity": "sha1-lQCAV6Vsr63CvGPd5/n/aVWUjjI=", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.1.tgz?cache=0&sync_timestamp=1587497111086&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.1.tgz", - "integrity": "sha1-174036MQW5FJTDFHCJMV7/iHSwE=", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz", - "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true, - "optional": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz", - "integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs=", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.2.tgz", - "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz", - "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz?cache=0&sync_timestamp=1576748705107&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fno-case%2Fdownload%2Fno-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npm.taobao.org/node-forge/download/node-forge-0.9.0.tgz", - "integrity": "sha1-1iQFDtu0SHStyhK7mlLsY8t4JXk=", - "dev": true - }, - "node-ipc": { - "version": "9.1.1", - "resolved": "https://registry.npm.taobao.org/node-ipc/download/node-ipc-9.1.1.tgz", - "integrity": "sha1-TiRe1pOOZRAOWV68XcNLFujdXWk=", - "dev": true, - "requires": { - "event-pubsub": "4.3.0", - "js-message": "1.0.5", - "js-queue": "2.0.0" - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/node-libs-browser/download/node-libs-browser-2.2.1.tgz", - "integrity": "sha1-tk9RPRgzhiX5A0bSew0jXmMfZCU=", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-releases": { - "version": "1.1.59", - "resolved": "https://registry.npm.taobao.org/node-releases/download/node-releases-1.1.59.tgz?cache=0&sync_timestamp=1594212234484&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-releases%2Fdownload%2Fnode-releases-1.1.59.tgz", - "integrity": "sha1-TWSDMGQc7HBL/xD45P4o5FOrjo4=", - "dev": true - }, - "nodent-runtime": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/nodent-runtime/download/nodent-runtime-3.2.1.tgz", - "integrity": "sha1-nidV2F4592Qojw1HUuvP4+VB4A4=", - "dev": true - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/nopt/download/nopt-4.0.3.tgz", - "integrity": "sha1-o3XK2dAv2SEnjZVMIlTVqlfhXkg=", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz", - "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz", - "integrity": "sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/normalize-range/download/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npm.taobao.org/normalize-url/download/normalize-url-3.3.0.tgz", - "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=", - "dev": true - }, - "normalize.css": { - "version": "8.0.1", - "resolved": "https://registry.npm.taobao.org/normalize.css/download/normalize.css-8.0.1.tgz?cache=0&sync_timestamp=1588361527323&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnormalize.css%2Fdownload%2Fnormalize.css-8.0.1.tgz", - "integrity": "sha1-m5iiCHOLnMJjTKrLxC0THJdIe/M=" - }, - "npm-path": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/npm-path/download/npm-path-2.0.4.tgz", - "integrity": "sha1-xkE0el/51qCeTZvOVYDE9QUnjmQ=", - "dev": true, - "requires": { - "which": "^1.2.10" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/npm-run-path/download/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/npm-which/download/npm-which-3.0.1.tgz", - "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", - "dev": true, - "requires": { - "commander": "^2.9.0", - "npm-path": "^2.0.2", - "which": "^1.2.10" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz", - "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npm.taobao.org/num2fraction/download/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/nwsapi/download/nwsapi-2.2.0.tgz", - "integrity": "sha1-IEh5qePQaP8qVROcLHcngGgaOLc=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", - "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/object-hash/download/object-hash-1.3.1.tgz", - "integrity": "sha1-/eRSCYqVHLFF8Dm7fUVUSd3BJt8=", - "dev": true - }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/object-inspect/download/object-inspect-1.7.0.tgz?cache=0&sync_timestamp=1592545149361&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-inspect%2Fdownload%2Fobject-inspect-1.7.0.tgz", - "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=" - }, - "object-is": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/object-is/download/object-is-1.1.2.tgz?cache=0&sync_timestamp=1586894009620&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject-is%2Fdownload%2Fobject-is-1.1.2.tgz", - "integrity": "sha1-xdLof/nhGfeLegiEQVGeLuwVc7Y=", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/object-keys/download/object-keys-1.1.1.tgz", - "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/object.assign/download/object.assign-4.1.0.tgz", - "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fobject.getownpropertydescriptors%2Fdownload%2Fobject.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/object.values/download/object.values-1.1.1.tgz", - "integrity": "sha1-aKmezeNWt+kpWjxeDOMdyMlT3l4=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/obuf/download/obuf-1.1.2.tgz", - "integrity": "sha1-Cb6jND1BhZ69RGKS0RydTbYZCE4=", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz", - "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npm.taobao.org/open/download/open-6.4.0.tgz?cache=0&sync_timestamp=1595208391438&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fopen%2Fdownload%2Fopen-6.4.0.tgz", - "integrity": "sha1-XBPpbQ3IlGhhZPGJZez+iJ7PyKk=", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "opener": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/opener/download/opener-1.5.1.tgz", - "integrity": "sha1-bS8Od/GgrwAyrKcWwsH7uOfoq+0=", - "dev": true - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz", - "integrity": "sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w=", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.3.tgz?cache=0&sync_timestamp=1585966141328&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foptionator%2Fdownload%2Foptionator-0.8.3.tgz", - "integrity": "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "ora": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/ora/download/ora-3.4.0.tgz?cache=0&sync_timestamp=1594997498208&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fora%2Fdownload%2Fora-3.4.0.tgz", - "integrity": "sha1-vwdSSRBZo+8+1MhQl1Md6f280xg=", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/original/download/original-1.0.2.tgz", - "integrity": "sha1-5EKmHP/hxf0gpl8yYcJmY7MD8l8=", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/os-browserify/download/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-3.1.0.tgz?cache=0&sync_timestamp=1584865484693&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fos-locale%2Fdownload%2Fos-locale-3.1.0.tgz", - "integrity": "sha1-qAKm7hfyTBBIOrmTVxnO9O0Wvxo=", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz", - "integrity": "sha1-hc36+uso6Gd/QW4odZK18/SepBA=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/p-defer/download/p-defer-1.0.0.tgz?cache=0&sync_timestamp=1559922734651&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-defer%2Fdownload%2Fp-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/p-finally/download/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/p-is-promise/download/p-is-promise-2.1.0.tgz", - "integrity": "sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz?cache=0&sync_timestamp=1594559696906&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-1.3.0.tgz", - "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/p-map/download/p-map-2.1.0.tgz", - "integrity": "sha1-MQko/u+cnsxltosXaTAYpmXOoXU=", - "dev": true - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/p-retry/download/p-retry-3.0.1.tgz", - "integrity": "sha1-MWtMiJPiyNwc+okfQGxLQivr8yg=", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npm.taobao.org/pako/download/pako-1.0.11.tgz", - "integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8=", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/parallel-transform/download/parallel-transform-1.2.0.tgz", - "integrity": "sha1-kEnKN9bLIYLDsdLHIL6U0UpYFPw=", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/param-case/download/param-case-2.1.1.tgz?cache=0&sync_timestamp=1576721608924&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparam-case%2Fdownload%2Fparam-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.5.tgz", - "integrity": "sha1-ADJxND2ljclMrOSU+u89IUfs6g4=", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-5.1.0.tgz", - "integrity": "sha1-xZNByXI/QUxFKXVWTHwApo1YrNI=", - "dev": true - }, - "parse5-htmlparser2-tree-adapter": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/parse5-htmlparser2-tree-adapter/download/parse5-htmlparser2-tree-adapter-5.1.1.tgz", - "integrity": "sha1-6MdD1OkhlNUpPs3isIvjHmdGHLw=", - "dev": true, - "requires": { - "parse5": "^5.1.1" - }, - "dependencies": { - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-5.1.1.tgz", - "integrity": "sha1-9o5OW6GFKsLK3AD0VV//bCq7YXg=", - "dev": true - } - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz", - "integrity": "sha1-5sTd1+06onxoogzE5Q4aTug7vEo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz?cache=0&sync_timestamp=1574441431664&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-key%2Fdownload%2Fpath-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", - "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-3.0.0.tgz", - "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/pathval/download/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.1.1.tgz?cache=0&sync_timestamp=1591275684229&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpbkdf2%2Fdownload%2Fpbkdf2-3.1.1.tgz", - "integrity": "sha1-y4cksPramEWWhW0abrr9NYRlS5Q=", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz", - "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=", - "dev": true, - "optional": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", - "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-3.0.0.tgz", - "integrity": "sha1-J0kCDyOe2ZCIGx9xIQ1R62UjvqM=", - "dev": true, - "requires": { - "find-up": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1594559696906&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz", - "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", - "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", - "dev": true - } - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/pkg-up/download/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npm.taobao.org/pluralize/download/pluralize-7.0.0.tgz", - "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=", - "dev": true, - "optional": true - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/pn/download/pn-1.1.0.tgz", - "integrity": "sha1-4vTO8OIZ9GPBeas3Rj5OHs3Muvs=", - "dev": true - }, - "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npm.taobao.org/popper.js/download/popper.js-1.16.1.tgz", - "integrity": "sha1-KiI8s9x7YhPXQOQDcr5A3kPmWxs=" - }, - "portfinder": { - "version": "1.0.27", - "resolved": "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.27.tgz?cache=0&sync_timestamp=1595216077180&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fportfinder%2Fdownload%2Fportfinder-1.0.27.tgz", - "integrity": "sha1-pBMzwRa15fPTgPl0WsLzUITEx1g=", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-7.0.32.tgz?cache=0&sync_timestamp=1591102414113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-7.0.32.tgz", - "integrity": "sha1-QxDW7jRwU9o0M9sr5JKIPWLOxZ0=", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz", - "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-calc/download/postcss-calc-7.0.2.tgz?cache=0&sync_timestamp=1582014221563&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-calc%2Fdownload%2Fpostcss-calc-7.0.2.tgz", - "integrity": "sha1-UE780AjKAnMSBWiweSsWzc3oqsE=", - "dev": true, - "requires": { - "postcss": "^7.0.27", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.2" - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-4.0.3.tgz", - "integrity": "sha1-rgYLzpPteUrHEmTwgTLVUJVr04E=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz", - "integrity": "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8=", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha1-H7q9LCRr/2qq15l7KwkY9NevQDM=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha1-P+EzzTyCKC5VD8myORdqkge3hOs=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/postcss-load-config/download/postcss-load-config-2.1.0.tgz", - "integrity": "sha1-yE1pK3u3tB3c7ZTuYuirMbQXsAM=", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/postcss-loader/download/postcss-loader-3.0.0.tgz", - "integrity": "sha1-a5eUPkfHLYRfqeA/Jzdz1OjdbC0=", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ=", - "dev": true, - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha1-NivqT/Wh+Y5AdacTxsslrv75plA=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-3.1.2.tgz", - "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY=", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz", - "integrity": "sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-3.1.2.tgz", - "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha1-3IfjQUjsfqtfeR981YSYMzdbdBo=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-6.0.23.tgz?cache=0&sync_timestamp=1591102414113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-6.0.23.tgz", - "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-6.0.23.tgz?cache=0&sync_timestamp=1591102414113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-6.0.23.tgz", - "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-6.0.23.tgz?cache=0&sync_timestamp=1591102414113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-6.0.23.tgz", - "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-1.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-values%2Fdownload%2Fpostcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npm.taobao.org/postcss/download/postcss-6.0.23.tgz?cache=0&sync_timestamp=1591102414113&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss%2Fdownload%2Fpostcss-6.0.23.tgz", - "integrity": "sha1-YcgswyisYOZ3ZF+XkFTrmLwOMyQ=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ=", - "dev": true, - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-display-values/download/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha1-Db4EpM6QY9RmftK+R2u4MMglk1o=", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-positions/download/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha1-BfdX+E8mBDc3g2ipH4ky1LECkX8=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-repeat-style/download/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha1-xOu8KJ85kaAo1EdRy90RkYsXkQw=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-string/download/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha1-zUTECrB6DHo23F6Zqs4eyk7CaQw=", - "dev": true, - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-timing-functions/download/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha1-jgCcoqOUnNr4rSPmtquZy159KNk=", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-unicode/download/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha1-hBvUj9zzAZrUuqdJOj02O1KuHPs=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE=", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-normalize-whitespace/download/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha1-vx1AcP5Pzqh9E0joJdjMDF+qfYI=", - "dev": true, - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4=", - "dev": true, - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha1-f9QuvqXpyBRgljniwuhK4nC6SN8=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha1-F++kBerMbge+NBSlyi0QdGgdTik=", - "dev": true, - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-6.0.2.tgz", - "integrity": "sha1-k0z3mdAWyDQRhZ4J3Oyt4BKG7Fw=", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-4.0.2.tgz", - "integrity": "sha1-F7mXvHEbMzurFDqu07jT1uPTglg=", - "dev": true, - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-3.3.1.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-3.3.1.tgz", - "integrity": "sha1-n/giVH4okyE88cMO+lGsX9G6goE=", - "dev": true - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npm.taobao.org/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz?cache=0&sync_timestamp=1588083210998&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-value-parser%2Fdownload%2Fpostcss-value-parser-4.1.0.tgz", - "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/prepend-http/download/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npm.taobao.org/prettier/download/prettier-1.19.1.tgz?cache=0&sync_timestamp=1587491448785&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fprettier%2Fdownload%2Fprettier-1.19.1.tgz", - "integrity": "sha1-99f1/4qc2HKnvkyhQglZVqYHl8s=", - "dev": true, - "optional": true - }, - "pretty": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/pretty/download/pretty-2.0.0.tgz", - "integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=", - "dev": true, - "requires": { - "condense-newlines": "^0.2.1", - "extend-shallow": "^2.0.1", - "js-beautify": "^1.6.12" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/pretty-error/download/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "pretty-format": { - "version": "21.2.1", - "resolved": "https://registry.npm.taobao.org/pretty-format/download/pretty-format-21.2.1.tgz?cache=0&sync_timestamp=1592925335887&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpretty-format%2Fdownload%2Fpretty-format-21.2.1.tgz", - "integrity": "sha1-rlQH888hBmzQEaobpfzntqLt2zY=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } - } - }, - "printj": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/printj/download/printj-1.1.2.tgz", - "integrity": "sha1-2Q3rKXWoufYA+zoclOP0xTx4oiI=" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", - "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/progress/download/progress-2.0.3.tgz", - "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz", - "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/promise-inflight/download/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npm.taobao.org/proto-list/download/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz", - "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz?cache=0&sync_timestamp=1585142991033&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpsl%2Fdownload%2Fpsl-1.8.0.tgz", - "integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/public-encrypt/download/public-encrypt-4.0.3.tgz", - "integrity": "sha1-T8ydd6B+SLp1J+fL4N4z0HATMeA=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npm.taobao.org/bn.js/download/bn.js-4.11.9.tgz", - "integrity": "sha1-JtVWgpRY+dHoH8SJUkk9C6NQeCg=", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", - "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/pumpify/download/pumpify-1.5.1.tgz?cache=0&sync_timestamp=1569938200736&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpumpify%2Fdownload%2Fpumpify-1.5.1.tgz", - "integrity": "sha1-NlE74karJ1cLGjdKXOJ4v9dDcM4=", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/q/download/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npm.taobao.org/query-string/download/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/querystring-es3/download/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/querystringify/download/querystringify-2.1.1.tgz", - "integrity": "sha1-YOWl/WSn+L+k0qsu1v30yFutFU4=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/randombytes/download/randombytes-2.1.0.tgz", - "integrity": "sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/randomfill/download/randomfill-1.0.4.tgz", - "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz", - "integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE=", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npm.taobao.org/raw-body/download/raw-body-2.4.0.tgz", - "integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-5.2.0.tgz", - "integrity": "sha1-e/KVQ4yloz5WzTDgU7NO5yUMk8w=", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/parse-json/download/parse-json-5.0.0.tgz", - "integrity": "sha1-c+URTJhtFD76NxLU6iTbmkJm9g8=", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - } - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fread-pkg-up%2Fdownload%2Fread-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "dependencies": { - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz", - "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-3.4.0.tgz?cache=0&sync_timestamp=1584985910691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-3.4.0.tgz", - "integrity": "sha1-n9zN+ekVWAVEkiGsZF6DA6tbmto=", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerate": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/regenerate/download/regenerate-1.4.1.tgz", - "integrity": "sha1-ytkq2Oa1kXc0hfvgWkhcr09Ffm8=", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npm.taobao.org/regenerate-unicode-properties/download/regenerate-unicode-properties-8.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerate-unicode-properties%2Fdownload%2Fregenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha1-5d5xEdZV57pgwFfb6f83yH5lzew=", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.5.tgz?cache=0&sync_timestamp=1584052597708&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.5.tgz", - "integrity": "sha1-2Hih0JS0MG0QuQlkhLM+vVXiZpc=", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npm.taobao.org/regenerator-transform/download/regenerator-transform-0.14.5.tgz?cache=0&sync_timestamp=1593557393872&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregenerator-transform%2Fdownload%2Fregenerator-transform-0.14.5.tgz", - "integrity": "sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ=", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz", - "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/regexp.prototype.flags/download/regexp.prototype.flags-1.3.0.tgz?cache=0&sync_timestamp=1576388379660&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexp.prototype.flags%2Fdownload%2Fregexp.prototype.flags-1.3.0.tgz", - "integrity": "sha1-erqJs8E6ZFCdq888qNn7ub31y3U=", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/regexpp/download/regexpp-1.1.0.tgz", - "integrity": "sha1-DjUW3Qt5BPQT0tQZPc5GGMOmias=", - "dev": true, - "optional": true - }, - "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npm.taobao.org/regexpu-core/download/regexpu-core-4.7.0.tgz?cache=0&sync_timestamp=1583949899397&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fregexpu-core%2Fdownload%2Fregexpu-core-4.7.0.tgz", - "integrity": "sha1-/L9FjFBDGwu3tF1pZ7gZLZHz2Tg=", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npm.taobao.org/regjsgen/download/regjsgen-0.5.2.tgz", - "integrity": "sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM=", - "dev": true - }, - "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npm.taobao.org/regjsparser/download/regjsparser-0.6.4.tgz", - "integrity": "sha1-p2n4aEMIQBpm6bUp0kNv9NBmYnI=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npm.taobao.org/relateurl/download/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/renderkid/download/renderkid-2.0.3.tgz", - "integrity": "sha1-OAF5wv9a4TZcUivy/Pz/AcW3QUk=", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - } - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz", - "integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI=", - "dev": true - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomutils%2Fdownload%2Fdomutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz", - "integrity": "sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npm.taobao.org/request/download/request-2.88.2.tgz?cache=0&sync_timestamp=1581439006948&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frequest%2Fdownload%2Frequest-2.88.2.tgz", - "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/request-promise-core/download/request-promise-core-1.1.3.tgz", - "integrity": "sha1-6aPAgbUTgN/qZ3M2Bh/qh5qCnuk=", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npm.taobao.org/request-promise-native/download/request-promise-native-1.0.8.tgz", - "integrity": "sha1-pFW5YLgm5E4r+Jma9k3/K/5YyzY=", - "dev": true, - "requires": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/require-from-string/download/require-from-string-2.0.2.tgz", - "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/require-uncached/download/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "optional": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "reselect": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/reselect/download/reselect-3.0.1.tgz", - "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.17.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve%2Fdownload%2Fresolve-1.17.0.tgz", - "integrity": "sha1-sllBtUloIxzC0bt2p5y38sC/hEQ=", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true, - "optional": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz?cache=0&sync_timestamp=1585438700247&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve-url%2Fdownload%2Fresolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npm.taobao.org/resumer/download/resumer-0.0.0.tgz", - "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", - "requires": { - "through": "~2.3.4" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz", - "integrity": "sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npm.taobao.org/retry/download/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/rgb-regex/download/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/rgba-regex/download/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1581229865753&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz", - "integrity": "sha1-ocGm9iR1FXe6XQeRTLyShQWFiQw=", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rollup": { - "version": "0.25.8", - "resolved": "https://registry.npm.taobao.org/rollup/download/rollup-0.25.8.tgz?cache=0&sync_timestamp=1595099799360&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frollup%2Fdownload%2Frollup-0.25.8.tgz", - "integrity": "sha1-v2zoO4dRDRY0Ru6qV37WpvxYNeA=", - "requires": { - "chalk": "^1.1.1", - "minimist": "^1.2.0", - "source-map-support": "^0.3.2" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npm.taobao.org/run-async/download/run-async-2.4.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frun-async%2Fdownload%2Frun-async-2.4.1.tgz", - "integrity": "sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU=", - "dev": true, - "optional": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/run-queue/download/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rw": { - "version": "1.3.3", - "resolved": "https://registry.npm.taobao.org/rw/download/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npm.taobao.org/rx-lite/download/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true, - "optional": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npm.taobao.org/rx-lite-aggregates/download/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "optional": true, - "requires": { - "rx-lite": "*" - } - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-5.5.12.tgz?cache=0&sync_timestamp=1593794887039&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frxjs%2Fdownload%2Frxjs-5.5.12.tgz", - "integrity": "sha1-b6YbinfD15PbrycL7i9D9lLXQcw=", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - }, - "dependencies": { - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/symbol-observable/download/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafer-buffer%2Fdownload%2Fsafer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", - "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", - "dev": true - }, - "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npm.taobao.org/saxes/download/saxes-3.1.11.tgz", - "integrity": "sha1-1Z0f0zLskq2YouCy7mRHAjhLHFs=", - "dev": true, - "requires": { - "xmlchars": "^2.1.1" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-2.7.0.tgz", - "integrity": "sha1-FxUfdtjq5n+793lgwzxnatn078c=", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/select/download/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/select-hose/download/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npm.taobao.org/selfsigned/download/selfsigned-1.10.7.tgz", - "integrity": "sha1-2lgZ/QSdVXTyjoipvMbbxubzkGs=", - "dev": true, - "requires": { - "node-forge": "0.9.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1586886301819&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "dev": true - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz", - "integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz?cache=0&sync_timestamp=1590596706367&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime%2Fdownload%2Fmime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-3.1.0.tgz", - "integrity": "sha1-i/OpFwcSZk7yVhtEtpHq/jmSFOo=", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/serve-index/download/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz?cache=0&sync_timestamp=1593407710477&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz?cache=0&sync_timestamp=1563425414995&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsetprototypeof%2Fdownload%2Fsetprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz", - "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz?cache=0&sync_timestamp=1585775409029&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fset-value%2Fdownload%2Fset-value-2.0.1.tgz", - "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/setimmediate/download/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz?cache=0&sync_timestamp=1563425414995&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsetprototypeof%2Fdownload%2Fsetprototypeof-1.1.1.tgz", - "integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npm.taobao.org/sha.js/download/sha.js-2.4.11.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsha.js%2Fdownload%2Fsha.js-2.4.11.tgz", - "integrity": "sha1-N6XPC4HsvGlD3hCbopYNGyZYSuc=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npm.taobao.org/shell-quote/download/shell-quote-1.7.2.tgz", - "integrity": "sha1-Z6fQLHbJ2iT5nSCAj8re0ODgS+I=", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/sigmund/download/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz", - "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz", - "integrity": "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=", - "dev": true - } - } - }, - "simplemde": { - "version": "1.11.2", - "resolved": "https://registry.npm.taobao.org/simplemde/download/simplemde-1.11.2.tgz", - "integrity": "sha1-ojo12XjSxA7wfewAjJLwcNjggOM=", - "requires": { - "codemirror": "*", - "codemirror-spell-checker": "*", - "marked": "*" - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/slash/download/slash-2.0.0.tgz", - "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-1.0.0.tgz", - "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", - "dev": true, - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "slick-carousel": { - "version": "1.8.1", - "resolved": "https://registry.npm.taobao.org/slick-carousel/download/slick-carousel-1.8.1.tgz", - "integrity": "sha1-pL+ykBSIe7Zs5Si5C9DNomLMj40=" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", - "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz", - "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz", - "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz", - "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz", - "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz", - "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npm.taobao.org/sntp/download/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npm.taobao.org/sockjs/download/sockjs-0.3.20.tgz", - "integrity": "sha1-smooPsVi74smh7RAM6Tuzqx12FU=", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.4.0", - "websocket-driver": "0.6.5" - } - }, - "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/sockjs-client/download/sockjs-client-1.4.0.tgz", - "integrity": "sha1-yfJWjhnI/YFztJl+o0IOC7MGx9U=", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npm.taobao.org/faye-websocket/download/faye-websocket-0.11.3.tgz", - "integrity": "sha1-XA6aiWjokSwoZjn96XeosgnyUI4=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/sort-keys/download/sort-keys-1.1.2.tgz?cache=0&sync_timestamp=1565864727994&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsort-keys%2Fdownload%2Fsort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "sortablejs": { - "version": "1.10.2", - "resolved": "https://registry.npm.taobao.org/sortablejs/download/sortablejs-1.10.2.tgz", - "integrity": "sha1-bkA2TZE/mLhaFPZnj5K1wSIfUpA=" - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz", - "integrity": "sha1-OZO9hzv8SEecyp6jpUeDXHwVSzQ=", - "dev": true - }, - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "requires": { - "amdefine": ">=0.0.4" - } - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz?cache=0&sync_timestamp=1584831908370&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-resolve%2Fdownload%2Fsource-map-resolve-0.5.3.tgz", - "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.3.3", - "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.3.3.tgz?cache=0&sync_timestamp=1587719517036&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.3.3.tgz", - "integrity": "sha1-NJAJd9W6PwfHdX7nLnO7GptTdU8=", - "requires": { - "source-map": "0.1.32" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz?cache=0&sync_timestamp=1590161967473&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-correct%2Fdownload%2Fspdx-correct-3.1.1.tgz", - "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz?cache=0&sync_timestamp=1587422410312&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-exceptions%2Fdownload%2Fspdx-exceptions-2.3.0.tgz", - "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.5.tgz", - "integrity": "sha1-NpS1gEVnpFjTyARYQqY1hjL2JlQ=", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/spdy/download/spdy-4.0.2.tgz", - "integrity": "sha1-t09GYgOj7aRSwCSSuR+56EonZ3s=", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/spdy-transport/download/spdy-transport-3.0.0.tgz", - "integrity": "sha1-ANSGOmQArXXfkzYaFghgXl3NzzE=", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz", - "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsprintf-js%2Fdownload%2Fsprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "ssf": { - "version": "0.10.3", - "resolved": "https://registry.npm.taobao.org/ssf/download/ssf-0.10.3.tgz", - "integrity": "sha1-jq4fwpyQpVLnkhII+BiS1vd6yys=", - "requires": { - "frac": "~1.1.2" - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz", - "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-6.0.1.tgz", - "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npm.taobao.org/stable/download/stable-0.1.8.tgz", - "integrity": "sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=", - "dev": true - }, - "stackframe": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/stackframe/download/stackframe-1.2.0.tgz?cache=0&sync_timestamp=1590854148142&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstackframe%2Fdownload%2Fstackframe-1.2.0.tgz", - "integrity": "sha1-UkKUktY8YuuYmATBFVLj0i53kwM=", - "dev": true - }, - "staged-git-files": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/staged-git-files/download/staged-git-files-1.0.0.tgz", - "integrity": "sha1-zbhHg3wfzFLAioctSIPMCHdmioA=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1587328859420&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/stealthy-require/download/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/stream-browserify/download/stream-browserify-2.0.2.tgz?cache=0&sync_timestamp=1587041519870&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstream-browserify%2Fdownload%2Fstream-browserify-2.0.2.tgz", - "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/stream-each/download/stream-each-1.2.3.tgz", - "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npm.taobao.org/stream-http/download/stream-http-2.8.3.tgz?cache=0&sync_timestamp=1588701035785&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstream-http%2Fdownload%2Fstream-http-2.8.3.tgz", - "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/stream-shift/download/stream-shift-1.0.1.tgz?cache=0&sync_timestamp=1576147145118&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstream-shift%2Fdownload%2Fstream-shift-1.0.1.tgz", - "integrity": "sha1-1wiCgVWasneEJCebCHfaPDktWj0=", - "dev": true - }, - "stream-to-observable": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/stream-to-observable/download/stream-to-observable-0.2.0.tgz", - "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", - "dev": true, - "requires": { - "any-observable": "^0.2.0" - } - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/strict-uri-encode/download/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.padend": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/string.prototype.padend/download/string.prototype.padend-3.1.0.tgz?cache=0&sync_timestamp=1576312069927&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.padend%2Fdownload%2Fstring.prototype.padend-3.1.0.tgz", - "integrity": "sha1-3Aj1eoAQ3FwVNVAxj2fhOtu3KsM=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "string.prototype.padstart": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/string.prototype.padstart/download/string.prototype.padstart-3.1.0.tgz", - "integrity": "sha1-tHwIdUDQcQvlpJN1dRoKYnvU/5A=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "string.prototype.trim": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/string.prototype.trim/download/string.prototype.trim-1.2.1.tgz", - "integrity": "sha1-FBIz3/Msgr+tgGhNfl8Iae4Pt4I=", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/string.prototype.trimend/download/string.prototype.trimend-1.0.1.tgz?cache=0&sync_timestamp=1586465409341&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimend%2Fdownload%2Fstring.prototype.trimend-1.0.1.tgz", - "integrity": "sha1-hYEqa4R6wAInD1gIFGBkyZX7aRM=", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/string.prototype.trimstart/download/string.prototype.trimstart-1.0.1.tgz?cache=0&sync_timestamp=1586465413621&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstring.prototype.trimstart%2Fdownload%2Fstring.prototype.trimstart-1.0.1.tgz", - "integrity": "sha1-FK9tnzSwU/fPyJty+PLuFLkDmlQ=", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npm.taobao.org/stringify-object/download/stringify-object-3.3.0.tgz", - "integrity": "sha1-cDBlrvyhkwDTzoivT1s5VtdVZik=", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-obj/download/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - } - } - }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npm.taobao.org/stringstream/download/stringstream-0.0.6.tgz", - "integrity": "sha1-eIAiWw1K0Q4wkn0Weh1vL9OzOnI=", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/strip-eof/download/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/strip-final-newline/download/strip-final-newline-2.0.0.tgz", - "integrity": "sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz?cache=0&sync_timestamp=1594567586410&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-json-comments%2Fdownload%2Fstrip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npm.taobao.org/stylehacks/download/stylehacks-4.0.3.tgz", - "integrity": "sha1-Zxj8r00eB9ihMYaQiB6NlnJqcdU=", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.2", - "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-selector-parser%2Fdownload%2Fpostcss-selector-parser-3.1.2.tgz", - "integrity": "sha1-sxD1xMD9r3b5SQK7qjDbaqhPUnA=", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/svgo/download/svgo-1.3.2.tgz?cache=0&sync_timestamp=1572433264480&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsvgo%2Fdownload%2Fsvgo-1.3.2.tgz", - "integrity": "sha1-ttxRHAYzRsnkFbgeQ0ARRbltQWc=", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npm.taobao.org/symbol-observable/download/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npm.taobao.org/symbol-tree/download/symbol-tree-3.2.4.tgz", - "integrity": "sha1-QwY30ki6d+B4iDlR+5qg7tfGP6I=", - "dev": true - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/table/download/table-4.0.2.tgz", - "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=", - "dev": true, - "optional": true, - "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true, - "optional": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "optional": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "optional": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.1.0.tgz?cache=0&sync_timestamp=1591599666712&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true, - "optional": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true, - "optional": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "optional": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz", - "integrity": "sha1-ofzMBrWNth/XpF2i2kT186Pme6I=", - "dev": true - }, - "tape": { - "version": "4.13.3", - "resolved": "https://registry.npm.taobao.org/tape/download/tape-4.13.3.tgz?cache=0&sync_timestamp=1590380169759&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftape%2Fdownload%2Ftape-4.13.3.tgz", - "integrity": "sha1-UbPZHINmjHpFsaWUtgfe4KC0Yng=", - "requires": { - "deep-equal": "~1.1.1", - "defined": "~1.0.0", - "dotignore": "~0.1.2", - "for-each": "~0.3.3", - "function-bind": "~1.1.1", - "glob": "~7.1.6", - "has": "~1.0.3", - "inherits": "~2.0.4", - "is-regex": "~1.0.5", - "minimist": "~1.2.5", - "object-inspect": "~1.7.0", - "resolve": "~1.17.0", - "resumer": "~0.0.0", - "string.prototype.trim": "~1.2.1", - "through": "~2.3.8" - } - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npm.taobao.org/terser/download/terser-4.8.0.tgz?cache=0&sync_timestamp=1593953635939&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser%2Fdownload%2Fterser-4.8.0.tgz", - "integrity": "sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc=", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npm.taobao.org/source-map-support/download/source-map-support-0.5.19.tgz?cache=0&sync_timestamp=1587719517036&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-support%2Fdownload%2Fsource-map-support-0.5.19.tgz", - "integrity": "sha1-qYti+G3K9PZzmWSMCFKRq56P7WE=", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.4", - "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-1.4.4.tgz?cache=0&sync_timestamp=1594910785474&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-1.4.4.tgz", - "integrity": "sha1-LGNUQ0cyS6r6mla6rd8WNMir/C8=", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^3.1.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true, - "optional": true - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npm.taobao.org/thenify/download/thenify-3.3.1.tgz", - "integrity": "sha1-iTLmhqQGYDigFt2eLKRq3Zg4qV8=", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npm.taobao.org/thenify-all/download/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "thread-loader": { - "version": "2.1.3", - "resolved": "https://registry.npm.taobao.org/thread-loader/download/thread-loader-2.1.3.tgz", - "integrity": "sha1-y9LBOfwrLebp0o9iKGq3cMGsvdo=", - "dev": true, - "requires": { - "loader-runner": "^2.3.1", - "loader-utils": "^1.1.0", - "neo-async": "^2.6.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npm.taobao.org/through2/download/through2-2.0.5.tgz", - "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/thunky/download/thunky-1.1.0.tgz?cache=0&sync_timestamp=1571043401546&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fthunky%2Fdownload%2Fthunky-1.1.0.tgz", - "integrity": "sha1-Wrr3FKlAXbBQRzK7zNLO3Z75U30=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npm.taobao.org/timers-browserify/download/timers-browserify-2.0.11.tgz", - "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/timsort/download/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", - "dev": true - }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz", - "integrity": "sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM=" - }, - "tinycolor2": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/tinycolor2/download/tinycolor2-1.4.1.tgz", - "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz?cache=0&sync_timestamp=1588178571895&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftmp%2Fdownload%2Ftmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", - "dev": true, - "optional": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/to-arraybuffer/download/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz", - "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz", - "integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM=", - "dev": true - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npm.taobao.org/toposort/download/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftough-cookie%2Fdownload%2Ftough-cookie-2.5.0.tgz", - "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/tr46/download/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "tree-table-vue": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/tree-table-vue/download/tree-table-vue-1.1.0.tgz", - "integrity": "sha1-ETpL2dhPqmQ5csS4AoCanbZjDYk=", - "requires": { - "clonedeep": "^2.0.0", - "iview": "^3.1.5", - "vue": "^2.5.17" - } - }, - "tryer": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/tryer/download/tryer-1.0.1.tgz", - "integrity": "sha1-8shUBoALmw90yfdGW4HqrSQSUvg=", - "dev": true - }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npm.taobao.org/tsconfig-paths/download/tsconfig-paths-3.9.0.tgz", - "integrity": "sha1-CYVHpsREiAfo/Ljq4IEGTumjyQs=", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz?cache=0&sync_timestamp=1586046271069&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-1.0.1.tgz", - "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.13.0.tgz", - "integrity": "sha1-yIHhPMcBWJTtkUhi0nZDb6mkcEM=", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npm.taobao.org/tty-browserify/download/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz?cache=0&sync_timestamp=1581365146868&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftweetnacl%2Fdownload%2Ftweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npm.taobao.org/type-detect/download/type-detect-4.0.8.tgz", - "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npm.taobao.org/type-fest/download/type-fest-0.6.0.tgz", - "integrity": "sha1-jSojcNPfiG61yQraHFv2GIrPg4s=", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz", - "integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typo-js": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/typo-js/download/typo-js-1.1.0.tgz", - "integrity": "sha1-pan1kry0U2Zr9wyWlNpYcF0CXtg=" - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz?cache=0&sync_timestamp=1592744803278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/uglifyjs-webpack-plugin/download/uglifyjs-webpack-plugin-1.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglifyjs-webpack-plugin%2Fdownload%2Fuglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha1-dfVIFghYFjoIZD4IbV/v4YpdZ94=", - "dev": true, - "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - }, - "dependencies": { - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-10.0.4.tgz?cache=0&sync_timestamp=1594429684526&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-10.0.4.tgz", - "integrity": "sha1-ZFI2eZnv+dQYiu/ZoU6dfGomNGA=", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.13.0.tgz?cache=0&sync_timestamp=1595168173997&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.13.0.tgz", - "integrity": "sha1-aWS8pnaF33wfFDDFhPB9dZeIW5w=", - "dev": true - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427569171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-1.3.0.tgz?cache=0&sync_timestamp=1587567875186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-1.3.0.tgz", - "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "mississippi": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/mississippi/download/mississippi-2.0.0.tgz", - "integrity": "sha1-NEKlCPr8KFAEhv7qmUCWduTuWm8=", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npm.taobao.org/pump/download/pump-2.0.1.tgz", - "integrity": "sha1-Ejma3W5M91Jtlzy8i1zi4pCLOQk=", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-0.4.7.tgz", - "integrity": "sha1-unT1l9K+LqiAExdG7hfQoJPGgYc=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-1.9.1.tgz", - "integrity": "sha1-z8IArvd7YAxH2pu4FJyUPnmML9s=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-5.3.0.tgz", - "integrity": "sha1-ujhyycbTOgcEp9cf8EXl7EiZnQY=", - "dev": true, - "requires": { - "safe-buffer": "^5.1.1" - } - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npm.taobao.org/uglify-es/download/uglify-es-3.3.9.tgz", - "integrity": "sha1-DBxPBwC+2NvBJM2zBNJZLKID5nc=", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha1-JhmADEyCWADv3YNDr33Zkzy+KBg=", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha1-jtKjJWmWG86SJ9Cc0/+7j+1fAgw=", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-1.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funicode-match-property-value-ecmascript%2Fdownload%2Funicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha1-DZH2AO7rMJaqlisdb8iIduZOpTE=", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npm.taobao.org/unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-1.1.0.tgz?cache=0&sync_timestamp=1583945805856&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funicode-property-aliases-ecmascript%2Fdownload%2Funicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha1-3Vepn2IHvt/0Yoq++5TFDblByPQ=", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz", - "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/uniqs/download/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/unique-filename/download/unique-filename-1.1.1.tgz", - "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npm.taobao.org/unique-slug/download/unique-slug-2.0.2.tgz", - "integrity": "sha1-uqvOkQg/xk6UWw861hPiZPfNTmw=", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz?cache=0&sync_timestamp=1583531006552&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-0.1.2.tgz", - "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/unquote/download/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz", - "integrity": "sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupper-case%2Fdownload%2Fupper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", - "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npm.taobao.org/url/download/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "url-loader": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/url-loader/download/url-loader-1.1.2.tgz", - "integrity": "sha1-uXHRkbg69pPF4/6kBkvp4fLX+Ng=", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npm.taobao.org/url-parse/download/url-parse-1.4.7.tgz", - "integrity": "sha1-qKg1NejACjFuQDpdtKwbm4U64ng=", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz", - "integrity": "sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npm.taobao.org/util/download/util-0.11.1.tgz?cache=0&sync_timestamp=1588238457176&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil%2Fdownload%2Futil-0.11.1.tgz", - "integrity": "sha1-MjZzNyDsZLsn9uJvQhqqLhtYjWE=", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.1.tgz", - "integrity": "sha1-a693dLgO6w91INi4HQeYKlmruu4=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/utila/download/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true - }, - "v-click-outside-x": { - "version": "3.7.1", - "resolved": "https://registry.npm.taobao.org/v-click-outside-x/download/v-click-outside-x-3.7.1.tgz?cache=0&sync_timestamp=1579043108278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fv-click-outside-x%2Fdownload%2Fv-click-outside-x-3.7.1.tgz", - "integrity": "sha1-qgPqoOQeRMtSB9z4bC2fDdZAhME=" - }, - "v-org-tree": { - "version": "1.0.12", - "resolved": "https://registry.npm.taobao.org/v-org-tree/download/v-org-tree-1.0.12.tgz", - "integrity": "sha1-Vmsu8dO4jI+tTO4zZaa0v+rjtI0=", - "requires": { - "clonedeep": "^2.0.0" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.4", - "resolved": "https://registry.npm.taobao.org/vendors/download/vendors-1.0.4.tgz?cache=0&sync_timestamp=1579857147055&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvendors%2Fdownload%2Fvendors-1.0.4.tgz", - "integrity": "sha1-4rgApT56Kbk1BsPPQRANFsTErY4=", - "dev": true - }, - "venn.js": { - "version": "0.2.20", - "resolved": "https://registry.npm.taobao.org/venn.js/download/venn.js-0.2.20.tgz", - "integrity": "sha1-Pw5QzHXLofWGkqijL2e9eq8apvo=", - "requires": { - "d3-selection": "^1.0.2", - "d3-transition": "^1.0.1", - "fmin": "0.0.2" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "view-design": { - "version": "4.3.2", - "resolved": "https://registry.npm.taobao.org/view-design/download/view-design-4.3.2.tgz", - "integrity": "sha1-bwgcZzt3QgObs4o6UZOO+rtg0KI=", - "requires": { - "async-validator": "^3.3.0", - "deepmerge": "^2.2.1", - "element-resize-detector": "^1.2.0", - "js-calendar": "^1.2.3", - "lodash.throttle": "^4.1.1", - "popper.js": "^1.14.6", - "tinycolor2": "^1.4.1", - "v-click-outside-x": "^3.7.1" - }, - "dependencies": { - "async-validator": { - "version": "3.3.0", - "resolved": "https://registry.npm.taobao.org/async-validator/download/async-validator-3.3.0.tgz", - "integrity": "sha1-HZIZO75g1tbIskZpLHAF6e0UqO4=" - } - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/vm-browserify/download/vm-browserify-1.1.2.tgz?cache=0&sync_timestamp=1572870776965&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvm-browserify%2Fdownload%2Fvm-browserify-1.1.2.tgz", - "integrity": "sha1-eGQcSIuObKkadfUR56OzKobl3aA=", - "dev": true - }, - "vue": { - "version": "2.6.11", - "resolved": "https://registry.npm.taobao.org/vue/download/vue-2.6.11.tgz", - "integrity": "sha1-dllNh31LEiNEBuhONSdcbVFBJcU=" - }, - "vue-data-loading": { - "version": "0.2.4", - "resolved": "https://registry.npm.taobao.org/vue-data-loading/download/vue-data-loading-0.2.4.tgz", - "integrity": "sha1-kftt9j7aXGXTrzM2foYqnh/Bhu8=", - "requires": { - "vue": "^2.0.0" - } - }, - "vue-enum": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/vue-enum/download/vue-enum-1.0.5.tgz", - "integrity": "sha1-cQfD4tfXnp1HKLsWzvS83TTBziM=" - }, - "vue-eslint-parser": { - "version": "2.0.3", - "resolved": "https://registry.npm.taobao.org/vue-eslint-parser/download/vue-eslint-parser-2.0.3.tgz?cache=0&sync_timestamp=1589539313907&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-eslint-parser%2Fdownload%2Fvue-eslint-parser-2.0.3.tgz", - "integrity": "sha1-wmjJbG2Uz+PZOKX3WTlZsMozYNE=", - "dev": true, - "optional": true, - "requires": { - "debug": "^3.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.2", - "esquery": "^1.0.0", - "lodash": "^4.17.4" - }, - "dependencies": { - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-3.7.3.tgz", - "integrity": "sha1-u1ByANPRf2AkdjYWC0gmKEsQhTU=", - "dev": true, - "optional": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - } - } - }, - "vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-hot-reload-api%2Fdownload%2Fvue-hot-reload-api-2.3.4.tgz", - "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=", - "dev": true - }, - "vue-i18n": { - "version": "7.8.1", - "resolved": "https://registry.npm.taobao.org/vue-i18n/download/vue-i18n-7.8.1.tgz", - "integrity": "sha1-LOS2795nmh4F3bXZB7/BvCGIA7I=" - }, - "vue-infinite-loading": { - "version": "2.4.5", - "resolved": "https://registry.npm.taobao.org/vue-infinite-loading/download/vue-infinite-loading-2.4.5.tgz", - "integrity": "sha1-zCD9QK9/IBiABkQ8mbYEcM8d4bM=" - }, - "vue-json-viewer": { - "version": "2.2.12", - "resolved": "https://registry.npm.taobao.org/vue-json-viewer/download/vue-json-viewer-2.2.12.tgz", - "integrity": "sha1-9y94pAIOa+QqQwAOCdIEf2iWJlY=", - "requires": { - "clipboard": "^2.0.4", - "vue": "^2.6.9" - } - }, - "vue-json-views": { - "version": "0.1.1", - "resolved": "https://registry.npm.taobao.org/vue-json-views/download/vue-json-views-0.1.1.tgz", - "integrity": "sha1-8YAXKr4EvK9Cag9DoBkk4EJuvPw=", - "requires": { - "vue": "^2.5.11" - }, - "dependencies": { - "vue-json-views": { - "version": "0.0.2", - "resolved": "https://registry.npm.taobao.org/vue-json-views/download/vue-json-views-0.0.2.tgz", - "integrity": "sha1-xadQA6glOnXDN81xftikVMMCXx0=", - "requires": { - "vue": "^2.5.11" - } - } - } - }, - "vue-loader": { - "version": "15.9.3", - "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.3.tgz?cache=0&sync_timestamp=1593355754768&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-15.9.3.tgz", - "integrity": "sha1-DeNdnlVdPtU5aVFsrFziVTEpndo=", - "dev": true, - "requires": { - "@vue/component-compiler-utils": "^3.1.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "vue-hot-reload-api": "^2.3.0", - "vue-style-loader": "^4.1.0" - } - }, - "vue-router": { - "version": "3.3.4", - "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-3.3.4.tgz?cache=0&sync_timestamp=1594111718735&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-3.3.4.tgz", - "integrity": "sha1-Tjirw0oRxBtsPYJERJouNjumJQs=" - }, - "vue-slick": { - "version": "1.1.15", - "resolved": "https://registry.npm.taobao.org/vue-slick/download/vue-slick-1.1.15.tgz", - "integrity": "sha1-KRYTRTH9H5Y4VI8roVJuTxEDJYg=", - "requires": { - "slick-carousel": "^1.6.0" - } - }, - "vue-style-loader": { - "version": "4.1.2", - "resolved": "https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-4.1.2.tgz", - "integrity": "sha1-3t80mAbyXOtOZPOtfApE+6c1/Pg=", - "dev": true, - "requires": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - } - }, - "vue-template-compiler": { - "version": "2.6.11", - "resolved": "https://registry.npm.taobao.org/vue-template-compiler/download/vue-template-compiler-2.6.11.tgz", - "integrity": "sha1-wEcE749JixUxMAGJk+VjCdRpgIA=", - "dev": true, - "requires": { - "de-indent": "^1.0.2", - "he": "^1.1.0" - } - }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npm.taobao.org/vue-template-es2015-compiler/download/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=", - "dev": true - }, - "vuedraggable": { - "version": "2.24.0", - "resolved": "https://registry.npm.taobao.org/vuedraggable/download/vuedraggable-2.24.0.tgz?cache=0&sync_timestamp=1594052423588&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvuedraggable%2Fdownload%2Fvuedraggable-2.24.0.tgz", - "integrity": "sha1-HuBp7rkfYfy1QPryDxxrLU2ZCiY=", - "requires": { - "sortablejs": "^1.10.1" - } - }, - "vuex": { - "version": "3.5.1", - "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-3.5.1.tgz?cache=0&sync_timestamp=1593445037188&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvuex%2Fdownload%2Fvuex-3.5.1.tgz", - "integrity": "sha1-8bjc6mSbwlJUz09DWAgdv12hiz0=" - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/w3c-hr-time/download/w3c-hr-time-1.0.2.tgz?cache=0&sync_timestamp=1583455604765&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fw3c-hr-time%2Fdownload%2Fw3c-hr-time-1.0.2.tgz", - "integrity": "sha1-ConN9cwVgi35w2BUNnaWPgzDCM0=", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/w3c-xmlserializer/download/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha1-MEhcp9cKb9BSQgo9Ev2Q5jOc55Q=", - "dev": true, - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "wangeditor": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/wangeditor/download/wangeditor-3.1.1.tgz", - "integrity": "sha1-+9PB1JdpI8nt67hbKdMLNVEq0Dk=" - }, - "watchpack": { - "version": "1.7.2", - "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.7.2.tgz", - "integrity": "sha1-wC5NTUmRPD5+EiwzJTZa+dMx6ao=", - "dev": true, - "requires": { - "chokidar": "^3.4.0", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha1-mUihhmy71suCTeoTp+1pH2yN3/A=", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1593261363626&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", - "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", - "dev": true, - "optional": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1594864731636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", - "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz?cache=0&sync_timestamp=1588787369955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.13.tgz", - "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz?cache=0&sync_timestamp=1584985910691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - } - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npm.taobao.org/wbuf/download/wbuf-1.7.3.tgz", - "integrity": "sha1-wdjRSTFtPqhShIiVy2oL/oh7h98=", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/wcwidth/download/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/webidl-conversions/download/webidl-conversions-4.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebidl-conversions%2Fdownload%2Fwebidl-conversions-4.0.2.tgz", - "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", - "dev": true - }, - "webpack": { - "version": "4.43.0", - "resolved": "https://registry.npm.taobao.org/webpack/download/webpack-4.43.0.tgz?cache=0&sync_timestamp=1594294511041&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack%2Fdownload%2Fwebpack-4.43.0.tgz", - "integrity": "sha1-xIVHsR1WMiTFYdrRFyyKoLimeOY=", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.1", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-bundle-analyzer": { - "version": "3.8.0", - "resolved": "https://registry.npm.taobao.org/webpack-bundle-analyzer/download/webpack-bundle-analyzer-3.8.0.tgz", - "integrity": "sha1-zms/kI2vBp/R9yZvaSy7O97ZuhY=", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1", - "bfj": "^6.1.1", - "chalk": "^2.4.1", - "commander": "^2.18.0", - "ejs": "^2.6.1", - "express": "^4.16.3", - "filesize": "^3.6.1", - "gzip-size": "^5.0.0", - "lodash": "^4.17.15", - "mkdirp": "^0.5.1", - "opener": "^1.5.1", - "ws": "^6.0.0" - }, - "dependencies": { - "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-7.3.1.tgz?cache=0&sync_timestamp=1591869432510&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Facorn%2Fdownload%2Facorn-7.3.1.tgz", - "integrity": "sha1-hQEHVNtTw/uvO56j4IOqXF0Uf/0=", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npm.taobao.org/acorn-walk/download/acorn-walk-7.2.0.tgz", - "integrity": "sha1-DeiJpgEgOQmw++B7iTjcIdLpZ7w=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-chain": { - "version": "4.12.1", - "resolved": "https://registry.npm.taobao.org/webpack-chain/download/webpack-chain-4.12.1.tgz?cache=0&sync_timestamp=1593639477219&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-chain%2Fdownload%2Fwebpack-chain-4.12.1.tgz", - "integrity": "sha1-bIQ5u7KrVQlS1g4eqTGRQZBsAqY=", - "dev": true, - "requires": { - "deepmerge": "^1.5.2", - "javascript-stringify": "^1.6.0" - }, - "dependencies": { - "deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz", - "integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M=", - "dev": true - } - } - }, - "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npm.taobao.org/webpack-dev-middleware/download/webpack-dev-middleware-3.7.2.tgz?cache=0&sync_timestamp=1594744804453&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-dev-middleware%2Fdownload%2Fwebpack-dev-middleware-3.7.2.tgz", - "integrity": "sha1-ABnD23FuP6XOy/ZPKriKdLqzMfM=", - "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" - } - }, - "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npm.taobao.org/webpack-dev-server/download/webpack-dev-server-3.11.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-dev-server%2Fdownload%2Fwebpack-dev-server-3.11.0.tgz", - "integrity": "sha1-jxVKO84bz9HMYY705wMniFXn/4w=", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz", - "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1593261363626&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz", - "integrity": "sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1594864731636&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz", - "integrity": "sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc=", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz", - "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.1.1.tgz", - "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz", - "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz?cache=0&sync_timestamp=1588787369955&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.13.tgz", - "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz", - "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", - "dev": true - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npm.taobao.org/is-absolute-url/download/is-absolute-url-3.0.3.tgz", - "integrity": "sha1-lsaiK2ojkpsR6gr7GDbDatSl1pg=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz", - "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz?cache=0&sync_timestamp=1594559696906&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fp-limit%2Fdownload%2Fp-limit-2.3.0.tgz", - "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz", - "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz", - "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", - "dev": true - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz?cache=0&sync_timestamp=1584985910691&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz", - "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz", - "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-1.0.0.tgz", - "integrity": "sha1-C3mpMgTXtgDUsoUNH2bCo0lRx3A=", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1586886301819&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", - "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-6.1.0.tgz", - "integrity": "sha1-B2Srxpxj1ayELdSGfo0CXogN+PM=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz", - "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-13.3.2.tgz?cache=0&sync_timestamp=1594421046064&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-13.3.2.tgz", - "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.1.2.tgz?cache=0&sync_timestamp=1595125190020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-13.1.2.tgz", - "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/webpack-log/download/webpack-log-2.0.0.tgz", - "integrity": "sha1-W3ko4GN1k/EZ0y9iJ8HgrDHhtH8=", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npm.taobao.org/webpack-merge/download/webpack-merge-4.2.2.tgz?cache=0&sync_timestamp=1594294904067&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebpack-merge%2Fdownload%2Fwebpack-merge-4.2.2.tgz", - "integrity": "sha1-onxS6ng9E5iv0gh/VH17nS9DY00=", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npm.taobao.org/webpack-sources/download/webpack-sources-1.4.3.tgz", - "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - } - } - }, - "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npm.taobao.org/websocket-driver/download/websocket-driver-0.6.5.tgz?cache=0&sync_timestamp=1591289007652&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwebsocket-driver%2Fdownload%2Fwebsocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", - "dev": true, - "requires": { - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/websocket-extensions/download/websocket-extensions-0.1.4.tgz", - "integrity": "sha1-f4RzvIOd/YdgituV1+sHUhFXikI=", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npm.taobao.org/whatwg-encoding/download/whatwg-encoding-1.0.5.tgz", - "integrity": "sha1-WrrPd3wyFmpR0IXWtPPn0nET3bA=", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/whatwg-mimetype/download/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha1-PUseAxLSB5h5+Cav8Y2+7KWWD78=", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npm.taobao.org/whatwg-url/download/whatwg-url-7.1.0.tgz?cache=0&sync_timestamp=1588965133257&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhatwg-url%2Fdownload%2Fwhatwg-url-7.1.0.tgz", - "integrity": "sha1-wsSS8eymEpiO/T0iZr4bn8YXDQY=", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz?cache=0&sync_timestamp=1574116262707&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwhich%2Fdownload%2Fwhich-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "wolfy87-eventemitter": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/wolfy87-eventemitter/download/wolfy87-eventemitter-5.1.0.tgz", - "integrity": "sha1-NcGsDdGsDBXjXZgVCPwiCEoToBE=" - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz", - "integrity": "sha1-YQY29rH3A4kb00dxzLF/uTtHB5w=", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/worker-farm/download/worker-farm-1.7.0.tgz", - "integrity": "sha1-JqlMU5G7ypJhUgAvabhKS/dy5ag=", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npm.taobao.org/write/download/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "optional": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npm.taobao.org/ws/download/ws-6.2.1.tgz?cache=0&sync_timestamp=1593925420205&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fws%2Fdownload%2Fws-6.2.1.tgz", - "integrity": "sha1-RC/fCkftZPWbal2P8TD0dI7VJPs=", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xlsx": { - "version": "0.13.5", - "resolved": "https://registry.npm.taobao.org/xlsx/download/xlsx-0.13.5.tgz", - "integrity": "sha1-ZYJroZRMb01sAjt+tsiea24Ncbc=", - "requires": { - "adler-32": "~1.2.0", - "cfb": "~1.0.8", - "codepage": "~1.14.0", - "commander": "~2.15.1", - "crc-32": "~1.2.0", - "exit-on-epipe": "~1.0.1", - "ssf": "~0.10.2" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npm.taobao.org/commander/download/commander-2.15.1.tgz?cache=0&sync_timestamp=1595168173997&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcommander%2Fdownload%2Fcommander-2.15.1.tgz", - "integrity": "sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8=" - } - } - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/xml-name-validator/download/xml-name-validator-3.0.0.tgz", - "integrity": "sha1-auc+Bt5NjG5H+fsYH3jWSK1FfGo=", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/xmlchars/download/xmlchars-2.2.0.tgz", - "integrity": "sha1-Bg/hvLf5x2/ioX24apvDq4lCEMs=", - "dev": true - }, - "xss": { - "version": "1.0.7", - "resolved": "https://registry.npm.taobao.org/xss/download/xss-1.0.7.tgz?cache=0&sync_timestamp=1591583567013&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxss%2Fdownload%2Fxss-1.0.7.tgz", - "integrity": "sha1-pVTL1ekJMkvWiT+0f/9EGtVOKpU=", - "requires": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", - "integrity": "sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", - "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz?cache=0&sync_timestamp=1594421046064&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-9.0.2.tgz?cache=0&sync_timestamp=1595125190020&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs-parser%2Fdownload%2Fyargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "yorkie": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/yorkie/download/yorkie-2.0.0.tgz", - "integrity": "sha1-kkEZEtQ1IU4SxRwq4Qk+VLa7g9k=", - "dev": true, - "requires": { - "execa": "^0.8.0", - "is-ci": "^1.0.10", - "normalize-path": "^1.0.0", - "strip-indent": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npm.taobao.org/execa/download/execa-0.8.0.tgz?cache=0&sync_timestamp=1594145237072&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexeca%2Fdownload%2Fexeca-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/get-stream/download/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz?cache=0&sync_timestamp=1594427569171&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flru-cache%2Fdownload%2Flru-cache-4.1.5.tgz", - "integrity": "sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "zrender": { - "version": "4.3.1", - "resolved": "https://registry.npm.taobao.org/zrender/download/zrender-4.3.1.tgz", - "integrity": "sha1-uviqbcgYei+BlpLX1fm+36K5D6M=" - } - } -} diff --git a/smart-admin-web/package.json b/smart-admin-web/package.json deleted file mode 100644 index ee82b487..00000000 --- a/smart-admin-web/package.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "smart-admin", - "version": "1.0.0", - "author": "1024创新实验室<1024lab@sina.com>", - "private": false, - "scripts": { - "dev": "vue-cli-service serve --open", - "local": "vue-cli-service serve --open --mode local", - "build": "vue-cli-service build", - "lint": "vue-cli-service lint", - "test:unit": "vue-cli-service test:unit", - "test:e2e": "vue-cli-service test:e2e", - "development": "vue-cli-service build --mode development", - "sit": "vue-cli-service build --mode sit", - "prod": "vue-cli-service build --mode prod" - }, - "dependencies": { - "@antv/g2": "^3.5.8-beta.1", - "axios": "^0.18.0", - "clipboard": "^2.0.0", - "codemirror": "^5.38.0", - "countup": "^1.8.2", - "cropperjs": "^1.2.2", - "dayjs": "^1.7.7", - "decimal.js": "^10.1.1", - "core-js":"^2.0.0", - "e-guide-layer": "^0.1.1", - "echarts": "^4.0.4", - "gq-plus": "^2.1.5", - "html2canvas": "^1.0.0-alpha.12", - "jquery": "^2.2.3", - "js-cookie": "^2.2.0", - "lodash": "^4.17.15", - "mavon-editor": "^2.7.5", - "moment": "^2.24.0", - "simplemde": "^1.11.2", - "sortablejs": "^1.7.0", - "tree-table-vue": "^1.1.0", - "v-org-tree": "^1.0.6", - "view-design": "^4.0.2", - "vue": "^2.5.10", - "vue-data-loading": "^0.2.4", - "vue-enum": "1.0.5", - "vue-i18n": "^7.8.0", - "vue-infinite-loading": "^2.4.4", - "vue-json-viewer": "^2.2.0", - "vue-json-views": "^0.1.1", - "vue-router": "^3.1.3", - "vue-slick": "^1.1.15", - "vuedraggable": "^2.16.0", - "vuex": "^3.0.1", - "wangeditor": "^3.1.1", - "xlsx": "^0.13.3" - }, - "devDependencies": { - "@vue/cli-plugin-babel": "^3.0.1", - "@vue/cli-plugin-eslint": "^3.0.1", - "@vue/cli-plugin-unit-mocha": "^3.0.1", - "@vue/cli-service": "^3.0.1", - "@vue/eslint-config-standard": "^3.0.0-beta.10", - "@vue/test-utils": "^1.0.0-beta.10", - "chai": "^4.1.2", - "compression-webpack-plugin": "^3.0.0", - "eslint-plugin-cypress": "^2.0.1", - "less": "^2.7.3", - "less-loader": "^4.0.5", - "lint-staged": "^6.0.0", - "uglifyjs-webpack-plugin": "^1.2.4", - "vue-template-compiler": "^2.5.13" - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not ie <= 8" - ], - "gitHooks": { - "pre-commit": "lint-staged" - }, - "lint-staged": { - "*.js": [ - "vue-cli-service lint", - "git add" - ], - "*.vue": [ - "vue-cli-service lint", - "git add" - ] - } -} diff --git a/smart-admin-web/public/favicon.ico b/smart-admin-web/public/favicon.ico deleted file mode 100644 index 5e59671b6e407a6a4ca45ce51e31ffa086ff3cad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16958 zcmeI4Yitx%6oBtia8Wen{Zvb}C|HTnA3kD8D=})+D4M81}3b@15D*_6JF)pR>aCO-45(BLM4$R8SE_rLi(FJFKARX#%W-pP?R_;2a!= zH82%Q!FR2ZO9V#3GWZGV;5;0M1F#C-f;%A+=GL3)N7o5%gAp)#$HqS6PR=cDZNJ;<*ZQ^O)kAV4=3>ybJ3rHQ(}@pmT0)$zmROz8kA&S|viIubp7}bY z)&tU*Ke={?DIjY;BX5`PZkrF$Gfwl1%cjL&&4L@e`L*oV&$-!=`N2-^&x@e1Pb{fN z?i+`o#fQ)KDvosrWBpoB%p2hlwB+pB{z8v6Nyh5>i`bsk%pBy#og4c6gN-rQQ?rNa z+TC$aVK)Ifm|`{Su0YO#3t;r^(jQ^F41(t1dSWKQor~U#6X{J0l5 z+p2omVrl(pd_QgRtLu>UBF{k?F$}uz(OKt|SRLU{(DB`JKDIh$nq<6R{l6RXaE>e< z^oJ#mJEq?Ln6aI0@zKj#nGSNEgXTf*G1fUH&OA$ATd+&3TkkX8ul|26IX#2jlTd4k zr)$@8FXIO3m=<{-`V*FT-g#NhxNcrQ#CYD4Pr^G^?=#-7es5g8pSq`D+YOdjV(Qwp zl z8Z7l!Vr%R*V*8!{F+MS0u=x}{e&rofzRg?!Q|)fue#YG4=Z|A0V0<1yUz_-(WY6}^ zz1==j+gqzsv0t_MCaz!o^3E^U7}I>q+Puc*SL^XF*Q6TA$jzf`WWNHg)V3BW@0JHa za*}6;y4v|ezW!lTp9`jQ&zv;XyZN z;)wo1u+=a6Q}6~9g4GW()|d<&TfZ-cBsxh4#QY}SLGqk6{6w@vx} z@gTeii^2B3m$KVd)zje}P2L%5;5~jp)GlLQ25p}v z$wi*wvw3cG&(n5nMnT5fw#9Mlv1?8JI)7OgQxE}dXO!er z3e#W>9ENis&&qNy*as^?zB3LC@)dL(A8k>;v5uhFm%{O|{_y0 zg)E3+Fc2BXKp~SDAR`SJh!i(SoJW%+fO8HZ(N06gB#o3LEfS8aj - - - - - - - - - - -
- - - - diff --git a/smart-admin-web/src/App.vue b/smart-admin-web/src/App.vue deleted file mode 100644 index 0d189502..00000000 --- a/smart-admin-web/src/App.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - diff --git a/smart-admin-web/src/api/data-scope.js b/smart-admin-web/src/api/data-scope.js deleted file mode 100644 index 14799315..00000000 --- a/smart-admin-web/src/api/data-scope.js +++ /dev/null @@ -1,15 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; -export const dataScopeApi = { - // 批量设置某角色数据范围 - updateDataScope: data => { - return postAxios('/dataScope/batchSet', data); - }, - // 数据权限列表 - getDataScopeList: () => { - return getAxios('/dataScope/list'); - }, - // 获取某角色所设置的数据范围 - getDataScopeByRoleId: roleId => { - return getAxios('/dataScope/listByRole/' + roleId); - } -}; diff --git a/smart-admin-web/src/api/department.js b/smart-admin-web/src/api/department.js deleted file mode 100644 index 2e4ebfa0..00000000 --- a/smart-admin-web/src/api/department.js +++ /dev/null @@ -1,47 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; -export const departmentApi = { - // 加载所有的部门子部门 - getLoadDepartment: () => { - return getAxios('/department/list'); - }, - // 查询部门及员工列表 - getDepartmentEmployeeList: () => { - return getAxios('/department/listEmployee'); - }, - // 添加部门 - addDepartment: (data) => { - return postAxios('/department/add', data); - }, - // 编辑部门 - updateDepartment: (data) => { - return postAxios('/department/update', data); - }, - // 删除部门 - deleteDepartment: (data) => { - return postAxios('/department/delete/' + data); - }, - // 根据id获取部门信息 - getDepartmentById: (data) => { - return getAxios('/department/query/' + data); - }, - // 查询部门列表 - getDepartmentAll: () => { - return getAxios('/department/listAll'); - }, - // 根据部门名称获取员工列表 - getListEmployeeByDepartmentName: (departmentName) => { - return getAxios('/department/listEmployeeByDepartmentName?departmentName=' + departmentName); - }, - // 上下移动 - upOrDown: (departmentId, swapId) => { - return getAxios('/department/upOrDown/' + departmentId + '/' + swapId); - }, - // 升级 - upGrade: (departmentId) => { - return getAxios('/department/upgrade/' + departmentId); - }, - // 降级 - downGrade: (departmentId, preId) => { - return getAxios('/department/downgrade/' + departmentId + '/' + preId); - } -}; diff --git a/smart-admin-web/src/api/email.js b/smart-admin-web/src/api/email.js deleted file mode 100644 index cb541021..00000000 --- a/smart-admin-web/src/api/email.js +++ /dev/null @@ -1,27 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; -export const emailApi = { - // 新增邮件 - addEmail: (data) => { - return postAxios('/email/add', data); - }, - // 分页查询邮件 - getEmail: (data) => { - return postAxios('/email/page/query', data); - }, - // 删除邮件 - deleteEmail: (id) => { - return getAxios('/email/delete/' + id); - }, - // 查看邮件详情 - getEmailDetails: (id) => { - return getAxios('/email/detail/' + id); - }, - // 发送邮件 - sendEmail: (id) => { - return getAxios('/email/send/' + id); - }, - // 更新编辑邮件 - updateEmail: (data) => { - return postAxios('/email/update', data); - } -}; diff --git a/smart-admin-web/src/api/employee.js b/smart-admin-web/src/api/employee.js deleted file mode 100644 index 7f1d8001..00000000 --- a/smart-admin-web/src/api/employee.js +++ /dev/null @@ -1,43 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; -export const employeeApi = { - // 员工管理查询 - getEmployeeList: (data) => { - return postAxios('/employee/query', data); - }, - // 添加员工 - addEmployee: (data) => { - return postAxios('/employee/add', data); - }, - // 更新员工信息 - updateEmployee: (data) => { - return postAxios('/employee/update', data); - }, - // 禁用启用单个员工 - updateStatus: (employeeId, status) => { - return getAxios('/employee/updateStatus/' + employeeId + '/' + status); - }, - // 批量禁用 - updateStatusBatch: (data) => { - return postAxios('/employee/batchUpdateStatus', data); - }, - // 单个员工角色授权 - updateRoles: (data) => { - return postAxios('/employee/updateRoles', data); - }, - // 修改密码 - updatePwd: (data) => { - return postAxios('/employee/updatePwd', data); - }, - // 重置密码 - resetPassword: (employeeId) => { - return getAxios('/employee/resetPasswd/' + employeeId); - }, - // 通过部门id获取当前部门的人员&没有部门的人 - getListEmployeeByDeptId: (departmentId) => { - return getAxios('/employee/listEmployeeByDeptId/' + departmentId); - }, - // 删除员工 - deleteEmployee: (employeeId) => { - return postAxios('/employee/delete/' + employeeId); - } -}; diff --git a/smart-admin-web/src/api/file.js b/smart-admin-web/src/api/file.js deleted file mode 100644 index e8f80248..00000000 --- a/smart-admin-web/src/api/file.js +++ /dev/null @@ -1,28 +0,0 @@ -import { postAxios, getAxios, getDownloadAxios} from '@/lib/http'; -import config from '@/config'; -const baseUrl = config.baseUrl.apiUrl; -export const fileApi = { - // 系统文件查询 - queryFileList: data => { - return postAxios('/api/file/query', data); - }, - // 系统文件下载通过接口 - downLoadFile: id => { - return getDownloadAxios('/api/file/downLoad?id=' + id); - }, - // 文件上传 - fileUpload: (type, data) => { - // return postAxios('/api/file/localUpload/' + type, data); - return this.fileUploadUrl; - }, - // 文件保存 - addFile: data => { - return postAxios('/api/file/save', data); - }, - // 上传路径:本地 - fileUploadLocalUrl: baseUrl + '/api/file/localUpload/', - // 上传路径:阿里OSS - fileUploadAliUrl: baseUrl + '/api/file/aliYunUpload/', - // 上传路径:七牛 - fileUploadQiNiuUrl: baseUrl + '/api/file/qiNiuUpload/' -}; diff --git a/smart-admin-web/src/api/heart-beat.js b/smart-admin-web/src/api/heart-beat.js deleted file mode 100644 index c5ec2486..00000000 --- a/smart-admin-web/src/api/heart-beat.js +++ /dev/null @@ -1,7 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; -export const heartBeatApi = { - // 分页查询所有岗位 - queryHeartBeatRecord: data => { - return postAxios('/heartBeat/query', data); - } -}; diff --git a/smart-admin-web/src/api/login.js b/smart-admin-web/src/api/login.js deleted file mode 100644 index 83338d56..00000000 --- a/smart-admin-web/src/api/login.js +++ /dev/null @@ -1,19 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; -export const loginApi = { - // 登录 - login: data => { - return postAxios('/session/login', data); - }, - // 根据token获取session - getSession: () => { - return getAxios('/session/get'); - }, - // 登出 - logout: (token) => { - return getAxios(`/session/logOut?x-access-token=${token}`); - }, - // 获取验证码 - getVerificationCode: () => { - return getAxios('/session/verificationCode'); - } -}; diff --git a/smart-admin-web/src/api/notice.js b/smart-admin-web/src/api/notice.js deleted file mode 100644 index fad6ad83..00000000 --- a/smart-admin-web/src/api/notice.js +++ /dev/null @@ -1,43 +0,0 @@ -// 任务调度API -import { - postAxios, - getAxios -} from '@/lib/http'; -export const noticeApi = { - // 查询消息列表 - getNoticeList: (data) => { - return postAxios('/notice/page/query', data); - }, - // 未读消息列表 - getNoticeUnreadList: (data) => { - return postAxios('/notice/unread/page/query', data); - }, - // 查询个人消息列表 - getPersonNoticeList: (data) => { - return postAxios('/notice/receive/page/query', data); - }, - // 添加消息 - addNotice: (data) => { - return postAxios('/notice/add', data); - }, - // 标记已读 - addNoticeRecord: (id) => { - return getAxios(`/notice/read/${id}`); - }, - // 修改消息 - updateNotice: (data) => { - return postAxios('/notice/update', data); - }, - // 删除消息 - deleteNotice: (id) => { - return getAxios(`/notice/delete/${id}`); - }, - // 获取通知详情 - getNoticeDetail: (id) => { - return getAxios(`/notice/detail/${id}`); - }, - // 发送消息 - sendNotice: (id) => { - return getAxios(`/notice/send/${id}`); - } -}; diff --git a/smart-admin-web/src/api/online-user.js b/smart-admin-web/src/api/online-user.js deleted file mode 100644 index b7847b9b..00000000 --- a/smart-admin-web/src/api/online-user.js +++ /dev/null @@ -1,12 +0,0 @@ -// 任务调度API -import { - postAxios, - getAxios -} from '@/lib/http'; -export const onlineUserApi = { - // 查询在线员工列表 - getOnlineUserList: (data) => { - return postAxios('/userOnLine/query', data); - } - -}; diff --git a/smart-admin-web/src/api/peony.js b/smart-admin-web/src/api/peony.js deleted file mode 100644 index 0c41d54f..00000000 --- a/smart-admin-web/src/api/peony.js +++ /dev/null @@ -1,28 +0,0 @@ -import { postAxios, getAxios, postDownloadAxios } from '@/lib/http'; - -export const peonyApi = { - // 添加牡丹花 @author 卓大 - addPeony: (data) => { - return postAxios('/peony/add', data); - }, - // 分页查询牡丹花 @author 卓大 - queryPeony: (data) => { - return postAxios('/peony/page/query', data); - }, - // 批量删除牡丹花 @author 卓大 - batchDeletePeony: (idList) => { - return postAxios('/peony/deleteByIds', idList); - }, - // 修改牡丹花 @author 卓大 - updatePeony: (data) => { - return postAxios('/peony/update',data); - }, - // 导出全部 @author 卓大 - exportAll:(data)=>{ - return postDownloadAxios('/peony/export/all',data); - }, - // 批量导出 @author 卓大 - batchExport: (idList) => { - return postDownloadAxios('/peony/export/batch', idList); - }, -}; diff --git a/smart-admin-web/src/api/position.js b/smart-admin-web/src/api/position.js deleted file mode 100644 index 3756c457..00000000 --- a/smart-admin-web/src/api/position.js +++ /dev/null @@ -1,19 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; -export const positionApi = { - // 分页查询所有岗位 - getPositionListPage: data => { - return postAxios('/position/getListPage', data); - }, - // 更新岗位 - updatePosition: data => { - return postAxios('/position/update', data); - }, - // 添加岗位 - addPosition: data => { - return postAxios('/position/add', data); - }, - // 根据ID删除岗位 - deletePosition: id => { - return getAxios('/position/remove/' + id); - } -}; diff --git a/smart-admin-web/src/api/privilege.js b/smart-admin-web/src/api/privilege.js deleted file mode 100644 index 3530544c..00000000 --- a/smart-admin-web/src/api/privilege.js +++ /dev/null @@ -1,36 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; - -export const privilegeApi = { - // 获取所有请求路径 - getAllUrl: data => { - return getAxios('/privilege/getAllUrl'); - }, - // 获取全部菜单列表 - getMenuList: data => { - return postAxios('/privilege/menu/queryAll'); - }, - // 菜单批量保存 - addBatchSaveMenu: data => { - return postAxios('/privilege/menu/batchSaveMenu', data); - }, - // 功能点批量保存 - addBatchSavePoints: data => { - return postAxios('/privilege/function/batchSave', data); - }, - // 查询菜单功能点 - queryPrivilegeFunctionList: menuKey => { - return postAxios('/privilege/function/query/' + menuKey); - }, - // 保存更新功能点 - addOrUpdate: data => { - return postAxios('/privilege/function/saveOrUpdate', data); - }, - // 更新角色权限 - getRolePower: data => { - return postAxios('/privilege/updateRolePrivilege', data); - }, - // 获取角色可选的功能权限 - getListPrivilegeByRoleId: id => { - return getAxios('/privilege/listPrivilegeByRoleId/' + id); - } -}; diff --git a/smart-admin-web/src/api/role.js b/smart-admin-web/src/api/role.js deleted file mode 100644 index be5f338a..00000000 --- a/smart-admin-web/src/api/role.js +++ /dev/null @@ -1,58 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; -export const roleApi = { - // 添加角色 - addRole: (remark, roleName) => { - const data = { - remark: remark, - roleName: roleName - }; - return postAxios('/role/add', data); - }, - // 删除角色 - deleteRole: id => { - return getAxios('/role/delete/' + id); - }, - // 修改角色 - updateRole: (id, remark, roleName) => { - const data = { - id: id, - remark: remark, - roleName: roleName - }; - return postAxios('/role/update', data); - }, - // 获取角色数据 - getRoleDetail: id => { - return getAxios('/role/get/' + id); - }, - // 加载角色列表 - getAllRole: () => { - return getAxios('role/getAll'); - }, - // 根据角色名字获取对应成员列表 - getListEmployee: data => { - return postAxios('/role/listEmployee', data); - }, - // 根据角色id获取角色成员-员工列表 - getAllListEmployee: id => { - return getAxios('/role/listAllEmployee/' + id); - }, - // 从角色成员列表中移除员工 - deleteEmployeeRole: param => { - return getAxios('/role/removeEmployee?employeeId=' + param.employeeId + '&roleId=' + param.roleId); - }, - // 从角色成员列表中批量移除员工 - deleteEmployeeList: data => { - return postAxios('/role/removeEmployeeList', data); - }, - - // 添加角色成员方法 - addEmployeeListRole: data => { - return postAxios('/role/addEmployeeList', data); - }, - // 通过员工id获取所有角色以及员工具有的角色 - getRoles: id => { - return getAxios('/role/getRoles/' + id); - }, - -}; diff --git a/smart-admin-web/src/api/smart-reload.js b/smart-admin-web/src/api/smart-reload.js deleted file mode 100644 index 8ee701ed..00000000 --- a/smart-admin-web/src/api/smart-reload.js +++ /dev/null @@ -1,20 +0,0 @@ -// smartReloadAPI -import { - postAxios, - getAxios -} from '@/lib/http'; -export const smartReloadApi = { - // 查询所有 - getSmartReloadList: () => { - return getAxios('/smartReload/all'); - }, - // 更新单条数据 - updateSmartReloadData: (data) => { - return postAxios('/smartReload/update', data); - }, - // 获取执行结果 - getSmartReloadResult: (tag) => { - return getAxios(`/smartReload/result/${tag}`); - } - -}; diff --git a/smart-admin-web/src/api/system-config.js b/smart-admin-web/src/api/system-config.js deleted file mode 100644 index 392dd942..00000000 --- a/smart-admin-web/src/api/system-config.js +++ /dev/null @@ -1,31 +0,0 @@ -// 系统参数API -import { - postAxios, - getAxios -} from '@/lib/http'; -export const systemConfigApi = { - // 查询系统参数列表 - getSystemConfigList: (data) => { - return postAxios('/systemConfig/getListPage', data); - }, - // 添加系统参数 - addSystemConfig: (data) => { - return postAxios('/systemConfig/add', data); - }, - // 更新单条系统参数 - updateSystemConfig: (data) => { - return postAxios('/systemConfig/update', data); - }, - // 通过key获取对应的信息 - getConfigListByKey: (key) => { - return getAxios(`/systemConfig/selectByKey?configKey=${key}`); - }, - // 根据分组查询所有系统配置 - getListByGroup: (group) => { - return getAxios(`/systemConfig/getListByGroup?group=${group}`); - }, - // 获取系统版本信息 - getCodeVersion: () => { - return getAxios('/codeVersion'); - } -}; diff --git a/smart-admin-web/src/api/task-manage.js b/smart-admin-web/src/api/task-manage.js deleted file mode 100644 index 7e787862..00000000 --- a/smart-admin-web/src/api/task-manage.js +++ /dev/null @@ -1,35 +0,0 @@ -// 任务调度API -import { - postAxios, - getAxios -} from '@/lib/http'; -export const taskApi = { - // 查询任务列表 - getTaskList: (data) => { - return postAxios('/quartz/task/query', data); - }, - // 添加或更新任务 - addOrUpdateTask: (data) => { - return postAxios('/quartz/task/saveOrUpdate', data); - }, - // 查询任务日志 - getTaskLog: (data) => { - return postAxios('/quartz/task/queryLog', data); - }, - // 暂停任务 - updateTaskPause: (taskId) => { - return getAxios(`/quartz/task/pause/${taskId}`); - }, - // 运行任务 - updateTaskRun: (taskId) => { - return getAxios(`/quartz/task/run/${taskId}`); - }, - // 恢复任务 - updateTaskResume: (taskId) => { - return getAxios(`/quartz/task/resume/${taskId}`); - }, - // 删除任务 - deleteTask: (taskId) => { - return getAxios(`/quartz/task/delete/${taskId}`); - } -}; diff --git a/smart-admin-web/src/api/user-log.js b/smart-admin-web/src/api/user-log.js deleted file mode 100644 index eb3a3ad9..00000000 --- a/smart-admin-web/src/api/user-log.js +++ /dev/null @@ -1,28 +0,0 @@ -// 用户日志API -import { - postAxios, - getAxios -} from '@/lib/http.js'; -export const userLogApi = { - // 查询用户操作日志 - getUserOperateLogPage: (data) => { - return postAxios('/userOperateLog/page/query', data); - }, - // 用户操作日志详情 - detailUserOperateLog: (data) => { - return getAxios('/userOperateLog/detail/' + data); - }, - // 删除用户操作日志 - deleteUserOperateLog: (data) => { - return getAxios('/userOperateLog/delete/' + data); - }, - // 查询用户登录日志 - getUserLoginLogPage: (data) => { - return postAxios('/userLoginLog/page/query', data); - }, - // 删除用户登录日志 - deleteUserLoginLog: (data) => { - return getAxios('/userLoginLog/delete/' + data); - } - -}; diff --git a/smart-admin-web/src/api/user.js b/smart-admin-web/src/api/user.js deleted file mode 100644 index 8ac0a2a1..00000000 --- a/smart-admin-web/src/api/user.js +++ /dev/null @@ -1,20 +0,0 @@ -import { postAxios, getAxios } from '@/lib/http'; - -export const login = ({ userName, password }) => { - const data = { - userName, - password - }; - return postAxios('login', data); -}; - -export const getUserInfo = (token) => { - let params = { - token - }; - return getAxios('get_info', params); -}; - -export const logout = (token) => { - return postAxios('logout', {}); -}; diff --git a/smart-admin-web/src/assets/icons/demo.css b/smart-admin-web/src/assets/icons/demo.css deleted file mode 100644 index a67054a0..00000000 --- a/smart-admin-web/src/assets/icons/demo.css +++ /dev/null @@ -1,539 +0,0 @@ -/* Logo 字体 */ -@font-face { - font-family: "iconfont logo"; - src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); - src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), - url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), - url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), - url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); -} - -.logo { - font-family: "iconfont logo"; - font-size: 160px; - font-style: normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -/* tabs */ -.nav-tabs { - position: relative; -} - -.nav-tabs .nav-more { - position: absolute; - right: 0; - bottom: 0; - height: 42px; - line-height: 42px; - color: #666; -} - -#tabs { - border-bottom: 1px solid #eee; -} - -#tabs li { - cursor: pointer; - width: 100px; - height: 40px; - line-height: 40px; - text-align: center; - font-size: 16px; - border-bottom: 2px solid transparent; - position: relative; - z-index: 1; - margin-bottom: -1px; - color: #666; -} - - -#tabs .active { - border-bottom-color: #f00; - color: #222; -} - -.tab-container .content { - display: none; -} - -/* 页面布局 */ -.main { - padding: 30px 100px; - width: 960px; - margin: 0 auto; -} - -.main .logo { - color: #333; - text-align: left; - margin-bottom: 30px; - line-height: 1; - height: 110px; - margin-top: -50px; - overflow: hidden; - *zoom: 1; -} - -.main .logo a { - font-size: 160px; - color: #333; -} - -.helps { - margin-top: 40px; -} - -.helps pre { - padding: 20px; - margin: 10px 0; - border: solid 1px #e7e1cd; - background-color: #fffdef; - overflow: auto; -} - -.icon_lists { - width: 100% !important; - overflow: hidden; - *zoom: 1; -} - -.icon_lists li { - width: 100px; - margin-bottom: 10px; - margin-right: 20px; - text-align: center; - list-style: none !important; - cursor: default; -} - -.icon_lists li .code-name { - line-height: 1.2; -} - -.icon_lists .icon { - display: block; - height: 100px; - line-height: 100px; - font-size: 42px; - margin: 10px auto; - color: #333; - -webkit-transition: font-size 0.25s linear, width 0.25s linear; - -moz-transition: font-size 0.25s linear, width 0.25s linear; - transition: font-size 0.25s linear, width 0.25s linear; -} - -.icon_lists .icon:hover { - font-size: 100px; -} - -.icon_lists .svg-icon { - /* 通过设置 font-size 来改变图标大小 */ - width: 1em; - /* 图标和文字相邻时,垂直对齐 */ - vertical-align: -0.15em; - /* 通过设置 color 来改变 SVG 的颜色/fill */ - fill: currentColor; - /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 - normalize.css 中也包含这行 */ - overflow: hidden; -} - -.icon_lists li .name, -.icon_lists li .code-name { - color: #666; -} - -/* markdown 样式 */ -.markdown { - color: #666; - font-size: 14px; - line-height: 1.8; -} - -.highlight { - line-height: 1.5; -} - -.markdown img { - vertical-align: middle; - max-width: 100%; -} - -.markdown h1 { - color: #404040; - font-weight: 500; - line-height: 40px; - margin-bottom: 24px; -} - -.markdown h2, -.markdown h3, -.markdown h4, -.markdown h5, -.markdown h6 { - color: #404040; - margin: 1.6em 0 0.6em 0; - font-weight: 500; - clear: both; -} - -.markdown h1 { - font-size: 28px; -} - -.markdown h2 { - font-size: 22px; -} - -.markdown h3 { - font-size: 16px; -} - -.markdown h4 { - font-size: 14px; -} - -.markdown h5 { - font-size: 12px; -} - -.markdown h6 { - font-size: 12px; -} - -.markdown hr { - height: 1px; - border: 0; - background: #e9e9e9; - margin: 16px 0; - clear: both; -} - -.markdown p { - margin: 1em 0; -} - -.markdown>p, -.markdown>blockquote, -.markdown>.highlight, -.markdown>ol, -.markdown>ul { - width: 80%; -} - -.markdown ul>li { - list-style: circle; -} - -.markdown>ul li, -.markdown blockquote ul>li { - margin-left: 20px; - padding-left: 4px; -} - -.markdown>ul li p, -.markdown>ol li p { - margin: 0.6em 0; -} - -.markdown ol>li { - list-style: decimal; -} - -.markdown>ol li, -.markdown blockquote ol>li { - margin-left: 20px; - padding-left: 4px; -} - -.markdown code { - margin: 0 3px; - padding: 0 5px; - background: #eee; - border-radius: 3px; -} - -.markdown strong, -.markdown b { - font-weight: 600; -} - -.markdown>table { - border-collapse: collapse; - border-spacing: 0px; - empty-cells: show; - border: 1px solid #e9e9e9; - width: 95%; - margin-bottom: 24px; -} - -.markdown>table th { - white-space: nowrap; - color: #333; - font-weight: 600; -} - -.markdown>table th, -.markdown>table td { - border: 1px solid #e9e9e9; - padding: 8px 16px; - text-align: left; -} - -.markdown>table th { - background: #F7F7F7; -} - -.markdown blockquote { - font-size: 90%; - color: #999; - border-left: 4px solid #e9e9e9; - padding-left: 0.8em; - margin: 1em 0; -} - -.markdown blockquote p { - margin: 0; -} - -.markdown .anchor { - opacity: 0; - transition: opacity 0.3s ease; - margin-left: 8px; -} - -.markdown .waiting { - color: #ccc; -} - -.markdown h1:hover .anchor, -.markdown h2:hover .anchor, -.markdown h3:hover .anchor, -.markdown h4:hover .anchor, -.markdown h5:hover .anchor, -.markdown h6:hover .anchor { - opacity: 1; - display: inline-block; -} - -.markdown>br, -.markdown>p>br { - clear: both; -} - - -.hljs { - display: block; - background: white; - padding: 0.5em; - color: #333333; - overflow-x: auto; -} - -.hljs-comment, -.hljs-meta { - color: #969896; -} - -.hljs-string, -.hljs-variable, -.hljs-template-variable, -.hljs-strong, -.hljs-emphasis, -.hljs-quote { - color: #df5000; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-type { - color: #a71d5d; -} - -.hljs-literal, -.hljs-symbol, -.hljs-bullet, -.hljs-attribute { - color: #0086b3; -} - -.hljs-section, -.hljs-name { - color: #63a35c; -} - -.hljs-tag { - color: #333333; -} - -.hljs-title, -.hljs-attr, -.hljs-selector-id, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #795da3; -} - -.hljs-addition { - color: #55a532; - background-color: #eaffea; -} - -.hljs-deletion { - color: #bd2c00; - background-color: #ffecec; -} - -.hljs-link { - text-decoration: underline; -} - -/* 代码高亮 */ -/* PrismJS 1.15.0 -https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ -/** - * prism.js default theme for JavaScript, CSS and HTML - * Based on dabblet (http://dabblet.com) - * @author Lea Verou - */ -code[class*="language-"], -pre[class*="language-"] { - color: black; - background: none; - text-shadow: 0 1px white; - font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -pre[class*="language-"]::-moz-selection, -pre[class*="language-"] ::-moz-selection, -code[class*="language-"]::-moz-selection, -code[class*="language-"] ::-moz-selection { - text-shadow: none; - background: #b3d4fc; -} - -pre[class*="language-"]::selection, -pre[class*="language-"] ::selection, -code[class*="language-"]::selection, -code[class*="language-"] ::selection { - text-shadow: none; - background: #b3d4fc; -} - -@media print { - - code[class*="language-"], - pre[class*="language-"] { - text-shadow: none; - } -} - -/* Code blocks */ -pre[class*="language-"] { - padding: 1em; - margin: .5em 0; - overflow: auto; -} - -:not(pre)>code[class*="language-"], -pre[class*="language-"] { - background: #f5f2f0; -} - -/* Inline code */ -:not(pre)>code[class*="language-"] { - padding: .1em; - border-radius: .3em; - white-space: normal; -} - -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: slategray; -} - -.token.punctuation { - color: #999; -} - -.namespace { - opacity: .7; -} - -.token.property, -.token.tag, -.token.boolean, -.token.number, -.token.constant, -.token.symbol, -.token.deleted { - color: #905; -} - -.token.selector, -.token.attr-name, -.token.string, -.token.char, -.token.builtin, -.token.inserted { - color: #690; -} - -.token.operator, -.token.entity, -.token.url, -.language-css .token.string, -.style .token.string { - color: #9a6e3a; - background: hsla(0, 0%, 100%, .5); -} - -.token.atrule, -.token.attr-value, -.token.keyword { - color: #07a; -} - -.token.function, -.token.class-name { - color: #DD4A68; -} - -.token.regex, -.token.important, -.token.variable { - color: #e90; -} - -.token.important, -.token.bold { - font-weight: bold; -} - -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} diff --git a/smart-admin-web/src/assets/icons/demo_index.html b/smart-admin-web/src/assets/icons/demo_index.html deleted file mode 100644 index 2c777b68..00000000 --- a/smart-admin-web/src/assets/icons/demo_index.html +++ /dev/null @@ -1,722 +0,0 @@ - - - - - IconFont Demo - - - - - - - - - - - -
-

- -
-
-
    - -
  • - -
    多级菜单
    -
    &#xe608;
    -
  • - -
  • - -
    导航展开
    -
    &#xe609;
    -
  • - -
  • - -
    导航折叠
    -
    &#xe60a;
    -
  • - -
  • - -
    向上箭头
    -
    &#xe60b;
    -
  • - -
  • - -
    向左箭头
    -
    &#xe60c;
    -
  • - -
  • - -
    向右箭头
    -
    &#xe60d;
    -
  • - -
  • - -
    关闭按钮
    -
    &#xe60e;
    -
  • - -
  • - -
    数据上传
    -
    &#xe60f;
    -
  • - -
  • - -
    系统监控
    -
    &#xe610;
    -
  • - -
  • - -
    邮件管理
    -
    &#xe611;
    -
  • - -
  • - -
    小屏
    -
    &#xe612;
    -
  • - -
  • - -
    人员管理
    -
    &#xe613;
    -
  • - -
  • - -
    向下拉
    -
    &#xe614;
    -
  • - -
  • - -
    excel导入导出
    -
    &#xe615;
    -
  • - -
  • - -
    向下箭头
    -
    &#xe616;
    -
  • - -
  • - -
    首页
    -
    &#xe617;
    -
  • - -
  • - -
    系统设置
    -
    &#xe618;
    -
  • - -
  • - -
    消息
    -
    &#xe619;
    -
  • - -
  • - -
    全屏
    -
    &#xe61a;
    -
  • - -
  • - -
    组件
    -
    &#xe61b;
    -
  • - -
  • - -
    news
    -
    &#xe61e;
    -
  • - -
  • - -
    定时任务
    -
    &#xe622;
    -
  • - -
  • - -
    动态加载
    -
    &#xe623;
    -
  • - -
  • - -
    接口文档
    -
    &#xe624;
    -
  • - -
-
-

Unicode 引用

-
- -

Unicode 是字体在网页端最原始的应用方式,特点是:

-
    -
  • 兼容性最好,支持 IE6+,及所有现代浏览器。
  • -
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • -
  • 但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。
  • -
-
-

注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式

-
-

Unicode 使用步骤如下:

-

第一步:拷贝项目下面生成的 @font-face

-
@font-face {
-  font-family: 'iconfont';
-  src: url('iconfont.eot');
-  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
-      url('iconfont.woff2') format('woff2'),
-      url('iconfont.woff') format('woff'),
-      url('iconfont.ttf') format('truetype'),
-      url('iconfont.svg#iconfont') format('svg');
-}
-
-

第二步:定义使用 iconfont 的样式

-
.iconfont {
-  font-family: "iconfont" !important;
-  font-size: 16px;
-  font-style: normal;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-

第三步:挑选相应图标并获取字体编码,应用于页面

-
-<span class="iconfont">&#x33;</span>
-
-
-

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

-
-
-
-
-
    - -
  • - -
    - 多级菜单 -
    -
    .iconduojicaidan -
    -
  • - -
  • - -
    - 导航展开 -
    -
    .icondaohangzhankai -
    -
  • - -
  • - -
    - 导航折叠 -
    -
    .icondaohangzhedie -
    -
  • - -
  • - -
    - 向上箭头 -
    -
    .iconxiangshangjiantou -
    -
  • - -
  • - -
    - 向左箭头 -
    -
    .iconxiangzuojiantou -
    -
  • - -
  • - -
    - 向右箭头 -
    -
    .iconxiangyoujiantou -
    -
  • - -
  • - -
    - 关闭按钮 -
    -
    .iconguanbianniu -
    -
  • - -
  • - -
    - 数据上传 -
    -
    .iconshujushangchuan -
    -
  • - -
  • - -
    - 系统监控 -
    -
    .iconxitongjiankong -
    -
  • - -
  • - -
    - 邮件管理 -
    -
    .iconyoujianguanli -
    -
  • - -
  • - -
    - 小屏 -
    -
    .iconxiaoping -
    -
  • - -
  • - -
    - 人员管理 -
    -
    .iconrenyuanguanli -
    -
  • - -
  • - -
    - 向下拉 -
    -
    .iconxiangxiala -
    -
  • - -
  • - -
    - excel导入导出 -
    -
    .iconexceldaorudaochu -
    -
  • - -
  • - -
    - 向下箭头 -
    -
    .iconxiangxiajiantou -
    -
  • - -
  • - -
    - 首页 -
    -
    .iconshouye -
    -
  • - -
  • - -
    - 系统设置 -
    -
    .iconxitongshezhi -
    -
  • - -
  • - -
    - 消息 -
    -
    .iconxiaoxi -
    -
  • - -
  • - -
    - 全屏 -
    -
    .iconquanping -
    -
  • - -
  • - -
    - 组件 -
    -
    .iconzujian -
    -
  • - -
  • - -
    - news -
    -
    .iconnews -
    -
  • - -
  • - -
    - 定时任务 -
    -
    .icondingshirenwu -
    -
  • - -
  • - -
    - 动态加载 -
    -
    .icondongtaijiazai -
    -
  • - -
  • - -
    - 接口文档 -
    -
    .iconjiekouwendang -
    -
  • - -
-
-

font-class 引用

-
- -

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

-

与 Unicode 使用方式相比,具有如下特点:

-
    -
  • 兼容性良好,支持 IE8+,及所有现代浏览器。
  • -
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • -
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • -
  • 不过因为本质上还是使用的字体,所以多色图标还是不支持的。
  • -
-

使用步骤如下:

-

第一步:引入项目下面生成的 fontclass 代码:

-
<link rel="stylesheet" href="./iconfont.css">
-
-

第二步:挑选相应图标并获取类名,应用于页面:

-
<span class="iconfont iconxxx"></span>
-
-
-

" - iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

-
-
-
-
-
    - -
  • - -
    多级菜单
    -
    #iconduojicaidan
    -
  • - -
  • - -
    导航展开
    -
    #icondaohangzhankai
    -
  • - -
  • - -
    导航折叠
    -
    #icondaohangzhedie
    -
  • - -
  • - -
    向上箭头
    -
    #iconxiangshangjiantou
    -
  • - -
  • - -
    向左箭头
    -
    #iconxiangzuojiantou
    -
  • - -
  • - -
    向右箭头
    -
    #iconxiangyoujiantou
    -
  • - -
  • - -
    关闭按钮
    -
    #iconguanbianniu
    -
  • - -
  • - -
    数据上传
    -
    #iconshujushangchuan
    -
  • - -
  • - -
    系统监控
    -
    #iconxitongjiankong
    -
  • - -
  • - -
    邮件管理
    -
    #iconyoujianguanli
    -
  • - -
  • - -
    小屏
    -
    #iconxiaoping
    -
  • - -
  • - -
    人员管理
    -
    #iconrenyuanguanli
    -
  • - -
  • - -
    向下拉
    -
    #iconxiangxiala
    -
  • - -
  • - -
    excel导入导出
    -
    #iconexceldaorudaochu
    -
  • - -
  • - -
    向下箭头
    -
    #iconxiangxiajiantou
    -
  • - -
  • - -
    首页
    -
    #iconshouye
    -
  • - -
  • - -
    系统设置
    -
    #iconxitongshezhi
    -
  • - -
  • - -
    消息
    -
    #iconxiaoxi
    -
  • - -
  • - -
    全屏
    -
    #iconquanping
    -
  • - -
  • - -
    组件
    -
    #iconzujian
    -
  • - -
  • - -
    news
    -
    #iconnews
    -
  • - -
  • - -
    定时任务
    -
    #icondingshirenwu
    -
  • - -
  • - -
    动态加载
    -
    #icondongtaijiazai
    -
  • - -
  • - -
    接口文档
    -
    #iconjiekouwendang
    -
  • - -
-
-

Symbol 引用

-
- -

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 - 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

-
    -
  • 支持多色图标了,不再受单色限制。
  • -
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • -
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • -
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • -
-

使用步骤如下:

-

第一步:引入项目下面生成的 symbol 代码:

-
<script src="./iconfont.js"></script>
-
-

第二步:加入通用 CSS 代码(引入一次就行):

-
<style>
-.icon {
-  width: 1em;
-  height: 1em;
-  vertical-align: -0.15em;
-  fill: currentColor;
-  overflow: hidden;
-}
-</style>
-
-

第三步:挑选相应图标并获取类名,应用于页面:

-
<svg class="icon" aria-hidden="true">
-  <use xlink:href="#icon-xxx"></use>
-</svg>
-
-
-
- -
-
- - - diff --git a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/demo.css b/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/demo.css deleted file mode 100644 index a67054a0..00000000 --- a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/demo.css +++ /dev/null @@ -1,539 +0,0 @@ -/* Logo 字体 */ -@font-face { - font-family: "iconfont logo"; - src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); - src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), - url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), - url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), - url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); -} - -.logo { - font-family: "iconfont logo"; - font-size: 160px; - font-style: normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -/* tabs */ -.nav-tabs { - position: relative; -} - -.nav-tabs .nav-more { - position: absolute; - right: 0; - bottom: 0; - height: 42px; - line-height: 42px; - color: #666; -} - -#tabs { - border-bottom: 1px solid #eee; -} - -#tabs li { - cursor: pointer; - width: 100px; - height: 40px; - line-height: 40px; - text-align: center; - font-size: 16px; - border-bottom: 2px solid transparent; - position: relative; - z-index: 1; - margin-bottom: -1px; - color: #666; -} - - -#tabs .active { - border-bottom-color: #f00; - color: #222; -} - -.tab-container .content { - display: none; -} - -/* 页面布局 */ -.main { - padding: 30px 100px; - width: 960px; - margin: 0 auto; -} - -.main .logo { - color: #333; - text-align: left; - margin-bottom: 30px; - line-height: 1; - height: 110px; - margin-top: -50px; - overflow: hidden; - *zoom: 1; -} - -.main .logo a { - font-size: 160px; - color: #333; -} - -.helps { - margin-top: 40px; -} - -.helps pre { - padding: 20px; - margin: 10px 0; - border: solid 1px #e7e1cd; - background-color: #fffdef; - overflow: auto; -} - -.icon_lists { - width: 100% !important; - overflow: hidden; - *zoom: 1; -} - -.icon_lists li { - width: 100px; - margin-bottom: 10px; - margin-right: 20px; - text-align: center; - list-style: none !important; - cursor: default; -} - -.icon_lists li .code-name { - line-height: 1.2; -} - -.icon_lists .icon { - display: block; - height: 100px; - line-height: 100px; - font-size: 42px; - margin: 10px auto; - color: #333; - -webkit-transition: font-size 0.25s linear, width 0.25s linear; - -moz-transition: font-size 0.25s linear, width 0.25s linear; - transition: font-size 0.25s linear, width 0.25s linear; -} - -.icon_lists .icon:hover { - font-size: 100px; -} - -.icon_lists .svg-icon { - /* 通过设置 font-size 来改变图标大小 */ - width: 1em; - /* 图标和文字相邻时,垂直对齐 */ - vertical-align: -0.15em; - /* 通过设置 color 来改变 SVG 的颜色/fill */ - fill: currentColor; - /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 - normalize.css 中也包含这行 */ - overflow: hidden; -} - -.icon_lists li .name, -.icon_lists li .code-name { - color: #666; -} - -/* markdown 样式 */ -.markdown { - color: #666; - font-size: 14px; - line-height: 1.8; -} - -.highlight { - line-height: 1.5; -} - -.markdown img { - vertical-align: middle; - max-width: 100%; -} - -.markdown h1 { - color: #404040; - font-weight: 500; - line-height: 40px; - margin-bottom: 24px; -} - -.markdown h2, -.markdown h3, -.markdown h4, -.markdown h5, -.markdown h6 { - color: #404040; - margin: 1.6em 0 0.6em 0; - font-weight: 500; - clear: both; -} - -.markdown h1 { - font-size: 28px; -} - -.markdown h2 { - font-size: 22px; -} - -.markdown h3 { - font-size: 16px; -} - -.markdown h4 { - font-size: 14px; -} - -.markdown h5 { - font-size: 12px; -} - -.markdown h6 { - font-size: 12px; -} - -.markdown hr { - height: 1px; - border: 0; - background: #e9e9e9; - margin: 16px 0; - clear: both; -} - -.markdown p { - margin: 1em 0; -} - -.markdown>p, -.markdown>blockquote, -.markdown>.highlight, -.markdown>ol, -.markdown>ul { - width: 80%; -} - -.markdown ul>li { - list-style: circle; -} - -.markdown>ul li, -.markdown blockquote ul>li { - margin-left: 20px; - padding-left: 4px; -} - -.markdown>ul li p, -.markdown>ol li p { - margin: 0.6em 0; -} - -.markdown ol>li { - list-style: decimal; -} - -.markdown>ol li, -.markdown blockquote ol>li { - margin-left: 20px; - padding-left: 4px; -} - -.markdown code { - margin: 0 3px; - padding: 0 5px; - background: #eee; - border-radius: 3px; -} - -.markdown strong, -.markdown b { - font-weight: 600; -} - -.markdown>table { - border-collapse: collapse; - border-spacing: 0px; - empty-cells: show; - border: 1px solid #e9e9e9; - width: 95%; - margin-bottom: 24px; -} - -.markdown>table th { - white-space: nowrap; - color: #333; - font-weight: 600; -} - -.markdown>table th, -.markdown>table td { - border: 1px solid #e9e9e9; - padding: 8px 16px; - text-align: left; -} - -.markdown>table th { - background: #F7F7F7; -} - -.markdown blockquote { - font-size: 90%; - color: #999; - border-left: 4px solid #e9e9e9; - padding-left: 0.8em; - margin: 1em 0; -} - -.markdown blockquote p { - margin: 0; -} - -.markdown .anchor { - opacity: 0; - transition: opacity 0.3s ease; - margin-left: 8px; -} - -.markdown .waiting { - color: #ccc; -} - -.markdown h1:hover .anchor, -.markdown h2:hover .anchor, -.markdown h3:hover .anchor, -.markdown h4:hover .anchor, -.markdown h5:hover .anchor, -.markdown h6:hover .anchor { - opacity: 1; - display: inline-block; -} - -.markdown>br, -.markdown>p>br { - clear: both; -} - - -.hljs { - display: block; - background: white; - padding: 0.5em; - color: #333333; - overflow-x: auto; -} - -.hljs-comment, -.hljs-meta { - color: #969896; -} - -.hljs-string, -.hljs-variable, -.hljs-template-variable, -.hljs-strong, -.hljs-emphasis, -.hljs-quote { - color: #df5000; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-type { - color: #a71d5d; -} - -.hljs-literal, -.hljs-symbol, -.hljs-bullet, -.hljs-attribute { - color: #0086b3; -} - -.hljs-section, -.hljs-name { - color: #63a35c; -} - -.hljs-tag { - color: #333333; -} - -.hljs-title, -.hljs-attr, -.hljs-selector-id, -.hljs-selector-class, -.hljs-selector-attr, -.hljs-selector-pseudo { - color: #795da3; -} - -.hljs-addition { - color: #55a532; - background-color: #eaffea; -} - -.hljs-deletion { - color: #bd2c00; - background-color: #ffecec; -} - -.hljs-link { - text-decoration: underline; -} - -/* 代码高亮 */ -/* PrismJS 1.15.0 -https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ -/** - * prism.js default theme for JavaScript, CSS and HTML - * Based on dabblet (http://dabblet.com) - * @author Lea Verou - */ -code[class*="language-"], -pre[class*="language-"] { - color: black; - background: none; - text-shadow: 0 1px white; - font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -pre[class*="language-"]::-moz-selection, -pre[class*="language-"] ::-moz-selection, -code[class*="language-"]::-moz-selection, -code[class*="language-"] ::-moz-selection { - text-shadow: none; - background: #b3d4fc; -} - -pre[class*="language-"]::selection, -pre[class*="language-"] ::selection, -code[class*="language-"]::selection, -code[class*="language-"] ::selection { - text-shadow: none; - background: #b3d4fc; -} - -@media print { - - code[class*="language-"], - pre[class*="language-"] { - text-shadow: none; - } -} - -/* Code blocks */ -pre[class*="language-"] { - padding: 1em; - margin: .5em 0; - overflow: auto; -} - -:not(pre)>code[class*="language-"], -pre[class*="language-"] { - background: #f5f2f0; -} - -/* Inline code */ -:not(pre)>code[class*="language-"] { - padding: .1em; - border-radius: .3em; - white-space: normal; -} - -.token.comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: slategray; -} - -.token.punctuation { - color: #999; -} - -.namespace { - opacity: .7; -} - -.token.property, -.token.tag, -.token.boolean, -.token.number, -.token.constant, -.token.symbol, -.token.deleted { - color: #905; -} - -.token.selector, -.token.attr-name, -.token.string, -.token.char, -.token.builtin, -.token.inserted { - color: #690; -} - -.token.operator, -.token.entity, -.token.url, -.language-css .token.string, -.style .token.string { - color: #9a6e3a; - background: hsla(0, 0%, 100%, .5); -} - -.token.atrule, -.token.attr-value, -.token.keyword { - color: #07a; -} - -.token.function, -.token.class-name { - color: #DD4A68; -} - -.token.regex, -.token.important, -.token.variable { - color: #e90; -} - -.token.important, -.token.bold { - font-weight: bold; -} - -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} diff --git a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/demo_index.html b/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/demo_index.html deleted file mode 100644 index 2c777b68..00000000 --- a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/demo_index.html +++ /dev/null @@ -1,722 +0,0 @@ - - - - - IconFont Demo - - - - - - - - - - - -
-

- -
-
-
    - -
  • - -
    多级菜单
    -
    &#xe608;
    -
  • - -
  • - -
    导航展开
    -
    &#xe609;
    -
  • - -
  • - -
    导航折叠
    -
    &#xe60a;
    -
  • - -
  • - -
    向上箭头
    -
    &#xe60b;
    -
  • - -
  • - -
    向左箭头
    -
    &#xe60c;
    -
  • - -
  • - -
    向右箭头
    -
    &#xe60d;
    -
  • - -
  • - -
    关闭按钮
    -
    &#xe60e;
    -
  • - -
  • - -
    数据上传
    -
    &#xe60f;
    -
  • - -
  • - -
    系统监控
    -
    &#xe610;
    -
  • - -
  • - -
    邮件管理
    -
    &#xe611;
    -
  • - -
  • - -
    小屏
    -
    &#xe612;
    -
  • - -
  • - -
    人员管理
    -
    &#xe613;
    -
  • - -
  • - -
    向下拉
    -
    &#xe614;
    -
  • - -
  • - -
    excel导入导出
    -
    &#xe615;
    -
  • - -
  • - -
    向下箭头
    -
    &#xe616;
    -
  • - -
  • - -
    首页
    -
    &#xe617;
    -
  • - -
  • - -
    系统设置
    -
    &#xe618;
    -
  • - -
  • - -
    消息
    -
    &#xe619;
    -
  • - -
  • - -
    全屏
    -
    &#xe61a;
    -
  • - -
  • - -
    组件
    -
    &#xe61b;
    -
  • - -
  • - -
    news
    -
    &#xe61e;
    -
  • - -
  • - -
    定时任务
    -
    &#xe622;
    -
  • - -
  • - -
    动态加载
    -
    &#xe623;
    -
  • - -
  • - -
    接口文档
    -
    &#xe624;
    -
  • - -
-
-

Unicode 引用

-
- -

Unicode 是字体在网页端最原始的应用方式,特点是:

-
    -
  • 兼容性最好,支持 IE6+,及所有现代浏览器。
  • -
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • -
  • 但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。
  • -
-
-

注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式

-
-

Unicode 使用步骤如下:

-

第一步:拷贝项目下面生成的 @font-face

-
@font-face {
-  font-family: 'iconfont';
-  src: url('iconfont.eot');
-  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
-      url('iconfont.woff2') format('woff2'),
-      url('iconfont.woff') format('woff'),
-      url('iconfont.ttf') format('truetype'),
-      url('iconfont.svg#iconfont') format('svg');
-}
-
-

第二步:定义使用 iconfont 的样式

-
.iconfont {
-  font-family: "iconfont" !important;
-  font-size: 16px;
-  font-style: normal;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-

第三步:挑选相应图标并获取字体编码,应用于页面

-
-<span class="iconfont">&#x33;</span>
-
-
-

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

-
-
-
-
-
    - -
  • - -
    - 多级菜单 -
    -
    .iconduojicaidan -
    -
  • - -
  • - -
    - 导航展开 -
    -
    .icondaohangzhankai -
    -
  • - -
  • - -
    - 导航折叠 -
    -
    .icondaohangzhedie -
    -
  • - -
  • - -
    - 向上箭头 -
    -
    .iconxiangshangjiantou -
    -
  • - -
  • - -
    - 向左箭头 -
    -
    .iconxiangzuojiantou -
    -
  • - -
  • - -
    - 向右箭头 -
    -
    .iconxiangyoujiantou -
    -
  • - -
  • - -
    - 关闭按钮 -
    -
    .iconguanbianniu -
    -
  • - -
  • - -
    - 数据上传 -
    -
    .iconshujushangchuan -
    -
  • - -
  • - -
    - 系统监控 -
    -
    .iconxitongjiankong -
    -
  • - -
  • - -
    - 邮件管理 -
    -
    .iconyoujianguanli -
    -
  • - -
  • - -
    - 小屏 -
    -
    .iconxiaoping -
    -
  • - -
  • - -
    - 人员管理 -
    -
    .iconrenyuanguanli -
    -
  • - -
  • - -
    - 向下拉 -
    -
    .iconxiangxiala -
    -
  • - -
  • - -
    - excel导入导出 -
    -
    .iconexceldaorudaochu -
    -
  • - -
  • - -
    - 向下箭头 -
    -
    .iconxiangxiajiantou -
    -
  • - -
  • - -
    - 首页 -
    -
    .iconshouye -
    -
  • - -
  • - -
    - 系统设置 -
    -
    .iconxitongshezhi -
    -
  • - -
  • - -
    - 消息 -
    -
    .iconxiaoxi -
    -
  • - -
  • - -
    - 全屏 -
    -
    .iconquanping -
    -
  • - -
  • - -
    - 组件 -
    -
    .iconzujian -
    -
  • - -
  • - -
    - news -
    -
    .iconnews -
    -
  • - -
  • - -
    - 定时任务 -
    -
    .icondingshirenwu -
    -
  • - -
  • - -
    - 动态加载 -
    -
    .icondongtaijiazai -
    -
  • - -
  • - -
    - 接口文档 -
    -
    .iconjiekouwendang -
    -
  • - -
-
-

font-class 引用

-
- -

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

-

与 Unicode 使用方式相比,具有如下特点:

-
    -
  • 兼容性良好,支持 IE8+,及所有现代浏览器。
  • -
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • -
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • -
  • 不过因为本质上还是使用的字体,所以多色图标还是不支持的。
  • -
-

使用步骤如下:

-

第一步:引入项目下面生成的 fontclass 代码:

-
<link rel="stylesheet" href="./iconfont.css">
-
-

第二步:挑选相应图标并获取类名,应用于页面:

-
<span class="iconfont iconxxx"></span>
-
-
-

" - iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

-
-
-
-
-
    - -
  • - -
    多级菜单
    -
    #iconduojicaidan
    -
  • - -
  • - -
    导航展开
    -
    #icondaohangzhankai
    -
  • - -
  • - -
    导航折叠
    -
    #icondaohangzhedie
    -
  • - -
  • - -
    向上箭头
    -
    #iconxiangshangjiantou
    -
  • - -
  • - -
    向左箭头
    -
    #iconxiangzuojiantou
    -
  • - -
  • - -
    向右箭头
    -
    #iconxiangyoujiantou
    -
  • - -
  • - -
    关闭按钮
    -
    #iconguanbianniu
    -
  • - -
  • - -
    数据上传
    -
    #iconshujushangchuan
    -
  • - -
  • - -
    系统监控
    -
    #iconxitongjiankong
    -
  • - -
  • - -
    邮件管理
    -
    #iconyoujianguanli
    -
  • - -
  • - -
    小屏
    -
    #iconxiaoping
    -
  • - -
  • - -
    人员管理
    -
    #iconrenyuanguanli
    -
  • - -
  • - -
    向下拉
    -
    #iconxiangxiala
    -
  • - -
  • - -
    excel导入导出
    -
    #iconexceldaorudaochu
    -
  • - -
  • - -
    向下箭头
    -
    #iconxiangxiajiantou
    -
  • - -
  • - -
    首页
    -
    #iconshouye
    -
  • - -
  • - -
    系统设置
    -
    #iconxitongshezhi
    -
  • - -
  • - -
    消息
    -
    #iconxiaoxi
    -
  • - -
  • - -
    全屏
    -
    #iconquanping
    -
  • - -
  • - -
    组件
    -
    #iconzujian
    -
  • - -
  • - -
    news
    -
    #iconnews
    -
  • - -
  • - -
    定时任务
    -
    #icondingshirenwu
    -
  • - -
  • - -
    动态加载
    -
    #icondongtaijiazai
    -
  • - -
  • - -
    接口文档
    -
    #iconjiekouwendang
    -
  • - -
-
-

Symbol 引用

-
- -

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 - 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

-
    -
  • 支持多色图标了,不再受单色限制。
  • -
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • -
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • -
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • -
-

使用步骤如下:

-

第一步:引入项目下面生成的 symbol 代码:

-
<script src="./iconfont.js"></script>
-
-

第二步:加入通用 CSS 代码(引入一次就行):

-
<style>
-.icon {
-  width: 1em;
-  height: 1em;
-  vertical-align: -0.15em;
-  fill: currentColor;
-  overflow: hidden;
-}
-</style>
-
-

第三步:挑选相应图标并获取类名,应用于页面:

-
<svg class="icon" aria-hidden="true">
-  <use xlink:href="#icon-xxx"></use>
-</svg>
-
-
-
- -
-
- - - diff --git a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.css b/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.css deleted file mode 100644 index 8c269496..00000000 --- a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.css +++ /dev/null @@ -1,113 +0,0 @@ -@font-face {font-family: "iconfont"; - src: url('iconfont.eot?t=1567826173562'); /* IE9 */ - src: url('iconfont.eot?t=1567826173562#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), - url('iconfont.woff?t=1567826173562') format('woff'), - url('iconfont.ttf?t=1567826173562') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ - url('iconfont.svg?t=1567826173562#iconfont') format('svg'); /* iOS 4.1- */ -} - -.iconfont { - font-family: "iconfont" !important; - font-size: 16px; - font-style: normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.iconduojicaidan:before { - content: "\e608"; -} - -.icondaohangzhankai:before { - content: "\e609"; -} - -.icondaohangzhedie:before { - content: "\e60a"; -} - -.iconxiangshangjiantou:before { - content: "\e60b"; -} - -.iconxiangzuojiantou:before { - content: "\e60c"; -} - -.iconxiangyoujiantou:before { - content: "\e60d"; -} - -.iconguanbianniu:before { - content: "\e60e"; -} - -.iconshujushangchuan:before { - content: "\e60f"; -} - -.iconxitongjiankong:before { - content: "\e610"; -} - -.iconyoujianguanli:before { - content: "\e611"; -} - -.iconxiaoping:before { - content: "\e612"; -} - -.iconrenyuanguanli:before { - content: "\e613"; -} - -.iconxiangxiala:before { - content: "\e614"; -} - -.iconexceldaorudaochu:before { - content: "\e615"; -} - -.iconxiangxiajiantou:before { - content: "\e616"; -} - -.iconshouye:before { - content: "\e617"; -} - -.iconxitongshezhi:before { - content: "\e618"; -} - -.iconxiaoxi:before { - content: "\e619"; -} - -.iconquanping:before { - content: "\e61a"; -} - -.iconzujian:before { - content: "\e61b"; -} - -.iconnews:before { - content: "\e61e"; -} - -.icondingshirenwu:before { - content: "\e622"; -} - -.icondongtaijiazai:before { - content: "\e623"; -} - -.iconjiekouwendang:before { - content: "\e624"; -} - diff --git a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.eot b/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.eot deleted file mode 100644 index cf0b3fbdf621e7a70585e35f454f7db627ef94f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8812 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 diff --git a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.js b/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.js deleted file mode 100644 index 6a3315a1..00000000 --- a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){var c,t='',h=(c=document.getElementsByTagName("script"))[c.length-1].getAttribute("data-injectcss");if(h&&!e.__iconfont__svg__cssinject__){e.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}!function(c){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(c,0);else{var h=function(){document.removeEventListener("DOMContentLoaded",h,!1),c()};document.addEventListener("DOMContentLoaded",h,!1)}else document.attachEvent&&(a=c,o=e.document,l=!1,(i=function(){try{o.documentElement.doScroll("left")}catch(c){return void setTimeout(i,50)}t()})(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,t())});function t(){l||(l=!0,a())}var a,o,l,i}(function(){var c,h;(c=document.createElement("div")).innerHTML=t,t=null,(h=c.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",function(c,h){h.firstChild?function(c,h){h.parentNode.insertBefore(c,h)}(c,h.firstChild):h.appendChild(c)}(h,document.body))})}(window); \ No newline at end of file diff --git a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.svg b/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.svg deleted file mode 100644 index a349f5e2..00000000 --- a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.svg +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Created by iconfont - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.ttf b/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.ttf deleted file mode 100644 index 69587d9ec84c49f0f13af71459b52433868ec15d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8644 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
w^-dZn^ z3s*qrn|3l~Sz1U|&2;ZDEER)=9US)di$HsD+%`Nk0ar`bu88Z_uQW%O5*)4;6)FYz zcoJ{tih*;|#w7KS9EnsW{5$tQNJpjBu-!GR#wNx81dutfx&$F6gH5I3AtNF18fFN! z&~OPpf$$K7GaLo%RvhYqj0K27BTz;TekR?&hiF~zsv11ZJ;!K5QLM=2*uHc7B99nh zQ*F*=2Qzj@+DWg^jm7>svc7p`J*N5I{Rch>A9CQOt5YA!+I{F;>(eAD`=P0;r}Y>d zxZ% z@#F{ZNjwh{9vp_pIUX9s3xhx#^h5VDX*V`A*j9WC5B4-2wmh#r3~8k-X|JM z`2nJVJb%bf8~19asqu$IysFV<*HC+Od!GeLJ>``1K*% zj@tIxF{Gg}JVo%c6t+(ZyEx?!b|c@|O9KUdwjhQrG%ghea6L8j#wFb#r2H(>#~d?c zxULa0o#tSE?9O|G0q?zYEKf_gWwgfK|JSy$->`!SgGa@~n2`TV(xZ}h@ zi#>%)?d?+TRE3nqM)qA*A!Xm&gp`F=q}$2@FNGF_qa?Hdixq$i`3fK?mT(si^eZ}R zT`TX?(yqqA0&YU93;a<(ZEW$y{HTca#@%AA{IepyC4Y5yeihNGe2^@|BQc^a=$9b1^d^wQ#ZA9&1cW+QAazkMcs?%H8+Z!6aDprT0nCyKBzhYtpnoZkLLUE zTndXjsGFuv|K3dISMfFs@`Z?F{nYM!b_o{vs9@pqnFd>*x3l{-XfQau>bw|u^~j57 zZvVv>v5r!Z=a68gm6t&8Zsld<@n5E3g8zR^yfFlM74%K5yutc`kpbPrnSTP_2+6Q= z{0s7)R-W+B&F5Nqj(>Nqw(=6_&$aS0@;_+h75qc<%T``xVUk*TgYBVcD{rzQ%^TZJ z%uFrK9LgVjAU{97xG=l8uw<-c?w*-jK00+`rMQyrnK^NCesLkcw!CJAG&!>{b7FShj*kuwih%^ZJiT}fe{XHWvS;Ar zEFnI`@^E$@Ks?W;*&XE2ka$miK{zwQY5Orv!fk4vK0 zaW;y-f(CD_Xr+DGU+FPnC-8OrkN7X~wLa~5DUnDf1?RIyI=p^^OtJ{C1h@r-2@jSO zr5MF2foH}xYNrln9$H>JGCw^ve`spKIW)C+cxqwpETa3T=ItBBnM3n4-kEt+ofP#) zkXu?@c74iO(f^k61B=V8vN^XrwQvx13-inF$-~P>mi^w-he3AE%r7klobE?zw|a>l zN9T1gUOYYz@`;&+2S5tQhCd#nqf_CTGt)CiF~1Ybh`=$J3+h^9t0xaHE-)}N`oFmw8(bqIu$hvzZi>1F#6rnEFQ4_;>>h9mPc_b)D= Mo>_p1<{6R9021Zi4kvHG_ z-k*2Y-Rqvc*SYuH__qVJm6QNz0924l0Py}Zzv%xj|4;t^Ls{QY4gf&IL8<&G$kqRA zI?~qX=0j-`D6W8lkwlmZnVpBtTa*@#;!^+sdfzXbwmv8KAV*ZL0{{>J0RW18Ok4b~ z&JH&A005Bzs*W24Au`>eYiE>*(xOnD1_fs9HHApW*#giI=Dj>+&^jN!!_wbF zP#SPl@4Naf`JiKbDq6{SHcF2<&rx0qyUvB2CpaA|w+9oHiwqq-PI_jpDq0w`OwqT` zU7mS<^rAS+nDq`Wn;XxWt+yUY5TtH7T$dDBMa$; zUlK>@{i-X0cKI?ZZ53t=-s}M$YHpmQM6zbh0?VVgq|-9qJX{A)k@c>oE3t$P@WS@rM=_*0G9YYyN8$O?AAZD?XtZxTy70hdTPO`O zShi}>#XxZ+o`K^Q(gb9kW1m+lU#wHum{lV-X&?=>{S&We=3#fayJb)K9$<{Tpc}r2 z_FS9?6>;9&9vLUxw3b384x2U=x!a?nD{OyizYcQ2L+dfgc?}?WK$z>~u*-N?p5#qY zmEmC~6N?-dWbf%ilAGFygvYpig+D2%!=IDhvDPyU@{D)>@L!r4T3%aS|9hcE5J(o6 zbd0u=`#r<+4;bK^>0+{csQOQ&iaE)qq`MUTus+~^p(9$li1}5K7bv@_amCuBzkMb7 z5+U6Ju{a|=FY$M;fi+Imrj9&VWVSaOIyyHd60t}});9t}DRx(F#NGGoJpLZ1z{1ah zUj@`@7ul9G$-5AZuS@lqcC7f`>vS8(CS|u6r03w`Te3D|e=U0|U*h?;YPBhmY1l{o z!&k13^fOJD5-5rN;k+C1S#^*~=&*s6bIDG4FfO+mwvEU(O7~h$lIT^M)p%{joC2Ms za#wwGUGP^Y+JDyXz8;9SuXeH2!D!x!Q4re304sPm+h{Ee^I$o^l888RG;5E$XCZH* zoy^-dUWnf8;9X0O^Cu6?)?Rz@6pw7Kl_G_OU3OgUj*Z`f9I%0dfT?&uDz zerl9!OT%dISo|lm8zs%NK7P+X`sKLq>crUXZi)!WP88XH%8PT_I@R#{SR+wj5 zTDm9i`ZQZ=&ea~xgR5UJurvrYj2S4y5*>s#hS|{Fq;((`w;_g$^YoiyXQz;Xj{Mhj zOK09~+lBm5`Ry;SH+nm@h^brY3sz0JAW%wuI;*xH!sj(zN#3Rh+6cV)f~Jx{6GHZ(hoHq<|g8ky`%5C4rP#|j%l3~?w}Y#8!3+~>;a>AK+mW_zCN7+fjj_=2lE zZsquTSr+&0B%?Y(+ll~(EDY^JV8c1#MsowcKN>plioMXpbhXVRY7pC(A$-5ThJBBDQ0()rN>J%R8N(FRBO=kC~b^g?#90d>yI@%OVocUlx>RWhJQxUE2@3&M2mHXr?{N#ZN}P>32&}B z8%)0)Q1Q6z*ju@Xc8moc%jj?_&(^FL`fX0LwoA;$KJ{38;i#05S#>3 zyq`JfS4n(M%t)l$&j5*2bhpK?Sj73G|4RZoU#Z9 zi!;eMLZk7y5@_7)dM}@812rR86&Ed*>eVu?1~&qllF5aJmNQt+*jX0_Z6~>G`ExJH zrKGm(eFb#snGxFfmPS5aT_`T>F ztz|*%;OOCcB979UW$Uc1D$;36UTh3 znlH^sN|xL#a5?o`I`u-RdE-2M-ePV16tA)$gRSGc>(7fRy^5ltitk^pg5rmYi))kP zzQ<$SO0fblxDDNDM)CTMR8z4D>~~s$bf9dV_{G&~9EGi$P^EGQ;rveZc|HIw#?eQW`0#prj2Q@){+!H99Uh`o)*<^05VxGreF z8YkwF~djvebaJ7Yf~ zhv(b~IeCVqvS96kP@PcgJ{NJFo}qKHIqynDTp@&7a311g`gcb>ulv2W-it`QU1A(E z(OX<1G&swNX_^aOo-8xS_-mTiua@p8nOU}!vIomzck)$O9Sxi&l`?U9C?C4fKH!7i zTitAs8(9aaRo1WfYbjx;O?xwks!JsCc1*6unb&8_5itHep)HdImQ!$~r*s^OfiNki z_7gw&@LG8_iOe}(U=kMNe5e%RR8^(;USlS)QUTW^D6XJ8JTh78#`C;7(*b44M3_Uw zUo%_bN1R2pV&Bao69%HsmR^=4ZCdG1Ncs@qb7tKr#F$u$Z@TabU%uNLZR>Ww=cBI; zP6{#cJ^955Sga<61G&NxNh21B+n?SHvyF?V&lOi3w9Yt3tGr)a>mGlc z>mzh11$nnlr-pIZ>%=oqrjeZRE$i{KDY3b0_IeHPs&IMsbAGwZi$Y^upt6V=iQ5zK zWDsKXP{r^~u@RJa66!YkNKqCWp{l3ET)IJ{WI#l@hOI)tpZ>$Kah|}GI&PlLZoi&% zi`8Lt@O{+e5$2M3c4?I|u4qSInK)a4*Ne3XrNkp5T}a<~f2wK)tu7R)n6oTjQGpCD zRg+f6j2{)R1(i1@4_CoIQZ~+-!B6vkC$fwCFi?96R?m%zeap(dJYF!8%#k;jMB@JDan2$pfykc7vWbKx67v)Cubd$XEQX3Y@9Qu87mlgnKI z58sRXXY@yhbHM3ur>lYkfNrrK1A|bs{UDy96HUYMbM{gu;`F*1XQ$RdXf5u8O3fR? zO9;efu8;zgXE0$v!g=-0d~Z*Fs#ix>xXoLk7^<{tocHlw#H`d$cE6J)lN9} z#6RUqX>1q5DD7b1!7VimUE&v2zzez8ARh#=7J-N&G!;xAgKOf_YCJqOlETiRH^`Ys%ktvTQ%eUoWe0@ssF2okoiC?yoQHXaY0$uKg zG^!K6_5Nk_Tp2sQ)XR!W1ud2R`<_0YN&5mZIb<>y)8;_c9YhSfZ17I-Un`qQ1TOSl z$9QOCq!K$gEal;#Q|bF-TeB(B`&Sh^2u$&>D|4&2c?GHeU?)H#8AkX(u}+jUkxdm+ zbol^poSS+2m7JEJnJS61}o{NUm9n#tOP%G3)ZGByBgR~!^kw_VK&IRrzndawn zj&_tF<+ojki(J!(iRD-mkKAN7NdNsVlehoaAzJ<8U-I^+TAGY^{lg<=T$6mk0%kSI z?Cf#xtQ6SO`PT^8z>L+Y_MaKt96~v#t>#~evBS>}uN*coWeJLIZ3#w(Q->Aaqo?5& zh3_URGUAp|GFJESQn}^v?ucJL@1n=SU=Q0r!^GE2q-({5vaV7f}qp)(9}p)Zc?}KGd2aapk(1wzTBF16lDWPI~tlmEF^*#&ST{I+uN9c&!Ci~tQ`$^=| zP*KtjEMnQR(Q+!=mHdpi`+g(rhI|!@sO=&0I}7`!h`AFI9TqeBR!lg-gm=nfXf^)t zE_Pc=d0Uz&)w#@z`?uMlo^O9SNjTly`R4R|suoYpXbLOBE?#CXV3|q4x$oQX zj1Qb~a2j;@T@mdhg-<_C>olhni7Ndi!~J!{919y zzslNnmPEQbqe@pX#idiu9Z zh=BM>eJcA}sz8&5jweBtqfp<*XE_=AInp++39hD%TwKZPcCD{_bP7sl~hJ8J_g!f{#NpT z|1hg;iS^kVtL>{57BIy(EW!#>{%3&|- zY(Rd8Exf`fOET_*fp~v9u%dit`zvqOUDm{0kpI_7KLaFK(51ex_Px;zovdM_sm8}g zjveK)u~@ZPz-+1f&K~k4dA1b1DJkvj>SRKh@p?DH#nCI0e%7jlup7tLlY03g?3nz- zp$mGz z$ZXDanu>E=5Q^DnMvi4nJCOynR=e;$gb-zw594^AX-v+&cQ&vJ1aO^5P!~?NBQJKv zV%JKN?&)(0%A)_zO99v#>aU*#hQaDUE1V#Px4vcDR=~$60X&Q*w$!m+IFJYvK#ucF z`oBJkwe^4Pkv;&rOnMp`sR}wknI1h7wU-UbODX2X0+4(Ipsbw#gew4nW{H-7)`GT$ z&WYZQVTsWJl)%ixY{7EGO2x*(k->?MF6_=(C(m{8Wx`u89^ZNSO~HeK>M*L9lY8$NL#eDXH(TK)F~o~c$* zFz0Q#7MQLH;AcK=!i(UZL~qgkGR;FY7Wj~o5-N8Hfy zqOL){&oabFasml4Cz*TljYdPin0lk%(Kr(%rX3+^MXl!t;qV+Q%oIqooKPidl(SrD zF_7Cw6LK(4CJcV_GhX_YlgbkS*UWPm^(}$<9y-5#pgf?9GPYux7kdT&3KAtv;7cCx zAE%ceBOrG=lEX752&V317!i6*~#+eeua*vD^qk|6wj zI})76{@0bAh0P^JO^nGy(ASlDr>Dl~%M_FMD(0u%%7AW@RMC^Ci;Q#gA|uOX?OLwe z&-~q2c%1?udgcAq%DEGmS2f(3&GE&xBFL(_-~nHYEL5vTVy|J2>*?>lXoIac%wtX0 zDZdEPvJ6q0iuueSuJ%> diff --git a/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.woff2 b/smart-admin-web/src/assets/icons/download (4)/font_1299963_2zqwx2axi0j/iconfont.woff2 deleted file mode 100644 index 89c0d09e7ac28fa8a86980e9905e1c02ee7ebfc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4584 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 SWT0jUIY|qZd}3}i0ssK8jJret diff --git a/smart-admin-web/src/assets/icons/iconfont.css b/smart-admin-web/src/assets/icons/iconfont.css deleted file mode 100644 index 8c269496..00000000 --- a/smart-admin-web/src/assets/icons/iconfont.css +++ /dev/null @@ -1,113 +0,0 @@ -@font-face {font-family: "iconfont"; - src: url('iconfont.eot?t=1567826173562'); /* IE9 */ - src: url('iconfont.eot?t=1567826173562#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'), - url('iconfont.woff?t=1567826173562') format('woff'), - url('iconfont.ttf?t=1567826173562') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ - url('iconfont.svg?t=1567826173562#iconfont') format('svg'); /* iOS 4.1- */ -} - -.iconfont { - font-family: "iconfont" !important; - font-size: 16px; - font-style: normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.iconduojicaidan:before { - content: "\e608"; -} - -.icondaohangzhankai:before { - content: "\e609"; -} - -.icondaohangzhedie:before { - content: "\e60a"; -} - -.iconxiangshangjiantou:before { - content: "\e60b"; -} - -.iconxiangzuojiantou:before { - content: "\e60c"; -} - -.iconxiangyoujiantou:before { - content: "\e60d"; -} - -.iconguanbianniu:before { - content: "\e60e"; -} - -.iconshujushangchuan:before { - content: "\e60f"; -} - -.iconxitongjiankong:before { - content: "\e610"; -} - -.iconyoujianguanli:before { - content: "\e611"; -} - -.iconxiaoping:before { - content: "\e612"; -} - -.iconrenyuanguanli:before { - content: "\e613"; -} - -.iconxiangxiala:before { - content: "\e614"; -} - -.iconexceldaorudaochu:before { - content: "\e615"; -} - -.iconxiangxiajiantou:before { - content: "\e616"; -} - -.iconshouye:before { - content: "\e617"; -} - -.iconxitongshezhi:before { - content: "\e618"; -} - -.iconxiaoxi:before { - content: "\e619"; -} - -.iconquanping:before { - content: "\e61a"; -} - -.iconzujian:before { - content: "\e61b"; -} - -.iconnews:before { - content: "\e61e"; -} - -.icondingshirenwu:before { - content: "\e622"; -} - -.icondongtaijiazai:before { - content: "\e623"; -} - -.iconjiekouwendang:before { - content: "\e624"; -} - diff --git a/smart-admin-web/src/assets/icons/iconfont.eot b/smart-admin-web/src/assets/icons/iconfont.eot deleted file mode 100644 index cf0b3fbdf621e7a70585e35f454f7db627ef94f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8812 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 diff --git a/smart-admin-web/src/assets/icons/iconfont.js b/smart-admin-web/src/assets/icons/iconfont.js deleted file mode 100644 index 6a3315a1..00000000 --- a/smart-admin-web/src/assets/icons/iconfont.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){var c,t='',h=(c=document.getElementsByTagName("script"))[c.length-1].getAttribute("data-injectcss");if(h&&!e.__iconfont__svg__cssinject__){e.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}!function(c){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(c,0);else{var h=function(){document.removeEventListener("DOMContentLoaded",h,!1),c()};document.addEventListener("DOMContentLoaded",h,!1)}else document.attachEvent&&(a=c,o=e.document,l=!1,(i=function(){try{o.documentElement.doScroll("left")}catch(c){return void setTimeout(i,50)}t()})(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,t())});function t(){l||(l=!0,a())}var a,o,l,i}(function(){var c,h;(c=document.createElement("div")).innerHTML=t,t=null,(h=c.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",function(c,h){h.firstChild?function(c,h){h.parentNode.insertBefore(c,h)}(c,h.firstChild):h.appendChild(c)}(h,document.body))})}(window); \ No newline at end of file diff --git a/smart-admin-web/src/assets/icons/iconfont.svg b/smart-admin-web/src/assets/icons/iconfont.svg deleted file mode 100644 index a349f5e2..00000000 --- a/smart-admin-web/src/assets/icons/iconfont.svg +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Created by iconfont - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/smart-admin-web/src/assets/icons/iconfont.ttf b/smart-admin-web/src/assets/icons/iconfont.ttf deleted file mode 100644 index 69587d9ec84c49f0f13af71459b52433868ec15d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8644 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
w^-dZn^ z3s*qrn|3l~Sz1U|&2;ZDEER)=9US)di$HsD+%`Nk0ar`bu88Z_uQW%O5*)4;6)FYz zcoJ{tih*;|#w7KS9EnsW{5$tQNJpjBu-!GR#wNx81dutfx&$F6gH5I3AtNF18fFN! z&~OPpf$$K7GaLo%RvhYqj0K27BTz;TekR?&hiF~zsv11ZJ;!K5QLM=2*uHc7B99nh zQ*F*=2Qzj@+DWg^jm7>svc7p`J*N5I{Rch>A9CQOt5YA!+I{F;>(eAD`=P0;r}Y>d zxZ% z@#F{ZNjwh{9vp_pIUX9s3xhx#^h5VDX*V`A*j9WC5B4-2wmh#r3~8k-X|JM z`2nJVJb%bf8~19asqu$IysFV<*HC+Od!GeLJ>``1K*% zj@tIxF{Gg}JVo%c6t+(ZyEx?!b|c@|O9KUdwjhQrG%ghea6L8j#wFb#r2H(>#~d?c zxULa0o#tSE?9O|G0q?zYEKf_gWwgfK|JSy$->`!SgGa@~n2`TV(xZ}h@ zi#>%)?d?+TRE3nqM)qA*A!Xm&gp`F=q}$2@FNGF_qa?Hdixq$i`3fK?mT(si^eZ}R zT`TX?(yqqA0&YU93;a<(ZEW$y{HTca#@%AA{IepyC4Y5yeihNGe2^@|BQc^a=$9b1^d^wQ#ZA9&1cW+QAazkMcs?%H8+Z!6aDprT0nCyKBzhYtpnoZkLLUE zTndXjsGFuv|K3dISMfFs@`Z?F{nYM!b_o{vs9@pqnFd>*x3l{-XfQau>bw|u^~j57 zZvVv>v5r!Z=a68gm6t&8Zsld<@n5E3g8zR^yfFlM74%K5yutc`kpbPrnSTP_2+6Q= z{0s7)R-W+B&F5Nqj(>Nqw(=6_&$aS0@;_+h75qc<%T``xVUk*TgYBVcD{rzQ%^TZJ z%uFrK9LgVjAU{97xG=l8uw<-c?w*-jK00+`rMQyrnK^NCesLkcw!CJAG&!>{b7FShj*kuwih%^ZJiT}fe{XHWvS;Ar zEFnI`@^E$@Ks?W;*&XE2ka$miK{zwQY5Orv!fk4vK0 zaW;y-f(CD_Xr+DGU+FPnC-8OrkN7X~wLa~5DUnDf1?RIyI=p^^OtJ{C1h@r-2@jSO zr5MF2foH}xYNrln9$H>JGCw^ve`spKIW)C+cxqwpETa3T=ItBBnM3n4-kEt+ofP#) zkXu?@c74iO(f^k61B=V8vN^XrwQvx13-inF$-~P>mi^w-he3AE%r7klobE?zw|a>l zN9T1gUOYYz@`;&+2S5tQhCd#nqf_CTGt)CiF~1Ybh`=$J3+h^9t0xaHE-)}N`oFmw8(bqIu$hvzZi>1F#6rnEFQ4_;>>h9mPc_b)D= Mo>_p1<{6R9021Zi4kvHG_ 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 diff --git a/smart-admin-web/src/assets/icons/iconfont.woff2 b/smart-admin-web/src/assets/icons/iconfont.woff2 deleted file mode 100644 index 89c0d09e7ac28fa8a86980e9905e1c02ee7ebfc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4584 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 SWT0jUIY|qZd}3}i0ssK8jJret diff --git a/smart-admin-web/src/assets/images/default_icon.png b/smart-admin-web/src/assets/images/default_icon.png deleted file mode 100644 index 1e0872fd462bc710a45851953108675002830fb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2364 zcmai02~ZPR8jipytKy=AfTBwqP&v#U2nmNu5)?=dbUG#-5(HGnAi5$b zFruJjbwD}PRe|wB6j2TpM>z%rhFWz{5DQj376xRugUZZQX>C_^zxTSo@B8nn-X{oI zWi@^NbQ}(66}Xxs#Mb$y+tLhsE^+BRiY@a{ZX_CtM58)T4dGTwku4Aq2!k<@5CWy~ z+ZrGr9L~I7E{a4W`8<{cfr+3AL)616jE%$jEZ3_*i2_1_El`YH>5Ct{b^{N{rM~zG z4?dZ%VnZ_d>g{SMbbE+MvRxrzO7YA603SUI6M!KU1oUvMQp3{w;wN-j*xvM-ga;-d zsKOWj(Wywj0AM3(2=E|!5+oG52f$zwDV{Vsler9_k||y!vKNU$BTzh9bTW%d1wLJP z%$iyn%@T3~KH0)fzIYjms#qkFPNyU4XhcLEL!vO5OcI$&qEZPMf}n|4qM)9j)Hr=s z;6NIQTCPInh!QXWjxb{TKqQnv_*)KBWmu7)cMRNE9O36w(AxDw)KowCdOi z<5CF;iiKcEiE1z`WfF^JiO-*ee^C~OC(#;I2>l-07ttC~yb2--Aq}EcORyqGJDJ>4 zvDj(|L=m+JL1I5=Tp&YGL?c5~0Gn;fFcWZzkSnE#PUHFq4#WXb$QN(=P9QS~G_r_7 zW|2Ku6fbwO7mG~(2<0PEd35|2p$ry{@h2!&ekq88{}(Kku%Zz)3}Q8qn>v=HQpQYJ zyjfz3dQJUry zt@&_Y`z%6hwzwzLI#;#NzT25H|LJbOVOrY0Tf29zG`_2r@e*&|wsTxYsaRPEJhUbr zH-r1W={VZg^`h(j9c_?>^UdAhPx)Dzi)|Z6#fqf<&Z3Gv5e)mvCa^Mbo&4a-;+om^ z=3|ZnW0o(g1`O7g{E&v(GOU|y3t*o3rqRyc@9x46*A}&y!FcDHMe(ZBCkusFoY!rx zX{$11r<^NxO4*PcZ?}IQ{Yd!q1>eHYTy^Mh&5v$j6(kp*$iX7DT>$M>yQTYOz+xE# zEGwP1e#or+zZ=6gZD^~1a$vy{KAHJY=$X7%T&Qo)%n9dq7@lz-*pFW+NtmPG${-a` zGU+Fd>`5|j&oKaIwc7@PJeP}65fN7ft4}n%P2`4M_u~D~SK8UX_Ca*&)RB>IMm|_E zbF2Sacclg@b(*WbD+U_ogvDkgFZC+9aBQuEG%GmBDM8__Nc~M2_SoW7lWl(^*+`8E zZ@H4U_Fm3uor7T@XVYoF(XspA-?O6y+GKKPyEJTHUrGKj`k1zfx2cj!xj%J%+>@%x z%2UltO5;SoH1k|~xVaY-;`!Nb)sGf+E#Gxwmm1P2&xy{qx;ps36!;fBJsDP-H$yjg z2J!4o!e`_Q+8845v~oQJt)SNnLK|%k zrMoUJw5d-s+~Jwu_|1FzVsB>bnU?DkZ{A`4`2ttOM>gvJB6hDn^luViQvYa=)7BRZm$|`gozCMr^AAm^+h}7SCw$T zhyC7jo+6&*-$Q?hiWHYJ#D@Ks^U+twoobGSWaWldSvVh*^%{3HFCaz!>VB#WK40VA zb*R5_tNX)k#*^uEOY8Nge`%4uu1L?(#@?IZUl;PW=VGRyLSo)KY9#Ck=btQX+c?7t=FDX;I%<-}!zK5;Se5+i^>OV=?D`L!DXAlE@q8 zioC|rcf089)q8cl!?OcAW|TXwnY)KGjoV$n!kRNh$MCVvSIC1pzP%p2u2yw8r}W*? z!sygn&NkHNYwxFDp7&$)*#71<)xxyor@`7JxLByVb>eU1jw5udxXst{F4bsu61t=8 z3jA*Kj6--yo3OTIm8zF!y~3<{)`fZ1qGF#*=M(kyZqMiZRPs9cP}gYcP}}o?q@?km zxA6Z`o3}_Y{BV}6EZtb8)aMoy65<`&Q${*;SrPwvdsp`!){KW0Egd=<6zOQR&)Xy) zBWurg%Wfo~WACc-ogeXT9Y$-l2XUg&1AE4v)i$jOEh~sHR_SDes)2PQi9X?OXGuG& z#v7##7qh16tTN`lN$D={clN3SGFt;;UW3}W9V6qr4_vC7=EqF>cYVHD%&@tasting \ No newline at end of file diff --git a/smart-admin-web/src/assets/images/error-page/error-404.svg b/smart-admin-web/src/assets/images/error-page/error-404.svg deleted file mode 100644 index 77d97f71..00000000 --- a/smart-admin-web/src/assets/images/error-page/error-404.svg +++ /dev/null @@ -1 +0,0 @@ -drone_delivery \ No newline at end of file diff --git a/smart-admin-web/src/assets/images/error-page/error-500.svg b/smart-admin-web/src/assets/images/error-page/error-500.svg deleted file mode 100644 index ef72fd32..00000000 --- a/smart-admin-web/src/assets/images/error-page/error-500.svg +++ /dev/null @@ -1 +0,0 @@ -co-working \ No newline at end of file diff --git a/smart-admin-web/src/assets/images/icon-qr-qq-wechat.png b/smart-admin-web/src/assets/images/icon-qr-qq-wechat.png deleted file mode 100644 index c5f6b18591f0025bc37fc2dae5c7bc85177c42ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43541 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 W(3(E^8d>n@;Zjjhm#>!n6!bq|VVLs( diff --git a/smart-admin-web/src/assets/images/icon-social-bilibili.svg b/smart-admin-web/src/assets/images/icon-social-bilibili.svg deleted file mode 100644 index d655a329..00000000 --- a/smart-admin-web/src/assets/images/icon-social-bilibili.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/smart-admin-web/src/assets/images/icon-social-juejin.svg b/smart-admin-web/src/assets/images/icon-social-juejin.svg deleted file mode 100644 index c0ad2aeb..00000000 --- a/smart-admin-web/src/assets/images/icon-social-juejin.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/smart-admin-web/src/assets/images/icon-social-twitter.svg b/smart-admin-web/src/assets/images/icon-social-twitter.svg deleted file mode 100644 index cef3ec09..00000000 --- a/smart-admin-web/src/assets/images/icon-social-twitter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/smart-admin-web/src/assets/images/icon-social-zhihu.svg b/smart-admin-web/src/assets/images/icon-social-zhihu.svg deleted file mode 100644 index 3a82ca82..00000000 --- a/smart-admin-web/src/assets/images/icon-social-zhihu.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/smart-admin-web/src/assets/images/login-alipay.png b/smart-admin-web/src/assets/images/login-alipay.png deleted file mode 100644 index 7d9f0306411646da46ca036af00fda790a3f2e04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1881 zcmah~3sBQ`81D&+FRmSShx37<3Zl}cZ)l`2Xp2;=houvIa2k>TU1<`NlokhbDB}hq zj(K+6yrF>NR1gN644ncxb?SUf#0NS>CqqR=IZ^Pr6b0R#+;U0&kNke$_x-=$_g!*h z=FjmQJz+G5!|~KdX^reS-t~+e!M@w<>RxvEh|$F}u|yJMhbfE`juMF&ptr)wm=S}~ z^cBaj5Dv$!(`<@o;tlg4gs_TW7e?f;k}R9U2?=wMFk-o?EGz5hK3XxKXNaPA2NF|aeWpb4&5Ri%`!Js%8l*ohg-3(!?eVbigDi5s6(#>Ib68Ada+Asr}AT1jJG? zD~2;Piiq11*4=_HZix&f}1Kx{502Ds>3u5w7O ztEOFAL0XJ5r(tL$MOcA;Js|VYvB-wB_lAoO9gBQOF31K0x+?UYiXGTu+rTv)>_2uf z*ufaiwk^f>=cG2zf7rHn*K5N~j@F8Wvn`in_@Qa2dg?K!Wyzi;QND-IOySk=yS*XX zt)+{l=&kcR&^u0FP0H=Fewvp$Ao?L!94yam`YmnCH-2IK+1#@%!~TrWhFK@N!%J7!*4Fmmb+uVl3deZGiT2}ZJ4~&k2cX>gowl&QcX7DeCrsF5qv^6u<$di1!;Y>v-{rP!=~DORz|&)IA54+wLH@j)fIM8e z2`k?EqNr~1^oe@s2Cp0LUL)6v-MF_R4oO~leEqx3x9Zbu{kNwK+nZY!?a9t=aVHhS zGJ@;;|496?cMY9jzn3=Cm|rGTx>Xm=9vSPbu5W5g$bCB3JMR*2M*XkP6Y)$cW9}#J=&dl_z5gbhbrsjj6wK^wT++n&d zXjjYjFEH+H29ics2NeQ=fq^kq!%pl;{E#U^coq$tz5YFhR39%!XAF&W%S{o03^>a=@^35$V0jIjJB$iA&=sa1J65=C60ygUO74+WSU3O@D z!Ll(scb53A>1*|NcPet=YTLfQ$|F{vx;=ycpoXpwEdJn9kZ!?vB+e$5KC4J5YmDPN z)?fX2n=y+%?bdY#x!zPV?7Q;eaGr(9DfEy#ALbwMUA27l50c3~%7$2OA@=2>nR>5U z_sZq@v7YstFP24(*eEZ&RubpY)L4?XE`jVUtOe#ZZ`;-}rK7bca7|jZI`wSUQ2}yw zTyHt|^W@S$r_J4FypKfsmy@-|N*wwA?(+*Jr;{BX7KFR*^5N2GpQri;q3LB2$GU(w mv8MFgjFT(C$93)NIc^+tZ^1ph@s-5&v(xM5Yj;O1U;QsNJ;NIS diff --git a/smart-admin-web/src/assets/images/login-bg.jpg b/smart-admin-web/src/assets/images/login-bg.jpg deleted file mode 100644 index 04c27b4f2c492241b7865a392088329c277a59ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 547587 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 p7WA>N`#QUh?Mu08+iN+ZX!f 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 j9xu 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 Fon}TpX09i97m*h7*dv1|%%2{CYZ>9ezC*_ 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

=z%Au|oxZ+3Nx4tps65@o9A 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

}ngG#A4Q5r8#O`f*3&>TJaB5%}!J10U|4?($) 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
}E@v|_G9?1zA4Z(GKO^K= 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 I=fBtg2Zx>A6#xJL diff --git a/smart-admin-web/src/assets/images/login-logo.png b/smart-admin-web/src/assets/images/login-logo.png deleted file mode 100644 index 61765e6dab63920b8e5a9962605860893332543c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4900 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 bXeU50`OgRKIXU;Y|65_K9ME+ZK4<;~Y*11s diff --git a/smart-admin-web/src/assets/images/login-sina.png b/smart-admin-web/src/assets/images/login-sina.png deleted file mode 100644 index 950619fd1b7c76b785dea3be1d775ffe950278c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1851 zcmah~2~ZPf6pna+2#ORLpfk9J;4zZ>AlVWrBmp9XBgT?~Se9ggK#~oc1p-*DfH+Vs zDD^0eCly3Rk!meMOB0Jn83932#0r!mShN%iiU-mS0@@jw?(FV=?DxI*{`b8%n;RPJ zZ)@#hO&}0##Q{PoK028nt9kglE0sTr56+lKj;%vtu~Z0!2|h|B1_s0$C=QmwkTNal z8tg?N%pOq51u|nO28|A969``31|6hGgfSonj#Fv*#KD?6BA`<8iQ#Ms zO`;RP@v4Ay6keAeEK{T>DtJnw_Zq;<0OAHTFa`kzjasV*4SeE+T@as}x2Z&60)i#- ziEo0EOF{twg2Dis!XYc@EH>cDqtH1_7LVrvFlclxmByvgnPfT#WYItd1DL#sxHnW8 z3rdB4lfLj3pBRr}I*>|DO--ewGARfeN2T+4JSvSrWiZG%f~-%|VvvEX)w@ku5W;!| zs?uR9L<^WLLNQ1(#wX&DzBz(MH*Hp{pG*^;FscF4QRx(#`A8E$rD7VVOGecb&Xo!( ztcEqP7SrQc`ZN~Ll0-5Mf3I1MW*V)>r10Cby%(*QrRiX*6xJijr~(%`*3BH24ium; zgdwO5LDW+j4~<7KL?4gn0D-`qVIHtDT%}basrps#a9|;X!F;0mJDG;xOc|XH;vz7) zt7%-2MtcL5AWBti+Iyi~kU{?s6qjEKVbK4Al?pHxK{XJrfy!L5RGl_%!ka__inV$S z(kfuFkWa*qM^UMipr=wV5sH_eWzllw(vGE zPpA72Urcu}ti{_F#ruEFOr3J~G4IUp@&5aS5|q+Ex$mijq6dO~^g^ee?3C z@wKd>$l>Ni&6l&D9V|MS{w(_LqAnu>wFLGYJ9xb1W<;~ap1PWq9*0w6v#+;RabAl* zy4LeJqv7S4E3@t!<2ui;jMqIHBGfFGz?>WM{*;>hBvO3mz{rCnrHuW<5}SFR?&25y zIo-~FIuw0!PFn7DM)qry&N=gB#p!`vwo$ilk8K{`UT1%EV5E0!3|T$8KXah{uVD;j zJ6Km#+dF(&A6_5R&0e!s$NVnl>}avv<7rCeG8@;m$6B6{jn_yf;8ds8)xK?}{5_GG z9i(j0{&RK@vn$fa(Af-kK%G?ZI=I;BP^HoK5}}nfn&YupZ2HX3V*UEGoq65W?P`k` zuNXeQPM1&l6TSLS-kpw@d6qSRqM)gGqjoj^f z;+8eZety7mv3sFS>71{B%CPn-?9AG?LA7Ak*<7IKo|m_GpYxJv%cp^y21@_P#jeMJ zw|a)|#O3@}8&a^CMXv3=$0}Y9b5<;FaEK~7Zr%3R%Pbz| z$5H-3JC_~UJm=_2Q)6S?-b7B#g0ix*N2c;}6>0C04U|hppZn)`e835B-Lz(WA#-rs zKjf{7hxJF=UzAogYcGU`X^yWy8J+AAo*R>I$REmBwb5fZnIuQsN;aOk;`wdT><;&! znj&df-j%_M7Wcu!MG@KTer<}Yu;d0i!SMpAJ4YZNFN0qfmTtMdC35q88euy(GglLC Rzrp-F6N`d{r+uR{{{_^{#sUBU diff --git a/smart-admin-web/src/assets/images/login-taobao.png b/smart-admin-web/src/assets/images/login-taobao.png deleted file mode 100644 index ecaa608aecd8657619c9852b6f9818d6bb52d6fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1898 zcmah~2~ZPf6pn}zupkye8a%cE6_FkMCyIZBz;K@pO6X-8I329Cdh!$0%1HJ0YddqBBDYdcxCEY z#E(WB--oI-q(&Jo(c*eGWWlh_dV*rpXnym}1f)$tNFW|bL@_DzNnJe?Kw&9!iLa8Q zBxFbu8j@i^qBA1Y+Kd#f7-r7*2mH(u%77jrA;7HHVMd8r${eyQq2`utkO>Sy$P_8_ zT~Hcj6d=P52;j>Wu(VtsUqC2ka|L`KvDh2nakwIoBLca67FQtg;YfHqVEAHE-VAVp zL?sU%_C>9v%p{T|Bp_%qnb;;i8#g3^T(MXTa(Ez*$D$A{<4TN#%q-04K4L+R7_|nJ zAW<9xEEb`7JdKnxsYu@)K~IdD#f-ygq7nw0Ap+#GIhG?00b%VZjz}};hMdD%5YZue z1S5?UmOF~2vZPdw!arzMuOCGlNfq+%**=Iis#g*Ss6vc*nn6p6oZxN=i;&0+2t?ur zHIC~>G9HzLlejSnCjgnul3_96xdg>v++_56kAuh|5|J`3-&q{$=Bv3}2_*tw^f^Z) z;c(tTl{kzhto$I90tx>ErR0Yp68c{-td%6-20cV+fLbaRB(TIGZ%U;k6f=?#rbR;K zQYLjgHj2U$AzvU9Dg-_#^pK!q$HE)a-Y^#)I~M+!T#yO|v{dMO6+5y;wSi?i+JDqy zw1W|hYFh)uufXHNja(q<9yu@Yx75MAm zoS@47$|%v`+Gw}mSWCN!yV0WQZ`(k6mde{j_}DfAa{s7_@#*&Rii!uqC$?CzqYG4O zt#0owue*VTc*Hfm$ttN`)9Bc8$98L3X8aC~x61}(EyNzuL2DV8FNY_w?PDlDDIu*|xL*ZBd@j75lIBolW(M zpSiG)>BF$^H~X!pWm=h1Ry%okG<1W31BW(7)I5#b-1ThAQ6janwjg^}FT-ci_~wU= zw{II8CTh2@4xo)w5GP`EqUjEQ`ssI8EWJW^fWEz0xyjn@{*wH|ho`>@uMQBBnz+Ko zd-rC`tNuROUcSJ;!lq=-t`7ekS*H~~*nQ@n;cJ)1b;+(1A756A^VGekLl~&C>S{SA z%w#ovI+z4lm-WV!O+;m#Ktb% zQWh}vM`H=|?hp0LXUzq48)K$8^SbACJoF25ns9GR4I+ZQdCqQuo!2;X=!LmgzZ`57 ziJaBNx;f*(B)^%$ipsx|rZM^^hxR(Hh%C6}cyukJt17%dF6zyy2^|l1v~{jgPk#Q@ zwJ8s8u*p{wj8|mZ0E$7^S3GZa4Kk|Pi-g{Tt7w{-V=Sa^F>O3LkA1hyf zx@yISt2Sv_GctFsA8_rfj%{+WIoTDM@owI{C4JS#<2o zud^DI%W_Xe3NP4oY(3g@==faQc?7+0aQe2vyY1Nz>sj^It~6iu{=`W-yCasrU#KEN JejsQ?&OeO7%7_2} diff --git a/smart-admin-web/src/assets/images/login_desc_bg.png b/smart-admin-web/src/assets/images/login_desc_bg.png deleted file mode 100644 index 70d8d62f10871e3af7783c3c23b246f6e4ea24ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272693 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%0AK3FI^M%_lJo#)O{!vCfw1OP75wP6Wjy`Z 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 P00000NkvXXu0mjfFM&Ni diff --git a/smart-admin-web/src/assets/images/login_logo.png b/smart-admin-web/src/assets/images/login_logo.png deleted file mode 100644 index 2955b838b1f804fca7a4f66b2f1e653e199c6491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3523 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 LNkvXXu0mjfRjz|) diff --git a/smart-admin-web/src/assets/images/shadow.png b/smart-admin-web/src/assets/images/shadow.png deleted file mode 100644 index 79cc097fd05bf5f241324a963c3d21cb62aee884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224307 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ð#!yPL3NxhH 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⋘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 z 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

Vgn8s3BxJttwP!+0+JWPIHiMQ2?i?r?ll#HSd3D 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 F{{SzO*Q5Xd diff --git a/smart-admin-web/src/assets/images/slider/sub_slider_default.png b/smart-admin-web/src/assets/images/slider/sub_slider_default.png deleted file mode 100644 index 67a4f2794e26b2e082f282b6209dd3208365cfca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3105 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 MHZZ?drRNg&AN+^vQ~&?~ diff --git a/smart-admin-web/src/assets/style/lib/animate.css b/smart-admin-web/src/assets/style/lib/animate.css deleted file mode 100644 index 6c72f594..00000000 --- a/smart-admin-web/src/assets/style/lib/animate.css +++ /dev/null @@ -1,3625 +0,0 @@ -@charset "UTF-8"; - -/*! - * animate.css -https://daneden.github.io/animate.css/ - * Version - 3.7.2 - * Licensed under the MIT license - http://opensource.org/licenses/MIT - * - * Copyright (c) 2019 Daniel Eden - */ - -@-webkit-keyframes bounce { - from, - 20%, - 53%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - 40%, - 43% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -30px, 0); - transform: translate3d(0, -30px, 0); - } - - 70% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -15px, 0); - transform: translate3d(0, -15px, 0); - } - - 90% { - -webkit-transform: translate3d(0, -4px, 0); - transform: translate3d(0, -4px, 0); - } -} - -@keyframes bounce { - from, - 20%, - 53%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - 40%, - 43% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -30px, 0); - transform: translate3d(0, -30px, 0); - } - - 70% { - -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - -webkit-transform: translate3d(0, -15px, 0); - transform: translate3d(0, -15px, 0); - } - - 90% { - -webkit-transform: translate3d(0, -4px, 0); - transform: translate3d(0, -4px, 0); - } -} - -.bounce { - -webkit-animation-name: bounce; - animation-name: bounce; - -webkit-transform-origin: center bottom; - transform-origin: center bottom; -} - -@-webkit-keyframes flash { - from, - 50%, - to { - opacity: 1; - } - - 25%, - 75% { - opacity: 0; - } -} - -@keyframes flash { - from, - 50%, - to { - opacity: 1; - } - - 25%, - 75% { - opacity: 0; - } -} - -.flash { - -webkit-animation-name: flash; - animation-name: flash; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes pulse { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 50% { - -webkit-transform: scale3d(1.05, 1.05, 1.05); - transform: scale3d(1.05, 1.05, 1.05); - } - - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@keyframes pulse { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 50% { - -webkit-transform: scale3d(1.05, 1.05, 1.05); - transform: scale3d(1.05, 1.05, 1.05); - } - - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -.pulse { - -webkit-animation-name: pulse; - animation-name: pulse; -} - -@-webkit-keyframes rubberBand { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 30% { - -webkit-transform: scale3d(1.25, 0.75, 1); - transform: scale3d(1.25, 0.75, 1); - } - - 40% { - -webkit-transform: scale3d(0.75, 1.25, 1); - transform: scale3d(0.75, 1.25, 1); - } - - 50% { - -webkit-transform: scale3d(1.15, 0.85, 1); - transform: scale3d(1.15, 0.85, 1); - } - - 65% { - -webkit-transform: scale3d(0.95, 1.05, 1); - transform: scale3d(0.95, 1.05, 1); - } - - 75% { - -webkit-transform: scale3d(1.05, 0.95, 1); - transform: scale3d(1.05, 0.95, 1); - } - - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@keyframes rubberBand { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 30% { - -webkit-transform: scale3d(1.25, 0.75, 1); - transform: scale3d(1.25, 0.75, 1); - } - - 40% { - -webkit-transform: scale3d(0.75, 1.25, 1); - transform: scale3d(0.75, 1.25, 1); - } - - 50% { - -webkit-transform: scale3d(1.15, 0.85, 1); - transform: scale3d(1.15, 0.85, 1); - } - - 65% { - -webkit-transform: scale3d(0.95, 1.05, 1); - transform: scale3d(0.95, 1.05, 1); - } - - 75% { - -webkit-transform: scale3d(1.05, 0.95, 1); - transform: scale3d(1.05, 0.95, 1); - } - - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -.rubberBand { - -webkit-animation-name: rubberBand; - animation-name: rubberBand; -} - -@-webkit-keyframes shake { - from, - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - 10%, - 30%, - 50%, - 70%, - 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - - 20%, - 40%, - 60%, - 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} - -@keyframes shake { - from, - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - 10%, - 30%, - 50%, - 70%, - 90% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - - 20%, - 40%, - 60%, - 80% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } -} - -.shake { - -webkit-animation-name: shake; - animation-name: shake; -} - -@-webkit-keyframes headShake { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 6.5% { - -webkit-transform: translateX(-6px) rotateY(-9deg); - transform: translateX(-6px) rotateY(-9deg); - } - - 18.5% { - -webkit-transform: translateX(5px) rotateY(7deg); - transform: translateX(5px) rotateY(7deg); - } - - 31.5% { - -webkit-transform: translateX(-3px) rotateY(-5deg); - transform: translateX(-3px) rotateY(-5deg); - } - - 43.5% { - -webkit-transform: translateX(2px) rotateY(3deg); - transform: translateX(2px) rotateY(3deg); - } - - 50% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -@keyframes headShake { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 6.5% { - -webkit-transform: translateX(-6px) rotateY(-9deg); - transform: translateX(-6px) rotateY(-9deg); - } - - 18.5% { - -webkit-transform: translateX(5px) rotateY(7deg); - transform: translateX(5px) rotateY(7deg); - } - - 31.5% { - -webkit-transform: translateX(-3px) rotateY(-5deg); - transform: translateX(-3px) rotateY(-5deg); - } - - 43.5% { - -webkit-transform: translateX(2px) rotateY(3deg); - transform: translateX(2px) rotateY(3deg); - } - - 50% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -.headShake { - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - -webkit-animation-name: headShake; - animation-name: headShake; -} - -@-webkit-keyframes swing { - 20% { - -webkit-transform: rotate3d(0, 0, 1, 15deg); - transform: rotate3d(0, 0, 1, 15deg); - } - - 40% { - -webkit-transform: rotate3d(0, 0, 1, -10deg); - transform: rotate3d(0, 0, 1, -10deg); - } - - 60% { - -webkit-transform: rotate3d(0, 0, 1, 5deg); - transform: rotate3d(0, 0, 1, 5deg); - } - - 80% { - -webkit-transform: rotate3d(0, 0, 1, -5deg); - transform: rotate3d(0, 0, 1, -5deg); - } - - to { - -webkit-transform: rotate3d(0, 0, 1, 0deg); - transform: rotate3d(0, 0, 1, 0deg); - } -} - -@keyframes swing { - 20% { - -webkit-transform: rotate3d(0, 0, 1, 15deg); - transform: rotate3d(0, 0, 1, 15deg); - } - - 40% { - -webkit-transform: rotate3d(0, 0, 1, -10deg); - transform: rotate3d(0, 0, 1, -10deg); - } - - 60% { - -webkit-transform: rotate3d(0, 0, 1, 5deg); - transform: rotate3d(0, 0, 1, 5deg); - } - - 80% { - -webkit-transform: rotate3d(0, 0, 1, -5deg); - transform: rotate3d(0, 0, 1, -5deg); - } - - to { - -webkit-transform: rotate3d(0, 0, 1, 0deg); - transform: rotate3d(0, 0, 1, 0deg); - } -} - -.swing { - -webkit-transform-origin: top center; - transform-origin: top center; - -webkit-animation-name: swing; - animation-name: swing; -} - -@-webkit-keyframes tada { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 10%, - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); - transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); - } - - 30%, - 50%, - 70%, - 90% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - } - - 40%, - 60%, - 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - } - - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@keyframes tada { - from { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - - 10%, - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); - transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); - } - - 30%, - 50%, - 70%, - 90% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); - } - - 40%, - 60%, - 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); - } - - to { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -.tada { - -webkit-animation-name: tada; - animation-name: tada; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes wobble { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - 15% { - -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - } - - 30% { - -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - } - - 45% { - -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - } - - 60% { - -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - } - - 75% { - -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes wobble { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - 15% { - -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); - } - - 30% { - -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); - } - - 45% { - -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); - } - - 60% { - -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); - } - - 75% { - -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.wobble { - -webkit-animation-name: wobble; - animation-name: wobble; -} - -@-webkit-keyframes jello { - from, - 11.1%, - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - 22.2% { - -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); - transform: skewX(-12.5deg) skewY(-12.5deg); - } - - 33.3% { - -webkit-transform: skewX(6.25deg) skewY(6.25deg); - transform: skewX(6.25deg) skewY(6.25deg); - } - - 44.4% { - -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); - transform: skewX(-3.125deg) skewY(-3.125deg); - } - - 55.5% { - -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); - transform: skewX(1.5625deg) skewY(1.5625deg); - } - - 66.6% { - -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); - transform: skewX(-0.78125deg) skewY(-0.78125deg); - } - - 77.7% { - -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); - transform: skewX(0.390625deg) skewY(0.390625deg); - } - - 88.8% { - -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - } -} - -@keyframes jello { - from, - 11.1%, - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - 22.2% { - -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); - transform: skewX(-12.5deg) skewY(-12.5deg); - } - - 33.3% { - -webkit-transform: skewX(6.25deg) skewY(6.25deg); - transform: skewX(6.25deg) skewY(6.25deg); - } - - 44.4% { - -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); - transform: skewX(-3.125deg) skewY(-3.125deg); - } - - 55.5% { - -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); - transform: skewX(1.5625deg) skewY(1.5625deg); - } - - 66.6% { - -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); - transform: skewX(-0.78125deg) skewY(-0.78125deg); - } - - 77.7% { - -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); - transform: skewX(0.390625deg) skewY(0.390625deg); - } - - 88.8% { - -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - transform: skewX(-0.1953125deg) skewY(-0.1953125deg); - } -} - -.jello { - -webkit-animation-name: jello; - animation-name: jello; - -webkit-transform-origin: center; - transform-origin: center; -} - -@-webkit-keyframes heartBeat { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - - 14% { - -webkit-transform: scale(1.3); - transform: scale(1.3); - } - - 28% { - -webkit-transform: scale(1); - transform: scale(1); - } - - 42% { - -webkit-transform: scale(1.3); - transform: scale(1.3); - } - - 70% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -@keyframes heartBeat { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - - 14% { - -webkit-transform: scale(1.3); - transform: scale(1.3); - } - - 28% { - -webkit-transform: scale(1); - transform: scale(1); - } - - 42% { - -webkit-transform: scale(1.3); - transform: scale(1.3); - } - - 70% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -.heartBeat { - -webkit-animation-name: heartBeat; - animation-name: heartBeat; - -webkit-animation-duration: 1.3s; - animation-duration: 1.3s; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; -} - -@-webkit-keyframes bounceIn { - from, - 20%, - 40%, - 60%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - - 40% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - - 80% { - -webkit-transform: scale3d(0.97, 0.97, 0.97); - transform: scale3d(0.97, 0.97, 0.97); - } - - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@keyframes bounceIn { - from, - 20%, - 40%, - 60%, - 80%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - - 0% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - - 40% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - - 80% { - -webkit-transform: scale3d(0.97, 0.97, 0.97); - transform: scale3d(0.97, 0.97, 0.97); - } - - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -.bounceIn { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-name: bounceIn; - animation-name: bounceIn; -} - -@-webkit-keyframes bounceInDown { - from, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -3000px, 0); - transform: translate3d(0, -3000px, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(0, 25px, 0); - transform: translate3d(0, 25px, 0); - } - - 75% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - - 90% { - -webkit-transform: translate3d(0, 5px, 0); - transform: translate3d(0, 5px, 0); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes bounceInDown { - from, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(0, -3000px, 0); - transform: translate3d(0, -3000px, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(0, 25px, 0); - transform: translate3d(0, 25px, 0); - } - - 75% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - - 90% { - -webkit-transform: translate3d(0, 5px, 0); - transform: translate3d(0, 5px, 0); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.bounceInDown { - -webkit-animation-name: bounceInDown; - animation-name: bounceInDown; -} - -@-webkit-keyframes bounceInLeft { - from, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(-3000px, 0, 0); - transform: translate3d(-3000px, 0, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(25px, 0, 0); - transform: translate3d(25px, 0, 0); - } - - 75% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - - 90% { - -webkit-transform: translate3d(5px, 0, 0); - transform: translate3d(5px, 0, 0); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes bounceInLeft { - from, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - - 0% { - opacity: 0; - -webkit-transform: translate3d(-3000px, 0, 0); - transform: translate3d(-3000px, 0, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(25px, 0, 0); - transform: translate3d(25px, 0, 0); - } - - 75% { - -webkit-transform: translate3d(-10px, 0, 0); - transform: translate3d(-10px, 0, 0); - } - - 90% { - -webkit-transform: translate3d(5px, 0, 0); - transform: translate3d(5px, 0, 0); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.bounceInLeft { - -webkit-animation-name: bounceInLeft; - animation-name: bounceInLeft; -} - -@-webkit-keyframes bounceInRight { - from, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - - from { - opacity: 0; - -webkit-transform: translate3d(3000px, 0, 0); - transform: translate3d(3000px, 0, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(-25px, 0, 0); - transform: translate3d(-25px, 0, 0); - } - - 75% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } - - 90% { - -webkit-transform: translate3d(-5px, 0, 0); - transform: translate3d(-5px, 0, 0); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes bounceInRight { - from, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - - from { - opacity: 0; - -webkit-transform: translate3d(3000px, 0, 0); - transform: translate3d(3000px, 0, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(-25px, 0, 0); - transform: translate3d(-25px, 0, 0); - } - - 75% { - -webkit-transform: translate3d(10px, 0, 0); - transform: translate3d(10px, 0, 0); - } - - 90% { - -webkit-transform: translate3d(-5px, 0, 0); - transform: translate3d(-5px, 0, 0); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.bounceInRight { - -webkit-animation-name: bounceInRight; - animation-name: bounceInRight; -} - -@-webkit-keyframes bounceInUp { - from, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - - from { - opacity: 0; - -webkit-transform: translate3d(0, 3000px, 0); - transform: translate3d(0, 3000px, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - - 75% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - - 90% { - -webkit-transform: translate3d(0, -5px, 0); - transform: translate3d(0, -5px, 0); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes bounceInUp { - from, - 60%, - 75%, - 90%, - to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - } - - from { - opacity: 0; - -webkit-transform: translate3d(0, 3000px, 0); - transform: translate3d(0, 3000px, 0); - } - - 60% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - - 75% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - - 90% { - -webkit-transform: translate3d(0, -5px, 0); - transform: translate3d(0, -5px, 0); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.bounceInUp { - -webkit-animation-name: bounceInUp; - animation-name: bounceInUp; -} - -@-webkit-keyframes bounceOut { - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - - 50%, - 55% { - opacity: 1; - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - - to { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } -} - -@keyframes bounceOut { - 20% { - -webkit-transform: scale3d(0.9, 0.9, 0.9); - transform: scale3d(0.9, 0.9, 0.9); - } - - 50%, - 55% { - opacity: 1; - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - - to { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } -} - -.bounceOut { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-name: bounceOut; - animation-name: bounceOut; -} - -@-webkit-keyframes bounceOutDown { - 20% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} - -@keyframes bounceOutDown { - 20% { - -webkit-transform: translate3d(0, 10px, 0); - transform: translate3d(0, 10px, 0); - } - - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, -20px, 0); - transform: translate3d(0, -20px, 0); - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} - -.bounceOutDown { - -webkit-animation-name: bounceOutDown; - animation-name: bounceOutDown; -} - -@-webkit-keyframes bounceOutLeft { - 20% { - opacity: 1; - -webkit-transform: translate3d(20px, 0, 0); - transform: translate3d(20px, 0, 0); - } - - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} - -@keyframes bounceOutLeft { - 20% { - opacity: 1; - -webkit-transform: translate3d(20px, 0, 0); - transform: translate3d(20px, 0, 0); - } - - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} - -.bounceOutLeft { - -webkit-animation-name: bounceOutLeft; - animation-name: bounceOutLeft; -} - -@-webkit-keyframes bounceOutRight { - 20% { - opacity: 1; - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - } - - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} - -@keyframes bounceOutRight { - 20% { - opacity: 1; - -webkit-transform: translate3d(-20px, 0, 0); - transform: translate3d(-20px, 0, 0); - } - - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} - -.bounceOutRight { - -webkit-animation-name: bounceOutRight; - animation-name: bounceOutRight; -} - -@-webkit-keyframes bounceOutUp { - 20% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, 20px, 0); - transform: translate3d(0, 20px, 0); - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} - -@keyframes bounceOutUp { - 20% { - -webkit-transform: translate3d(0, -10px, 0); - transform: translate3d(0, -10px, 0); - } - - 40%, - 45% { - opacity: 1; - -webkit-transform: translate3d(0, 20px, 0); - transform: translate3d(0, 20px, 0); - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} - -.bounceOutUp { - -webkit-animation-name: bounceOutUp; - animation-name: bounceOutUp; -} - -@-webkit-keyframes fadeIn { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -@keyframes fadeIn { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -.fadeIn { - -webkit-animation-name: fadeIn; - animation-name: fadeIn; -} - -@-webkit-keyframes fadeInDown { - from { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes fadeInDown { - from { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.fadeInDown { - -webkit-animation-name: fadeInDown; - animation-name: fadeInDown; -} - -@-webkit-keyframes fadeInDownBig { - from { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes fadeInDownBig { - from { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.fadeInDownBig { - -webkit-animation-name: fadeInDownBig; - animation-name: fadeInDownBig; -} - -@-webkit-keyframes fadeInLeft { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes fadeInLeft { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.fadeInLeft { - -webkit-animation-name: fadeInLeft; - animation-name: fadeInLeft; -} - -@-webkit-keyframes fadeInLeftBig { - from { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes fadeInLeftBig { - from { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.fadeInLeftBig { - -webkit-animation-name: fadeInLeftBig; - animation-name: fadeInLeftBig; -} - -@-webkit-keyframes fadeInRight { - from { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes fadeInRight { - from { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.fadeInRight { - -webkit-animation-name: fadeInRight; - animation-name: fadeInRight; -} - -@-webkit-keyframes fadeInRightBig { - from { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes fadeInRightBig { - from { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.fadeInRightBig { - -webkit-animation-name: fadeInRightBig; - animation-name: fadeInRightBig; -} - -@-webkit-keyframes fadeInUp { - from { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes fadeInUp { - from { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.fadeInUp { - -webkit-animation-name: fadeInUp; - animation-name: fadeInUp; -} - -@-webkit-keyframes fadeInUpBig { - from { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes fadeInUpBig { - from { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.fadeInUpBig { - -webkit-animation-name: fadeInUpBig; - animation-name: fadeInUpBig; -} - -@-webkit-keyframes fadeOut { - from { - opacity: 1; - } - - to { - opacity: 0; - } -} - -@keyframes fadeOut { - from { - opacity: 1; - } - - to { - opacity: 0; - } -} - -.fadeOut { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} - -@-webkit-keyframes fadeOutDown { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} - -@keyframes fadeOutDown { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} - -.fadeOutDown { - -webkit-animation-name: fadeOutDown; - animation-name: fadeOutDown; -} - -@-webkit-keyframes fadeOutDownBig { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} - -@keyframes fadeOutDownBig { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, 2000px, 0); - transform: translate3d(0, 2000px, 0); - } -} - -.fadeOutDownBig { - -webkit-animation-name: fadeOutDownBig; - animation-name: fadeOutDownBig; -} - -@-webkit-keyframes fadeOutLeft { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} - -@keyframes fadeOutLeft { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} - -.fadeOutLeft { - -webkit-animation-name: fadeOutLeft; - animation-name: fadeOutLeft; -} - -@-webkit-keyframes fadeOutLeftBig { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} - -@keyframes fadeOutLeftBig { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(-2000px, 0, 0); - transform: translate3d(-2000px, 0, 0); - } -} - -.fadeOutLeftBig { - -webkit-animation-name: fadeOutLeftBig; - animation-name: fadeOutLeftBig; -} - -@-webkit-keyframes fadeOutRight { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} - -@keyframes fadeOutRight { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} - -.fadeOutRight { - -webkit-animation-name: fadeOutRight; - animation-name: fadeOutRight; -} - -@-webkit-keyframes fadeOutRightBig { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} - -@keyframes fadeOutRightBig { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(2000px, 0, 0); - transform: translate3d(2000px, 0, 0); - } -} - -.fadeOutRightBig { - -webkit-animation-name: fadeOutRightBig; - animation-name: fadeOutRightBig; -} - -@-webkit-keyframes fadeOutUp { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} - -@keyframes fadeOutUp { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} - -.fadeOutUp { - -webkit-animation-name: fadeOutUp; - animation-name: fadeOutUp; -} - -@-webkit-keyframes fadeOutUpBig { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} - -@keyframes fadeOutUpBig { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(0, -2000px, 0); - transform: translate3d(0, -2000px, 0); - } -} - -.fadeOutUpBig { - -webkit-animation-name: fadeOutUpBig; - animation-name: fadeOutUpBig; -} - -@-webkit-keyframes flip { - from { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) - rotate3d(0, 1, 0, -360deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 40% { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) - rotate3d(0, 1, 0, -190deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) - rotate3d(0, 1, 0, -190deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 50% { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) - rotate3d(0, 1, 0, -170deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) - rotate3d(0, 1, 0, -170deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 80% { - -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) - rotate3d(0, 1, 0, 0deg); - transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) - rotate3d(0, 1, 0, 0deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - to { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) - rotate3d(0, 1, 0, 0deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} - -@keyframes flip { - from { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) - rotate3d(0, 1, 0, -360deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, -360deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 40% { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) - rotate3d(0, 1, 0, -190deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) - rotate3d(0, 1, 0, -190deg); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 50% { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) - rotate3d(0, 1, 0, -170deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 150px) - rotate3d(0, 1, 0, -170deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 80% { - -webkit-transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) - rotate3d(0, 1, 0, 0deg); - transform: perspective(400px) scale3d(0.95, 0.95, 0.95) translate3d(0, 0, 0) - rotate3d(0, 1, 0, 0deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - to { - -webkit-transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) - rotate3d(0, 1, 0, 0deg); - transform: perspective(400px) scale3d(1, 1, 1) translate3d(0, 0, 0) rotate3d(0, 1, 0, 0deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} - -.animated.flip { - -webkit-backface-visibility: visible; - backface-visibility: visible; - -webkit-animation-name: flip; - animation-name: flip; -} - -@-webkit-keyframes flipInX { - from { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 60% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - opacity: 1; - } - - 80% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - } - - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} - -@keyframes flipInX { - from { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 60% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - transform: perspective(400px) rotate3d(1, 0, 0, 10deg); - opacity: 1; - } - - 80% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - transform: perspective(400px) rotate3d(1, 0, 0, -5deg); - } - - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} - -.flipInX { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInX; - animation-name: flipInX; -} - -@-webkit-keyframes flipInY { - from { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 60% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - opacity: 1; - } - - 80% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - } - - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} - -@keyframes flipInY { - from { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - transform: perspective(400px) rotate3d(0, 1, 0, -20deg); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 60% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - transform: perspective(400px) rotate3d(0, 1, 0, 10deg); - opacity: 1; - } - - 80% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - transform: perspective(400px) rotate3d(0, 1, 0, -5deg); - } - - to { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } -} - -.flipInY { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInY; - animation-name: flipInY; -} - -@-webkit-keyframes flipOutX { - from { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - - 30% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - opacity: 1; - } - - to { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - opacity: 0; - } -} - -@keyframes flipOutX { - from { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - - 30% { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - transform: perspective(400px) rotate3d(1, 0, 0, -20deg); - opacity: 1; - } - - to { - -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - transform: perspective(400px) rotate3d(1, 0, 0, 90deg); - opacity: 0; - } -} - -.flipOutX { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-animation-name: flipOutX; - animation-name: flipOutX; - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; -} - -@-webkit-keyframes flipOutY { - from { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - - 30% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - opacity: 1; - } - - to { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - opacity: 0; - } -} - -@keyframes flipOutY { - from { - -webkit-transform: perspective(400px); - transform: perspective(400px); - } - - 30% { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - transform: perspective(400px) rotate3d(0, 1, 0, -15deg); - opacity: 1; - } - - to { - -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - transform: perspective(400px) rotate3d(0, 1, 0, 90deg); - opacity: 0; - } -} - -.flipOutY { - -webkit-animation-duration: 0.75s; - animation-duration: 0.75s; - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipOutY; - animation-name: flipOutY; -} - -@-webkit-keyframes lightSpeedIn { - from { - -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); - transform: translate3d(100%, 0, 0) skewX(-30deg); - opacity: 0; - } - - 60% { - -webkit-transform: skewX(20deg); - transform: skewX(20deg); - opacity: 1; - } - - 80% { - -webkit-transform: skewX(-5deg); - transform: skewX(-5deg); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes lightSpeedIn { - from { - -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); - transform: translate3d(100%, 0, 0) skewX(-30deg); - opacity: 0; - } - - 60% { - -webkit-transform: skewX(20deg); - transform: skewX(20deg); - opacity: 1; - } - - 80% { - -webkit-transform: skewX(-5deg); - transform: skewX(-5deg); - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.lightSpeedIn { - -webkit-animation-name: lightSpeedIn; - animation-name: lightSpeedIn; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; -} - -@-webkit-keyframes lightSpeedOut { - from { - opacity: 1; - } - - to { - -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); - transform: translate3d(100%, 0, 0) skewX(30deg); - opacity: 0; - } -} - -@keyframes lightSpeedOut { - from { - opacity: 1; - } - - to { - -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); - transform: translate3d(100%, 0, 0) skewX(30deg); - opacity: 0; - } -} - -.lightSpeedOut { - -webkit-animation-name: lightSpeedOut; - animation-name: lightSpeedOut; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; -} - -@-webkit-keyframes rotateIn { - from { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate3d(0, 0, 1, -200deg); - transform: rotate3d(0, 0, 1, -200deg); - opacity: 0; - } - - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} - -@keyframes rotateIn { - from { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate3d(0, 0, 1, -200deg); - transform: rotate3d(0, 0, 1, -200deg); - opacity: 0; - } - - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} - -.rotateIn { - -webkit-animation-name: rotateIn; - animation-name: rotateIn; -} - -@-webkit-keyframes rotateInDownLeft { - from { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } - - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} - -@keyframes rotateInDownLeft { - from { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } - - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} - -.rotateInDownLeft { - -webkit-animation-name: rotateInDownLeft; - animation-name: rotateInDownLeft; -} - -@-webkit-keyframes rotateInDownRight { - from { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} - -@keyframes rotateInDownRight { - from { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} - -.rotateInDownRight { - -webkit-animation-name: rotateInDownRight; - animation-name: rotateInDownRight; -} - -@-webkit-keyframes rotateInUpLeft { - from { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} - -@keyframes rotateInUpLeft { - from { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } - - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} - -.rotateInUpLeft { - -webkit-animation-name: rotateInUpLeft; - animation-name: rotateInUpLeft; -} - -@-webkit-keyframes rotateInUpRight { - from { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, -90deg); - transform: rotate3d(0, 0, 1, -90deg); - opacity: 0; - } - - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} - -@keyframes rotateInUpRight { - from { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, -90deg); - transform: rotate3d(0, 0, 1, -90deg); - opacity: 0; - } - - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - opacity: 1; - } -} - -.rotateInUpRight { - -webkit-animation-name: rotateInUpRight; - animation-name: rotateInUpRight; -} - -@-webkit-keyframes rotateOut { - from { - -webkit-transform-origin: center; - transform-origin: center; - opacity: 1; - } - - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate3d(0, 0, 1, 200deg); - transform: rotate3d(0, 0, 1, 200deg); - opacity: 0; - } -} - -@keyframes rotateOut { - from { - -webkit-transform-origin: center; - transform-origin: center; - opacity: 1; - } - - to { - -webkit-transform-origin: center; - transform-origin: center; - -webkit-transform: rotate3d(0, 0, 1, 200deg); - transform: rotate3d(0, 0, 1, 200deg); - opacity: 0; - } -} - -.rotateOut { - -webkit-animation-name: rotateOut; - animation-name: rotateOut; -} - -@-webkit-keyframes rotateOutDownLeft { - from { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } -} - -@keyframes rotateOutDownLeft { - from { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - opacity: 0; - } -} - -.rotateOutDownLeft { - -webkit-animation-name: rotateOutDownLeft; - animation-name: rotateOutDownLeft; -} - -@-webkit-keyframes rotateOutDownRight { - from { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} - -@keyframes rotateOutDownRight { - from { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} - -.rotateOutDownRight { - -webkit-animation-name: rotateOutDownRight; - animation-name: rotateOutDownRight; -} - -@-webkit-keyframes rotateOutUpLeft { - from { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} - -@keyframes rotateOutUpLeft { - from { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - opacity: 1; - } - - to { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - opacity: 0; - } -} - -.rotateOutUpLeft { - -webkit-animation-name: rotateOutUpLeft; - animation-name: rotateOutUpLeft; -} - -@-webkit-keyframes rotateOutUpRight { - from { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, 90deg); - transform: rotate3d(0, 0, 1, 90deg); - opacity: 0; - } -} - -@keyframes rotateOutUpRight { - from { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - opacity: 1; - } - - to { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate3d(0, 0, 1, 90deg); - transform: rotate3d(0, 0, 1, 90deg); - opacity: 0; - } -} - -.rotateOutUpRight { - -webkit-animation-name: rotateOutUpRight; - animation-name: rotateOutUpRight; -} - -@-webkit-keyframes hinge { - 0% { - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 20%, - 60% { - -webkit-transform: rotate3d(0, 0, 1, 80deg); - transform: rotate3d(0, 0, 1, 80deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 40%, - 80% { - -webkit-transform: rotate3d(0, 0, 1, 60deg); - transform: rotate3d(0, 0, 1, 60deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - opacity: 1; - } - - to { - -webkit-transform: translate3d(0, 700px, 0); - transform: translate3d(0, 700px, 0); - opacity: 0; - } -} - -@keyframes hinge { - 0% { - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 20%, - 60% { - -webkit-transform: rotate3d(0, 0, 1, 80deg); - transform: rotate3d(0, 0, 1, 80deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 40%, - 80% { - -webkit-transform: rotate3d(0, 0, 1, 60deg); - transform: rotate3d(0, 0, 1, 60deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - opacity: 1; - } - - to { - -webkit-transform: translate3d(0, 700px, 0); - transform: translate3d(0, 700px, 0); - opacity: 0; - } -} - -.hinge { - -webkit-animation-duration: 2s; - animation-duration: 2s; - -webkit-animation-name: hinge; - animation-name: hinge; -} - -@-webkit-keyframes jackInTheBox { - from { - opacity: 0; - -webkit-transform: scale(0.1) rotate(30deg); - transform: scale(0.1) rotate(30deg); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - } - - 50% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - - 70% { - -webkit-transform: rotate(3deg); - transform: rotate(3deg); - } - - to { - opacity: 1; - -webkit-transform: scale(1); - transform: scale(1); - } -} - -@keyframes jackInTheBox { - from { - opacity: 0; - -webkit-transform: scale(0.1) rotate(30deg); - transform: scale(0.1) rotate(30deg); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - } - - 50% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - - 70% { - -webkit-transform: rotate(3deg); - transform: rotate(3deg); - } - - to { - opacity: 1; - -webkit-transform: scale(1); - transform: scale(1); - } -} - -.jackInTheBox { - -webkit-animation-name: jackInTheBox; - animation-name: jackInTheBox; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes rollIn { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes rollIn { - from { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); - } - - to { - opacity: 1; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.rollIn { - -webkit-animation-name: rollIn; - animation-name: rollIn; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes rollOut { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - } -} - -@keyframes rollOut { - from { - opacity: 1; - } - - to { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); - } -} - -.rollOut { - -webkit-animation-name: rollOut; - animation-name: rollOut; -} - -@-webkit-keyframes zoomIn { - from { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - - 50% { - opacity: 1; - } -} - -@keyframes zoomIn { - from { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - - 50% { - opacity: 1; - } -} - -.zoomIn { - -webkit-animation-name: zoomIn; - animation-name: zoomIn; -} - -@-webkit-keyframes zoomInDown { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -@keyframes zoomInDown { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -.zoomInDown { - -webkit-animation-name: zoomInDown; - animation-name: zoomInDown; -} - -@-webkit-keyframes zoomInLeft { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -@keyframes zoomInLeft { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(-1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -.zoomInLeft { - -webkit-animation-name: zoomInLeft; - animation-name: zoomInLeft; -} - -@-webkit-keyframes zoomInRight { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -@keyframes zoomInRight { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(1000px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-10px, 0, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -.zoomInRight { - -webkit-animation-name: zoomInRight; - animation-name: zoomInRight; -} - -@-webkit-keyframes zoomInUp { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -@keyframes zoomInUp { - from { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 1000px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - 60% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -.zoomInUp { - -webkit-animation-name: zoomInUp; - animation-name: zoomInUp; -} - -@-webkit-keyframes zoomOut { - from { - opacity: 1; - } - - 50% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - - to { - opacity: 0; - } -} - -@keyframes zoomOut { - from { - opacity: 1; - } - - 50% { - opacity: 0; - -webkit-transform: scale3d(0.3, 0.3, 0.3); - transform: scale3d(0.3, 0.3, 0.3); - } - - to { - opacity: 0; - } -} - -.zoomOut { - -webkit-animation-name: zoomOut; - animation-name: zoomOut; -} - -@-webkit-keyframes zoomOutDown { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -@keyframes zoomOutDown { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, -60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, 2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -.zoomOutDown { - -webkit-animation-name: zoomOutDown; - animation-name: zoomOutDown; -} - -@-webkit-keyframes zoomOutLeft { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - } - - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); - transform: scale(0.1) translate3d(-2000px, 0, 0); - -webkit-transform-origin: left center; - transform-origin: left center; - } -} - -@keyframes zoomOutLeft { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(42px, 0, 0); - } - - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(-2000px, 0, 0); - transform: scale(0.1) translate3d(-2000px, 0, 0); - -webkit-transform-origin: left center; - transform-origin: left center; - } -} - -.zoomOutLeft { - -webkit-animation-name: zoomOutLeft; - animation-name: zoomOutLeft; -} - -@-webkit-keyframes zoomOutRight { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - } - - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); - transform: scale(0.1) translate3d(2000px, 0, 0); - -webkit-transform-origin: right center; - transform-origin: right center; - } -} - -@keyframes zoomOutRight { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(-42px, 0, 0); - } - - to { - opacity: 0; - -webkit-transform: scale(0.1) translate3d(2000px, 0, 0); - transform: scale(0.1) translate3d(2000px, 0, 0); - -webkit-transform-origin: right center; - transform-origin: right center; - } -} - -.zoomOutRight { - -webkit-animation-name: zoomOutRight; - animation-name: zoomOutRight; -} - -@-webkit-keyframes zoomOutUp { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -@keyframes zoomOutUp { - 40% { - opacity: 1; - -webkit-transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - transform: scale3d(0.475, 0.475, 0.475) translate3d(0, 60px, 0); - -webkit-animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - animation-timing-function: cubic-bezier(0.55, 0.055, 0.675, 0.19); - } - - to { - opacity: 0; - -webkit-transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - transform: scale3d(0.1, 0.1, 0.1) translate3d(0, -2000px, 0); - -webkit-transform-origin: center bottom; - transform-origin: center bottom; - -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - animation-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1); - } -} - -.zoomOutUp { - -webkit-animation-name: zoomOutUp; - animation-name: zoomOutUp; -} - -@-webkit-keyframes slideInDown { - from { - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - visibility: visible; - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes slideInDown { - from { - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - visibility: visible; - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.slideInDown { - -webkit-animation-name: slideInDown; - animation-name: slideInDown; -} - -@-webkit-keyframes slideInLeft { - from { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - visibility: visible; - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes slideInLeft { - from { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - visibility: visible; - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.slideInLeft { - -webkit-animation-name: slideInLeft; - animation-name: slideInLeft; -} - -@-webkit-keyframes slideInRight { - from { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - visibility: visible; - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes slideInRight { - from { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - visibility: visible; - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.slideInRight { - -webkit-animation-name: slideInRight; - animation-name: slideInRight; -} - -@-webkit-keyframes slideInUp { - from { - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - visibility: visible; - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -@keyframes slideInUp { - from { - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - visibility: visible; - } - - to { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} - -.slideInUp { - -webkit-animation-name: slideInUp; - animation-name: slideInUp; -} - -@-webkit-keyframes slideOutDown { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - to { - visibility: hidden; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} - -@keyframes slideOutDown { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - to { - visibility: hidden; - -webkit-transform: translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0); - } -} - -.slideOutDown { - -webkit-animation-name: slideOutDown; - animation-name: slideOutDown; -} - -@-webkit-keyframes slideOutLeft { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - to { - visibility: hidden; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} - -@keyframes slideOutLeft { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - to { - visibility: hidden; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } -} - -.slideOutLeft { - -webkit-animation-name: slideOutLeft; - animation-name: slideOutLeft; -} - -@-webkit-keyframes slideOutRight { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - to { - visibility: hidden; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} - -@keyframes slideOutRight { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - to { - visibility: hidden; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } -} - -.slideOutRight { - -webkit-animation-name: slideOutRight; - animation-name: slideOutRight; -} - -@-webkit-keyframes slideOutUp { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - to { - visibility: hidden; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} - -@keyframes slideOutUp { - from { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } - - to { - visibility: hidden; - -webkit-transform: translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0); - } -} - -.slideOutUp { - -webkit-animation-name: slideOutUp; - animation-name: slideOutUp; -} - -.animated { - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} - -.animated.infinite { - -webkit-animation-iteration-count: infinite; - animation-iteration-count: infinite; -} - -.animated.delay-1s { - -webkit-animation-delay: 1s; - animation-delay: 1s; -} - -.animated.delay-2s { - -webkit-animation-delay: 2s; - animation-delay: 2s; -} - -.animated.delay-3s { - -webkit-animation-delay: 3s; - animation-delay: 3s; -} - -.animated.delay-4s { - -webkit-animation-delay: 4s; - animation-delay: 4s; -} - -.animated.delay-5s { - -webkit-animation-delay: 5s; - animation-delay: 5s; -} - -.animated.fast { - -webkit-animation-duration: 800ms; - animation-duration: 800ms; -} - -.animated.faster { - -webkit-animation-duration: 500ms; - animation-duration: 500ms; -} - -.animated.slow { - -webkit-animation-duration: 2s; - animation-duration: 2s; -} - -.animated.slower { - -webkit-animation-duration: 3s; - animation-duration: 3s; -} - -@media (print), (prefers-reduced-motion: reduce) { - .animated { - -webkit-animation-duration: 1ms !important; - animation-duration: 1ms !important; - -webkit-transition-duration: 1ms !important; - transition-duration: 1ms !important; - -webkit-animation-iteration-count: 1 !important; - animation-iteration-count: 1 !important; - } -} \ No newline at end of file diff --git a/smart-admin-web/src/components/active-plate/active-plate.vue b/smart-admin-web/src/components/active-plate/active-plate.vue deleted file mode 100644 index 237e2e05..00000000 --- a/smart-admin-web/src/components/active-plate/active-plate.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/components/charts/bar.vue b/smart-admin-web/src/components/charts/bar.vue deleted file mode 100644 index 49dcd500..00000000 --- a/smart-admin-web/src/components/charts/bar.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - diff --git a/smart-admin-web/src/components/charts/index.js b/smart-admin-web/src/components/charts/index.js deleted file mode 100644 index cd86f348..00000000 --- a/smart-admin-web/src/components/charts/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import ChartPie from './pie.vue'; -import ChartBar from './bar.vue'; -export { ChartPie, ChartBar }; diff --git a/smart-admin-web/src/components/charts/pie.vue b/smart-admin-web/src/components/charts/pie.vue deleted file mode 100644 index 4c4ffc7d..00000000 --- a/smart-admin-web/src/components/charts/pie.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - diff --git a/smart-admin-web/src/components/charts/theme.json b/smart-admin-web/src/components/charts/theme.json deleted file mode 100644 index 909b518a..00000000 --- a/smart-admin-web/src/components/charts/theme.json +++ /dev/null @@ -1,490 +0,0 @@ -{ - "color": [ - "#2d8cf0", - "#19be6b", - "#ff9900", - "#E46CBB", - "#9A66E4", - "#ed3f14" - ], - "backgroundColor": "rgba(0,0,0,0)", - "textStyle": {}, - "title": { - "textStyle": { - "color": "#516b91" - }, - "subtextStyle": { - "color": "#93b7e3" - } - }, - "line": { - "itemStyle": { - "normal": { - "borderWidth": "2" - } - }, - "lineStyle": { - "normal": { - "width": "2" - } - }, - "symbolSize": "6", - "symbol": "emptyCircle", - "smooth": true - }, - "radar": { - "itemStyle": { - "normal": { - "borderWidth": "2" - } - }, - "lineStyle": { - "normal": { - "width": "2" - } - }, - "symbolSize": "6", - "symbol": "emptyCircle", - "smooth": true - }, - "bar": { - "itemStyle": { - "normal": { - "barBorderWidth": 0, - "barBorderColor": "#ccc" - }, - "emphasis": { - "barBorderWidth": 0, - "barBorderColor": "#ccc" - } - } - }, - "pie": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "scatter": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "boxplot": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "parallel": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "sankey": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "funnel": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "gauge": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "candlestick": { - "itemStyle": { - "normal": { - "color": "#edafda", - "color0": "transparent", - "borderColor": "#d680bc", - "borderColor0": "#8fd3e8", - "borderWidth": "2" - } - } - }, - "graph": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - } - }, - "lineStyle": { - "normal": { - "width": 1, - "color": "#aaa" - } - }, - "symbolSize": "6", - "symbol": "emptyCircle", - "smooth": true, - "color": [ - "#2d8cf0", - "#19be6b", - "#f5ae4a", - "#9189d5", - "#56cae2", - "#cbb0e3" - ], - "label": { - "normal": { - "textStyle": { - "color": "#eee" - } - } - } - }, - "map": { - "itemStyle": { - "normal": { - "areaColor": "#f3f3f3", - "borderColor": "#516b91", - "borderWidth": 0.5 - }, - "emphasis": { - "areaColor": "rgba(165,231,240,1)", - "borderColor": "#516b91", - "borderWidth": 1 - } - }, - "label": { - "normal": { - "textStyle": { - "color": "#000" - } - }, - "emphasis": { - "textStyle": { - "color": "rgb(81,107,145)" - } - } - } - }, - "geo": { - "itemStyle": { - "normal": { - "areaColor": "#f3f3f3", - "borderColor": "#516b91", - "borderWidth": 0.5 - }, - "emphasis": { - "areaColor": "rgba(165,231,240,1)", - "borderColor": "#516b91", - "borderWidth": 1 - } - }, - "label": { - "normal": { - "textStyle": { - "color": "#000" - } - }, - "emphasis": { - "textStyle": { - "color": "rgb(81,107,145)" - } - } - } - }, - "categoryAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.05)", - "rgba(200,200,200,0.02)" - ] - } - } - }, - "valueAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.05)", - "rgba(200,200,200,0.02)" - ] - } - } - }, - "logAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.05)", - "rgba(200,200,200,0.02)" - ] - } - } - }, - "timeAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.05)", - "rgba(200,200,200,0.02)" - ] - } - } - }, - "toolbox": { - "iconStyle": { - "normal": { - "borderColor": "#999" - }, - "emphasis": { - "borderColor": "#666" - } - } - }, - "legend": { - "textStyle": { - "color": "#999999" - } - }, - "tooltip": { - "axisPointer": { - "lineStyle": { - "color": "#ccc", - "width": 1 - }, - "crossStyle": { - "color": "#ccc", - "width": 1 - } - } - }, - "timeline": { - "lineStyle": { - "color": "#8fd3e8", - "width": 1 - }, - "itemStyle": { - "normal": { - "color": "#8fd3e8", - "borderWidth": 1 - }, - "emphasis": { - "color": "#8fd3e8" - } - }, - "controlStyle": { - "normal": { - "color": "#8fd3e8", - "borderColor": "#8fd3e8", - "borderWidth": 0.5 - }, - "emphasis": { - "color": "#8fd3e8", - "borderColor": "#8fd3e8", - "borderWidth": 0.5 - } - }, - "checkpointStyle": { - "color": "#8fd3e8", - "borderColor": "rgba(138,124,168,0.37)" - }, - "label": { - "normal": { - "textStyle": { - "color": "#8fd3e8" - } - }, - "emphasis": { - "textStyle": { - "color": "#8fd3e8" - } - } - } - }, - "visualMap": { - "color": [ - "#516b91", - "#59c4e6", - "#a5e7f0" - ] - }, - "dataZoom": { - "backgroundColor": "rgba(0,0,0,0)", - "dataBackgroundColor": "rgba(255,255,255,0.3)", - "fillerColor": "rgba(167,183,204,0.4)", - "handleColor": "#a7b7cc", - "handleSize": "100%", - "textStyle": { - "color": "#333" - } - }, - "markPoint": { - "label": { - "normal": { - "textStyle": { - "color": "#eee" - } - }, - "emphasis": { - "textStyle": { - "color": "#eee" - } - } - } - } -} \ No newline at end of file diff --git a/smart-admin-web/src/components/common-icon/common-icon.vue b/smart-admin-web/src/components/common-icon/common-icon.vue deleted file mode 100644 index 03cbc0e8..00000000 --- a/smart-admin-web/src/components/common-icon/common-icon.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/components/common-icon/index.js b/smart-admin-web/src/components/common-icon/index.js deleted file mode 100644 index ca1bd334..00000000 --- a/smart-admin-web/src/components/common-icon/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import CommonIcon from './common-icon.vue'; -export default CommonIcon; diff --git a/smart-admin-web/src/components/count-to/count-to.vue b/smart-admin-web/src/components/count-to/count-to.vue deleted file mode 100644 index 4c8f274e..00000000 --- a/smart-admin-web/src/components/count-to/count-to.vue +++ /dev/null @@ -1,198 +0,0 @@ - - - diff --git a/smart-admin-web/src/components/count-to/index.js b/smart-admin-web/src/components/count-to/index.js deleted file mode 100644 index 52c7fb88..00000000 --- a/smart-admin-web/src/components/count-to/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import countTo from './count-to.vue'; -export default countTo; diff --git a/smart-admin-web/src/components/count-to/index.less b/smart-admin-web/src/components/count-to/index.less deleted file mode 100644 index e17d7c60..00000000 --- a/smart-admin-web/src/components/count-to/index.less +++ /dev/null @@ -1,10 +0,0 @@ -@prefix: ~"count-to"; - -.@{prefix}-wrapper{ - .content-outer{ - display: inline-block; - .@{prefix}-unit-text{ - font-style: normal; - } - } -} diff --git a/smart-admin-web/src/components/editor/editor.vue b/smart-admin-web/src/components/editor/editor.vue deleted file mode 100644 index da3123dc..00000000 --- a/smart-admin-web/src/components/editor/editor.vue +++ /dev/null @@ -1,77 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/components/editor/index.js b/smart-admin-web/src/components/editor/index.js deleted file mode 100644 index 58c0cd58..00000000 --- a/smart-admin-web/src/components/editor/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import Editor from './editor.vue'; -export default Editor; diff --git a/smart-admin-web/src/components/employee/employee-selector.vue b/smart-admin-web/src/components/employee/employee-selector.vue deleted file mode 100644 index a55f140a..00000000 --- a/smart-admin-web/src/components/employee/employee-selector.vue +++ /dev/null @@ -1,54 +0,0 @@ - - \ No newline at end of file diff --git a/smart-admin-web/src/components/icons/icons.vue b/smart-admin-web/src/components/icons/icons.vue deleted file mode 100644 index 08112f96..00000000 --- a/smart-admin-web/src/components/icons/icons.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/components/icons/index.js b/smart-admin-web/src/components/icons/index.js deleted file mode 100644 index 9bce89b3..00000000 --- a/smart-admin-web/src/components/icons/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import Icons from './icons.vue'; -export default Icons; diff --git a/smart-admin-web/src/components/main/components/a-back-top/index.js b/smart-admin-web/src/components/main/components/a-back-top/index.js deleted file mode 100644 index 7c87382d..00000000 --- a/smart-admin-web/src/components/main/components/a-back-top/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import ABackTop from './index.vue'; -export default ABackTop; diff --git a/smart-admin-web/src/components/main/components/a-back-top/index.vue b/smart-admin-web/src/components/main/components/a-back-top/index.vue deleted file mode 100644 index e13c5621..00000000 --- a/smart-admin-web/src/components/main/components/a-back-top/index.vue +++ /dev/null @@ -1,130 +0,0 @@ - - diff --git a/smart-admin-web/src/components/main/components/fullscreen/fullscreen.vue b/smart-admin-web/src/components/main/components/fullscreen/fullscreen.vue deleted file mode 100644 index b5fb231c..00000000 --- a/smart-admin-web/src/components/main/components/fullscreen/fullscreen.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/components/main/components/fullscreen/index.js b/smart-admin-web/src/components/main/components/fullscreen/index.js deleted file mode 100644 index 45c287e9..00000000 --- a/smart-admin-web/src/components/main/components/fullscreen/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import Fullscreen from './fullscreen.vue'; -export default Fullscreen; diff --git a/smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less b/smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less deleted file mode 100644 index 1ace1eb8..00000000 --- a/smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.less +++ /dev/null @@ -1,4 +0,0 @@ -.custom-bread-crumb{ - display: inline-block; - vertical-align: top; -} diff --git a/smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue b/smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue deleted file mode 100644 index 9d1fc5d7..00000000 --- a/smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/custom-bread-crumb.vue +++ /dev/null @@ -1,44 +0,0 @@ - - diff --git a/smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/index.js b/smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/index.js deleted file mode 100644 index a360517d..00000000 --- a/smart-admin-web/src/components/main/components/header-bar/custom-bread-crumb/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import customBreadCrumb from './custom-bread-crumb.vue'; -export default customBreadCrumb; diff --git a/smart-admin-web/src/components/main/components/header-bar/header-bar.less b/smart-admin-web/src/components/main/components/header-bar/header-bar.less deleted file mode 100644 index 9c62d564..00000000 --- a/smart-admin-web/src/components/main/components/header-bar/header-bar.less +++ /dev/null @@ -1,19 +0,0 @@ -.header-bar{ - width: 100%; - height: 100%; - position: relative; - .custom-content-con{ - float: right; - height: auto; - padding-right: 20px; - // line-height: 64px; - & > *{ - float: right; - } - } -} - - -.step-bottom-btn{ - width: 380px !important; -} diff --git a/smart-admin-web/src/components/main/components/header-bar/header-bar.vue b/smart-admin-web/src/components/main/components/header-bar/header-bar.vue deleted file mode 100644 index 059b69c4..00000000 --- a/smart-admin-web/src/components/main/components/header-bar/header-bar.vue +++ /dev/null @@ -1,106 +0,0 @@ - - - - diff --git a/smart-admin-web/src/components/main/components/header-bar/index.js b/smart-admin-web/src/components/main/components/header-bar/index.js deleted file mode 100644 index 7559bb43..00000000 --- a/smart-admin-web/src/components/main/components/header-bar/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import HeaderBar from './header-bar'; -export default HeaderBar; diff --git a/smart-admin-web/src/components/main/components/header-bar/sider-trigger/index.js b/smart-admin-web/src/components/main/components/header-bar/sider-trigger/index.js deleted file mode 100644 index e474a26d..00000000 --- a/smart-admin-web/src/components/main/components/header-bar/sider-trigger/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import siderTrigger from './sider-trigger.vue'; -export default siderTrigger; diff --git a/smart-admin-web/src/components/main/components/header-bar/sider-trigger/sider-trigger.less b/smart-admin-web/src/components/main/components/header-bar/sider-trigger/sider-trigger.less deleted file mode 100644 index bb852980..00000000 --- a/smart-admin-web/src/components/main/components/header-bar/sider-trigger/sider-trigger.less +++ /dev/null @@ -1,21 +0,0 @@ -.trans{ - transition: transform .2s ease; -} -@size: 40px; -.sider-trigger-a{ - padding: 6px; - width: @size; - height: @size; - display: inline-block; - text-align: center; - color: #5c6b77; - margin-top: 10px; - i{ - .trans; - vertical-align: top; - } - &.collapsed i{ - transform: rotateZ(180deg); - .trans; - } -} diff --git a/smart-admin-web/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue b/smart-admin-web/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue deleted file mode 100644 index 71971884..00000000 --- a/smart-admin-web/src/components/main/components/header-bar/sider-trigger/sider-trigger.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - diff --git a/smart-admin-web/src/components/main/components/language/index.js b/smart-admin-web/src/components/main/components/language/index.js deleted file mode 100644 index 74d5e61b..00000000 --- a/smart-admin-web/src/components/main/components/language/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import Language from './language.vue'; -export default Language; diff --git a/smart-admin-web/src/components/main/components/language/language.vue b/smart-admin-web/src/components/main/components/language/language.vue deleted file mode 100644 index 29a8cbb0..00000000 --- a/smart-admin-web/src/components/main/components/language/language.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - diff --git a/smart-admin-web/src/components/main/components/notice/notice.vue b/smart-admin-web/src/components/main/components/notice/notice.vue deleted file mode 100644 index 337d09ae..00000000 --- a/smart-admin-web/src/components/main/components/notice/notice.vue +++ /dev/null @@ -1,371 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/components/main/components/side-menu/collapsed-menu.vue b/smart-admin-web/src/components/main/components/side-menu/collapsed-menu.vue deleted file mode 100644 index 6011e12b..00000000 --- a/smart-admin-web/src/components/main/components/side-menu/collapsed-menu.vue +++ /dev/null @@ -1,84 +0,0 @@ - - diff --git a/smart-admin-web/src/components/main/components/side-menu/index.js b/smart-admin-web/src/components/main/components/side-menu/index.js deleted file mode 100644 index 4a51d599..00000000 --- a/smart-admin-web/src/components/main/components/side-menu/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import SideMenu from './side-menu.vue'; -export default SideMenu; diff --git a/smart-admin-web/src/components/main/components/side-menu/item-mixin.js b/smart-admin-web/src/components/main/components/side-menu/item-mixin.js deleted file mode 100644 index 921342fe..00000000 --- a/smart-admin-web/src/components/main/components/side-menu/item-mixin.js +++ /dev/null @@ -1,30 +0,0 @@ -export default { - props: { - // 父文件 - parentItem: { - type: Object, - default: () => { } - }, - // 主题 - theme: { - type: String, - require: false - }, - // 图标尺寸 - iconSize: { - type: Number, - require: false - } - }, - computed: { - parentName () { - return this.parentItem.name; - }, - children () { - return this.parentItem.children; - }, - textColor () { - return this.theme === 'dark' ? '#fff' : '#495060'; - } - } -}; diff --git a/smart-admin-web/src/components/main/components/side-menu/mixin.js b/smart-admin-web/src/components/main/components/side-menu/mixin.js deleted file mode 100644 index 770d5bb6..00000000 --- a/smart-admin-web/src/components/main/components/side-menu/mixin.js +++ /dev/null @@ -1,18 +0,0 @@ -import CommonIcon from '_c/common-icon'; -import { showTitle } from '@/lib/menu-func'; -export default { - components: { - CommonIcon - }, - methods: { - showTitle (item) { - return showTitle(item, this); - }, - showChildren (item) { - return item.children && (item.children.length > 0 || (item.meta && item.meta.showAlways)); - }, - getNameOrHref (item, children0) { - return item.href ? `isTurnByHref_${item.href}` : (children0 ? item.children[0].name : item.name); - } - } -}; diff --git a/smart-admin-web/src/components/main/components/side-menu/side-menu-item.vue b/smart-admin-web/src/components/main/components/side-menu/side-menu-item.vue deleted file mode 100644 index d236b7a5..00000000 --- a/smart-admin-web/src/components/main/components/side-menu/side-menu-item.vue +++ /dev/null @@ -1,35 +0,0 @@ - - diff --git a/smart-admin-web/src/components/main/components/side-menu/side-menu.less b/smart-admin-web/src/components/main/components/side-menu/side-menu.less deleted file mode 100644 index e50fae79..00000000 --- a/smart-admin-web/src/components/main/components/side-menu/side-menu.less +++ /dev/null @@ -1,39 +0,0 @@ -.side-menu-wrapper{ - user-select: none; - .menu-collapsed{ - padding-top: 10px; - - .ivu-dropdown{ - .ivu-dropdown-rel a{ - width: 100%; - } - } - .ivu-tooltip{ - width: 100%; - .ivu-tooltip-rel{ - width: 100%; - } - .ivu-tooltip-popper .ivu-tooltip-content{ - .ivu-tooltip-arrow{ - border-right-color: #fff; - } - .ivu-tooltip-inner{ - background: #fff; - color: #495060; - } - } - } - - - } - a.drop-menu-a{ - display: inline-block; - padding: 6px 15px; - width: 100%; - text-align: center; - color: #495060; - } -} -.menu-title{ - padding-left: 6px; -} diff --git a/smart-admin-web/src/components/main/components/side-menu/side-menu.vue b/smart-admin-web/src/components/main/components/side-menu/side-menu.vue deleted file mode 100644 index ceccb359..00000000 --- a/smart-admin-web/src/components/main/components/side-menu/side-menu.vue +++ /dev/null @@ -1,197 +0,0 @@ - - - diff --git a/smart-admin-web/src/components/main/components/tags-nav/index.js b/smart-admin-web/src/components/main/components/tags-nav/index.js deleted file mode 100644 index 56d2f1c2..00000000 --- a/smart-admin-web/src/components/main/components/tags-nav/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import TagsNav from './tags-nav.vue'; -export default TagsNav; diff --git a/smart-admin-web/src/components/main/components/tags-nav/tags-nav.less b/smart-admin-web/src/components/main/components/tags-nav/tags-nav.less deleted file mode 100644 index ddb05134..00000000 --- a/smart-admin-web/src/components/main/components/tags-nav/tags-nav.less +++ /dev/null @@ -1,136 +0,0 @@ -.no-select{ - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} -.size{ - height: 100%; -} -.tags-nav{ - position: relative; - margin:0 auto; - // border-top: 1px solid #F0F0F0; - // border-bottom: 1px solid #F0F0F0; - background: #f4f6f8; - padding:0 20px; - - .no-select; - .size; - .close-con{ - position: absolute; - right: 0; - top: 5px; - height: 30px; - width: 42px; - background: #f3f5f7; - text-align: center; - z-index: 10; - margin-top:5px; - - border-top: 1px solid #F5F7FC; - border-bottom: 1px solid #F5F7FC; - i{ - color:#666666; - } - button{ - margin-top:3px; - - } - } - .btn-con{ - margin-top:10px; - position: absolute; - top: 0px; - height: 30px; - line-height: 30px; - // padding:0 10px; - background: #f3f5f7; - z-index: 10; - - button{ - position: relative; - top:-1px; - line-height: 14px; - text-align: center; - color:#666666; - - } - &.left-btn{ - left: 0px; - border: 1px solid #F5F7FC; - } - &.right-btn{ - right: 42px; - border: 1px solid #F5F7FC; - } - } - .scroll-outer{ - position: absolute; - left: 52px; - right: 61px; - top: 0; - bottom: 0; - padding:10px 0; - .scroll-body{ - display: inline-block; - position: absolute; - box-shadow: border-box; - overflow: visible; - white-space: nowrap; - transition: left .3s ease; - .ivu-tag{ - height:34px; - margin:0; - } - .ivu-tag{ - // min-width:10px; - height:30px; - line-height: 30px; - border-radius: 3px; - padding:0 10px; - background: #fff!important; - border:none; - text-align: center; - color:#1C2B36; - font-size: 14px; - margin:0 5px; - span{ - color:#1C2B36!important; - padding:0 5px; - } - i{ - color:#1C2B36!important; - font-size: 4px; - } - } - .ivu-tag-primary{ - transition: background .2s ease; - background: #2D8CF0!important; - span,i{ - color:#fff!important; - } - } - } - } - .contextmenu { - position: absolute; - margin: 0; - padding: 5px 0; - background: #fff; - z-index: 1000; - list-style-type: none; - border-radius: 3px; - box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, .1); - li { - margin: 0; - padding: 5px 15px; - cursor: pointer; - &:hover { - background: #eee; - } - } - } -} diff --git a/smart-admin-web/src/components/main/components/tags-nav/tags-nav.vue b/smart-admin-web/src/components/main/components/tags-nav/tags-nav.vue deleted file mode 100644 index 00909fa0..00000000 --- a/smart-admin-web/src/components/main/components/tags-nav/tags-nav.vue +++ /dev/null @@ -1,256 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/components/main/components/user/index.js b/smart-admin-web/src/components/main/components/user/index.js deleted file mode 100644 index 54d7ca0b..00000000 --- a/smart-admin-web/src/components/main/components/user/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import User from './user.vue'; -export default User; diff --git a/smart-admin-web/src/components/main/components/user/user.less b/smart-admin-web/src/components/main/components/user/user.less deleted file mode 100644 index 9c5eeba7..00000000 --- a/smart-admin-web/src/components/main/components/user/user.less +++ /dev/null @@ -1,25 +0,0 @@ -.user-avatar-dropdown{ - padding-left:20px; - color:#909ca4; - .dropdown-arrows{ - margin:0 10px; - } - .head{ - position: relative; - top:-2px; - } -} -.user{ - - &-avatar-dropdown{ - cursor: pointer; - display: inline-block; - // height: 64px; - vertical-align: middle; - // line-height: 64px; - .ivu-badge-dot{ - top: 16px; - } - } - -} diff --git a/smart-admin-web/src/components/main/components/user/user.vue b/smart-admin-web/src/components/main/components/user/user.vue deleted file mode 100644 index d7f0324a..00000000 --- a/smart-admin-web/src/components/main/components/user/user.vue +++ /dev/null @@ -1,131 +0,0 @@ - - - - diff --git a/smart-admin-web/src/components/main/index.js b/smart-admin-web/src/components/main/index.js deleted file mode 100644 index 87be9ddf..00000000 --- a/smart-admin-web/src/components/main/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import Main from './main.vue'; -export default Main; diff --git a/smart-admin-web/src/components/main/main.less b/smart-admin-web/src/components/main/main.less deleted file mode 100644 index 588e8c13..00000000 --- a/smart-admin-web/src/components/main/main.less +++ /dev/null @@ -1,129 +0,0 @@ -//滚动条样式 -.scrollbar(@width: 2px){ - &::-webkit-scrollbar { width: @width; height: 8px; } - &::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box-shadow: inset 0 0 5px rgb(185, 185, 185); background: #c7c5c8; } - &::-webkit-scrollbar-track { border-radius: 0; background: #ddd; } -} -.no-scrollbar{ - &::-webkit-scrollbar {display:none} -} -.main{ - .scrollbar, - .ivu-table-overflowX, - .content-wrapper, - .w-e-text{ - .scrollbar; - } - iframe body{ - .scrollbar; - } - .logo-con{ - padding: 19px 10px 15px 5px; - &.collapsed{ - padding: 19px 0 15px; - text-align: center; - } - } - .menu-dropdown{ - margin-left: 200px; - } - .search-bar{ - padding:0 14px; - margin-bottom: 20px; - &.collapsed{ - padding:0 12px; - i{ - width: 40px; - - } - } - input{ - width: 100%; - height:36px; - background: #152a3a; - color:#44505c; - font-size: 14px; - outline: none; - - &::placeholder{ - color:#44505c; - } - &:focus{ - border:none; - outline: none; - background: #fff; - } - border:none; - } - i{ - line-height: 36px; - color:#44505c; - } - } - .header-con{ - background: #fff; - padding: 0 10px; - width: 100%; - } - .main-layout-con{ - height: 100%; - overflow: hidden; - } - .main-content-con{ - height: ~"calc(100% - 60px)"; - overflow: hidden; - } - .tag-nav-wrapper{ - padding: 0; - height:50px; - // background:#F0F0F0; - } - .content-wrapper{ - padding: 0 18px 18px; - height: ~"calc(100% - 80px)"; - overflow: auto; - } - .left-sider{ - .ivu-layout-sider-children{ - overflow-y: scroll; - margin-right: -18px; - } - } -} -.ivu-menu-light.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu):after{ - right: inherit; left: 0; -} -.ivu-menu-item > i{ - margin-right: 12px !important; -} -.ivu-menu-submenu > .ivu-menu > .ivu-menu-item > i { - margin-right: 8px !important; -} -.collased-menu-dropdown{ - width: 100%; - margin: 0; - line-height: normal; - padding: 7px 0 6px 16px; - clear: both; - font-size: 12px !important; - white-space: nowrap; - list-style: none; - cursor: pointer; - transition: background 0.2s ease-in-out; - &:hover{ - background: rgba(100, 100, 100, 0.1); - } - & * { - color: #515a6e; - } - .ivu-menu-item > i{ - margin-right: 12px !important; - } - .ivu-menu-submenu > .ivu-menu > .ivu-menu-item > i { - margin-right: 8px !important; - } -} - -.ivu-select-dropdown.ivu-dropdown-transfer{ - max-height: 400px; -} diff --git a/smart-admin-web/src/components/main/main.vue b/smart-admin-web/src/components/main/main.vue deleted file mode 100644 index 0be9f2c1..00000000 --- a/smart-admin-web/src/components/main/main.vue +++ /dev/null @@ -1,533 +0,0 @@ - - - diff --git a/smart-admin-web/src/components/smart-admin-ad/ad.vue b/smart-admin-web/src/components/smart-admin-ad/ad.vue deleted file mode 100644 index 43f2d9e1..00000000 --- a/smart-admin-web/src/components/smart-admin-ad/ad.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - diff --git a/smart-admin-web/src/components/smart-admin-ad/index.js b/smart-admin-web/src/components/smart-admin-ad/index.js deleted file mode 100644 index f0b0e3fb..00000000 --- a/smart-admin-web/src/components/smart-admin-ad/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import Ad from './ad.vue'; -export default Ad; diff --git a/smart-admin-web/src/components/tables/edit.vue b/smart-admin-web/src/components/tables/edit.vue deleted file mode 100644 index 55c142ac..00000000 --- a/smart-admin-web/src/components/tables/edit.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/components/tables/handle-btns.js b/smart-admin-web/src/components/tables/handle-btns.js deleted file mode 100644 index 7254b3e1..00000000 --- a/smart-admin-web/src/components/tables/handle-btns.js +++ /dev/null @@ -1,70 +0,0 @@ -// 验证 -const validate = { - operation: (params) => { - if (params.operation === 0) { - return false; - } - return true; - }, - audit: (params) => { - if (params.audit === 0) { - return false; - } - return true; - } -}; -const btns = { - // 删除:需要判定 - delete: (h, params, vm) => { - let disabledFlag = false; - return h('Tooltip', { - props: { - content: '删除', - placement: 'top', - transfer: true - } - }, [h('Button', { - props: { - type: 'error', - size: 'small', - icon: 'md-trash', - disabled: disabledFlag - }, - style: { - marginRight: '5px' - }, - on: { - click: () => { - vm.$emit('on-delete', params); - } - } - })]); - }, - edit: (h, params, vm) => { - let disabledFlag = false; - return h('Tooltip', { - props: { - content: '编辑', - placement: 'top', - transfer: true - } - }, [h('Button', { - props: { - type: 'primary', - size: 'small', - icon: 'md-trash', - disabled: disabledFlag - }, - style: { - marginRight: '5px' - }, - on: { - click: () => { - vm.$emit('on-edit', params); - } - } - })]); - } -}; - -export default btns; diff --git a/smart-admin-web/src/components/tables/index.js b/smart-admin-web/src/components/tables/index.js deleted file mode 100644 index 899190c0..00000000 --- a/smart-admin-web/src/components/tables/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import Tables from './tables.vue'; -export default Tables; diff --git a/smart-admin-web/src/components/tables/index.less b/smart-admin-web/src/components/tables/index.less deleted file mode 100644 index 3c352e11..00000000 --- a/smart-admin-web/src/components/tables/index.less +++ /dev/null @@ -1,17 +0,0 @@ -.search-con{ - padding: 10px 0; - .search{ - &-col{ - display: inline-block; - width: 200px; - } - &-input{ - display: inline-block; - width: 200px; - margin-left: 2px; - } - &-btn{ - margin-left: 2px; - } - } -} diff --git a/smart-admin-web/src/components/tables/tables.vue b/smart-admin-web/src/components/tables/tables.vue deleted file mode 100644 index 0c2329b4..00000000 --- a/smart-admin-web/src/components/tables/tables.vue +++ /dev/null @@ -1,342 +0,0 @@ - - - diff --git a/smart-admin-web/src/config/index.js b/smart-admin-web/src/config/index.js deleted file mode 100644 index a80b6815..00000000 --- a/smart-admin-web/src/config/index.js +++ /dev/null @@ -1,38 +0,0 @@ -console.log('api url : ', process.env.VUE_APP_URL); -console.log('websocket url : ', process.env.VUE_APP_SOCKET_URL); -export default { - /** - * @description 配置显示在浏览器标签的title - */ - title: 'Smart-Admin', - /** - * @description token在Cookie中存储的天数,默认1天 - */ - cookieExpires: 3, - /** - * @description 是否使用国际化,默认为false - * 如果不使用,则需要在路由中给需要在菜单中展示的路由设置meta: {title: 'xxx'} - * 用来在菜单中显示文字 - */ - useI18n: false, - /** - * @description api请求基础路径 - */ - baseUrl: { - apiUrl: process.env.VUE_APP_URL, - webSocketUrl: process.env.VUE_APP_SOCKET_URL - }, - /** - * @description 默认打开的首页的路由name值,默认为home - */ - homeName: 'Home', - /** - * @description 需要加载的插件 - */ - plugin: { - 'error-store': { - showInHeader: true, // 设为false后不会在顶部显示错误日志徽标 - developmentOff: true // 设为true后在开发环境不会收集错误信息,方便开发中排查错误 - } - } -}; diff --git a/smart-admin-web/src/constants/file.js b/smart-admin-web/src/constants/file.js deleted file mode 100644 index 6a205f55..00000000 --- a/smart-admin-web/src/constants/file.js +++ /dev/null @@ -1,24 +0,0 @@ -export const FILE_TYPE = { - LOCAL: { - value: 1, - desc: '本地文件服务' - }, - ALI_OSS: { - value: 2, - desc: '阿里OSS文件服务' - }, - QI_NIU_OSS: { - value: 3, - desc: '七牛文件服务' - } -}; -export const SERVICE_TYPE = { - BACK_USER: { - value: '1', - desc: '用户后台' - } -}; -export default { - FILE_TYPE, - SERVICE_TYPE -}; diff --git a/smart-admin-web/src/constants/index.js b/smart-admin-web/src/constants/index.js deleted file mode 100644 index 55101226..00000000 --- a/smart-admin-web/src/constants/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import notice from './notice.js'; -import login from './login.js'; -import file from './file.js'; -import privilege from './privilege'; -export default { - ...notice, - ...login, - ...file, - ...privilege -}; diff --git a/smart-admin-web/src/constants/login.js b/smart-admin-web/src/constants/login.js deleted file mode 100644 index fb28973b..00000000 --- a/smart-admin-web/src/constants/login.js +++ /dev/null @@ -1,13 +0,0 @@ -export const PRIVILEGE_TYPE = { - MENU: { - value: 1, - desc: '是' - }, - POINTS: { - value: 2, - desc: '否' - } -}; -export default { - PRIVILEGE_TYPE -}; diff --git a/smart-admin-web/src/constants/notice.js b/smart-admin-web/src/constants/notice.js deleted file mode 100644 index 0d5315fa..00000000 --- a/smart-admin-web/src/constants/notice.js +++ /dev/null @@ -1,13 +0,0 @@ -export const NOTICE_STATUS = { - YES: { - value: 1, - desc: '是' - }, - NO: { - value: 0, - desc: '否' - } -}; -export default { - NOTICE_STATUS -}; diff --git a/smart-admin-web/src/constants/privilege.js b/smart-admin-web/src/constants/privilege.js deleted file mode 100644 index 885e86d6..00000000 --- a/smart-admin-web/src/constants/privilege.js +++ /dev/null @@ -1,14 +0,0 @@ -export const PRIVILEGE_TYPE_ENUM = { - MENU: { - value: 1, - desc: '菜单' - }, - POINTS: { - value: 2, - desc: '功能点' - } -}; - -export default { - PRIVILEGE_TYPE_ENUM -}; diff --git a/smart-admin-web/src/constants/table-page.js b/smart-admin-web/src/constants/table-page.js deleted file mode 100644 index 83586bfd..00000000 --- a/smart-admin-web/src/constants/table-page.js +++ /dev/null @@ -1,6 +0,0 @@ - -/** - * table分页 每页条数切换的配置 - */ -export const PAGE_SIZE_OPTIONS = [10,20,30,50,75,100,150,200,300,500,1000]; - diff --git a/smart-admin-web/src/directives/directives.js b/smart-admin-web/src/directives/directives.js deleted file mode 100644 index 701eec5d..00000000 --- a/smart-admin-web/src/directives/directives.js +++ /dev/null @@ -1,11 +0,0 @@ -import draggable from './module/draggable'; -import clipboard from './module/clipboard'; -import privilege from './module/privilege'; - -const directives = { - draggable, - clipboard, - privilege -}; - -export default directives; diff --git a/smart-admin-web/src/directives/index.js b/smart-admin-web/src/directives/index.js deleted file mode 100644 index dcc9ffb3..00000000 --- a/smart-admin-web/src/directives/index.js +++ /dev/null @@ -1,31 +0,0 @@ -import directive from './directives'; - -const importDirective = Vue => { - /** - * 拖拽指令 v-draggable="options" - * options = { - * trigger: /这里传入作为拖拽触发器的CSS选择器/, - * body: /这里传入需要移动容器的CSS选择器/, - * recover: /拖动结束之后是否恢复到原来的位置/ - * } - */ - Vue.directive('draggable', directive.draggable); - /** - * clipboard指令 v-draggable="options" - * options = { - * value: /在输入框中使用v-model绑定的值/, - * success: /复制成功后的回调/, - * error: /复制失败后的回调/ - * } - */ - Vue.directive('clipboard', directive.clipboard); - /** - * privilege指令 v-privilege="options" - * options = { - * value: /当前按钮的唯一权限识别/, - * } - */ - Vue.directive('privilege', directive.privilege); -}; - -export default importDirective; diff --git a/smart-admin-web/src/directives/module/clipboard.js b/smart-admin-web/src/directives/module/clipboard.js deleted file mode 100644 index 0684eb61..00000000 --- a/smart-admin-web/src/directives/module/clipboard.js +++ /dev/null @@ -1,30 +0,0 @@ -import Clipboard from 'clipboard'; -export default { - bind: (el, binding) => { - const clipboard = new Clipboard(el, { - text: () => binding.value.value - }); - el.__success_callback__ = binding.value.success; - el.__error_callback__ = binding.value.error; - clipboard.on('success', e => { - const callback = el.__success_callback__; - callback && callback(e); - }); - clipboard.on('error', e => { - const callback = el.__error_callback__; - callback && callback(e); - }); - el.__clipboard__ = clipboard; - }, - update: (el, binding) => { - el.__clipboard__.text = () => binding.value.value; - el.__success_callback__ = binding.value.success; - el.__error_callback__ = binding.value.error; - }, - unbind: (el, binding) => { - delete el.__success_callback__; - delete el.__error_callback__; - el.__clipboard__.destroy(); - delete el.__clipboard__; - } -}; diff --git a/smart-admin-web/src/directives/module/draggable.js b/smart-admin-web/src/directives/module/draggable.js deleted file mode 100644 index 8bf798b3..00000000 --- a/smart-admin-web/src/directives/module/draggable.js +++ /dev/null @@ -1,42 +0,0 @@ -import { on } from '@/lib/util'; -export default { - inserted: (el, binding, vnode) => { - let triggerDom = document.querySelector(binding.value.trigger); - triggerDom.style.cursor = 'move'; - let bodyDom = document.querySelector(binding.value.body); - let pageX = 0; - let pageY = 0; - let transformX = 0; - let transformY = 0; - let canMove = false; - const handleMousedown = e => { - let transform = /\(.*\)/.exec(bodyDom.style.transform); - if (transform) { - transform = transform[0].slice(1, transform[0].length - 1); - let splitxy = transform.split('px, '); - transformX = parseFloat(splitxy[0]); - transformY = parseFloat(splitxy[1].split('px')[0]); - } - pageX = e.pageX; - pageY = e.pageY; - canMove = true; - }; - const handleMousemove = e => { - let xOffset = e.pageX - pageX + transformX; - let yOffset = e.pageY - pageY + transformY; - if (canMove) - {bodyDom.style.transform = `translate(${xOffset}px, ${yOffset}px)`;} - }; - const handleMouseup = e => { - canMove = false; - }; - on(triggerDom, 'mousedown', handleMousedown); - on(document, 'mousemove', handleMousemove); - on(document, 'mouseup', handleMouseup); - }, - update: (el, binding, vnode) => { - if (!binding.value.recover) return; - let bodyDom = document.querySelector(binding.value.body); - bodyDom.style.transform = ''; - } -}; diff --git a/smart-admin-web/src/directives/module/privilege.js b/smart-admin-web/src/directives/module/privilege.js deleted file mode 100644 index d5016721..00000000 --- a/smart-admin-web/src/directives/module/privilege.js +++ /dev/null @@ -1,23 +0,0 @@ -// 页面内按钮过滤 -import store from '@/store/index'; -export default { - inserted: function (el, binding, vnode) { - // 获取当前路由name - // 如果页面为同一模块下的子页面则取最上级权限 - let routeName = vnode.context.$route.meta.privilegeExtend - ? vnode.context.$route.meta.privilegeExtend - : vnode.context.$route.name; - // 超级管理员 - if (store.state.user.userLoginInfo.isSuperMan) { - return true; - } - // 获取功能点权限 - let functionList = store.state.user.privilegeFunctionPointsMap.get(routeName); - // 有权限 - if (functionList && functionList.includes(binding.value)) { - - } else { - el.parentNode.removeChild(el); - } - } -}; diff --git a/smart-admin-web/src/lib/cookie.js b/smart-admin-web/src/lib/cookie.js deleted file mode 100644 index 83386119..00000000 --- a/smart-admin-web/src/lib/cookie.js +++ /dev/null @@ -1,21 +0,0 @@ -import Cookies from 'js-cookie'; -import config from '@/config'; -const { cookieExpires } = config; -export const TOKEN_KEY = 'token'; - -export default { - setToken: token => { - Cookies.set(TOKEN_KEY, token, { - // token在Cookie中存储的天数,默认1天 - expires: cookieExpires || 7 - }); - }, - getToken: () => { - const token = Cookies.get(TOKEN_KEY); - if (token) return token; - else return null; - }, - clearToken: () => { - Cookies.remove(TOKEN_KEY); - } -}; diff --git a/smart-admin-web/src/lib/http.js b/smart-admin-web/src/lib/http.js deleted file mode 100644 index 0223aa7b..00000000 --- a/smart-admin-web/src/lib/http.js +++ /dev/null @@ -1,161 +0,0 @@ -import Axios from 'axios'; -import config from '@/config'; -import { Message, Spin } from 'view-design'; -import cookie from '@/lib/cookie'; -// 之所以封装这个axios,是因为在一些请求中,无法上传信息,很尴尬,估计原因是继承的有问题,无法携带headers -export const baseUrl = config.baseUrl.apiUrl; -export const socketBaseUrl = config.baseUrl.webSocketUrl; - -let axios = Axios.create({ - baseURL: baseUrl, - timeout: 30000, - headers: { - 'Content-Type': 'application/json; charset=utf-8' - } -}); - -axios.interceptors.request.use( - function (config) { - // 在发送请求之前做些什么 - if (cookie.getToken()) { - config.headers['x-access-token'] = cookie.getToken(); - } - return config; - }, - function (error) { - // 对请求错误做些什么 - Spin.hide(); - return Promise.reject(error); - } -); -// 添加响应拦截器 -axios.interceptors.response.use( - res => { - if (res.config.responseType === 'blob') { - let isReturnJson = res.headers && res.headers['content-type'] && res.headers['content-type'].indexOf("json") > -1; - //后端返回错误信息 - if (isReturnJson) { - let reader = new FileReader() - reader.onload = function (event) { - let content = reader.result - let parseRes = JSON.parse(content) // 错误信息 - return validateResponseCode({ - data: parseRes - }); - } - reader.readAsText(res.data); - return true - } else { - //下载文件 - download(res); - } - } else { - //正常json请求 - return validateResponseCode(res); - } - }, - error => { - Spin.hide(); - Message.error('服务内部错误'); - console.log('1111', error); - // 对响应错误做点什么 - return Promise.reject(error); - } -); - -function validateResponseCode (res) { - let { data } = res; - if (data && data.code && data.code !== 1) { - if (data.code === 1001) { - cookie.clearToken(); - localStorage.clear(); - window.location.href = window.location.pathname + '#/login'; - Message.error('未登录,或登录失效,请登录'); - return; - } else if (data.code === 502) { - window.location.href = window.location.pathname + '#/500'; - return; - } else { - Spin.hide(); - Message.error(data.msg); - return Promise.reject(res); - } - } - return Promise.resolve(data); -} - -function blobToText (blob) { - return new Promise((resolve, reject) => { - const fileReader = new FileReader(); - fileReader.readAsText(blob); - fileReader.onload = function () { - try { - const result = JSON.parse(this.result); - if (result && result['resultCode'] === 'fail') { - resolve(result); - } else { - reject(); - } - } catch (e) { - //TODO handle the exception - reject(); - } - } - }) -} - -export const postAxios = (url, data) => { - return axios.post(url, data); -}; - -export const postFileUploadAxios = (url, data) => { - return axios.post(url, data, { headers: { 'Content-Type': 'multipart/form-data' } }); -}; - -export const getDownloadAxios = (url) => { - return axios.get(url, { responseType: 'blob' }); -}; - -export const postDownloadAxios = (url, data) => { - return axios.post(url, data, { responseType: 'blob' }); -}; - -export const getAxios = (url, data) => { - return axios.get(url, { - params: data - }); -}; - -function download (res) { - let reader = new FileReader(); - let data = res.data; - reader.onload = e => { - if (e.target.result.indexOf('Result') != -1 && JSON.parse(e.target.result).Result == false) { - // 进行错误处理 - } else { - let fileName = "download"; - let contentDisposition = res.headers['Content-Disposition']; - contentDisposition = contentDisposition ? contentDisposition : res.headers['content-disposition']; - if (contentDisposition) { - fileName = window.decodeURI(contentDisposition.split('=')[1], "UTF-8"); - } - executeDownload(data, fileName); - } - }; - reader.readAsText(data); -} - -// 模拟点击a 标签进行下载 -function executeDownload (data, fileName) { - if (!data) { - return - } - let url = window.URL.createObjectURL(new Blob([data])); - let link = document.createElement('a'); - link.style.display = 'none'; - link.href = url; - link.setAttribute('download', fileName); - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); -} diff --git a/smart-admin-web/src/lib/local.js b/smart-admin-web/src/lib/local.js deleted file mode 100644 index c19d7e3d..00000000 --- a/smart-admin-web/src/lib/local.js +++ /dev/null @@ -1,8 +0,0 @@ -export const localSave = (key, value) => { - localStorage.setItem(key, value); -}; - -export const localRead = key => { - return localStorage.getItem(key) || ''; -}; - diff --git a/smart-admin-web/src/lib/menu-func.js b/smart-admin-web/src/lib/menu-func.js deleted file mode 100644 index 914d5379..00000000 --- a/smart-admin-web/src/lib/menu-func.js +++ /dev/null @@ -1,276 +0,0 @@ -import { forEach, hasOneOf, objEqual } from '@/lib/util'; -import config from '@/config'; -import { localRead, localSave } from '@/lib/local'; -const { title, useI18n } = config; -export const hasChild = item => { - return item.children && item.children.length !== 0; -}; - -/** - * 通过权限过滤菜单 - * @param {Object} map 权限对象 - * @param {Array} menuList 菜单列表 - * @returns {Array} - */ -export const getShowMenu = (map = {}, menuList, access = false) => { - // 判断是否为超级管理员 - if (access) { - return menuList; - } - // 返回的菜单列表 - let result = []; - for (let menuItem of menuList) { - let routerObj = JSON.parse(JSON.stringify(menuItem)); - if ( - map.hasOwnProperty(menuItem.name) && - (menuItem.name !== 'home' && menuItem.name !== '_home') - ) { - // 判断该菜单权限下是否为数组,若为数组,则为功能点权限否则为子菜单 - if (getType(map[routerObj.name]) === 'array') { - let funcPrivilege = localRead('funcPrivilegeInfo') - ? JSON.parse(localRead('funcPrivilegeInfo')) - : {}; - localSave( - 'funcPrivilegeInfo', - JSON.stringify({ - ...funcPrivilege, - [routerObj.name]: map[routerObj.name] - }) - ); - } else if ( - getType(map[routerObj.name]) !== 'array' && - !routerObj.children - ) { - // 判断是否为二级菜单,若是则需要多枚举一层赋值 - let funcPrivilege = localRead('funcPrivilegeInfo') - ? JSON.parse(localRead('funcPrivilegeInfo')) - : {}; - localSave( - 'funcPrivilegeInfo', - JSON.stringify({ - ...funcPrivilege, - [routerObj.name]: map[routerObj.name][routerObj.name] - }) - ); - } else if ( - getType(map[routerObj.name]) !== 'array' && - routerObj.children - ) { - // 循环子菜单权限 - routerObj.children = getShowMenu( - map[routerObj.name], - routerObj.children - ); - } - result.push(routerObj); - } - } - return result; -}; -// 获取数据类型 -export const getType = obj => { - return {}.toString - .call(obj) - .match(/\s([a-zA-Z]+)/)[1] - .toLowerCase(); -}; - -/** - * @description 本地存储和获取标签导航列表 - */ -export const setTagNavListInLocalStorage = list => { - localStorage.tagNaveList = JSON.stringify(list); -}; -/** - * @returns {Array} 其中的每个元素只包含路由原信息中的name, path, meta三项 - */ -export const getTagNavListFromLocalStorage = () => { - const list = localStorage.tagNaveList; - return list ? JSON.parse(list) : []; -}; -export const getBreadCrumbList = (route, homeRoute) => { - let homeItem = { - ...homeRoute, - icon: homeRoute.meta.icon - }; - let routeMatched = route.matched; - if (routeMatched.some(item => item.name === homeRoute.name)) { - return [homeItem]; - } - let res = routeMatched - .filter(item => { - return item.meta === undefined || !item.meta.hideInBread; - }) - .map(item => { - let meta = { - ...item.meta - }; - if (meta.title && typeof meta.title === 'function') { - meta.__titleIsFunction__ = true; - meta.title = meta.title(route); - } - let obj = { - icon: (item.meta && item.meta.icon) || '', - name: item.name, - meta: meta - }; - return obj; - }); - res = res.filter(item => { - return !item.meta.hideInMenu; - }); - return [...res]; -}; -/** - * @param {Array} routers 路由列表数组 - * @description 用于找到路由列表中name为home的对象 - */ -export const getHomeRoute = (routers, homeName = 'Home') => { - let i = -1; - let len = routers.length; - let homeRoute = {}; - while (++i < len) { - let item = routers[i]; - if (item.children && item.children.length) { - let res = getHomeRoute(item.children, homeName); - if (res.name) return res; - } else { - if (item.name === homeName) homeRoute = item; - } - } - return homeRoute; -}; -/** - * @param {Array} list 标签列表 - * @param {String} name 当前关闭的标签的name - */ -export const getNextRoute = (list, route) => { - let res = {}; - if (list.length === 2) { - res = getHomeRoute(list); - } else { - const index = list.findIndex(item => routeEqual(item, route)); - if (index === list.length - 1) res = list[list.length - 2]; - else res = list[index + 1]; - } - return res; -}; - -/** - * 判断打开的标签列表里是否已存在这个新添加的路由对象 - */ -export const routeHasExist = (tagNavList, routeItem) => { - let len = tagNavList.length; - let res = false; - doCustomTimes(len, index => { - if (routeEqual(tagNavList[index], routeItem)) res = true; - }); - return res; -}; -/** - * @param {*} list 现有标签导航列表 - * @param {*} newRoute 新添加的路由原信息对象 - * @description 如果该newRoute已经存在则不再添加 - */ -export const getNewTagList = (list, newRoute) => { - const { name, path, meta, query } = newRoute; - let newList = [...list]; - let index = newList.findIndex(item => item.name === name); - if (index >= 0) { - newList[index] = { name, path, meta, query }; - } else newList.push({ name, path, meta, query }); - return newList; -}; -export const routeEqual = (route1, route2) => { - return route1.name === route2.name; -}; -export const getRouteTitleHandled = route => { - let router = { - ...route - }; - let meta = { - ...route.meta - }; - let title = ''; - if (meta.title) { - if (typeof meta.title === 'function') { - meta.__titleIsFunction__ = true; - title = meta.title(router); - } else title = meta.title; - } - meta.title = title; - router.meta = meta; - return router; -}; -/** - * @param {Number} times 回调函数需要执行的次数 - * @param {Function} callback 回调函数 - */ -export const doCustomTimes = (times, callback) => { - let i = -1; - while (++i < times) { - callback(i); - } -}; -export const showTitle = (item, vm) => { - let { title, __titleIsFunction__ } = item.meta; - if (!title) return; - if (useI18n) { - if (title.includes('{{') && title.includes('}}') && useI18n) { - title = title.replace(/({{[\s\S]+?}})/, (m, str) => - str.replace(/{{([\s\S]*)}}/, (m, _) => vm.$t(_.trim())) - ); - } else if (__titleIsFunction__) title = item.meta.title; - else title = vm.$t(item.name); - } else title = (item.meta && item.meta.title) || item.name; - return title; -}; -/** - * @description 根据当前跳转的路由设置显示在浏览器标签的title - * @param {Object} routeItem 路由对象 - * @param {Object} vm Vue实例 - */ -export const setTitle = (routeItem, vm) => { - const handledRoute = getRouteTitleHandled(routeItem); - const pageTitle = showTitle(handledRoute, vm); - const resTitle = pageTitle ? `${pageTitle} - ${title}` : title; - window.document.title = resTitle; -}; - -export const findNodeUpper = (ele, tag) => { - if (ele.parentNode) { - if (ele.parentNode.tagName === tag.toUpperCase()) { - return ele.parentNode; - } else { - return findNodeUpper(ele.parentNode, tag); - } - } -}; - -export const findNodeUpperByClasses = (ele, classes) => { - let parentNode = ele.parentNode; - if (parentNode) { - let classList = parentNode.classList; - if ( - classList && - classes.every(className => classList.contains(className)) - ) { - return parentNode; - } else { - return findNodeUpperByClasses(parentNode, classes); - } - } -}; - -export const findNodeDownward = (ele, tag) => { - const tagName = tag.toUpperCase(); - if (ele.childNodes.length) { - let i = -1; - let len = ele.childNodes.length; - while (++i < len) { - let child = ele.childNodes[i]; - if (child.tagName === tagName) return child; - else return findNodeDownward(child, tag); - } - } -}; diff --git a/smart-admin-web/src/lib/printPlugs.js b/smart-admin-web/src/lib/printPlugs.js deleted file mode 100644 index 9c4295dd..00000000 --- a/smart-admin-web/src/lib/printPlugs.js +++ /dev/null @@ -1,133 +0,0 @@ -// 打印类属性、方法定义 -/* eslint-disable */ -//第二个参数表明是否要关闭当前窗口 -const Print = function(dom, close, options) { - if (!(this instanceof Print)) return new Print(dom, close, options); - - this.options = this.extend( - { - noPrint: '.no-print' - }, - options - ); - - if (typeof dom === 'string') { - this.dom = document.querySelector(dom); - } else { - this.dom = dom; - } - - this.init(close); -}; -Print.prototype = { - init: function(close) { - var content = this.getStyle() + this.getHtml(); - this.writeIframe(content, close); - }, - extend: function(obj, obj2) { - for (var k in obj2) { - obj[k] = obj2[k]; - } - return obj; - }, - - getStyle: function() { - var str = '', - styles = document.querySelectorAll('style,link'); - for (var i = 0; i < styles.length; i++) { - str += styles[i].outerHTML; - } - str += - ''; - - return str; - }, - - getHtml: function() { - var inputs = document.querySelectorAll('input'); - var textareas = document.querySelectorAll('textarea'); - var selects = document.querySelectorAll('select'); - - for (var k in inputs) { - if (inputs[k].type == 'checkbox' || inputs[k].type == 'radio') { - if (inputs[k].checked == true) { - inputs[k].setAttribute('checked', 'checked'); - } else { - inputs[k].removeAttribute('checked'); - } - } else if (inputs[k].type == 'text') { - inputs[k].setAttribute('value', inputs[k].value); - } - } - - for (var k2 in textareas) { - if (textareas[k2].type == 'textarea') { - textareas[k2].innerHTML = textareas[k2].value; - } - } - - for (var k3 in selects) { - if (selects[k3].type == 'select-one') { - var child = selects[k3].children; - for (var i in child) { - if (child[i].tagName == 'OPTION') { - if (child[i].selected == true) { - child[i].setAttribute('selected', 'selected'); - } else { - child[i].removeAttribute('selected'); - } - } - } - } - } - return this.dom.outerHTML; - }, - - writeIframe: function(content, close) { - var w, - doc, - iframe = document.createElement('iframe'), - f = document.body.appendChild(iframe); - iframe.id = 'myIframe'; - iframe.style = 'position:absolute;'; - - w = f.contentWindow || f.contentDocument; - doc = f.contentDocument || f.contentWindow.document; - doc.open(); - doc.write(content); - doc.close(); - this.toPrint(w, close); - setTimeout(function() { - document.body.removeChild(iframe); - }, 500); - }, - - toPrint: function(frameWindow, close) { - try { - setTimeout(function() { - frameWindow.focus(); - try { - if (!frameWindow.document.execCommand('print', false, null)) { - frameWindow.print(); - } - } catch (e) { - frameWindow.print(); - } - frameWindow.close(); - if (close) { - window.close(); - } - }, 500); - } catch (err) { - console.log('err', err); - } - } -}; -const MyPlugin = {}; -MyPlugin.install = function(Vue, options) { - // 4. 添加实例方法 - Vue.prototype.$print = Print; -}; -export default MyPlugin; diff --git a/smart-admin-web/src/lib/render-dom.js b/smart-admin-web/src/lib/render-dom.js deleted file mode 100644 index 1cad207e..00000000 --- a/smart-admin-web/src/lib/render-dom.js +++ /dev/null @@ -1,10 +0,0 @@ -export default { - name: 'RenderDom', - functional: true, - props: { - render: Function - }, - render: (h, ctx) => { - return ctx.props.render(h); - } -}; diff --git a/smart-admin-web/src/lib/table-action.js b/smart-admin-web/src/lib/table-action.js deleted file mode 100644 index f9a541fc..00000000 --- a/smart-admin-web/src/lib/table-action.js +++ /dev/null @@ -1,84 +0,0 @@ -// 处理table操作按钮 -const tableAction = (h, array) => { - let btnArray = []; - let btnMore = []; - array.map((item, index) => { - if (index < 2) { - let btn = h( - 'a', - { - props: { - type: !index ? 'primary' : 'info', - size: 'small', - to: item.to ? item.to : '', - target: item.target ? item.target : '_self', - ghost: true - }, - style: { - marginLeft: '5px' - }, - directives: item.directives, - on: { - click: item.action - } - }, - item.title - ); - btnArray.push(btn); - } else { - btnMore.push( - h( - 'DropdownItem', - { - nativeOn: { - click: item.action - } - }, - item.title - ) - ); - } - }); - let dropdown = h( - 'Dropdown', - { - props: { - transfer: true - } - }, - [ - h( - 'a', - { - props: { - type: 'default', - size: 'small' - }, - style: { - marginLeft: '5px' - } - }, - [ - h('span', '更多'), - h('Icon', { - props: { - type: 'ios-arrow-down' - } - }) - ] - ), - h( - 'DropdownMenu', - { - slot: 'list' - }, - btnMore - ) - ] - ); - if (array.length > 2) { - btnArray.push(dropdown); - } - return btnArray; -}; -export default tableAction; diff --git a/smart-admin-web/src/lib/util.js b/smart-admin-web/src/lib/util.js deleted file mode 100644 index 6a3845b0..00000000 --- a/smart-admin-web/src/lib/util.js +++ /dev/null @@ -1,515 +0,0 @@ -import moment from 'moment'; -/** - * @param {String} url - * @description 从URL中解析参数 - */ -export const getParams = url => { - const keyValueArr = url.split('?')[1].split('&'); - let paramObj = {}; - keyValueArr.forEach(item => { - const keyValue = item.split('='); - paramObj[keyValue[0]] = keyValue[1]; - }); - return paramObj; -}; - -/** - * @param {Any} obj - * @description 获取数据类型 - */ -export const getType = obj => { - return {}.toString - .call(obj) - .match(/\s([a-zA-Z]+)/)[1] - .toLowerCase(); -}; -// 日期格式 -export const dateFormat = { - YMD: 'YMD', - YMDHM: 'YMDHM', - YMDHMS: 'YMDHMS' -}; -export const forEach = (arr, fn) => { - if (!arr.length || !fn) return; - let i = -1; - let len = arr.length; - while (++i < len) { - let item = arr[i]; - fn(item, i, arr); - } -}; - -/** - * @param {Array} arr1 - * @param {Array} arr2 - * @description 得到两个数组的交集, 两个数组的元素为数值或字符串 - */ -export const getIntersection = (arr1, arr2) => { - let len = Math.min(arr1.length, arr2.length); - let i = -1; - let res = []; - while (++i < len) { - const item = arr2[i]; - if (arr1.indexOf(item) > -1) res.push(item); - } - return res; -}; - -/** - * @param {Array} arr1 - * @param {Array} arr2 - * @description 得到两个数组的并集, 两个数组的元素为数值或字符串 - */ -export const getUnion = (arr1, arr2) => { - return Array.from(new Set([...arr1, ...arr2])); -}; - -/** - * @param {Array} target 目标数组 - * @param {Array} arr 需要查询的数组 - * @description 判断要查询的数组是否至少有一个元素包含在目标数组中 - */ -export const hasOneOf = (targetarr, arr) => { - return targetarr.some(_ => arr.indexOf(_) > -1); -}; - -/** - * @param {String|Number} value 要验证的字符串或数值 - * @param {*} validList 用来验证的列表 - */ -export function oneOf (value, validList) { - for (let i = 0; i < validList.length; i++) { - if (value === validList[i]) { - return true; - } - } - return false; -} - -/** - * @param {Number} timeStamp 判断时间戳格式是否是毫秒 - * @returns {Boolean} - */ -const isMillisecond = timeStamp => { - const timeStr = String(timeStamp); - return timeStr.length > 10; -}; - -/** - * @param {Number} timeStamp 传入的时间戳 - * @param {Number} currentTime 当前时间时间戳 - * @returns {Boolean} 传入的时间戳是否早于当前时间戳 - */ -const isEarly = (timeStamp, currentTime) => { - return timeStamp < currentTime; -}; - -/** - * @param {Number} num 数值 - * @returns {String} 处理后的字符串 - * @description 如果传入的数值小于10,即位数只有1位,则在前面补充0 - */ -const getHandledValue = num => { - return num < 10 ? '0' + num : num; -}; - -/** - * @param {Number} timeStamp 传入的时间戳 - * @param {Number} startType 要返回的时间字符串的格式类型,传入'year'则返回年开头的完整时间 - */ -const getDate = (timeStamp, startType) => { - const d = new Date(timeStamp * 1000); - const year = d.getFullYear(); - const month = getHandledValue(d.getMonth() + 1); - const date = getHandledValue(d.getDate()); - const hours = getHandledValue(d.getHours()); - const minutes = getHandledValue(d.getMinutes()); - const second = getHandledValue(d.getSeconds()); - let resStr = ''; - if (startType === 'year') { - resStr = - year + - '-' + - month + - '-' + - date + - ' ' + - hours + - ':' + - minutes + - ':' + - second; - } - else resStr = month + '-' + date + ' ' + hours + ':' + minutes; - return resStr; -}; - -/** - * @param {String|Number} timeStamp 时间戳 - * @returns {String} 相对时间字符串 - */ -export const getRelativeTime = timeStamp => { - // 判断当前传入的时间戳是秒格式还是毫秒 - const IS_MILLISECOND = isMillisecond(timeStamp); - // 如果是毫秒格式则转为秒格式 - if (IS_MILLISECOND) Math.floor((timeStamp /= 1000)); - // 传入的时间戳可以是数值或字符串类型,这里统一转为数值类型 - timeStamp = Number(timeStamp); - // 获取当前时间时间戳 - const currentTime = Math.floor(Date.parse(new Date()) / 1000); - // 判断传入时间戳是否早于当前时间戳 - const IS_EARLY = isEarly(timeStamp, currentTime); - // 获取两个时间戳差值 - let diff = currentTime - timeStamp; - // 如果IS_EARLY为false则差值取反 - if (!IS_EARLY) diff = -diff; - let resStr = ''; - const dirStr = IS_EARLY ? '前' : '后'; - // 少于等于59秒 - if (diff <= 59) resStr = diff + '秒' + dirStr; - // 多于59秒,少于等于59分钟59秒 - else if (diff > 59 && diff <= 3599) { resStr = Math.floor(diff / 60) + '分钟' + dirStr; } - // 多于59分钟59秒,少于等于23小时59分钟59秒 - else if (diff > 3599 && diff <= 86399) { resStr = Math.floor(diff / 3600) + '小时' + dirStr; } - // 多于23小时59分钟59秒,少于等于29天59分钟59秒 - else if (diff > 86399 && diff <= 2623859) { resStr = Math.floor(diff / 86400) + '天' + dirStr; } - // 多于29天59分钟59秒,少于364天23小时59分钟59秒,且传入的时间戳早于当前 - else if (diff > 2623859 && diff <= 31567859 && IS_EARLY) { resStr = getDate(timeStamp); } - else resStr = getDate(timeStamp, 'year'); - return resStr; -}; - -/** - * @returns {String} 当前浏览器名称 - */ -export const getExplorer = () => { - const ua = window.navigator.userAgent; - const isExplorer = exp => { - return ua.indexOf(exp) > -1; - }; - if (isExplorer('MSIE')) return 'IE'; - else if (isExplorer('Firefox')) return 'Firefox'; - else if (isExplorer('Chrome')) return 'Chrome'; - else if (isExplorer('Opera')) return 'Opera'; - else if (isExplorer('Safari')) return 'Safari'; -}; - -/** - * @description 绑定事件 on(element, event, handler) - */ -export const on = (function () { - if (document.addEventListener) { - return function (element, event, handler) { - if (element && event && handler) { - element.addEventListener(event, handler, false); - } - }; - } else { - return function (element, event, handler) { - if (element && event && handler) { - element.attachEvent('on' + event, handler); - } - }; - } -})(); - -/** - * @description 解绑事件 off(element, event, handler) - */ -export const off = (function () { - if (document.removeEventListener) { - return function (element, event, handler) { - if (element && event) { - element.removeEventListener(event, handler, false); - } - }; - } else { - return function (element, event, handler) { - if (element && event) { - element.detachEvent('on' + event, handler); - } - }; - } -})(); - -/** - * 判断一个对象是否存在key,如果传入第二个参数key,则是判断这个obj对象是否存在key这个属性 - * 如果没有传入key这个参数,则判断obj对象是否有键值对 - */ -export const hasKey = (obj, key) => { - if (key) return key in obj; - else { - let keysArr = Object.keys(obj); - return keysArr.length; - } -}; - -/** - * @param {*} obj1 对象 - * @param {*} obj2 对象 - * @description 判断两个对象是否相等,这两个对象的值只能是数字或字符串 - */ -export const objEqual = (obj1, obj2) => { - const keysArr1 = Object.keys(obj1); - const keysArr2 = Object.keys(obj2); - if (keysArr1.length !== keysArr2.length) return false; - else if (keysArr1.length === 0 && keysArr2.length === 0) return true; - /* eslint-disable-next-line */ else { return !keysArr1.some(key => obj1[key] != obj2[key]); } -}; - -// 相关工具类 -export const utils = { - /** - * @description table实现反选 - * @param {Object} vm Vue实例 - * @param {Array} tableSelectDate 选中的数据 - * @param {Array} allData 所有数据 - * @param {Array} key 数据中的唯一值 - */ - reverseSelect (vm, tableSelectDate, allData, key) { - let copyMess = JSON.parse(JSON.stringify(tableSelectDate)); - // 流程:先全部选中->再部分选中 - vm.handleSelectAll(false); - // 选中的idList - let idList = copyMess.map(item => item[key]); - console.log(idList); - for (let item of allData) { - if (idList.every(id => id !== item.id)) { - vm.$set(item, '_checked', true); - tableSelectDate.push(item); - } else { - vm.$set(item, '_checked', false); - } - } - }, - // 校验字符串是否相同 合同使用 - contrastString (originStr, changeStr) { - let origin = originStr - .replace(/\s*/g, '') - .replace(/"/g, '\'') - .replace(/ /g, '') - .replace(/disabled=\/'\/'/g, 'disabled'); - let change = changeStr - .replace(/\s*/g, '') - .replace(/"/g, '\'') - .replace(/ /g, '') - .replace(/disabled=\/'\/'/g, 'disabled'); - return origin === change; - }, - // 获取当前日期getDateStr(0)、前几天getDateStr(-10)、后几天getDateStr(20) - getDateStr (AddDayCount, format) { - let date = new Date(); - // 获取AddDayCount天后的日期 - date.setDate(date.getDate() + AddDayCount); - return this.getDate(date, format); - }, - getDate (date, format) { - let year = date.getFullYear(); - // day获取当前几号,不足10补0 - let day = date.getDate() > 9 ? date.getDate() : '0' + date.getDate(); - // month获取当前月份的日期,不足10补0 - let month = - date.getMonth() + 1 > 9 - ? date.getMonth() + 1 - : '0' + (date.getMonth() + 1); - // h获取当前小时,不足10补0 - let h = date.getHours() > 9 ? date.getHours() : '0' + date.getHours(); - // s获取当前分钟,不足10补0 - let m = date.getMinutes() > 9 ? date.getMinutes() : '0' + date.getMinutes(); - // s获取当前秒数,不足10补0 - let s = date.getSeconds() > 9 ? date.getSeconds() : '0' + date.getSeconds(); - let resultDate = ''; - if (format === dateFormat.YMD) { - resultDate = year + '-' + month + '-' + day; - } - if (format === dateFormat.YMDHM) { - resultDate = year + '-' + month + '-' + day + ' ' + h + ':' + m; - } - if (format === dateFormat.YMDHMS) { - resultDate = year + '-' + month + '-' + day + ' ' + h + ':' + m + ':' + s; - } - return resultDate; - }, - // 获取周一和周日日期,返回两种格式时间 - getDateWeek () { - let now = new Date(); - let nowTime = now.getTime(); - let day = now.getDay(); - let oneDayLong = 1000 * 60 * 60 * 24; - let MondayTime = nowTime - (day - 1) * oneDayLong; - let SundayTime = nowTime + (7 - day) * oneDayLong; - let monday = new Date(MondayTime); - let sunday = new Date(SundayTime); - return { - // first: this.getDateAll(monday), - // last: this.getDateAll(sunday), - firstDate: monday, - lastDate: sunday - }; - }, - // 获取月初与月末日期,返回两种时间格式 - getDateMonth () { - let dateFirter = new Date(); - let dateLast = new Date(); - dateFirter.setDate(1); - - let currentMonth = dateLast.getMonth(); - let nextMonth = ++currentMonth; - let nextMonthFirstDay = new Date(dateLast.getFullYear(), nextMonth, 1); - let oneDay = 1000 * 60 * 60 * 24; - dateLast = new Date(nextMonthFirstDay - oneDay); - - return { - // first: this.getDateAll(dateFirter), - // last: this.getDateAll(dateLast), - firstDate: dateFirter, - lastDate: dateLast - }; - }, - // 计算天数 - getDayBetweenDate (date) { - date = this.getDate(new Date(date), 'YMD'); - let startTime = Date.parse(new Date(date)); // IE支持“yyyy/MM/dd”格式 - let endTime = Date.parse(this.getDate(new Date(), 'YMD')); - let day = parseInt((endTime - startTime) / (1000 * 60 * 60 * 24)); - return day; - }, - getDateIntervalYear (firstDate, secondDate) { - if (!firstDate || !secondDate) { - return 0; - } - let first = new Date(firstDate); - let second = new Date(secondDate); - let firstYear = first.getFullYear(); - let secondYear = second.getFullYear(); - let intervalYear = secondYear - firstYear; - return intervalYear < 0 ? 0 : intervalYear; - }, - getDateIntervalYearFixed2 (firstDate, secondDate) { - if (!firstDate || !secondDate) { - return 0; - } - // 格式化时间 - let startDate = new Date(this.getDate(new Date(firstDate), 'YMD')); - let endDate = new Date(this.getDate(new Date(secondDate), 'YMD')); - // 得到毫秒值 - let startTime = Date.parse(startDate); - let endTime = Date.parse(endDate); - // 得到差了多少天 - let day = parseInt((endTime - startTime) / (1000 * 60 * 60 * 24)); - if (day <= 0) { - return 0; - } - // 得到差的多少年 保留两位小数 - let resultYear = parseFloat((day / (30 * 12)).toFixed(2)); - return resultYear; - }, - // 数字转化为中文大写 - // 代码如下所示: - convertCurrency (money) { - // 汉字的数字 - let cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']; - // 基本单位 - let cnIntRadice = ['', '拾', '佰', '仟']; - // 对应整数部分扩展单位 - let cnIntUnits = ['', '万', '亿', '兆']; - // 对应小数部分单位 - let cnDecUnits = ['角', '分', '毫', '厘']; - // 整数金额时后面跟的字符 - let cnInteger = '整'; - // 整型完以后的单位 - let cnIntLast = '元'; - // 最大处理的数字 - let maxNum = 999999999999999.9999; - // 金额整数部分 - let integerNum; - // 金额小数部分 - let decimalNum; - // 输出的中文金额字符串 - let chineseStr = ''; - // 分离金额后用的数组,预定义 - let parts; - if (money === '') { - return ''; - } - money = parseFloat(money); - if (money >= maxNum) { - // 超出最大处理数字 - return ''; - } - if (money === 0) { - chineseStr = cnNums[0] + cnIntLast + cnInteger; - return chineseStr; - } - // 转换为字符串 - money = money.toString(); - if (money.indexOf('.') === -1) { - integerNum = money; - decimalNum = ''; - } else { - parts = money.split('.'); - integerNum = parts[0]; - decimalNum = parts[1].substr(0, 4); - } - // 获取整型部分转换 - if (parseInt(integerNum, 10) > 0) { - let zeroCount = 0; - let IntLen = integerNum.length; - for (let i = 0; i < IntLen; i++) { - let n = integerNum.substr(i, 1); - let p = IntLen - i - 1; - let q = p / 4; - let m = p % 4; - if (n === '0') { - zeroCount++; - } else { - if (zeroCount > 0) { - chineseStr += cnNums[0]; - } - // 归零 - zeroCount = 0; - chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]; - } - if (m === 0 && zeroCount < 4) { - chineseStr += cnIntUnits[q]; - } - } - chineseStr += cnIntLast; - } - // 小数部分 - if (decimalNum !== '') { - let decLen = decimalNum.length; - for (let i = 0; i < decLen; i++) { - let n = decimalNum.substr(i, 1); - if (n !== '0') { - chineseStr += cnNums[Number(n)] + cnDecUnits[i]; - } - } - } - if (chineseStr === '') { - chineseStr += cnNums[0] + cnIntLast + cnInteger; - } else if (decimalNum === '') { - chineseStr += cnInteger; - } - return chineseStr; - } -}; - - -export const dateTimeRangeConvert = (timerange) => { - // timerange - let arr = []; - if (timerange[0] === '') { - arr.push(null); - } else { - arr.push(moment(timerange[0]).format("YYYY-MM-DD 00:00:00")); - } - - if (timerange[1] === '') { - arr.push(null); - } else { - arr.push(moment(timerange[1]).format("YYYY-MM-DD 23:59:59")); - } - return arr; -} - diff --git a/smart-admin-web/src/locale/index.js b/smart-admin-web/src/locale/index.js deleted file mode 100644 index 5509260c..00000000 --- a/smart-admin-web/src/locale/index.js +++ /dev/null @@ -1,37 +0,0 @@ -import Vue from 'vue'; -import VueI18n from 'vue-i18n'; -import { localRead } from '@/lib/local'; -import customZhCn from './lang/zh-CN'; -import customZhTw from './lang/zh-TW'; -import customEnUs from './lang/en-US'; -import zhCnLocale from 'view-design/src/locale/lang/zh-CN'; -import enUsLocale from 'view-design/src/locale/lang/en-US'; -import zhTwLocale from 'view-design/src/locale/lang/zh-TW'; - -Vue.use(VueI18n); - -// 自动根据浏览器系统语言设置语言 -const navLang = navigator.language; -const localLang = (navLang === 'zh-CN' || navLang === 'en-US') ? navLang : false; -let lang = localLang || localRead('local') || 'zh-CN'; - -Vue.config.lang = lang; - -// vue-i18n 6.x+写法 -Vue.locale = () => { }; -const messages = { - 'zh-CN': Object.assign(zhCnLocale, customZhCn), - 'zh-TW': Object.assign(zhTwLocale, customZhTw), - 'en-US': Object.assign(enUsLocale, customEnUs) -}; -const i18n = new VueI18n({ - locale: lang, - messages -}); - -export default i18n; - -// vue-i18n 5.x写法 -// Vue.locale('zh-CN', Object.assign(zhCnLocale, customZhCn)) -// Vue.locale('en-US', Object.assign(zhTwLocale, customZhTw)) -// Vue.locale('zh-TW', Object.assign(enUsLocale, customEnUs)) diff --git a/smart-admin-web/src/locale/lang/en-US.js b/smart-admin-web/src/locale/lang/en-US.js deleted file mode 100644 index dc20d8f6..00000000 --- a/smart-admin-web/src/locale/lang/en-US.js +++ /dev/null @@ -1,46 +0,0 @@ -export default { - home: 'Home', - login: 'Login', - components: 'Components', - count_to_page: 'Count-to', - tables_page: 'Table', - split_pane_page: 'Split-pane', - markdown_page: 'Markdown-editor', - editor_page: 'Rich-Text-Editor', - icons_page: 'Custom-icon', - img_cropper_page: 'Image-editor', - update: 'Update', - doc: 'Document', - join_page: 'QQ Group', - update_table_page: 'Update .CSV', - update_paste_page: 'Paste Table Data', - multilevel: 'multilevel', - directive_page: 'Directive', - level_1: 'Level-1', - level_2: 'Level-2', - level_2_1: 'Level-2-1', - level_2_3: 'Level-2-3', - level_2_2: 'Level-2-2', - level_2_2_1: 'Level-2-2-1', - level_2_2_2: 'Level-2-2-2', - excel: 'Excel', - 'upload-excel': 'Upload Excel', - 'export-excel': 'Export Excel', - tools_methods_page: 'Tools Methods', - drag_list_page: 'Drag-list', - i18n_page: 'Internationalization', - modalTitle: 'Modal Title', - content: 'This is the modal box content.', - buttonText: 'Show Modal', - 'i18n-tip': 'Note: Only this page is multi-language, other pages do not add language content to the multi-language package.', - error_store_page: 'Error Collection', - error_logger_page: 'Error Logger', - query: 'Query', - params: 'Params', - cropper_page: 'Cropper', - message_page: 'Message Center', - tree_table_page: 'Tree Table', - org_tree_page: 'Org Tree', - drag_drawer_page: 'Draggable Drawer', - tree_select_page: 'Tree Selector' -} diff --git a/smart-admin-web/src/locale/lang/zh-CN.js b/smart-admin-web/src/locale/lang/zh-CN.js deleted file mode 100644 index 9e402562..00000000 --- a/smart-admin-web/src/locale/lang/zh-CN.js +++ /dev/null @@ -1,46 +0,0 @@ -export default { - home: '首页', - login: '登录', - components: '组件', - count_to_page: '数字渐变', - tables_page: '多功能表格', - split_pane_page: '分割窗口', - markdown_page: 'Markdown编辑器', - editor_page: '富文本编辑器', - icons_page: '自定义图标', - img_cropper_page: '图片编辑器', - update: '上传数据', - join_page: 'QQ群', - doc: '文档', - update_table_page: '上传CSV文件', - update_paste_page: '粘贴表格数据', - multilevel: '多级菜单', - directive_page: '指令', - level_1: 'Level-1', - level_2: 'Level-2', - level_2_1: 'Level-2-1', - level_2_3: 'Level-2-3', - level_2_2: 'Level-2-2', - level_2_2_1: 'Level-2-2-1', - level_2_2_2: 'Level-2-2-2', - excel: 'Excel', - 'upload-excel': '上传excel', - 'export-excel': '导出excel', - tools_methods_page: '工具函数', - drag_list_page: '拖拽列表', - i18n_page: '多语言', - modalTitle: '模态框题目', - content: '这是模态框内容', - buttonText: '显示模态框', - 'i18n-tip': '注:仅此页做了多语言,其他页面没有在多语言包中添加语言内容', - error_store_page: '错误收集', - error_logger_page: '错误日志', - query: '带参路由', - params: '动态路由', - cropper_page: '图片裁剪', - message_page: '消息中心', - tree_table_page: '树状表格', - org_tree_page: '组织结构树', - drag_drawer_page: '可拖动抽屉', - tree_select_page: '树状下拉选择器' -} diff --git a/smart-admin-web/src/locale/lang/zh-TW.js b/smart-admin-web/src/locale/lang/zh-TW.js deleted file mode 100644 index ce51c428..00000000 --- a/smart-admin-web/src/locale/lang/zh-TW.js +++ /dev/null @@ -1,46 +0,0 @@ -export default { - home: '首頁', - login: '登錄', - components: '组件', - count_to_page: '数字渐变', - tables_page: '多功能表格', - split_pane_page: '分割窗口', - markdown_page: 'Markdown編輯器', - editor_page: '富文本編輯器', - icons_page: '自定義圖標', - img_cropper_page: '圖片編輯器', - update: '上傳數據', - join_page: 'QQ群', - doc: '文檔', - update_table_page: '上傳CSV文件', - update_paste_page: '粘貼表格數據', - multilevel: '多级菜单', - directive_page: '指令', - level_1: 'Level-1', - level_2: 'Level-2', - level_2_1: 'Level-2-1', - level_2_3: 'Level-2-3', - level_2_2: 'Level-2-2', - level_2_2_1: 'Level-2-2-1', - level_2_2_2: 'Level-2-2-2', - excel: 'Excel', - 'upload-excel': '上傳excel', - 'export-excel': '導出excel', - tools_methods_page: '工具函數', - drag_list_page: '拖拽列表', - i18n_page: '多語言', - modalTitle: '模態框題目', - content: '這是模態框內容', - buttonText: '顯示模態框', - 'i18n-tip': '注:僅此頁做了多語言,其他頁面沒有在多語言包中添加語言內容', - error_store_page: '錯誤收集', - error_logger_page: '錯誤日誌', - query: '帶參路由', - params: '動態路由', - cropper_page: '圖片裁剪', - message_page: '消息中心', - tree_table_page: '樹狀表格', - org_tree_page: '組織結構樹', - drag_drawer_page: '可拖動抽屜', - tree_select_page: '樹狀下拉選擇器' -} diff --git a/smart-admin-web/src/main.js b/smart-admin-web/src/main.js deleted file mode 100644 index d213c7f2..00000000 --- a/smart-admin-web/src/main.js +++ /dev/null @@ -1,80 +0,0 @@ -// The Vue build version to load with the `import` command -// (runtime-only or standalone) has been set in webpack.base.conf with an alias. -import Vue from 'vue'; -import App from './App'; -import router from './router'; -import store from './store'; -import ViewUI from 'view-design'; -import i18n from '@/locale'; -import config from '@/config'; -import importDirective from '@/directives'; -import JsonViewer from 'vue-json-viewer'; -import _ from 'lodash'; -// import { directive as clickOutside } from 'v-click-outside-x'; -import * as vClickOutside from 'v-click-outside-x'; -import installPlugin from '@/plugins'; -import './themes/index.less'; -import '@/assets/icons/iconfont.css'; -import 'slick-carousel/slick/slick.css'; -import { Decimal } from 'decimal.js'; -// 枚举管理 -import Enum from 'vue-enum'; -import enumInfo from '@/constants'; -// 处理table操作按钮 -import tableAction from './lib/table-action'; - -// 时间 -import moment from 'moment'; - -import 'e-guide-layer/dist/e-guide-layer.css' -import eGuideLayer from 'e-guide-layer' - -Vue.use(eGuideLayer); - -Vue.prototype.$tableAction = tableAction; -Vue.use(Enum, { enumInfo }); -Vue.use(ViewUI, { - i18n: (key, value) => i18n.t(key, value) -}); -Vue.use(JsonViewer); -Vue.use(vClickOutside); - - -Number.prototype.toFixed = function (length) { - let x = new Decimal(this); - return x.toFixed(length); -}; - -//时间处理 -moment.locale('zh-cn'); //设置语言 或 moment.lang('zh-cn'); -Vue.prototype.$moment = moment;//赋值使用 - - -/** - * @description 注册admin内置插件 - */ -installPlugin(Vue); -/** - * @description 生产环境关掉提示 - */ -Vue.config.productionTip = false; -/** - * @description 全局注册应用配置 - */ -Vue.prototype.$config = config; -/** - * 注册指令 - */ -importDirective(Vue); -// Vue.directive('clickOutside', clickOutside); - -window._ = _; - -/* eslint-disable no-new */ -new Vue({ - el: '#app', - router, - i18n, - store, - render: h => h(App) -}); diff --git a/smart-admin-web/src/main.less b/smart-admin-web/src/main.less deleted file mode 100644 index 72a1a030..00000000 --- a/smart-admin-web/src/main.less +++ /dev/null @@ -1,37 +0,0 @@ -.warp-card { - margin-top: 10px; - &:first-child { - margin-top: 0; - } - .action-show { - .ivu-btn { - margin: 0 3px; - } - } - .action-hide { - .ivu-btn { - margin: 0 3px; - span { - //display: none; - } - } - } - .add-form { - padding-top: 15px; - } -} -.areaSelect .areaBox .areaArrow.active { - border-color: #689df6 !important; -} - -.areaSelect .areaBox .areaInput:hover, .areaSelect .areaBox .areaInput:focus { - border-color: #689df6 !important; -} - -.areaSelect .areaBox .areaModal ul li.active[data-v-16a01167] { - background: #fff !important; - color: #689df6 !important; -} -.main{ - .side-menu-wrapper .ivu-menu-dark .ivu-menu .ivu-menu-submenu-has-parent-submenu{ padding-left: 41px; } -} diff --git a/smart-admin-web/src/plugins/error-store/index.js b/smart-admin-web/src/plugins/error-store/index.js deleted file mode 100644 index c8b35b8f..00000000 --- a/smart-admin-web/src/plugins/error-store/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import store from '@/store'; -export default { - install(Vue, options) {} -}; diff --git a/smart-admin-web/src/plugins/index.js b/smart-admin-web/src/plugins/index.js deleted file mode 100644 index 1a1c1870..00000000 --- a/smart-admin-web/src/plugins/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import config from '@/config'; -const { plugin } = config; - -export default Vue => { - for (let name in plugin) { - const value = plugin[name]; - Vue.use( - require(`./${name}`).default, - typeof value === 'object' ? value : undefined - ); - } -}; diff --git a/smart-admin-web/src/router/before-close.js b/smart-admin-web/src/router/before-close.js deleted file mode 100644 index 0d4d61db..00000000 --- a/smart-admin-web/src/router/before-close.js +++ /dev/null @@ -1,17 +0,0 @@ -import { Modal } from 'view-design'; - -const beforeClose = { - before_close_normal: resolve => { - Modal.confirm({ - title: '确定要关闭这一页吗', - onOk: () => { - resolve(true); - }, - onCancel: () => { - resolve(false); - } - }); - } -}; - -export default beforeClose; diff --git a/smart-admin-web/src/router/index.js b/smart-admin-web/src/router/index.js deleted file mode 100644 index c86b14ee..00000000 --- a/smart-admin-web/src/router/index.js +++ /dev/null @@ -1,218 +0,0 @@ -import Vue from 'vue'; -import Router from 'vue-router'; -import { routers } from './routers'; -import store from '@/store'; -import ViewUI from 'view-design'; -import cookie from '@/lib/cookie'; -import { localRead } from '@/lib/local'; -import { setTitle } from '@/lib/menu-func'; -import config from '@/config'; - -const { homeName } = config; - -Vue.use(Router); -const router = new Router({ - // routes: routers, - routes: buildRouters(routers) - // mode: 'history' -}); -const LOGIN_PAGE_NAME = 'login'; - -// 防止用户刷新丢失登录信息 -if ( - Object.keys(store.state.user.userLoginInfo).length === 0 && - localRead('userLoginInfo') -) { - store.commit('setUserLoginInfo', JSON.parse(localRead('userLoginInfo'))); -} -// 解决路由跳转相同的地址报错 -const originalPush = Router.prototype.push; -Router.prototype.push = function (location) { - try { - return originalPush.call(this, location).catch(err => err); - } catch (error) { - // TODO zhuoda sentry - console.error(error); - } -}; - -// 关于当前页面 -Router.prototype.closeCurrentPage = function () { - let current = this.history.current; - store.commit('closeTag', current); - store.commit('deleteKeepAliveIncludes', current.name); -}; - -// 关闭当前页面然后跳转到指定页面 -Router.prototype.closeCurrentPageAndPush = function (pushParam) { - let current = this.history.current; - store.commit('closeTagNotPushNextRoute', current); - store.commit('deleteKeepAliveIncludes', current.name); - this.push(pushParam); -}; -let storeSelf = store; -router.beforeEach((to, from, next) => { - ViewUI.LoadingBar.start(); - const token = cookie.getToken(); - if (!token && to.name !== LOGIN_PAGE_NAME) { - // 未登录且要跳转的页面不是登录页 - next({ - name: LOGIN_PAGE_NAME // 跳转到登录页 - }); - } else if (!token && to.name === LOGIN_PAGE_NAME) { - // 未登陆且要跳转的页面是登录页 - next(); // 跳转 - } else if (token && to.name === LOGIN_PAGE_NAME) { - // 已登录且要跳转的页面是登录页 - next({ - // 跳转到home页 - name: homeName - }); - setTitle(to, router.app); - ViewUI.LoadingBar.finish(); - window.scrollTo(0, 0); - } else { - // 特殊页面直接放行 - if (to.meta.noValidatePrivilege) { - next(); - return; - } - - //如果是超管,直接放行 - if (store.state.user.userLoginInfo.isSuperMan) { - next(); - return; - } - - // 去掉/之后第一个字母 - let key = to.path.substr(1, 1); - let pathArray = storeSelf.state.user.privilegeRouterPathMap.get(key); - if (!(pathArray && pathArray.indexOf(to.path) >= 0)) { - next({ - name: 'Error401' - }); - } else { - next(); - } - } -}); - -router.afterEach(to => { - setTitle(to, router.app); - ViewUI.LoadingBar.finish(); - window.scrollTo(0, 0); -}); - -function buildRouters (routerArray) { - let lineRouters = []; - for (let routerItem of routerArray) { - //如果是顶层菜单 - if (routerItem.meta.topMenu) { - // for (let children of routerItem.children) { - let lineRouterArray = convertRouterTree2Line(routerItem.children); - lineRouters.push(...lineRouterArray); - // } - } else { - let lineRouterArray = convertRouterTree2Line([routerItem]); - lineRouters.push(...lineRouterArray); - } - } - return lineRouters; -} - -function convertRouterTree2Line (routerArray) { - //一级,比如 人员管理 - let topArray = []; - for (let router1Item of routerArray) { - let level2Array = []; - //二级,比如员工管理 - if (router1Item.children) { - for (let level2Item of router1Item.children) { - - let level2ItemCopy = {}; - for (let property in level2Item) { - if ('children' !== property) { - level2ItemCopy[property] = level2Item[property]; - } - } - - //三级, - if (level2Item.children) { - level2Array.push(...level2Item.children) - } - - level2ItemCopy.children = []; - level2Array.push(level2Item); - } - } - - let newTopRouterItem = {}; - for (let property in router1Item) { - if ('children' !== property) { - newTopRouterItem[property] = router1Item[property]; - } - } - - newTopRouterItem.children = level2Array; - topArray.push(newTopRouterItem); - } - - return topArray; -} - -let tempCheckObj = { - checkRouterNameMap: new Map(), - checkRouterPathMap: new Map() -}; - -function recursionCheckRouter (routerArray) { - for (let routerItem of routerArray) { - if (!routerItem.name) { - console.error('没有配置router name', routerItem); - } else { - let existNameRouter = tempCheckObj.checkRouterNameMap.get( - routerItem.name - ); - if (typeof existNameRouter !== 'undefined') { - console.error('存在相同的router name', routerItem, existNameRouter); - } else { - tempCheckObj.checkRouterNameMap.set(routerItem.name, routerItem); - } - } - - if (!routerItem.path) { - console.error('没有配置router path', routerItem); - } else { - // path必须以 / 开头 - if (routerItem.path !== '*' && routerItem.path.indexOf('/') !== 0) { - console.error('path 没有以/开头 ', routerItem); - } - - let existPathRouter = tempCheckObj.checkRouterPathMap.get( - routerItem.path - ); - if (typeof existPathRouter !== 'undefined') { - console.error('存在相同的router path', routerItem, existPathRouter); - } else { - tempCheckObj.checkRouterPathMap.set(routerItem.path, routerItem); - } - } - - if (routerItem.children) { - recursionCheckRouter(routerItem.children); - } - } -} - -//如果是开发环境,需要检测router的规范性 -if (process.env.NODE_ENV === 'development') { - recursionCheckRouter(routers); - delete tempCheckObj.checkRouterNameMap; - delete tempCheckObj.checkRouterPathMap; -} - -const topMenuArray = routers.filter(e => e.meta.topMenu); -export { topMenuArray }; - -export default router; - diff --git a/smart-admin-web/src/router/module/business/email.js b/smart-admin-web/src/router/module/business/email.js deleted file mode 100644 index 55c00de7..00000000 --- a/smart-admin-web/src/router/module/business/email.js +++ /dev/null @@ -1,40 +0,0 @@ -import Main from '@/components/main'; -// 基础设置 -export const emailSetting = [ - { - path: '/email', - name: 'Email', - component: Main, - meta: { - title: '邮件管理', - icon: 'icon iconfont iconyoujianguanli' - }, - children: [ - // 发送email - { - path: '/email/email-list', - name: 'EmailList', - meta: { - title: '邮件管理', - privilege: [ - { title: '查询', name: 'email-query' }, - { title: '新增', name: 'email-add' }, - { title: '编辑', name: 'email-update' }, - { title: '删除', name: 'email-delete' } - ] - }, - component: () => import('@/views/business/email/email-list.vue') - }, - // 发送email - { - path: '/email/send-mail', - name: 'SendMail', - meta: { - title: '发送邮件', - privilege: [{ title: '发送', name: 'email-send' }] - }, - component: () => import('@/views/business/email/send-mail.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/business/index.js b/smart-admin-web/src/router/module/business/index.js deleted file mode 100644 index cf9ef2e4..00000000 --- a/smart-admin-web/src/router/module/business/index.js +++ /dev/null @@ -1,29 +0,0 @@ - -import Main from '@/components/main'; - -import { peony } from './peony'; -import { emailSetting } from './email'; -import { keepAlive } from './keep-alive'; -import { notice } from './notice'; -import { threeRouter } from './three-router'; - -// 业务 -export const business = [ - { - path: '/business', - name: 'Business', - component: Main, - meta: { - title: '业务功能', - topMenu:true, - icon: 'icon iconfont iconyoujianguanli' - }, - children: [ - ...peony, - ...emailSetting, - ...keepAlive, - ...notice, - ...threeRouter - ] - } -]; diff --git a/smart-admin-web/src/router/module/business/keep-alive.js b/smart-admin-web/src/router/module/business/keep-alive.js deleted file mode 100644 index 98c5e044..00000000 --- a/smart-admin-web/src/router/module/business/keep-alive.js +++ /dev/null @@ -1,31 +0,0 @@ -import Main from '@/components/main'; -// 接口文档 -export const keepAlive = [ - { - path: '/keep-alive', - name: 'KeepAlive', - component: Main, - meta: { - title: 'KeepAlive', - icon: 'icon iconfont iconxitongshezhi' - }, - children: [ - { - path: '/keep-alive/content-list', - name: 'KeepAliveContentList', - meta: { - title: 'KeepAlive列表' - }, - component: () => import('@/views/business/keep-alive/content-list.vue') - }, - { - path: '/keep-alive/add-content', - name: 'KeepAliveAddContent', - meta: { - title: 'KeepAlive表单' - }, - component: () => import('@/views/business/keep-alive/add-content.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/business/notice.js b/smart-admin-web/src/router/module/business/notice.js deleted file mode 100644 index c4ae9550..00000000 --- a/smart-admin-web/src/router/module/business/notice.js +++ /dev/null @@ -1,52 +0,0 @@ -import Main from '@/components/main'; -// 消息管理 -export const notice = [ - { - path: '/notice', - name: 'Notice', - component: Main, - meta: { - title: '消息管理', - icon: 'icon iconfont iconnews' - }, - children: [ - { - path: '/notice/notice-list', - name: 'NoticeList', - meta: { - title: '通知管理', - privilege: [ - { title: '查询', name: 'notice-query' }, - { title: '添加', name: 'notice-add' }, - { title: '修改', name: 'notice-edit' }, - { title: '删除', name: 'notice-delete' }, - { title: '详情', name: 'notice-detail' }, - { title: '发送', name: 'notice-send' } - ] - }, - component: () => import('@/views/business/notice/notice-list.vue') - }, - { - path: '/notice/person-notice', - name: 'PersonNotice', - meta: { - title: '个人消息', - privilege: [ - { title: '查询', name: 'person-notice-query' }, - { title: '详情', name: 'person-notice-detail' } - ] - }, - component: () => import('@/views/business/notice/person-notice.vue') - }, - { - path: '/notice/notice-detail', - name: 'NoticeDetail', - meta: { - title: '消息详情', - hideInMenu:true - }, - component: () => import('@/views/business/notice/notice-detail.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/business/peony.js b/smart-admin-web/src/router/module/business/peony.js deleted file mode 100644 index aff33eac..00000000 --- a/smart-admin-web/src/router/module/business/peony.js +++ /dev/null @@ -1,49 +0,0 @@ -import Main from '@/components/main'; -// t_peony路由 -export const peony = [ - { - path: '/peony', - name: 'Peony', - component: Main, - meta: { - title: '牡丹管理', - icon: 'icon iconfont iconyoujianguanli' - }, - children: [ - // 牡丹花 列表 - { - path: '/peony/peony-list', - name: 'PeonyList', - meta: { - title: '牡丹花列表', - privilege: [ - { title: '查询', name: 'peony-list-query' }, - { title: '新增', name: 'peony-list-add' }, - { title: '编辑', name: 'peony-list-update' }, - { title: '批量删除', name: 'peony-list-batch-delete' }, - { title: '批量导出', name: 'peony-list-batch-export' }, - { title: '导出全部', name: 'peony-list-export-all' } - ] - }, - component: () => import('@/views/business/peony/peony-list.vue') - }, - // 牡丹花 列表 1 - { - path: '/peony/peony-list1', - name: 'PeonyList1', - meta: { - title: '牡丹花列表1', - privilege: [ - { title: '查询', name: 'peony1-list-query' }, - { title: '新增', name: 'peony1-list-add' }, - { title: '编辑', name: 'peony1-list-update' }, - { title: '批量删除', name: 'peony1-list-batch-delete' }, - { title: '批量导出', name: 'peony1-list-batch-export' }, - { title: '导出全部', name: 'peony1-list-export-all' } - ] - }, - component: () => import('@/views/business/peony/peony-list.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/business/three-router.js b/smart-admin-web/src/router/module/business/three-router.js deleted file mode 100644 index bd958adc..00000000 --- a/smart-admin-web/src/router/module/business/three-router.js +++ /dev/null @@ -1,63 +0,0 @@ -import Main from '@/components/main'; -// 三级路由演示 -export const threeRouter = [ - { - path: '/three-router', - name: 'ThreeRouter', - component: Main, - meta: { - title: '三级路由', - icon: 'icon iconfont iconzujian' - }, - children: [ - // 最大支持到三级菜单 - { - path: '/three-router/level-two', - name: 'LevelTwo', - meta: { - title: '三级菜单' - }, - children: [ - { - path: '/three-router/level-two/level-three1', - name: 'ThreeLevelRouterView', - meta: { - title: '三级菜单子颗粒', - privilege: [ - { title: '添加', name: 'three-level-router-view-add' }, - { title: '查询', name: 'three-level-router-view-query' }, - ] - }, - component: () => import('@/views/business/three-level-router/three-level-router-view.vue') - }, - { - path: '/three-router/level-two/level-three2', - name: 'RoleTwoTwo', - meta: { - title: '三级菜单子哈', - privilege: [ - { title: '添加', name: 'roleTwoTwo-add' }, - { title: '删除', name: 'roleTwoTwo-delete' }, - { title: '删除', name: 'roleTwoTwo-delete1' }, - { title: '删除', name: 'roleTwoTwo-delete2' }, - ] - }, - component: () => import('@/views/support/monitor/sql.vue') - } - ] - }, - { - path: '/three-router/level-two2', - name: 'RoleOneOne', - meta: { - title: '二级菜单', - privilege: [ - { title: '添加', name: 'roleOneOne-add' }, - { title: '删除', name: 'roleOneOne-delete' } - ] - }, - component: () => import('@/views/support/monitor/sql.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/error.js b/smart-admin-web/src/router/module/error.js deleted file mode 100644 index 9ab50841..00000000 --- a/smart-admin-web/src/router/module/error.js +++ /dev/null @@ -1,33 +0,0 @@ -// 错误页 -export const error = [ - { - path: '/401', - name: 'Error401', - meta: { - hideInMenu: true, - access: true, - noValidatePrivilege: true - }, - component: () => import('@/views/error-page/401.vue') - }, - { - path: '/500', - name: 'Error500', - meta: { - hideInMenu: true, - access: true, - noValidatePrivilege: true - }, - component: () => import('@/views/error-page/500.vue') - }, - { - path: '*', - name: 'http://localhost:8080/#employee/role-employee-manage', - meta: { - hideInMenu: true, - access: true, - noValidatePrivilege: true - }, - component: () => import('@/views/error-page/404.vue') - } -]; diff --git a/smart-admin-web/src/router/module/home.js b/smart-admin-web/src/router/module/home.js deleted file mode 100644 index 87ca26a6..00000000 --- a/smart-admin-web/src/router/module/home.js +++ /dev/null @@ -1,29 +0,0 @@ -import Main from '@/components/main'; -// 首页 -export const home = [ - { - path: '/', - name: '_home', - redirect: '/home', - component: Main, - meta: { - title: '首页', - noKeepAlive: true, - hideInMenu: true, - noValidatePrivilege: true, - icon: 'icon iconfont iconxitongshezhi' - }, - children: [ - { - path: '/home', - name: 'Home', - meta: { - title: '首页', - noValidatePrivilege: true, - noKeepAlive: true - }, - component: () => import('@/views/home') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/support/api-doc.js b/smart-admin-web/src/router/module/support/api-doc.js deleted file mode 100644 index 8336078c..00000000 --- a/smart-admin-web/src/router/module/support/api-doc.js +++ /dev/null @@ -1,25 +0,0 @@ -import Main from '@/components/main'; -// 接口文档 -export const apiDoc = [ - { - path: '/api-doc', - component: Main, - name: 'ApiDoc', - meta: { - title: '接口文档', - icon: 'icon iconfont iconjiekouwendang' - }, - - children: [ - { - path: '/api-doc/swagger', - name: 'Swagger', - meta: { - title: 'Swagger接口文档', - icon: 'icon iconfont iconjiekouwendang' - }, - component: () => import('@/views/support/api-doc/swagger.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/support/heart-beat.js b/smart-admin-web/src/router/module/support/heart-beat.js deleted file mode 100644 index 82e51a01..00000000 --- a/smart-admin-web/src/router/module/support/heart-beat.js +++ /dev/null @@ -1,31 +0,0 @@ -import Main from '@/components/main'; -// 心跳服务 -export const heartBeat = [ - { - path: '/heart-beat', - name: 'HeartBeat', - component: Main, - meta: { - title: '心跳服务', - icon: 'icon iconfont icondingshirenwu' - }, - - children: [ - { - path: '/heart-beat/heart-beat-list', - name: 'HeartBeatList', - meta: { - title: '心跳服务', - icon: 'icon iconfont icondingshirenwu', - privilege: [ - { - title: '查询任务', - name: 'heart-beat-query' - } - ] - }, - component: () => import('@/views/support/heart-beat/heart-beat-list.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/support/index.js b/smart-admin-web/src/router/module/support/index.js deleted file mode 100644 index 0f1d4ad0..00000000 --- a/smart-admin-web/src/router/module/support/index.js +++ /dev/null @@ -1,30 +0,0 @@ - -import Main from '@/components/main'; - - -import { apiDoc } from './api-doc'; -import { heartBeat } from './heart-beat'; -import { monitor } from './monitor'; -import { reload } from './reload'; -import { task } from './task'; - -// 业务 -export const support = [ - { - path: '/support', - name: 'Support', - component: Main, - meta: { - title: '开发专用', - topMenu: true, - icon: 'icon iconfont iconjiekouwendang' - }, - children: [ - ...apiDoc, - ...heartBeat, - ...monitor, - ...reload, - ...task - ] - } -]; diff --git a/smart-admin-web/src/router/module/support/monitor.js b/smart-admin-web/src/router/module/support/monitor.js deleted file mode 100644 index 064ec831..00000000 --- a/smart-admin-web/src/router/module/support/monitor.js +++ /dev/null @@ -1,34 +0,0 @@ -import Main from '@/components/main'; -// 系统监控 -export const monitor = [ - { - path: '/monitor', - component: Main, - name: 'Monitor', - meta: { - title: '系统监控', - icon: 'icon iconfont iconxitongjiankong' - }, - children: [ - // 在线人数 - { - path: '/monitor/online-user', - name: 'OnlineUser', - meta: { - title: '在线人数', - privilege: [{ title: '查询', name: 'online-user-search' }] - }, - component: () => import('@/views/support/monitor/online-user.vue') - }, - // SQL监控 - { - path: '/monitor/sql', - name: 'Sql', - meta: { - title: 'SQL监控' - }, - component: () => import('@/views/support/monitor/sql.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/support/reload.js b/smart-admin-web/src/router/module/support/reload.js deleted file mode 100644 index 929a10d5..00000000 --- a/smart-admin-web/src/router/module/support/reload.js +++ /dev/null @@ -1,40 +0,0 @@ -import Main from '@/components/main'; -// 动态加载 -export const reload = [ - { - path: '/reload', - name: 'Reload', - component: Main, - meta: { - title: '动态加载', - icon: 'icon iconfont icondongtaijiazai' - }, - - children: [ - { - path: '/reload/smart-reload-list', - name: 'SmartReloadList', - meta: { - title: 'SmartReload', - icon: 'icon iconfont icondongtaijiazai', - privilege: [ - { - title: '查询', - name: 'smart-reload-search' - }, - { - title: '执行reload', - name: 'smart-reload-update' - }, - { - title: '查看执行结果', - name: 'smart-reload-result' - } - ] - }, - component: () => - import('@/views/support/reload/smart-reload/smart-reload-list.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/support/task.js b/smart-admin-web/src/router/module/support/task.js deleted file mode 100644 index 97b2c869..00000000 --- a/smart-admin-web/src/router/module/support/task.js +++ /dev/null @@ -1,63 +0,0 @@ -import Main from '@/components/main'; -// 任务调度 -export const task = [ - { - path: '/task', - name: 'Task', - component: Main, - meta: { - title: '定时任务', - icon: 'icon iconfont icondingshirenwu' - }, - - children: [ - { - path: '/system-setting/task-list', - name: 'TaskList', - meta: { - title: '任务管理', - icon: 'icon iconfont icondingshirenwu', - privilege: [ - { - title: '查询任务', - name: 'task-search' - }, - { - title: '刷新任务', - name: 'task-refresh' - }, - { - title: '添加任务', - name: 'task-add' - }, - { - title: '编辑任务', - name: 'task-update' - }, - { - title: '暂停任务', - name: 'task-pause' - }, - { - title: '恢复任务', - name: 'task-resume' - }, - { - title: '立即运行任务', - name: 'task-run' - }, - { - title: '查看任务日志', - name: 'task-query-log' - }, - { - title: '删除任务', - name: 'task-delete' - } - ] - }, - component: () => import('@/views/support/task/task-list.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/system/employee.js b/smart-admin-web/src/router/module/system/employee.js deleted file mode 100644 index f01a9c6d..00000000 --- a/smart-admin-web/src/router/module/system/employee.js +++ /dev/null @@ -1,149 +0,0 @@ -import Main from '@/components/main'; -// 基础设置 -export const employee = [ - { - path: '/employee', - component: Main, - name: 'Employee', - meta: { - title: '人员管理', - icon: 'icon iconfont iconrenyuanguanli' - }, - children: [ - // 角色管理页面路由 - { - path: '/employee/role', - name: 'RoleManage', - meta: { - title: '角色管理', - privilege: [ - { - title: '添加角色', - name: 'add-role' - }, - { - title: '删除角色', - name: 'delete-role' - }, - { - title: '编辑角色', - name: 'update-role' - }, - { - title: '修改角色权限', - name: 'update-role-privilege' - }, - { - title: '添加成员', - name: 'add-employee-role' - }, - { - title: '移除成员', - name: 'delete-employee-role' - }, - { - title: '批量移除', - name: 'delete-employee-role-batch' - }, - { - title: '查询成员', - name: 'search-employee-list' - }, - { - title: '查询数据范围', - name: 'query-data-scope' - }, - { - title: '更新数据范围', - name: 'update-data-scope' - } - ] - }, - component: () => import('@/views/system/employee/role/role-manage.vue') - }, - // 岗位管理页面路由 新 - { - path: '/employee/position', - name: 'PositionList', - meta: { - title: '岗位管理', - privilege: [ - { - title: '查询', - name: 'search-position' - }, - { - title: '添加', - name: 'add-position' - }, - { - title: '修改', - name: 'update-position' - }, - { - title: '删除', - name: 'delete-position' - } - ] - }, - component: () => import('@/views/system/employee/position/position-list.vue') - }, - // 人员管理页面路由 - { - path: '/employee/role-employee-manage', - name: 'RoleEmployeeManage', - meta: { - title: '员工管理', - privilege: [ - { - title: '添加部门', - name: 'add-department' - }, - { - title: '编辑部门', - name: 'update-department' - }, - { - title: '删除部门', - name: 'delete-department' - }, - { - title: '查询', - name: 'search-department' - }, - { - title: '添加成员', - name: 'add-employee' - }, - { - title: '编辑成员', - name: 'update-employee' - }, - { - title: '禁用', - name: 'disabled-employee' - }, - { - title: '批量操作', - name: 'disabled-employee-batch' - }, - { - title: '员工角色编辑', - name: 'update-employee-role' - }, - { - title: '删除员工', - name: 'delete-employee' - }, - { - title: '重置密码', - name: 'reset-employee-password' - } - ] - }, - component: () => - import('@/views/system/employee/role-employee/role-employee-manage.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/system/file.js b/smart-admin-web/src/router/module/system/file.js deleted file mode 100644 index 1d51b19a..00000000 --- a/smart-admin-web/src/router/module/system/file.js +++ /dev/null @@ -1,29 +0,0 @@ -import Main from '@/components/main'; -// 文件服务 -export const file = [ - { - path: '/file', - name: 'File', - component: Main, - meta: { - title: '文件服务', - icon: 'ios-cloud-upload' - }, - children: [ - { - path: '/file/file-list', - name: 'FileList', - meta: { - title: '文件列表', - icon: 'ios-cloud-upload', - privilege: [ - { title: '查询', name: 'file-filePage-query' }, - { title: '上传', name: 'file-filePage-upload' }, - { title: '下载', name: 'file-filePage-download' } - ] - }, - component: () => import('@/views/system/file/file-list.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/system/index.js b/smart-admin-web/src/router/module/system/index.js deleted file mode 100644 index 1c5592c3..00000000 --- a/smart-admin-web/src/router/module/system/index.js +++ /dev/null @@ -1,28 +0,0 @@ - -import Main from '@/components/main'; - - -import { employee } from './employee'; -import { file } from './file'; -import { userLog } from './user-log'; -import { systemSetting } from './system-setting'; - -// 业务 -export const system = [ - { - path: '/system', - name: 'System', - component: Main, - meta: { - title: '系统设置', - topMenu: true, - icon: 'icon iconfont iconxitongshezhi' - }, - children: [ - ...employee, - ...file, - ...userLog, - ...systemSetting - ] - } -]; diff --git a/smart-admin-web/src/router/module/system/system-setting.js b/smart-admin-web/src/router/module/system/system-setting.js deleted file mode 100644 index 708cd3d7..00000000 --- a/smart-admin-web/src/router/module/system/system-setting.js +++ /dev/null @@ -1,65 +0,0 @@ -import Main from '@/components/main'; -// 基础设置 -export const systemSetting = [ - { - path: '/system-setting', - name: 'SystemSetting', - component: Main, - meta: { - title: '系统设置', - icon: 'icon iconfont iconxitongshezhi' - }, - - children: [ - { - path: '/system-setting/system-config', - name: 'SystemConfig', - meta: { - title: '系统参数', - privilege: [ - { - title: '查询系统参数', - name: 'system-params-search' - }, - { - title: '添加系统参数', - name: 'system-params-add' - }, - { - title: '修改系统参数', - name: 'system-config-update' - }, - { - title: '搜索系统参数', - name: 'system-config-search' - } - ] - }, - component: () => - import('@/views/system/system-setting/system-config/system-config.vue') - }, - { - path: '/system-setting/system-privilege', - name: 'SystemPrivilege', - meta: { - title: '菜单设置', - privilege: [ - { - title: '编辑', - name: 'privilege-main-update' - }, - { - title: '批量保存功能点', - name: 'privilege-batch-save-points' - }, - { - title: '查询', - name: 'privilege-main-search' - } - ] - }, - component: () => import('@/views/system/system-setting/system-privilege/system-privilege.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/module/system/user-log.js b/smart-admin-web/src/router/module/system/user-log.js deleted file mode 100644 index 5d868c84..00000000 --- a/smart-admin-web/src/router/module/system/user-log.js +++ /dev/null @@ -1,42 +0,0 @@ -import Main from '@/components/main'; -// 用户日志 -export const userLog = [ - { - path: '/user-log', - name: 'UserLog', - component: Main, - meta: { - title: '用户日志', - icon: 'ios-paper-outline' - }, - children: [ - // 发送email - { - path: '/user-log/user-operate-log', - name: 'UserOperateLog', - meta: { - title: '用户操作日志', - privilege: [ - { title: '查询', name: 'user-operate-log-search' }, - { title: '详情', name: 'user-operate-log-detail' }, - { title: '删除', name: 'user-operate-log-delete' } - ] - }, - component: () => import('@/views/system/user-log/user-operate-log.vue') - }, - // 人员管理页面路由 - { - path: '/user-log/user-login-log', - name: 'UserLoginLog', - meta: { - title: '用户登录日志', - privilege: [ - { title: '查询', name: 'user-login-log-search' }, - { title: '删除', name: 'user-login-log-delete' } - ] - }, - component: () => import('@/views/system/user-log/user-login-log.vue') - } - ] - } -]; diff --git a/smart-admin-web/src/router/routers.js b/smart-admin-web/src/router/routers.js deleted file mode 100644 index afcb628c..00000000 --- a/smart-admin-web/src/router/routers.js +++ /dev/null @@ -1,43 +0,0 @@ -import { home } from './module/home'; -import { error } from './module/error'; -import { business } from './module/business'; -import { support } from './module/support'; -import { system } from './module/system'; - -/** - * - * meta除了原生参数外可配置的参数: - * meta: { - * title: { String|Number|Function } - * 显示在侧边栏、面包屑和标签栏的文字 - * 使用'{{ 多语言字段 }}'形式结合多语言使用,例子看多语言的路由配置; - * 可以传入一个回调函数,参数是当前路由对象,例子看动态路由和带参路由 - * hideInBread: (false) 设为true后此级路由将不会出现在面包屑中,示例看QQ群路由配置 - * hideInMenu: (false) 设为true后在左侧菜单不会显示该页面选项, - * privilegeExtend:{String} 同一功能模块下子页面的功能点权限继承菜单模块创建的路由权限 by lihaifan&lipeng - * noKeepAlive: (false) 设为true后页面在切换标签后不会缓存,如果需要缓存,无需设置这个字段,而且需要设置页面组件name属性和路由配置的name一致 - * noValidatePrivilege: (true) 表示此路由不需要验证权限 - * topMenu:(true),表示为顶级菜单 - * } - */ -// 登录模块 -export const login = { - path: '/login', - name: 'login', - meta: { - hideInMenu: true, - title: 'Login - 登录', - noValidatePrivilege: true - }, - component: () => import('@/views/login/login.vue') -}; - -// 全部路由 -export const routers = [ - login, - ...home, - ...error, - ...business, - ...system, - ...support -]; diff --git a/smart-admin-web/src/store/index.js b/smart-admin-web/src/store/index.js deleted file mode 100644 index 6883f539..00000000 --- a/smart-admin-web/src/store/index.js +++ /dev/null @@ -1,25 +0,0 @@ -import Vue from 'vue'; -import Vuex from 'vuex'; - -import user from './module/user'; -import app from './module/app'; -import notice from './module/notice'; - -Vue.use(Vuex); - -export default new Vuex.Store({ - state: { - // - }, - mutations: { - // - }, - actions: { - // - }, - modules: { - user, - notice, - app - } -}); diff --git a/smart-admin-web/src/store/module/app.js b/smart-admin-web/src/store/module/app.js deleted file mode 100644 index c19eade0..00000000 --- a/smart-admin-web/src/store/module/app.js +++ /dev/null @@ -1,129 +0,0 @@ -import { - getBreadCrumbList, - setTagNavListInLocalStorage, - getMenuByRouter, - getTagNavListFromLocalStorage, - getHomeRoute, - getNextRoute, - routeHasExist, - routeEqual, - getRouteTitleHandled -} from '@/lib/menu-func'; -import { localSave, localRead } from '@/lib/local'; -import router from '@/router'; -import { routers } from '@/router/routers'; -import config from '@/config'; -const { homeName } = config; -// 关闭页面+tag -const closePage = (state, route) => { - const nextRoute = getNextRoute(state.tagNavList, route); - state.tagNavList = state.tagNavList.filter(item => { - return !routeEqual(item, route); - }); - router.push(nextRoute); -}; - -export default { - state: { - // 缓存路由 - keepAliveIncludes: [], - // 面包屑列表 - breadCrumbList: [], - // tag列表 - tagNavList: [], - // 首页路由 - homeRoute: {}, - // 本地缓存 - local: localRead('local'), - // 错误列表 - errorList: [], - hasReadErrorPage: false - }, - getters: { - - errorCount: state => state.errorList.length - }, - mutations: { - // 加入缓存 - pushKeepAliveIncludes (state, val) { - if (state.keepAliveIncludes.length < 30) { - let number = state.keepAliveIncludes.findIndex(e => e === val); - if (number === -1) { - state.keepAliveIncludes.push(val); - } - } - }, - // 删除缓存 - deleteKeepAliveIncludes (state, val) { - let number = state.keepAliveIncludes.findIndex(e => e === val); - if (number !== -1) { - state.keepAliveIncludes.splice(number, 1); - } - }, - // 清空缓存 - clearKeepAliveIncludes (state, val) { - state.keepAliveIncludes = [val]; - }, - // 关闭其他 - deleteOtherKeepAliveIncludes (state, val) { - state.keepAliveIncludes.forEach((item, index, arr) => { - if (item !== config.homeName && item !== val) { - arr.splice(index, 1); - } - }); - }, - // 设置其是否出现在面包屑中 - setBreadCrumb (state, route) { - state.breadCrumbList = getBreadCrumbList(route, state.homeRoute); - }, - // 初始化首页使用 - setHomeRoute (state, routes) { - state.homeRoute = getHomeRoute(routes, homeName); - }, - // 设置tag列表 - setTagNavList (state, list) { - let tagList = []; - if (list) { - tagList = [...list]; - } else tagList = getTagNavListFromLocalStorage() || []; - if (tagList[0] && tagList[0].name !== homeName) tagList.shift(); - let homeTagIndex = tagList.findIndex(item => item.name === homeName); - if (homeTagIndex > 0) { - let homeTag = tagList.splice(homeTagIndex, 1)[0]; - tagList.unshift(homeTag); - } - state.tagNavList = tagList; - setTagNavListInLocalStorage([...tagList]); - }, - // 关闭tag - closeTag (state, route) { - let tag = state.tagNavList.filter(item => routeEqual(item, route)); - route = tag[0] ? tag[0] : null; - if (!route) return; - closePage(state, route); - }, - // 关闭当前tag,且不进行跳转 - closeTagNotPushNextRoute (state, route) { - state.tagNavList = state.tagNavList.filter(item => { - return !routeEqual(item, route); - }); - }, - // 新增tag - addTag (state, { route, type = 'unshift' }) { - let router = getRouteTitleHandled(route); - if (!routeHasExist(state.tagNavList, router)) { - if (type === 'push') state.tagNavList.push(router); - else { - if (router.name === homeName) state.tagNavList.unshift(router); - else state.tagNavList.splice(1, 0, router); - } - setTagNavListInLocalStorage([...state.tagNavList]); - } - }, - // 保存本地信息 - setLocal (state, lang) { - localSave('local', lang); - state.local = lang; - } - } -}; diff --git a/smart-admin-web/src/store/module/notice.js b/smart-admin-web/src/store/module/notice.js deleted file mode 100644 index 3cff149e..00000000 --- a/smart-admin-web/src/store/module/notice.js +++ /dev/null @@ -1,19 +0,0 @@ -import { noticeApi } from '@/api/notice'; -export default { - state: { - noticeList: [], - noticeNumber: 0 - }, - mutations: { - updateNotice(state, data) { - state.noticeList = [...state.noticeList, ...data]; - }, - updateNoticeNum(state, data) { - state.noticeNumber = data; - }, - restNotice(state) { - state.noticeList = []; - state.noticeNumber = 0; - } - } -}; diff --git a/smart-admin-web/src/store/module/user.js b/smart-admin-web/src/store/module/user.js deleted file mode 100644 index eb2ca10a..00000000 --- a/smart-admin-web/src/store/module/user.js +++ /dev/null @@ -1,122 +0,0 @@ -import cookie from '@/lib/cookie.js'; -import { loginApi } from '@/api/login'; -import { localSave, localRead } from '@/lib/local'; -import { getType } from '@/lib/util'; -import { PRIVILEGE_TYPE_ENUM } from '@/constants/privilege'; - -const localReadRouterPrivilege = () => { - let map = new Map(); - let userRouterPrivilegeString = localRead('userRouterPrivilege'); - if (userRouterPrivilegeString) { - let privilegeList = JSON.parse(userRouterPrivilegeString); - if (privilegeList) { - for (const path of privilegeList) { - let key = path.substr(1, 1); - let pathArray = map.get(key); - if (pathArray) { - pathArray.push(path); - } else { - pathArray = []; - pathArray.push(path); - map.set(key, pathArray); - } - } - } - } - return map; -}; - -export default { - state: { - token: cookie.getToken(), - // session信息 - userLoginInfo: {}, - isUpdatePrivilege: false, - // key为router name, value为 key的集合,用于v-privilege,页面功能点判断 - privilegeFunctionPointsMap: new Map(), - // 菜单key权限集合,用于左侧是否有菜单权限判断 - privilegeMenuKeyList: [], - /** - * key为 router path的首字母,value为集合 - * 这样做是为了提高查询效率,用于vue-router拦截判断path - */ - privilegeRouterPathMap: localReadRouterPrivilege() - - }, - mutations: { - // 设置token - setToken (state, token) { - state.token = token; - cookie.setToken(token); - }, - // 保存用户登录信息 - setUserLoginInfo (state, userLoginInfo) { - state.userLoginInfo = userLoginInfo; - localSave('userLoginInfo', JSON.stringify(userLoginInfo)); - }, - setUserPrivilege (state, privilegeList) { - state.isUpdatePrivilege = true; - let routerPathArray = []; - for (const privilege of privilegeList) { - // 是菜单权限 - if (privilege.type === PRIVILEGE_TYPE_ENUM.MENU.value) { - state.privilegeMenuKeyList.push(privilege.key); - if (privilege.url) { - routerPathArray.push(privilege.url); - // 去掉/之后第一个字母 - let key = privilege.url.substr(1, 1); - let pathArray = state.privilegeRouterPathMap.get(key); - if (pathArray) { - pathArray.push(privilege.url); - } else { - pathArray = []; - pathArray.push(privilege.url); - state.privilegeRouterPathMap.set(key, pathArray); - } - } - } - // 如果是功能点 - if (privilege.type === PRIVILEGE_TYPE_ENUM.POINTS.value) { - if (privilege.parentKey) { - let pointArray = state.privilegeFunctionPointsMap.get(privilege.parentKey); - if (pointArray) { - pointArray.push(privilege.key); - } else { - pointArray = []; - pointArray.push(privilege.key); - state.privilegeFunctionPointsMap.set(privilege.parentKey, pointArray); - } - } - } - } - localSave('userRouterPrivilege', JSON.stringify(routerPathArray)); - } - }, - getters: { - // 用户功能点权限 - userFuncPrivilegeInfo: () => localRead('funcPrivilegeInfo'), - // 用户菜单权限 - userMenuPrivilege: state => state.userLoginInfo.privilegeList - }, - actions: { - // 登录 - handleLogin ({ commit }, params) { - params.loginName = params.loginName.trim(); - return new Promise((resolve, reject) => { - loginApi - .login(params) - .then(res => { - localStorage.clear(); - const data = res.data; - commit('setToken', data.xaccessToken); - // 保存用户登录 - commit('setUserLoginInfo', data); - resolve(); - }) - .catch(err => { - reject(err); - }); - }); - } - } -}; diff --git a/smart-admin-web/src/themes/ReadMe.md b/smart-admin-web/src/themes/ReadMe.md deleted file mode 100644 index 57ab76e4..00000000 --- a/smart-admin-web/src/themes/ReadMe.md +++ /dev/null @@ -1 +0,0 @@ -这是配置主题及颜色的 diff --git a/smart-admin-web/src/themes/index.less b/smart-admin-web/src/themes/index.less deleted file mode 100644 index 6870d219..00000000 --- a/smart-admin-web/src/themes/index.less +++ /dev/null @@ -1,328 +0,0 @@ -@import '~view-design/src/styles/index.less'; -/************** - 导航栏 -**************/ -// 导航栏背景 -@menu-dark-title: #001529; -@menu-dark-active-bg: #000c17; -@layout-sider-background: #001529; -@primary-color: #2d8cf0; -@blue: #2d8cf0; -@blueA100: #2e3c5a; -@blueA200: #e7f3ff; -@blueA300: #f0f7fd; -@blueA400: #001529; -@garyA100: #f5f5f5; -@garyA200: #666; -@garyA300: #999; -@tableColor: #eee; -@black: #444; - -.side-menu-wrapper { - // 一级菜单 高亮颜色 - .ivu-menu-dark.ivu-menu-vertical .ivu-menu-item-active:not(.ivu-menu-submenu), - .ivu-menu-dark.ivu-menu-vertical .ivu-menu-submenu-title-active:not(.ivu-menu-submenu){ - color: #fff; - } - .ivu-menu-dark { - .ivu-menu { - .ivu-menu-submenu { - margin-bottom: 0; - } - - .ivu-menu-submenu-title { - padding: 8px 24px !important; - } - - .ivu-menu-submenu-has-parent-submenu { - padding-left: 51px; - } - - // 二级菜单 - .ivu-menu-item, - .ivu-menu-submenu-has-parent-submenu { - padding: 8px 0 9px 48px !important; - background: url('../assets/images/slider/sub_slider_default.png') 30px 0 - no-repeat !important; - - &:hover { - background: url('../assets/images/slider/sub_slider_default.png') 30px - 0 no-repeat !important; - } - - &.ivu-menu-item-active { - background: url('../assets/images/slider/sub_slider_active.png') 30px - 0 no-repeat !important; - border-right: 5px @primary-color solid; - - &:hover { - background: url('../assets/images/slider/sub_slider_active.png') - 30px 0 no-repeat !important; - border-right: 5px @primary-color solid; - } - } - } - .ivu-menu-submenu-has-parent-submenu { - padding-left: 31px !important; - .ivu-menu-submenu-title { - padding: 0 17px !important; - } - &.ivu-menu-child-item-active { - background: url('../assets/images/slider/sub_slider_active.png') 30px - 0 no-repeat !important; - border-right: 0; - } - .ivu-menu { - padding-top: 8px; - } - .ivu-menu-item, - .ivu-menu-item-active:hover { - background: none !important; - padding-left: 32px !important; - } - } - } - } -} - -// 导航栏 -.menu-collapsed { - text-align: center; - padding-top: 0 !important; -} - -// 左侧导航收缩 -.ivu-layout-sider-collapsed { - .ivu-dropdown { - text-align: center; - line-height: 38px; - margin: 0px auto; - color: #515a6e; - - &:hover { - color: @primary-color; - } - } - .ivu-tooltip { - line-height: 38px; - } -} -// 收缩导航栏鼠标经过下拉 -.menu-dropdown { - width: 160px; - left: 65px !important; - background: #001529; - border-radius: 3px; - color: #fff; - .ivu-dropdown-item { - color: #fff; - height: 40px; - line-height: 40px; - padding: 0 20px; - box-sizing: border-box; - .menu-title { - // padding:5px 0; - } - &:hover { - background: none; - border-right: 4px @primary-color solid; - } - } -} -/************** - header -**************/ -@layout-header-height: 52px; - -//面包屑 -.ivu-breadcrumb { - color: #515a6e; -} - -.ivu-breadcrumb-item-separator { - color: #515a6e; -} - - -/************** - table -**************/ -@table-thead-bg: #F7F7F9; -@border-color-split: #F7F7F9; -// @border-color-base: #F7F7F9; - -.ivu-table { - height: auto; - - table { - border-spacing: 0; - width: 100%; - tr { - &.ivu-table-row-hover { - tr, td { - animation: tableHover 0.5s; - } - } - th, td { - border: 1px @tableColor solid; - border-left: 0; - border-top: 0; - text-align: center; - &.ivu-table-column-left { - text-align: left; - } - &:nth-child(1) { - border-left: 0; - } - .ivu-table-cell { - padding: 0 8px; - overflow: inherit; - } - .table-line { - background: @tableColor; - height: 1px; - margin: 8px -18px; - } - } - th { - color: @garyA200; - background: @garyA100; - height: 42px; - font-size: 14px; - color: #808080; - text-align: left; - } - td { - font-weight: normal; - padding: 2px 0; - height: 32px; - text-align: left; - font-size: 12px; - border-bottom: 1px solid #F7F7F9; - .ivu-table-cell-with-expand{ - height: 32px; - line-height: 32px; - } - } - } - } -} - -.ivu-table-body { - &::-webkit-scrollbar { - width: 10px; - height: 10px; - } -} - -.ivu-card-extra { - position: absolute; - right: 8px; - top: 8px; -} - -.ivu-card-head { - background: #fafafa; - border-radius: 4px 4px 0 0; - padding: 12px 16px; - font-size: 14px; - font-weight: bold; - .ivu-icon { - color: #666; - } -} - -.ivu-select-dropdown { - z-index: 10000; - &::-webkit-scrollbar { - width: 10px; - height: 10px; - } -} - -.ivu-dropdown-transfer, -.ivu-select-dropdown-transfer { - position: fixed; -} - -.ivu-table-fixed-body { - overflow: inherit; -} -.ivu-card{ - box-shadow: none !important; -} -// 表单类 -.ivu-btn{ - &:focus{ - box-shadow: none; - } -} - -.ivu-spin-fix{ - background-color: rgba(255, 255, 255, 0.3); -} - -// 重写字体大小 -.ivu-select, -.ivu-select-single .ivu-select-selection .ivu-select-placeholder, -.ivu-select-single .ivu-select-selection .ivu-select-selected-value, -.ivu-select-input, -.ivu-input, -textarea.ivu-input, -.ivu-btn, -.ivu-checkbox-wrapper, -.ivu-form .ivu-form-item-label{ - font-size: 12px; -} -.ivu-btn-large{ - font-size: 14px; -} -.ivu-select-item, -.ivu-dropdown-item{ - font-size: 12px !important; -} - -/****自定义样式***/ - -.search-card .ivu-form-item { - margin-bottom: 0px !important; -} - -.marginRight10{ - margin-right: 10px !important; -} -.marginLeft10{ - margin-left: 10px !important; -} - -.marginBottom10{ - margin-bottom: 10px !important; -} - -.float-right{ - float:right; -} - -.float-left{ - float:left; -} - -.error-color{ - color: #ed4014; -} - -.smart-query-card .ivu-card-body{ - padding: 10px !important; -} - -.smart-query-form-row:not(:first-child){ - margin-top: 8px; -} - -.smart-query-form-row span{ - margin-right: 8px; -} - -.smart-query-table-page{ - margin-top: 10px; -} \ No newline at end of file diff --git a/smart-admin-web/src/views/business/email/email-list.vue b/smart-admin-web/src/views/business/email/email-list.vue deleted file mode 100644 index 357998a8..00000000 --- a/smart-admin-web/src/views/business/email/email-list.vue +++ /dev/null @@ -1,214 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/business/email/send-mail.vue b/smart-admin-web/src/views/business/email/send-mail.vue deleted file mode 100644 index d06261d9..00000000 --- a/smart-admin-web/src/views/business/email/send-mail.vue +++ /dev/null @@ -1,215 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/business/keep-alive/add-content.vue b/smart-admin-web/src/views/business/keep-alive/add-content.vue deleted file mode 100644 index 0c2290dd..00000000 --- a/smart-admin-web/src/views/business/keep-alive/add-content.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/business/keep-alive/content-list.vue b/smart-admin-web/src/views/business/keep-alive/content-list.vue deleted file mode 100644 index 11b34887..00000000 --- a/smart-admin-web/src/views/business/keep-alive/content-list.vue +++ /dev/null @@ -1,80 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/business/notice/notice-detail.vue b/smart-admin-web/src/views/business/notice/notice-detail.vue deleted file mode 100644 index 66687bda..00000000 --- a/smart-admin-web/src/views/business/notice/notice-detail.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/business/notice/notice-list.vue b/smart-admin-web/src/views/business/notice/notice-list.vue deleted file mode 100644 index 8c129b19..00000000 --- a/smart-admin-web/src/views/business/notice/notice-list.vue +++ /dev/null @@ -1,369 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/business/notice/person-notice.vue b/smart-admin-web/src/views/business/notice/person-notice.vue deleted file mode 100644 index cc2fec01..00000000 --- a/smart-admin-web/src/views/business/notice/person-notice.vue +++ /dev/null @@ -1,221 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/business/peony/components/peony-list-form.vue b/smart-admin-web/src/views/business/peony/components/peony-list-form.vue deleted file mode 100644 index 9f99862b..00000000 --- a/smart-admin-web/src/views/business/peony/components/peony-list-form.vue +++ /dev/null @@ -1,133 +0,0 @@ - - \ No newline at end of file diff --git a/smart-admin-web/src/views/business/peony/peony-list.vue b/smart-admin-web/src/views/business/peony/peony-list.vue deleted file mode 100644 index 8c0edaff..00000000 --- a/smart-admin-web/src/views/business/peony/peony-list.vue +++ /dev/null @@ -1,495 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/business/three-level-router/three-level-router-view.vue b/smart-admin-web/src/views/business/three-level-router/three-level-router-view.vue deleted file mode 100644 index 2003c453..00000000 --- a/smart-admin-web/src/views/business/three-level-router/three-level-router-view.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/error-page/401.vue b/smart-admin-web/src/views/error-page/401.vue deleted file mode 100644 index 70b3c366..00000000 --- a/smart-admin-web/src/views/error-page/401.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/error-page/404.vue b/smart-admin-web/src/views/error-page/404.vue deleted file mode 100644 index 291406f6..00000000 --- a/smart-admin-web/src/views/error-page/404.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/error-page/500.vue b/smart-admin-web/src/views/error-page/500.vue deleted file mode 100644 index e2a6c249..00000000 --- a/smart-admin-web/src/views/error-page/500.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/error-page/back-btn-group.vue b/smart-admin-web/src/views/error-page/back-btn-group.vue deleted file mode 100644 index 7966849b..00000000 --- a/smart-admin-web/src/views/error-page/back-btn-group.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/error-page/error-content.vue b/smart-admin-web/src/views/error-page/error-content.vue deleted file mode 100644 index d81d965e..00000000 --- a/smart-admin-web/src/views/error-page/error-content.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/error-page/error.less b/smart-admin-web/src/views/error-page/error.less deleted file mode 100644 index 63802459..00000000 --- a/smart-admin-web/src/views/error-page/error.less +++ /dev/null @@ -1,46 +0,0 @@ -.error-page{ - width: 100%; - height: 100%; - position: relative; - background: #f8f8f9; - .content-con{ - width: 700px; - height: 600px; - position: absolute; - left: 50%; - top: 50%; - transform: translate(-50%, -60%); - img{ - display: block; - width: 100%; - height: 100%; - } - .text-con{ - position: absolute; - left: 0px; - top: 0px; - h4{ - position: absolute; - left: 0px; - top: 0px; - font-size: 80px; - font-weight: 700; - color: #348EED; - } - h5{ - position: absolute; - width: 700px; - left: 0px; - top: 100px; - font-size: 20px; - font-weight: 700; - color: #67647D; - } - } - .back-btn-group{ - position: absolute; - right: 0px; - bottom: 20px; - } - } -} diff --git a/smart-admin-web/src/views/home/components/card.vue b/smart-admin-web/src/views/home/components/card.vue deleted file mode 100644 index 763eabf4..00000000 --- a/smart-admin-web/src/views/home/components/card.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/home/components/chart-bar.vue b/smart-admin-web/src/views/home/components/chart-bar.vue deleted file mode 100644 index 8130be3c..00000000 --- a/smart-admin-web/src/views/home/components/chart-bar.vue +++ /dev/null @@ -1,140 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/home/components/chart-funnel.vue b/smart-admin-web/src/views/home/components/chart-funnel.vue deleted file mode 100644 index dd076399..00000000 --- a/smart-admin-web/src/views/home/components/chart-funnel.vue +++ /dev/null @@ -1,106 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/home/components/chart-gauge.vue b/smart-admin-web/src/views/home/components/chart-gauge.vue deleted file mode 100644 index 99750aa7..00000000 --- a/smart-admin-web/src/views/home/components/chart-gauge.vue +++ /dev/null @@ -1,87 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/home/components/chart-line.vue b/smart-admin-web/src/views/home/components/chart-line.vue deleted file mode 100644 index d7aeed44..00000000 --- a/smart-admin-web/src/views/home/components/chart-line.vue +++ /dev/null @@ -1,123 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/home/components/chart-pie.vue b/smart-admin-web/src/views/home/components/chart-pie.vue deleted file mode 100644 index 01037399..00000000 --- a/smart-admin-web/src/views/home/components/chart-pie.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/home/components/home-circle.vue b/smart-admin-web/src/views/home/components/home-circle.vue deleted file mode 100644 index 903ec4e2..00000000 --- a/smart-admin-web/src/views/home/components/home-circle.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/home/components/home-progress.vue b/smart-admin-web/src/views/home/components/home-progress.vue deleted file mode 100644 index dc9682a7..00000000 --- a/smart-admin-web/src/views/home/components/home-progress.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/home/components/theme.json b/smart-admin-web/src/views/home/components/theme.json deleted file mode 100644 index 909b518a..00000000 --- a/smart-admin-web/src/views/home/components/theme.json +++ /dev/null @@ -1,490 +0,0 @@ -{ - "color": [ - "#2d8cf0", - "#19be6b", - "#ff9900", - "#E46CBB", - "#9A66E4", - "#ed3f14" - ], - "backgroundColor": "rgba(0,0,0,0)", - "textStyle": {}, - "title": { - "textStyle": { - "color": "#516b91" - }, - "subtextStyle": { - "color": "#93b7e3" - } - }, - "line": { - "itemStyle": { - "normal": { - "borderWidth": "2" - } - }, - "lineStyle": { - "normal": { - "width": "2" - } - }, - "symbolSize": "6", - "symbol": "emptyCircle", - "smooth": true - }, - "radar": { - "itemStyle": { - "normal": { - "borderWidth": "2" - } - }, - "lineStyle": { - "normal": { - "width": "2" - } - }, - "symbolSize": "6", - "symbol": "emptyCircle", - "smooth": true - }, - "bar": { - "itemStyle": { - "normal": { - "barBorderWidth": 0, - "barBorderColor": "#ccc" - }, - "emphasis": { - "barBorderWidth": 0, - "barBorderColor": "#ccc" - } - } - }, - "pie": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "scatter": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "boxplot": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "parallel": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "sankey": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "funnel": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "gauge": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - }, - "emphasis": { - "borderWidth": 0, - "borderColor": "#ccc" - } - } - }, - "candlestick": { - "itemStyle": { - "normal": { - "color": "#edafda", - "color0": "transparent", - "borderColor": "#d680bc", - "borderColor0": "#8fd3e8", - "borderWidth": "2" - } - } - }, - "graph": { - "itemStyle": { - "normal": { - "borderWidth": 0, - "borderColor": "#ccc" - } - }, - "lineStyle": { - "normal": { - "width": 1, - "color": "#aaa" - } - }, - "symbolSize": "6", - "symbol": "emptyCircle", - "smooth": true, - "color": [ - "#2d8cf0", - "#19be6b", - "#f5ae4a", - "#9189d5", - "#56cae2", - "#cbb0e3" - ], - "label": { - "normal": { - "textStyle": { - "color": "#eee" - } - } - } - }, - "map": { - "itemStyle": { - "normal": { - "areaColor": "#f3f3f3", - "borderColor": "#516b91", - "borderWidth": 0.5 - }, - "emphasis": { - "areaColor": "rgba(165,231,240,1)", - "borderColor": "#516b91", - "borderWidth": 1 - } - }, - "label": { - "normal": { - "textStyle": { - "color": "#000" - } - }, - "emphasis": { - "textStyle": { - "color": "rgb(81,107,145)" - } - } - } - }, - "geo": { - "itemStyle": { - "normal": { - "areaColor": "#f3f3f3", - "borderColor": "#516b91", - "borderWidth": 0.5 - }, - "emphasis": { - "areaColor": "rgba(165,231,240,1)", - "borderColor": "#516b91", - "borderWidth": 1 - } - }, - "label": { - "normal": { - "textStyle": { - "color": "#000" - } - }, - "emphasis": { - "textStyle": { - "color": "rgb(81,107,145)" - } - } - } - }, - "categoryAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.05)", - "rgba(200,200,200,0.02)" - ] - } - } - }, - "valueAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.05)", - "rgba(200,200,200,0.02)" - ] - } - } - }, - "logAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.05)", - "rgba(200,200,200,0.02)" - ] - } - } - }, - "timeAxis": { - "axisLine": { - "show": true, - "lineStyle": { - "color": "#cccccc" - } - }, - "axisTick": { - "show": false, - "lineStyle": { - "color": "#333" - } - }, - "axisLabel": { - "show": true, - "textStyle": { - "color": "#999999" - } - }, - "splitLine": { - "show": true, - "lineStyle": { - "color": [ - "#eeeeee" - ] - } - }, - "splitArea": { - "show": false, - "areaStyle": { - "color": [ - "rgba(250,250,250,0.05)", - "rgba(200,200,200,0.02)" - ] - } - } - }, - "toolbox": { - "iconStyle": { - "normal": { - "borderColor": "#999" - }, - "emphasis": { - "borderColor": "#666" - } - } - }, - "legend": { - "textStyle": { - "color": "#999999" - } - }, - "tooltip": { - "axisPointer": { - "lineStyle": { - "color": "#ccc", - "width": 1 - }, - "crossStyle": { - "color": "#ccc", - "width": 1 - } - } - }, - "timeline": { - "lineStyle": { - "color": "#8fd3e8", - "width": 1 - }, - "itemStyle": { - "normal": { - "color": "#8fd3e8", - "borderWidth": 1 - }, - "emphasis": { - "color": "#8fd3e8" - } - }, - "controlStyle": { - "normal": { - "color": "#8fd3e8", - "borderColor": "#8fd3e8", - "borderWidth": 0.5 - }, - "emphasis": { - "color": "#8fd3e8", - "borderColor": "#8fd3e8", - "borderWidth": 0.5 - } - }, - "checkpointStyle": { - "color": "#8fd3e8", - "borderColor": "rgba(138,124,168,0.37)" - }, - "label": { - "normal": { - "textStyle": { - "color": "#8fd3e8" - } - }, - "emphasis": { - "textStyle": { - "color": "#8fd3e8" - } - } - } - }, - "visualMap": { - "color": [ - "#516b91", - "#59c4e6", - "#a5e7f0" - ] - }, - "dataZoom": { - "backgroundColor": "rgba(0,0,0,0)", - "dataBackgroundColor": "rgba(255,255,255,0.3)", - "fillerColor": "rgba(167,183,204,0.4)", - "handleColor": "#a7b7cc", - "handleSize": "100%", - "textStyle": { - "color": "#333" - } - }, - "markPoint": { - "label": { - "normal": { - "textStyle": { - "color": "#eee" - } - }, - "emphasis": { - "textStyle": { - "color": "#eee" - } - } - } - } -} \ No newline at end of file diff --git a/smart-admin-web/src/views/home/home.vue b/smart-admin-web/src/views/home/home.vue deleted file mode 100644 index 99cdbac2..00000000 --- a/smart-admin-web/src/views/home/home.vue +++ /dev/null @@ -1,154 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/home/index.js b/smart-admin-web/src/views/home/index.js deleted file mode 100644 index 5f66ed9d..00000000 --- a/smart-admin-web/src/views/home/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import home from './home.vue'; -export default home; diff --git a/smart-admin-web/src/views/login/canvas.js b/smart-admin-web/src/views/login/canvas.js deleted file mode 100644 index 67b21ffb..00000000 --- a/smart-admin-web/src/views/login/canvas.js +++ /dev/null @@ -1,289 +0,0 @@ -// 离子波浪 -export const lonWave = () => { - var starlings = function (n, r, t, o, e, u, i, f) { - var a = f.onSetup - void 0 === a && (a = null) - var v = f.onRepeat - void 0 === v && (v = null) - var c = f.modifier - void 0 === c && (c = null) - var l = f.perspective - void 0 === l && (l = 1) - var d = f.pixelRatio - void 0 === d && (d = 1) - var m = f.triangles - void 0 === m && (m = !1) - var s - var p - var y = r.length - var w = function (n, r) { - let t = s.createShader(n) - return s.shaderSource(t, r), s.compileShader(t), t - } - var b = function () { - for (var n = 0; n < o.length; n += 1) { - for (var r = s.createBuffer(), e = o[n], u = e.data(0, 0).length, i = new Float32Array(t * y * u), f = 0; f < t; f += 1) { - for (var a = e.data(f, t), v = f * y * u, l = 0; l < y; l += 1) { - for (var d = 0; d < u; d += 1) { - c !== null && e.name === c.attribute ? i[v] = c.value(i[v], a, d, l) : i[v] = a[d] - v += 1 - } - } - } - s.bindBuffer(s.ARRAY_BUFFER, r) - s.bufferData(s.ARRAY_BUFFER, i, s.STATIC_DRAW) - var m = s.getAttribLocation(p, o[n].name) - s.enableVertexAttribArray(m) - s.vertexAttribPointer(m, u, s.FLOAT, !1, !1, 0, 0) - } - } - var A = function () { - e.push({ - name: 'uMVP', - type: 'mat4' - }) - for (var n = 0; n < e.length; n += 1) { - var r = s.getUniformLocation(p, e[n].name) - e[n].location = r - } - } - var F = { - float: function (n, r) { - return s.uniform1f(n, r) - }, - vec2: function (n, r) { - return s.uniform2fv(n, r) - }, - vec3: function (n, r) { - return s.uniform3fv(n, r) - }, - vec4: function (n, r) { - return s.uniform4fv(n, r) - }, - mat2: function (n, r) { - return s.uniformMatrix2fv(n, !1, r) - }, - mat3: function (n, r) { - return s.uniformMatrix3fv(n, !1, r) - }, - mat4: function (n, r) { - return s.uniformMatrix4fv(n, !1, r) - } - } - var g = function () { - s.clear(16640) - s.useProgram(p) - v !== null && v(s, p, e) - for (var n = 0; n < e.length; n += 1) F[e[n].type](e[n].location, e[n].value) - s.drawArrays(m ? s.TRIANGLES : s.POINTS, 0, y * t) - requestAnimationFrame(g) - } - var h = function () { - n.width = n.clientWidth * d - n.height = n.clientHeight * d - var r = s.drawingBufferWidth - var t = s.drawingBufferHeight - s.viewport(0, 0, r, t) - e[e.length - 1].value = [l / (r / t), 0, 0, 0, 0, l, 0, 0, 0, 0, -1, -1, 0, 0, 1, 1] - } - s = n.getContext('webgl') - p = s.createProgram() - s.attachShader(p, w(s.VERTEX_SHADER, u)) - s.attachShader(p, w(s.FRAGMENT_SHADER, i)) - s.linkProgram(p) - A() - h() - b() - a !== null && a(s) - g() - window.addEventListener('resize', h, !1) - } - - // Do you like rainbow waves? - var rainbow = false - - // Need more performance? - var HD = true - - var canvas = document.getElementById('canvas') - var background = document.querySelector('.background') - var bar = document.querySelector('.progress') - var initialize = function initialize (vertices) { - var pixelRatio = HD ? window.devicePixelRatio : 1 - var rows = HD ? 90 : 90 - var multiplier = rows * rows - var duration = 0.4 - var geometry = [{ - x: 0, - y: 0, - z: 0 - }] - var pointSize = (HD ? 6 : 2).toFixed(1) - - var step = 0.004 - var size = 5 - var attributes = [{ - name: 'aPositionStart', - data: function data (i, total) { - return [size - (i % rows / rows + 0.5 / rows) * (size * 2), -1, (size - (Math.floor(i / rows) / rows + 0.5 / rows) * size * 2) * -1] - } - }, - { - name: 'aControlPointOne', - data: function data (i) { - return [size - (i % rows / rows + 0.5 / rows) * (size * 2), -0.5 + getRandom(0.2), (size - (Math.floor(i / rows) / rows + 0.5 / rows) * size * 2) * -1] - } - }, - { - name: 'aControlPointTwo', - data: function data (i) { - return [size - (i % rows / rows + 0.5 / rows) * (size * 2), -0.5 + getRandom(0.2), (size - (Math.floor(i / rows) / rows + 0.5 / rows) * size * 2) * -1] - } - }, - { - name: 'aPositionEnd', - data: function data (i) { - return [size - (i % rows / rows + 0.5 / rows) * (size * 2), -1, (size - (Math.floor(i / rows) / rows + 0.5 / rows) * size * 2) * -1] - } - }, - { - name: 'aOffset', - data: function data (i) { - return [i * ((1 - duration) / (multiplier - 1))] - } - }, - { - name: 'aColor', - data: function data (i, total) { - return getHSL(rainbow ? i / total * 1.0 : 0.5 + i / total * 0.4, 0.5, 0.5) - } - }] - - var uniforms = [{ - name: 'uProgress', - type: 'float', - value: 0.8 - }] - - var vertexShader = '\n attribute vec3 aPositionStart;\n attribute vec3 aControlPointOne;\n attribute vec3 aControlPointTwo;\n attribute vec3 aPositionEnd;\n attribute float aOffset;\n attribute vec3 aColor;\n\n uniform float uProgress;\n uniform mat4 uMVP;\n\n varying vec3 vColor;\n\n vec3 bezier4(vec3 a, vec3 b, vec3 c, vec3 d, float t) {\n return mix(mix(mix(a, b, t), mix(b, c, t), t), mix(mix(b, c, t), mix(c, d, t), t), t);\n }\n\n float easeInOutQuint(float t){\n return t < 0.5 ? 16.0 * t * t * t * t * t : 1.0 + 16.0 * (--t) * t * t * t * t;\n }\n\n void main () {\n float tProgress = easeInOutQuint(min(1.0, max(0.0, (uProgress - aOffset)) / ' + duration + '));\n vec3 newPosition = bezier4(aPositionStart, aControlPointOne, aControlPointTwo, aPositionEnd, tProgress);\n gl_PointSize = ' + pointSize + ' + ((newPosition.y + 1.0) * 80.0);\n gl_Position = uMVP * vec4(newPosition, 1.0);\n vColor = aColor;\n }\n' - - var fragmentShader = '\n precision mediump float;\n\n varying vec3 vColor;\n\n void main() {\n vec2 pc = 2.0 * gl_PointCoord - 1.0;\n gl_FragColor = vec4(vColor, 1.0 - dot(pc, pc));\n }\n' - - var onSetup = function onSetup (gl) { - gl.blendFunc(gl.SRC_ALPHA, gl.ONE) - gl.enable(gl.BLEND) - } - - var onRepeat = function onRepeat () { - rotateY(uniforms[uniforms.length - 1].value, 0.002) - if (uniforms[0].value < 0) { - uniforms[0].value = 1 - } - uniforms[0].value -= step - } - - var options = { - onSetup: onSetup, - onRepeat: onRepeat, - pixelRatio: pixelRatio - } - - starlings(canvas, geometry, multiplier, attributes, uniforms, vertexShader, fragmentShader, options) - } - - var getRandom = function getRandom (value) { - return Math.random() * value - value / 2 - } - - var rotateY = function rotateY (matrix, angle) { - var sin = Math.sin(angle) - var cos = Math.cos(angle) - var clone = JSON.parse(JSON.stringify(matrix)) - - matrix[0] = clone[0] * cos - clone[8] * sin - matrix[1] = clone[1] * cos - clone[9] * sin - matrix[2] = clone[2] * cos - clone[10] * sin - matrix[3] = clone[3] * cos - clone[11] * sin - matrix[8] = clone[0] * sin + clone[8] * cos - matrix[9] = clone[1] * sin + clone[9] * cos - matrix[10] = clone[2] * sin + clone[10] * cos - matrix[11] = clone[3] * sin + clone[11] * cos - } - - var h2r = function h2r (p, q, t) { - if (t < 0) t += 1 - if (t > 1) t -= 1 - if (t < 1 / 6) return p + (q - p) * 6 * t - if (t < 1 / 2) return q - if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t) - return p - } - - var getHSL = function getHSL (h, s, l) { - h = (h % 1 + 1) % 1 - s = Math.max(0, Math.min(1, s)) - l = Math.max(0, Math.min(1, l)) - if (s === 0) return [l, l, l] - var p = l <= 0.5 ? l * (1 + s) : l + s - l * s - var q = 2 * l - p - return [h2r(q, p, h + 1 / 3), h2r(q, p, h), h2r(q, p, h - 1 / 3)] - } - initialize() -} - -// 随机线条 -export const canvasParticle = (function () { - function getElementByTag (name) { return document.getElementsByTagName(name) } - function getELementById (id) { return document.getElementById(id) } - function canvasInit (canvasConfig) { - canvasConfig = canvasConfig || {} - var html = getElementByTag('html')[0] - var body = document.getElementById('canvasView') - var canvasObj = document.createElement('canvas') - var canvas = { element: canvasObj, points: [], config: { vx: canvasConfig.vx || 4, vy: canvasConfig.vy || 4, height: canvasConfig.height || 2, width: canvasConfig.width || 2, count: canvasConfig.count || 100, color: canvasConfig.color || '121, 162, 185', stroke: canvasConfig.stroke || '130,255,255', dist: canvasConfig.dist || 6000, e_dist: canvasConfig.e_dist || 20000, max_conn: 10 } }; if (canvas.element.getContext('2d')) { canvas.context = canvas.element.getContext('2d') } else { return null } - body.style.padding = '0'; body.style.margin = '0'; body.appendChild(canvas.element); canvas.element.style = 'position: fixed; top: 0; left: 0; z-index: -1;'; canvasSize(canvas.element); window.onresize = function () { canvasSize(canvas.element) } - body.onmousemove = function (e) { var event = e || window.event; canvas.mouse = { x: event.clientX, y: event.clientY } } - document.onmouseleave = function () { canvas.mouse = undefined } - setInterval(function () { drawPoint(canvas) }, 40) - } - function canvasSize (canvas) { - var width = document.getElementById('canvasView').style.width - var height = document.getElementById('canvasView').style.height - width = parseInt(width); height = parseInt(height) - canvas.width = width || window.innerWeight || document.documentElement.clientWidth || document.body.clientWidth; canvas.height = height || window.innerWeight || document.documentElement.clientHeight || document.body.clientHeight - } - function drawPoint (canvas) { - var context = canvas.context - var point - var dist - context.clearRect(0, 0, canvas.element.width, canvas.element.height); context.beginPath(); context.fillStyle = 'rgb(' + canvas.config.color + ')'; for (var i = 0, len = canvas.config.count; i < len; i++) { - if (canvas.points.length != canvas.config.count) { point = { x: Math.floor(Math.random() * canvas.element.width), y: Math.floor(Math.random() * canvas.element.height), vx: canvas.config.vx / 2 - Math.random() * canvas.config.vx, vy: canvas.config.vy / 2 - Math.random() * canvas.config.vy } } else { point = borderPoint(canvas.points[i], canvas) } - context.fillRect(point.x - canvas.config.width / 2, point.y - canvas.config.height / 2, canvas.config.width, canvas.config.height); canvas.points[i] = point - } - drawLine(context, canvas, canvas.mouse); context.closePath() - } - function borderPoint (point, canvas) { - var p = point; if (point.x <= 0 || point.x >= canvas.element.width) { p.vx = -p.vx; p.x += p.vx } else if (point.y <= 0 || point.y >= canvas.element.height) { p.vy = -p.vy; p.y += p.vy } else { p = { x: p.x + p.vx, y: p.y + p.vy, vx: p.vx, vy: p.vy } } - return p - } - function drawLine (context, canvas, mouse) { - let dist - context = context || canvas.context; for (var i = 0, len = canvas.config.count; i < len; i++) { - canvas.points[i].max_conn = 0; for (var j = 0; j < len; j++) { - if (i != j) { - dist = Math.round(canvas.points[i].x - canvas.points[j].x) * Math.round(canvas.points[i].x - canvas.points[j].x) + - Math.round(canvas.points[i].y - canvas.points[j].y) * Math.round(canvas.points[i].y - canvas.points[j].y); if (dist <= canvas.config.dist && canvas.points[i].max_conn < canvas.config.max_conn) { - canvas.points[i].max_conn++; context.lineWidth = 0.5 - dist / canvas.config.dist; context.strokeStyle = 'rgba(' + canvas.config.stroke + ',' + (1 - dist / canvas.config.dist) + ')' - context.beginPath(); context.moveTo(canvas.points[i].x, canvas.points[i].y); context.lineTo(canvas.points[j].x, canvas.points[j].y); context.stroke() - } - } - } - if (mouse) { - dist = Math.round(canvas.points[i].x - mouse.x) * Math.round(canvas.points[i].x - mouse.x) + - Math.round(canvas.points[i].y - mouse.y) * Math.round(canvas.points[i].y - mouse.y); if (dist > canvas.config.dist && dist <= canvas.config.e_dist) { canvas.points[i].x = canvas.points[i].x + (mouse.x - canvas.points[i].x) / 20; canvas.points[i].y = canvas.points[i].y + (mouse.y - canvas.points[i].y) / 20 } - if (dist <= canvas.config.e_dist) { context.lineWidth = 1; context.strokeStyle = 'rgba(' + canvas.config.stroke + ',' + (1 - dist / canvas.config.e_dist) + ')'; context.beginPath(); context.moveTo(canvas.points[i].x, canvas.points[i].y); context.lineTo(mouse.x, mouse.y); context.stroke() } - } - } - } - return canvasInit -})() diff --git a/smart-admin-web/src/views/login/components/login-form.vue b/smart-admin-web/src/views/login/components/login-form.vue deleted file mode 100644 index b50ae0e6..00000000 --- a/smart-admin-web/src/views/login/components/login-form.vue +++ /dev/null @@ -1,134 +0,0 @@ - - diff --git a/smart-admin-web/src/views/login/login.less b/smart-admin-web/src/views/login/login.less deleted file mode 100644 index 82a52efc..00000000 --- a/smart-admin-web/src/views/login/login.less +++ /dev/null @@ -1,128 +0,0 @@ -.center { - text-align: center; -} - -.login { - font-family: Arial, "PingFang SC", "Microsoft YaHei"; - width: 100%; - height: 100%; - background: url(../../assets/images/login-bg.jpg) no-repeat fixed; - background-size: cover; - - .content { - width: 424px; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -56%) - } - .ivu-card { - background: rgba(255, 255, 255, 0.95); - border-radius: 10px; - box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.3); - } - .form-con { - margin: 32px 0; - width: 424px; - background: #fff; - padding: 32px 32px; - border-radius: 8px; - .ivu-input { - border: 1px solid #E8E8EE; - border-radius: 4px; - font-size: 16px; - color: #525252; - padding: 0 20px; - &:focus { - border: 1px solid #0097F6; - box-shadow: none; - } - } - .ivu-form-item-error-tip { - height: 30px; - line-height: 30px; - padding: 0; - color: #f66; - top:90%; - } - .ivu-form-item { - margin-bottom: 22px; - } - .remember { - margin: -10px 0 10px; - } - .ivu-input, - .ivu-btn { - height: 48px; - } - .ivu-btn { - font-size: 16px; - } - .ivu-input-group-prepend { - padding: 4px 15px; - } - .code-input { - width: 172px; - } - .codeUrl { - height: 80%; - position: absolute; - z-index: 3; - top: 0; - bottom: 0; - margin: auto; - right: 24px; - border-radius: 0 4px 4px 0; - cursor: pointer; - } - } - .login-tip { - font-size: 10px; - text-align: center; - color: #c3c3c3; - } - .footerDesc { - font-family: "MicrosoftYaHei"; - color: #A6A6A8; - font-size: 14px; - } - .otherWay { - font-size: 14px; - font-family: "Microsoft YaHei"; - .inline { - display: inline-block; - } - .align { - vertical-align: middle; - } - .marginLeft { - margin-left: 20px; - float:right; - } - } - .remember { - font-size: 14px; - } -} -.draw { - position: fixed; - width: 1px; - z-index: 99999; - line-height: 1px; - pointer-events: none; -} - -@keyframes floatOne { - 0% { - opacity: 1; - } - - 50% { - opacity: 1; - } - - 100% { - opacity: 0; - transform: translate3D(0, -20px, 0) scale(5) rotate(45deg); - } -} \ No newline at end of file diff --git a/smart-admin-web/src/views/login/login.vue b/smart-admin-web/src/views/login/login.vue deleted file mode 100644 index 0e529a15..00000000 --- a/smart-admin-web/src/views/login/login.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/support/api-doc/swagger.vue b/smart-admin-web/src/views/support/api-doc/swagger.vue deleted file mode 100644 index c05f5e73..00000000 --- a/smart-admin-web/src/views/support/api-doc/swagger.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/support/heart-beat/heart-beat-list.vue b/smart-admin-web/src/views/support/heart-beat/heart-beat-list.vue deleted file mode 100644 index 1637378e..00000000 --- a/smart-admin-web/src/views/support/heart-beat/heart-beat-list.vue +++ /dev/null @@ -1,115 +0,0 @@ - - diff --git a/smart-admin-web/src/views/support/monitor/online-user.vue b/smart-admin-web/src/views/support/monitor/online-user.vue deleted file mode 100644 index b133c303..00000000 --- a/smart-admin-web/src/views/support/monitor/online-user.vue +++ /dev/null @@ -1,152 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/support/monitor/sql.vue b/smart-admin-web/src/views/support/monitor/sql.vue deleted file mode 100644 index ced71bf8..00000000 --- a/smart-admin-web/src/views/support/monitor/sql.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/support/reload/smart-reload/smart-reload-list.vue b/smart-admin-web/src/views/support/reload/smart-reload/smart-reload-list.vue deleted file mode 100644 index b0027c4c..00000000 --- a/smart-admin-web/src/views/support/reload/smart-reload/smart-reload-list.vue +++ /dev/null @@ -1,273 +0,0 @@ - - diff --git a/smart-admin-web/src/views/support/task/task-list.vue b/smart-admin-web/src/views/support/task/task-list.vue deleted file mode 100644 index d73e96be..00000000 --- a/smart-admin-web/src/views/support/task/task-list.vue +++ /dev/null @@ -1,556 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/system/employee/components/department-employee-tree-item/department-employee-tree-item.vue b/smart-admin-web/src/views/system/employee/components/department-employee-tree-item/department-employee-tree-item.vue deleted file mode 100644 index 8f64b4d5..00000000 --- a/smart-admin-web/src/views/system/employee/components/department-employee-tree-item/department-employee-tree-item.vue +++ /dev/null @@ -1,124 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/system/employee/components/department-employee-tree/department-employee-tree.vue b/smart-admin-web/src/views/system/employee/components/department-employee-tree/department-employee-tree.vue deleted file mode 100644 index be1e3c5a..00000000 --- a/smart-admin-web/src/views/system/employee/components/department-employee-tree/department-employee-tree.vue +++ /dev/null @@ -1,251 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/system/employee/position/position-list.vue b/smart-admin-web/src/views/system/employee/position/position-list.vue deleted file mode 100644 index 98870609..00000000 --- a/smart-admin-web/src/views/system/employee/position/position-list.vue +++ /dev/null @@ -1,366 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/system/employee/role-employee/components/employee-table-add/employee-table-add.vue b/smart-admin-web/src/views/system/employee/role-employee/components/employee-table-add/employee-table-add.vue deleted file mode 100644 index e93daec4..00000000 --- a/smart-admin-web/src/views/system/employee/role-employee/components/employee-table-add/employee-table-add.vue +++ /dev/null @@ -1,527 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/system/employee/role-employee/components/employee-table-detail/employee-table-detail.vue b/smart-admin-web/src/views/system/employee/role-employee/components/employee-table-detail/employee-table-detail.vue deleted file mode 100644 index a2cc214d..00000000 --- a/smart-admin-web/src/views/system/employee/role-employee/components/employee-table-detail/employee-table-detail.vue +++ /dev/null @@ -1,72 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/system/employee/role-employee/components/employee-table/employee-table.vue b/smart-admin-web/src/views/system/employee/role-employee/components/employee-table/employee-table.vue deleted file mode 100644 index d75ae5df..00000000 --- a/smart-admin-web/src/views/system/employee/role-employee/components/employee-table/employee-table.vue +++ /dev/null @@ -1,569 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/system/employee/role-employee/role-employee-manage.vue b/smart-admin-web/src/views/system/employee/role-employee/role-employee-manage.vue deleted file mode 100644 index 034407a7..00000000 --- a/smart-admin-web/src/views/system/employee/role-employee/role-employee-manage.vue +++ /dev/null @@ -1,831 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/system/employee/role/components/role-data-scope/role-data-scope.vue b/smart-admin-web/src/views/system/employee/role/components/role-data-scope/role-data-scope.vue deleted file mode 100644 index 0413ce76..00000000 --- a/smart-admin-web/src/views/system/employee/role/components/role-data-scope/role-data-scope.vue +++ /dev/null @@ -1,144 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/system/employee/role/components/role-list/role-list.vue b/smart-admin-web/src/views/system/employee/role/components/role-list/role-list.vue deleted file mode 100644 index 55ab14c3..00000000 --- a/smart-admin-web/src/views/system/employee/role/components/role-list/role-list.vue +++ /dev/null @@ -1,407 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/system/employee/role/components/role-tree/role-tree.vue b/smart-admin-web/src/views/system/employee/role/components/role-tree/role-tree.vue deleted file mode 100644 index fe4eec67..00000000 --- a/smart-admin-web/src/views/system/employee/role/components/role-tree/role-tree.vue +++ /dev/null @@ -1,431 +0,0 @@ - - - - diff --git a/smart-admin-web/src/views/system/employee/role/role-manage.vue b/smart-admin-web/src/views/system/employee/role/role-manage.vue deleted file mode 100644 index 9765f362..00000000 --- a/smart-admin-web/src/views/system/employee/role/role-manage.vue +++ /dev/null @@ -1,339 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/system/file/file-list.vue b/smart-admin-web/src/views/system/file/file-list.vue deleted file mode 100644 index 9f79d984..00000000 --- a/smart-admin-web/src/views/system/file/file-list.vue +++ /dev/null @@ -1,279 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/system/system-setting/system-config/system-config.vue b/smart-admin-web/src/views/system/system-setting/system-config/system-config.vue deleted file mode 100644 index 0fd884a4..00000000 --- a/smart-admin-web/src/views/system/system-setting/system-config/system-config.vue +++ /dev/null @@ -1,397 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/system/system-setting/system-privilege/components/privilege-form.vue b/smart-admin-web/src/views/system/system-setting/system-privilege/components/privilege-form.vue deleted file mode 100644 index f4454771..00000000 --- a/smart-admin-web/src/views/system/system-setting/system-privilege/components/privilege-form.vue +++ /dev/null @@ -1,144 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/system/system-setting/system-privilege/system-privilege.vue b/smart-admin-web/src/views/system/system-setting/system-privilege/system-privilege.vue deleted file mode 100644 index ade7836b..00000000 --- a/smart-admin-web/src/views/system/system-setting/system-privilege/system-privilege.vue +++ /dev/null @@ -1,410 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/system/user-log/user-login-log.vue b/smart-admin-web/src/views/system/user-log/user-login-log.vue deleted file mode 100644 index bc9b0928..00000000 --- a/smart-admin-web/src/views/system/user-log/user-login-log.vue +++ /dev/null @@ -1,185 +0,0 @@ - - - diff --git a/smart-admin-web/src/views/system/user-log/user-operate-log.vue b/smart-admin-web/src/views/system/user-log/user-operate-log.vue deleted file mode 100644 index db47df63..00000000 --- a/smart-admin-web/src/views/system/user-log/user-operate-log.vue +++ /dev/null @@ -1,252 +0,0 @@ - - - - - diff --git a/smart-admin-web/src/views/three-router/three-content.vue b/smart-admin-web/src/views/three-router/three-content.vue deleted file mode 100644 index eeac6f71..00000000 --- a/smart-admin-web/src/views/three-router/three-content.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/smart-admin-web/tests/e2e/.eslintrc b/smart-admin-web/tests/e2e/.eslintrc deleted file mode 100644 index 02023fba..00000000 --- a/smart-admin-web/tests/e2e/.eslintrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "plugins": [ - "cypress" - ], - "env": { - "mocha": true, - "cypress/globals": true - }, - "rules": { - "strict": "off" - } -} diff --git a/smart-admin-web/tests/e2e/plugins/index.js b/smart-admin-web/tests/e2e/plugins/index.js deleted file mode 100644 index cfefc78b..00000000 --- a/smart-admin-web/tests/e2e/plugins/index.js +++ /dev/null @@ -1,9 +0,0 @@ -// https://docs.cypress.io/guides/guides/plugins-guide.html - -module.exports = (on, config) => Object.assign({}, config, { - fixturesFolder: 'tests/e2e/fixtures', - integrationFolder: 'tests/e2e/specs', - screenshotsFolder: 'tests/e2e/screenshots', - videosFolder: 'tests/e2e/videos', - supportFile: 'tests/e2e/support/index.js' -}) diff --git a/smart-admin-web/tests/e2e/specs/test.js b/smart-admin-web/tests/e2e/specs/test.js deleted file mode 100644 index 41ad94a0..00000000 --- a/smart-admin-web/tests/e2e/specs/test.js +++ /dev/null @@ -1,8 +0,0 @@ -// https://docs.cypress.io/api/introduction/api.html - -describe('My First Test', () => { - it('Visits the app root url', () => { - cy.visit('/') - cy.contains('h1', 'Welcome to Your Vue.js App') - }) -}) diff --git a/smart-admin-web/tests/e2e/support/commands.js b/smart-admin-web/tests/e2e/support/commands.js deleted file mode 100644 index c1f5a772..00000000 --- a/smart-admin-web/tests/e2e/support/commands.js +++ /dev/null @@ -1,25 +0,0 @@ -// *********************************************** -// This example commands.js shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add("login", (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This is will overwrite an existing command -- -// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) diff --git a/smart-admin-web/tests/e2e/support/index.js b/smart-admin-web/tests/e2e/support/index.js deleted file mode 100644 index d68db96d..00000000 --- a/smart-admin-web/tests/e2e/support/index.js +++ /dev/null @@ -1,20 +0,0 @@ -// *********************************************************** -// This example support/index.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands' - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/smart-admin-web/tests/unit/.eslintrc.js b/smart-admin-web/tests/unit/.eslintrc.js deleted file mode 100644 index 8038afe9..00000000 --- a/smart-admin-web/tests/unit/.eslintrc.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - env: { - mocha: true - }, - rules: { - 'import/no-extraneous-dependencies': 'off' - } -} diff --git a/smart-admin-web/tests/unit/HelloWorld.spec.js b/smart-admin-web/tests/unit/HelloWorld.spec.js deleted file mode 100644 index bb668bf4..00000000 --- a/smart-admin-web/tests/unit/HelloWorld.spec.js +++ /dev/null @@ -1,13 +0,0 @@ -import { expect } from 'chai' -import { shallow } from '@vue/test-utils' -import HelloWorld from '@/components/HelloWorld.vue' - -describe('HelloWorld.vue', () => { - it('renders props.msg when passed', () => { - const msg = 'new message' - const wrapper = shallow(HelloWorld, { - propsData: { msg } - }) - expect(wrapper.text()).to.include(msg) - }) -}) diff --git a/smart-admin-web/vscode/settings.json b/smart-admin-web/vscode/settings.json deleted file mode 100644 index ab4bb79a..00000000 --- a/smart-admin-web/vscode/settings.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\cmd.exe", - "jetbrainsKeymap.promptV3Features": true, - "editor.multiCursorModifier": "ctrlCmd", - "editor.formatOnPaste": true, - "debug.allowBreakpointsEverywhere": true, - "files.autoSave": "afterDelay", - "workbench.colorTheme": "One Dark Pro", - "workbench.iconTheme": "vscode-icons", - "vetur.validation.template": false, - "[javascript]": { - "editor.defaultFormatter": "vscode.typescript-language-features" - }, - "[less]": { - "editor.defaultFormatter": "HookyQR.beautify" - }, - "javascript.format.insertSpaceBeforeFunctionParenthesis": true, - "eslint.autoFixOnSave": true, - "eslint.alwaysShowStatus": true, - "workbench.startupEditor": "newUntitledFile", - //"vetur.format.defaultFormatter.html": "js-beautify-html", - //"vetur.format.defaultFormatter.js": "vscode-typescript", //让vue中的js按编辑器自带的ts格式进行格式化 - "vetur.format.defaultFormatterOptions": { - // "js-beautify-html": { - // // force|force-aligned | force-expand-multiline - // "wrap_line_length": 100, - // "wrap_attributes": "auto", - // "end_with_newline": false - // //"wrap_attributes": "auto" - // }, - "prettyhtml": { - "printWidth": 100, - "singleQuote": false, - "wrapAttributes": false, - "sortAttributes": true - }, - "prettier": { - "semi": true, - "singleQuote": true - } - }, - "search.location": "panel", -} diff --git a/smart-admin-web/vue.config.js b/smart-admin-web/vue.config.js deleted file mode 100644 index af5bfbf7..00000000 --- a/smart-admin-web/vue.config.js +++ /dev/null @@ -1,77 +0,0 @@ -const path = require('path'); -const resolve = dir => { - return path.join(__dirname, dir); -}; -const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); -const CompressionWebpackPlugin = require('compression-webpack-plugin'); -const productionGzipExtensions = ['js', 'css']; -// 项目部署基础 -// 默认情况下,我们假设你的应用将被部署在域的根目录下, -// 例如:https://www.my-app.com/ -// 默认:'/' -// 如果您的应用程序部署在子路径中,则需要在这指定子路径 -// 例如:https://www.foobar.com/my-app/ -// 需要将它改为'/my-app/' -const publicPath = process.env.NODE_ENV === 'production' ? '/' : '/'; -const lintOnSave = process.env.NODE_ENV === 'production'; - -module.exports = { - // Project deployment base - // By default we assume your app will be deployed at the root of a domain, - // e.g. https://www.my-app.com/ - // If your app is deployed at a sub-path, you will need to specify that - // sub-path here. For example, if your app is deployed at - // https://www.foobar.com/my-app/ - // then change this to '/my-app/' - publicPath, - // tweak internal webpack configuration. - // see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md - // 如果你不需要使用eslint,把lintOnSave设为false即可 - lintOnSave, - chainWebpack: config => { - config.entry = { - main: ['babel-polyfill', './src/main'], - vendors: './src/vendors' - }; - config.module - .rule('view-design') - .test(/view-design.src.*?js$/) - .use('babel') - .loader('babel-loader') - .end(); - config.resolve.alias - .set('@', resolve('src')) // key,value自行定义,比如.set('@@', resolve('src/components')) - .set('_c', resolve('src/components')); - }, - // 设为false打包时不生成.map文件 - productionSourceMap: false, - // 这里写你调用接口的基础路径,来解决跨域,如果设置了代理,那你本地开发环境的axios的baseUrl要写为 '' ,即空字符串 - // devServer: { - // proxy: 'localhost:3000' - // } - configureWebpack: { - plugins: [ - // 开启gzip压缩 - new CompressionWebpackPlugin({ - algorithm: 'gzip', - test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'), - threshold: 10240, - minRatio: 0.8 - }) - ], - optimization: { - minimizer: [ - new UglifyJsPlugin({ - uglifyOptions: { - compress: { - warnings: true, - drop_console: true, // console - drop_debugger: true, - pure_funcs: ['console.log'] // 移除console - } - } - }) - ] - } - } -}; diff --git a/代码规范/api接口规范.md b/代码规范/api接口规范.md deleted file mode 100644 index 044b17dd..00000000 --- a/代码规范/api接口规范.md +++ /dev/null @@ -1,38 +0,0 @@ -### Restful接口规范 -1、不推荐使用 rest 命名 url, 只能使用 get/post 方法。url 命名上规范如下:虽然 Rest 大法好,但是有时并不能一眼根据 url看出来是什么操作。 -url 格式为: - -/业务模块/子模块/动作 - -举例: -``` -GET /department/get/{id} 查询某个部门详细信息 -POST /department/query 复杂查询 -POST /department/add 添加部门 -POST /department/update 更新部门 -GET /department/delete/{id} 删除部门 -``` -### controller 里接口 swagger 规范 -1、controller每个方法必须添加 swagger 文档注解 @ApiOperation ,并填写接口描述信息,描述最后必须加上作者信息 @author 哪吒 -比如: -```java - @ApiOperation("更新部门信息 @author 哪吒") - @PostMapping("/department/update") - public ResponseDTO updateDepartment(@Valid @RequestBody DeptUpdateDTO deptUpdateDTO) { - return departmentService.updateDepartment(deptUpdateDTO); - } -``` - -### controller 里 传入和返回 JavaBean 规范 -1、类中的每个字段添加注释 -2、对于枚举值的类型,要清楚标注清楚可能的值,以及每个值表示什么含义 -比如: -``` -public class UserVO{ - - @ApiModelProperty("性别:0表示 女,1表示 男,2表示 未知") - private Integer gender; - -} - -``` \ No newline at end of file diff --git a/代码规范/front-standard-guide.md b/代码规范/front-standard-guide.md deleted file mode 100644 index 629b060d..00000000 --- a/代码规范/front-standard-guide.md +++ /dev/null @@ -1,1148 +0,0 @@ -# 前端 JS 项目开发规范 - -规范的目的是为了编写高质量的代码,让你的团队成员每天得心情都是愉悦的,大家在一起是快乐的。 - -引自《阿里规约》的开头片段: - -_----现代软件架构的复杂性需要协同开发完成,如何高效地协同呢?无规矩不成方圆,无规范难以协同,比如,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全,试想如果没有限速,没有红绿灯,谁还敢上路行驶。对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。代码的字里行间流淌的是软件系统的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升系统稳定性,码出质量。_ - -# 一、编程规约 - -### (一)命名规范 - -#### 1.1.1 项目命名 - -全部采用小写方式, 以中划线分隔。 - -正例:`mall-management-system` - -反例:`mall_management-system / mallManagementSystem` - -#### 1.1.2 目录命名 - -全部采用小写方式, 以中划线分隔,有复数结构时,要采用复数命名法, 缩写不用复数 - -正例: `scripts / styles / components / images / utils / layouts / demo-styles / demo-scripts / img / doc` - -反例: `script / style / demo_scripts / demoStyles / imgs / docs` - -【特殊】VUE 的项目中的 components 中的组件目录,使用 kebab-case 命名 - -正例: `head-search / page-loading / authorized / notice-icon` - -反例: `HeadSearch / PageLoading` - -【特殊】VUE 的项目中的除 components 组件目录外的所有目录也使用 kebab-case 命名 -正例: `page-one / shopping-car / user-management` - -反例: `ShoppingCar / UserManagement` - -#### 1.1.3 JS、CSS、SCSS、HTML、PNG 文件命名 - -全部采用小写方式, 以中划线分隔 - -正例: `render-dom.js / signup.css / index.html / company-logo.png` - -反例: `renderDom.js / UserManagement.html` - -#### 1.1.4 命名严谨性 - -代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用 - -正例:`henan / luoyang / rmb 等国际通用的名称,可视同英文。` - -反例:`DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3` - -**杜绝完全不规范的缩写,避免望文不知义:** - -反例:AbstractClass“缩写”命名成 AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。 - -### (二)HTML 规范 (Vue Template 同样适用) - -#### 1.2.1 HTML 类型 - -推荐使用 HTML5 的文档类型申明: . -(建议使用 text/html 格式的 HTML。避免使用 XHTML。XHTML 以及它的属性,比如 application/xhtml+xml 在浏览器中的应用支持与优化空间都十分有限)。 - -- 规定字符编码 -- IE 兼容模式 -- 规定字符编码 -- doctype 大写 - -正例: - -```html - - - - - - Page title - - - Company - - -``` - -#### 1.2.2 缩进 - -缩进使用 2 个空格(一个 tab) - -嵌套的节点应该缩进。 - -#### 1.2.3 分块注释 - -在每一个块状元素,列表元素和表格元素后,加上一对 HTML 注释。注释格式 - -\ -

- -
- - -``` - -### 1.2.4 语义化标签 - -HTML5 中新增很多语义化标签,所以优先使用语义化标签,避免一个页面都是 div 或者 p 标签 - -正例 - -```html -
-
-``` - -反例 - -```html -
-

-
-``` - -#### 1.2.5 引号 - -使用双引号(" ") 而不是单引号(' ') 。 - -正例: `
` - -反例: `
` - -### (三) CSS 规范 - -#### 1.3.1 命名 - -- 类名使用小写字母,以中划线分隔 -- id 采用驼峰式命名 -- scss 中的变量、函数、混合、placeholder 采用驼峰式命名 - -ID 和 class 的名称总是使用可以反应元素目的和用途的名称,或其他通用的名称,代替表象和晦涩难懂的名称 - - -不推荐: -```css -.fw-800 { - font-weight: 800; -} - -.red { - color: red; -} -``` -推荐: -``` -.heavy { - font-weight: 800; -} - -.important { - color: red; -} -``` - -#### 1.3.2 选择器 - -1)css 选择器中避免使用标签名 -从结构、表现、行为分离的原则来看,应该尽量避免 css 中出现 HTML 标签,并且在 css 选择器中出现标签名会存在潜在的问题。 - -2)很多前端开发人员写选择器链的时候不使用 直接子选择器(注:直接子选择器和后代选择器的区别)。有时,这可能会导致疼痛的设计问题并且有时候可能会很耗性能。然而,在任何情况下,这是一个非常不好的做法。如果你不写很通用的,需要匹配到 DOM 末端的选择器, 你应该总是考虑直接子选择器。 - -不推荐: - -```css -.content .title { - font-size: 2rem; -} -``` - -推荐: - -```css -.content > .title { - font-size: 2rem; -} -``` - -#### 1.3.3 尽量使用缩写属性 - -不推荐: - -```css -border-top-style: none; -font-family: palatino, georgia, serif; -font-size: 100%; -line-height: 1.6; -padding-bottom: 2em; -padding-left: 1em; -padding-right: 1em; -padding-top: 0; -``` - -推荐: - -```css -border-top: 0; -font: 100%/1.6 palatino, georgia, serif; -padding: 0 1em 2em; -``` -#### 1.3.4 每个选择器及属性独占一行 -不推荐: -``` -button{ - width:100px;height:50px;color:#fff;background:#00a0e9; -} -``` -推荐: -``` -button{ - width:100px; - height:50px; - color:#fff; - background:#00a0e9; -} -``` -#### 1.3.5 省略0后面的单位 -不推荐: -``` -div{ - padding-bottom: 0px; - margin: 0em; -} -``` -推荐: -``` -div{ - padding-bottom: 0; - margin: 0; -} -``` -#### 1.3.6 避免使用ID选择器及全局标签选择器防止污染全局样式 -不推荐: -```css -#header{ - padding-bottom: 0px; - margin: 0em; -} -``` -推荐: -``` -.header{ - padding-bottom: 0px; - margin: 0em; -} -``` - -### (四) LESS 规范 - -#### 1.4.1 代码组织 -##### 1)将公共less文件放置在style/less/common文件夹 -例:// color.less,common.less - - -##### 2)按以下顺序组织 -1、@import; -2、变量声明; -3、样式声明; -``` -@import "mixins/size.less"; - -@default-text-color: #333; - -.page { - width: 960px; - margin: 0 auto; -} -``` -#### 1.4.2 避免嵌套层级过多 - 将嵌套深度限制在3级。对于超过4级的嵌套,给予重新评估。这可以避免出现过于详实的CSS选择器。 -避免大量的嵌套规则。当可读性受到影响时,将之打断。推荐避免出现多于20行的嵌套规则出现 - -不推荐: -```less -.main{ - .title{ - .name{ - color:#fff - } - } -} -``` -推荐: -``` -.main-title{ - .name{ - color:#fff - } -} -``` - -### (五) Javascript 规范 - -#### 1.5.1 命名 - -##### 1) 采用小写驼峰命名 lowerCamelCase,代码中的命名均不能以下划线,也不能以下划线或美元符号结束 - -反例: `_name / name_ / name$` - -##### 2) 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式。 - -正例: `localValue / getHttpMessage() / inputUserId` - -\***\*其中 method 方法命名必须是 动词 或者 动词+名词 形式\*\*** - -正例:`saveShopCarData /openShopCarInfoDialog` - -反例:`save / open / show / go` - -\***\*特此说明,增删查改,详情统一使用如下 5 个单词,不得使用其他(目的是为了统一各个端)\*\*** - -`add / update / delete / detail / get` - -**附: 函数方法常用的动词:** - -```js -get 获取/set 设置, -add 增加/remove 删除 -create 创建/destory 移除 -start 启动/stop 停止 -open 打开/close 关闭, -read 读取/write 写入 -load 载入/save 保存, -create 创建/destroy 销毁 -begin 开始/end 结束, -backup 备份/restore 恢复 -import 导入/export 导出, -split 分割/merge 合并 -inject 注入/extract 提取, -attach 附着/detach 脱离 -bind 绑定/separate 分离, -view 查看/browse 浏览 -edit 编辑/modify 修改, -select 选取/mark 标记 -copy 复制/paste 粘贴, -undo 撤销/redo 重做 -insert 插入/delete 移除, -add 加入/append 添加 -clean 清理/clear 清除, -index 索引/sort 排序 -find 查找/search 搜索, -increase 增加/decrease 减少 -play 播放/pause 暂停, -launch 启动/run 运行 -compile 编译/execute 执行, -debug 调试/trace 跟踪 -observe 观察/listen 监听, -build 构建/publish 发布 -input 输入/output 输出, -encode 编码/decode 解码 -encrypt 加密/decrypt 解密, -compress 压缩/decompress 解压缩 -pack 打包/unpack 解包, -parse 解析/emit 生成 -connect 连接/disconnect 断开, -send 发送/receive 接收 -download 下载/upload 上传, -refresh 刷新/synchronize 同步 -update 更新/revert 复原, -lock 锁定/unlock 解锁 -check out 签出/check in 签入, -submit 提交/commit 交付 -push 推/pull 拉, -expand 展开/collapse 折叠 -begin 起始/end 结束, -start 开始/finish 完成 -enter 进入/exit 退出, -abort 放弃/quit 离开 -obsolete 废弃/depreciate 废旧, -collect 收集/aggregate 聚集 -``` - -##### 3) 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。 - -正例: `MAX_STOCK_COUNT` - -反例: `MAX_COUNT` - -#### 1.5.2 代码格式 - -##### 1) 使用 2 个空格进行缩进 - -正例: - -```js -if (x < y) { - x += 10; -} else { - x += 1; -} -``` - -##### 2) 不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。 - -> 说明:任何情形,没有必要插入多个空行进行隔开。 - -#### 1.5.3 字符串 - -统一使用单引号(‘),不使用双引号(“)。这在创建 HTML 字符串非常有好处: - -正例: - -```js -let str = 'foo'; -let testDiv = '
'; -``` - -反例: - -```js -let str = 'foo'; -let testDiv = "
"; -``` - -#### 1.5.4 对象声明 - -##### 1)使用字面值创建对象 - -正例: `let user = {};` - -反例: `let user = new Object();` - -##### 2) 使用字面量来代替对象构造器 - -正例: - -```js -var user = { - age: 0, - name: 1, - city: 3 -}; -``` - -反例: - -```js -var user = new Object(); -user.age = 0; -user.name = 0; -user.city = 0; -``` - -#### 1.5.5 使用 ES6,7 - -必须优先使用 ES6,7 中新增的语法糖和函数。这将简化你的程序,并让你的代码更加灵活和可复用。 - -> 必须强制使用 ES6, ES7 的新语法,比如箭头函数、await/async , 解构, let , for...of 等等 - -#### 1.5.6 括号 - -下列关键字后必须有大括号(即使代码块的内容只有一行):if, else, for, while, do, switch, try, catch, finally, with。 - -正例: - -```js -if (condition) { - doSomething(); -} -``` - -反例: - -```js -if (condition) doSomething(); -``` - -#### 1.5.7 undefined 判断 - -永远不要直接使用 undefined 进行变量判断;使用 typeof 和字符串'undefined'对变量进行判断。 - -正例: - -```js -if (typeof person === 'undefined') { - ... -} -``` - -反例: - -```js -if (person === undefined) { - ... -} -``` - -#### 1.5.8 条件判断和循环最多三层 - -条件判断能使用三目运算符和逻辑运算符解决的,就不要使用条件判断,但是谨记不要写太长的三目运算符。如果超过 3 层请抽成函数,并写清楚注释。 - -#### 1.5.9 this 的转换命名 - -对上下文 this 的引用只能使用'self'来命名 - -#### 1.5.10 慎用 console.log - -因 console.log 大量使用会有性能问题,所以在非 webpack 项目中谨慎使用 log 功能 - -# 二、Vue 项目规范 - -### (一) Vue 编码基础 - -vue 项目规范以 Vue 官方规范 (https://cn.vuejs.org/v2/style-guide/) 中的 A 规范为基础,在其上面进行项目开发,故所有代码均遵守该规范。 - -> 请仔仔细细阅读 Vue 官方规范,切记,此为第一步。 - -#### 2.1.1. 组件规范 - -##### 1) 组件名为多个单词。 - -组件名应该始终是多个单词组成(大于等于 2),且命名规范为`KebabCase`格式。 -这样做可以避免跟现有的以及未来的 HTML 元素相冲突,因为所有的 HTML 元素名称都是单个单词的。 - -正例: - -```js -export default { - name: 'TodoItem' - // ... -}; -``` - -反例: - -```js -export default { - name: 'Todo', - // ... -} -export default { - name: 'todo-item', - // ... -} -``` - -##### 2) 组件文件名为 pascal-case 格式 - -正例: - -``` -components/ -|- my-component.vue -``` - -反例: - -``` -components/ -|- myComponent.vue -|- MyComponent.vue -``` - -##### 3) 基础组件文件名为 base 开头,使用完整单词而不是缩写。 - -正例: - -``` -components/ -|- base-button.vue -|- base-table.vue -|- base-icon.vue -``` - -反例: - -``` -components/ -|- MyButton.vue -|- VueTable.vue -|- Icon.vue -``` - -##### 4) 和父组件紧密耦合的子组件应该以父组件名作为前缀命名 - -正例: - -``` -components/ -|- todo-list.vue -|- todo-list-item.vue -|- todo-list-item-button.vue -|- user-profile-options.vue (完整单词) -``` - -反例: - -``` -components/ -|- TodoList.vue -|- TodoItem.vue -|- TodoButton.vue -|- UProfOpts.vue (使用了缩写) -``` - -##### 5) 在 Template 模版中使用组件,应使用 PascalCase 模式,并且使用自闭合组件。 - -正例: - -```html - - - -``` - -反例: - -```html -
-``` - -##### 6) 组件的 data 必须是一个函数 - -当在组件中使用 data 属性的时候 (除了 new Vue 外的任何地方),它的值必须是返回一个对象的函数。 因为如果直接是一个对象的话,子组件之间的属性值会互相影响。 - -正例: - -```js -export default { - data () { -​ return { -​ name: 'jack' -​ } - } -} -``` - -反例: - -```js -export default { - data: { -​ name: 'jack' - } -} -``` - -##### 7) Prop 定义应该尽量详细 - -- 必须使用 camelCase 驼峰命名 -- 必须指定类型 -- 必须加上注释,表明其含义 -- 必须加上 required 或者 default,两者二选其一 -- 如果有业务需要,必须加上 validator 验证 - -正例: - -```js - props: { - // 组件状态,用于控制组件的颜色 - status: { - ​ type: String, - required: true, - ​ validator: function (value) { - ​ return [ - ​ 'succ', - ​ 'info', - ​ 'error' - ​ ].indexOf(value) !== -1 - ​ } - }, - // 用户级别,用于显示皇冠个数 - userLevel:{ - type: String, - required: true - } -} -``` - -##### 8) 为组件样式设置作用域 - -正例: - -```html - - - - -``` - -反例: - -```html - - - -``` - -##### 9) 如果特性元素较多,应该主动换行。 - -正例: -```html - -``` - - -反例: -```html - -``` - -#### 2.1.2. 模板中使用简单的表达式 - -组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法。复杂表达式会让你的模板变得不那么声明式。我们应该尽量描述应该出现的是什么,而非如何计算那个值。而且计算属性和方法使得代码可以重用。 - -正例: - -```js - - -// 复杂表达式已经移入一个计算属性 -computed: { - normalizedFullName: function () { -​ return this.fullName.split(' ').map(function (word) { -​ return word[0].toUpperCase() + word.slice(1) -​ }).join(' ') - } -} -``` - -反例: - -```js - -``` - -#### 2.1.3 指令都使用缩写形式 - -指令推荐都使用缩写形式,(用 : 表示 v-bind: 、用 @ 表示 v-on: 和用 # 表示 v-slot:) - -正例: - -```js - -``` - -反例: - -```js - - -``` - -#### 2.1.4 标签顺序保持一致 - -单文件组件应该总是让标签顺序保持为 `

+ Recommended IDE setup: + VSCode + + + + Vetur + + or + Volar + (if using + <script setup>) +