From 4bdf2bf032d949b8d3f7fb289d75fb7410b9d3c9 Mon Sep 17 00:00:00 2001 From: pj7zf6ina <1552567007@qq.com> Date: Thu, 13 Mar 2025 12:38:42 +0800 Subject: [PATCH 01/11] Initial commit --- README.md | 2 + .../.gitee/ISSUE_TEMPLATE.zh-CN.md | 13 + .../.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md | 15 + warehouseManager-developer/.idea/.gitignore | 8 + .../.idea/dataSources.xml | 31 + .../.idea/libraries/WMS.xml | 13 + warehouseManager-developer/.idea/misc.xml | 7 + warehouseManager-developer/.idea/modules.xml | 8 + .../.idea/sqldialects.xml | 6 + .../.idea/warehouseManager-developer.iml | 10 + .../.idea/webContexts.xml | 10 + warehouseManager-developer/LICENSE | 201 + warehouseManager-developer/README.md | 112 + warehouseManager-developer/WMS/.gitignore | 8 + warehouseManager-developer/WMS/pom.xml | 318 + .../WMS/sql/createtable.sql | 224 + .../controller/CustomerManageHandler.java | 278 + .../common/controller/FileSourceHandler.java | 44 + .../common/controller/GoodsManageHandler.java | 277 + .../RepositoryAdminManageHandler.java | 288 + .../controller/RepositoryManageHandler.java | 309 + .../controller/StockRecordManageHandler.java | 210 + .../controller/StorageManageHandler.java | 364 + .../controller/SupplierManageHandler.java | 272 + .../common/controller/SystemLogHandler.java | 136 + .../Impl/CustomerManageServiceImpl.java | 338 + .../service/Impl/GoodsManageServiceImpl.java | 348 + .../RepositoryAdminManageServiceImpl.java | 405 + .../Impl/RepositoryManageServiceImpl.java | 377 + .../Impl/StockRecordManageServiceImpl.java | 443 ++ .../Impl/StorageManageServiceImpl.java | 514 ++ .../Impl/SupplierManageServiceImpl.java | 333 + .../service/Impl/SystemLogServiceImpl.java | 292 + .../Interface/CustomerManageService.java | 101 + .../service/Interface/GoodsManageService.java | 101 + .../RepositoryAdminManageService.java | 118 + .../service/Interface/RepositoryService.java | 108 + .../Interface/StockRecordManageService.java | 58 + .../Interface/StorageManageService.java | 153 + .../Interface/SupplierManageService.java | 101 + .../service/Interface/SystemLogService.java | 81 + .../com/ken/wms/common/util/EJConvertor.java | 684 ++ .../com/ken/wms/common/util/FileUtil.java | 27 + .../com/ken/wms/common/util/Response.java | 78 + .../ken/wms/common/util/ResponseFactory.java | 18 + .../com/ken/wms/dao/AccessRecordMapper.java | 36 + .../com/ken/wms/dao/AccessRecordMapper.xml | 46 + .../java/com/ken/wms/dao/CustomerMapper.java | 72 + .../java/com/ken/wms/dao/CustomerMapper.xml | 106 + .../java/com/ken/wms/dao/GoodsMapper.java | 73 + .../main/java/com/ken/wms/dao/GoodsMapper.xml | 100 + .../ken/wms/dao/RepositoryAdminMapper.java | 64 + .../com/ken/wms/dao/RepositoryAdminMapper.xml | 107 + .../com/ken/wms/dao/RepositoryMapper.java | 63 + .../java/com/ken/wms/dao/RepositoryMapper.xml | 105 + .../com/ken/wms/dao/RolePermissionMapper.java | 14 + .../com/ken/wms/dao/RolePermissionMapper.xml | 23 + .../java/com/ken/wms/dao/RolesMapper.java | 15 + .../main/java/com/ken/wms/dao/RolesMapper.xml | 16 + .../java/com/ken/wms/dao/StockInMapper.java | 87 + .../java/com/ken/wms/dao/StockInMapper.xml | 163 + .../java/com/ken/wms/dao/StockOutMapper.java | 86 + .../java/com/ken/wms/dao/StockOutMapper.xml | 163 + .../java/com/ken/wms/dao/StorageMapper.java | 83 + .../java/com/ken/wms/dao/StorageMapper.xml | 168 + .../java/com/ken/wms/dao/SupplierMapper.java | 74 + .../java/com/ken/wms/dao/SupplierMapper.xml | 106 + .../java/com/ken/wms/dao/UserInfoMapper.java | 61 + .../java/com/ken/wms/dao/UserInfoMapper.xml | 68 + .../wms/dao/UserOperationRecordMapper.java | 34 + .../ken/wms/dao/UserOperationRecordMapper.xml | 42 + .../com/ken/wms/dao/UserPermissionMapper.java | 33 + .../com/ken/wms/dao/UserPermissionMapper.xml | 35 + .../com/ken/wms/domain/AccessRecordDO.java | 103 + .../com/ken/wms/domain/AccessRecordDTO.java | 101 + .../java/com/ken/wms/domain/Customer.java | 73 + .../main/java/com/ken/wms/domain/Goods.java | 62 + .../java/com/ken/wms/domain/Repository.java | 82 + .../com/ken/wms/domain/RepositoryAdmin.java | 84 + .../main/java/com/ken/wms/domain/RoleDO.java | 48 + .../com/ken/wms/domain/RolePermissionDO.java | 64 + .../java/com/ken/wms/domain/StockInDO.java | 137 + .../java/com/ken/wms/domain/StockOutDO.java | 137 + .../com/ken/wms/domain/StockRecordDTO.java | 129 + .../main/java/com/ken/wms/domain/Storage.java | 83 + .../java/com/ken/wms/domain/Supplier.java | 73 + .../main/java/com/ken/wms/domain/User.java | 44 + .../java/com/ken/wms/domain/UserInfoDO.java | 76 + .../java/com/ken/wms/domain/UserInfoDTO.java | 119 + .../ken/wms/domain/UserOperationRecordDO.java | 102 + .../wms/domain/UserOperationRecordDTO.java | 101 + .../ken/wms/exception/BusinessException.java | 33 + .../CustomerManageServiceException.java | 21 + .../GoodsManageServiceException.java | 21 + ...RepositoryAdminManageServiceException.java | 25 + .../RepositoryManageServiceException.java | 21 + .../StockRecordManageServiceException.java | 26 + .../StorageManageServiceException.java | 21 + .../SupplierManageServiceException.java | 21 + .../exception/SystemLogServiceException.java | 24 + .../UserAccountServiceException.java | 28 + .../exception/UserInfoServiceException.java | 25 + .../security/controller/AccountHandler.java | 232 + .../controller/PageForwardHandler.java | 41 + .../filter/AnyOfRolesAuthorizationFilter.java | 38 + .../ExtendFormAuthenticationFilter.java | 95 + .../filter/KickoutSessionControlFilter.java | 151 + .../security/listener/SessionListener.java | 55 + .../security/realms/UserAuthorizingRealm.java | 104 + .../FilterChainDefinitionMapBuilder.java | 95 + .../service/Impl/AccountServiceImpl.java | 86 + .../service/Impl/UserInfoServiceImpl.java | 265 + .../service/Interface/AccountService.java | 20 + .../service/Interface/UserInfoService.java | 59 + .../wms/security/util/CaptchaGenerator.java | 101 + .../com/ken/wms/security/util/MD5Util.java | 39 + .../ken/wms/util/GlobalExceptionHandler.java | 39 + .../com/ken/wms/util/aop/ServiceLogging.java | 57 + .../com/ken/wms/util/aop/UserOperation.java | 17 + .../wms/util/aop/UserOperationLogging.java | 61 + .../main/resources/config/DBConfig.properties | 10 + .../src/main/resources/config/EJConvertor.xsd | 34 + .../resources/config/EJConvertorConfig.xml | 172 + .../resources/config/MyBatisConfiguration.xml | 20 + .../resources/config/ShiroConfiguration.xml | 147 + .../config/SpringContextConfiguration.xml | 105 + .../config/SpringMVCConfiguration.xml | 35 + .../WMS/src/main/resources/config/ehcache.xml | 101 + .../main/resources/config/log4j.properties | 52 + .../webapp/WEB-INF/download/customerInfo.xlsx | Bin 0 -> 8680 bytes .../webapp/WEB-INF/download/goodsInfo.xlsx | Bin 0 -> 8652 bytes .../WEB-INF/download/repositoryAdminInfo.xlsx | Bin 0 -> 8673 bytes .../WEB-INF/download/repositoryInfo.xlsx | Bin 0 -> 8652 bytes .../WEB-INF/download/storageRecord.xlsx | Bin 0 -> 8700 bytes .../webapp/WEB-INF/download/supplierInfo.xlsx | Bin 0 -> 8651 bytes .../WMS/src/main/webapp/WEB-INF/jsp/login.jsp | 219 + .../src/main/webapp/WEB-INF/jsp/mainPage.jsp | 437 ++ .../WMS/src/main/webapp/WEB-INF/web.xml | 79 + .../css/bootstrap-datetimepicker.min.css | 9 + .../src/main/webapp/css/bootstrap-table.css | 306 + .../src/main/webapp/css/bootstrap-theme.css | 587 ++ .../main/webapp/css/bootstrap-theme.css.map | 1 + .../main/webapp/css/bootstrap-theme.min.css | 5 + .../WMS/src/main/webapp/css/bootstrap.css | 6800 +++++++++++++++++ .../WMS/src/main/webapp/css/bootstrap.css.map | 1 + .../WMS/src/main/webapp/css/bootstrap.min.css | 5 + .../webapp/css/bootstrapValidator.min.css | 11 + .../WMS/src/main/webapp/css/jquery-ui.css | 630 ++ .../src/main/webapp/css/jquery.mloading.css | 94 + .../WMS/src/main/webapp/css/mainPage.css | 44 + .../src/main/webapp/css/model/login/login.css | 11 + .../src/main/webapp/errorPage/404Error.html | 17 + .../src/main/webapp/errorPage/500Error.html | 17 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../WMS/src/main/webapp/js/ajaxfileupload.js | 225 + .../webapp/js/bootstrap-datetimepicker.min.js | 1 + .../js/bootstrap-datetimepicker.zh-CN.js | 16 + .../webapp/js/bootstrap-table-zh-CN.min.js | 7 + .../src/main/webapp/js/bootstrap-table.min.js | 8 + .../WMS/src/main/webapp/js/bootstrap.js | 2363 ++++++ .../WMS/src/main/webapp/js/bootstrap.min.js | 7 + .../main/webapp/js/bootstrapValidator.min.js | 12 + .../src/main/webapp/js/jquery-2.2.3.min.js | 4 + .../WMS/src/main/webapp/js/jquery-ui.min.js | 6 + .../WMS/src/main/webapp/js/jquery.md5.js | 229 + .../WMS/src/main/webapp/js/jquery.mloading.js | 202 + .../WMS/src/main/webapp/js/mainPage.js | 226 + .../WMS/src/main/webapp/js/npm.js | 13 + .../WMS/src/main/webapp/js/zh_CN.js | 334 + .../main/webapp/media/icons/error-icon.png | Bin 0 -> 5099 bytes .../main/webapp/media/icons/stock_in-512.png | Bin 0 -> 7761 bytes .../main/webapp/media/icons/stock_out-512.png | Bin 0 -> 7888 bytes .../webapp/media/icons/stock_search-512.png | Bin 0 -> 8247 bytes .../main/webapp/media/icons/success-icon.png | Bin 0 -> 4387 bytes .../main/webapp/media/icons/warning-icon.png | Bin 0 -> 2598 bytes .../WMS/src/main/webapp/media/images/404.jpg | Bin 0 -> 9049 bytes .../WMS/src/main/webapp/media/images/500.jpg | Bin 0 -> 11482 bytes .../webapp/media/images/backgroundPic.png | Bin 0 -> 464400 bytes .../pagecomponent/accessRecordManagement.jsp | 148 + .../pagecomponent/customerManagement.jsp | 902 +++ .../webapp/pagecomponent/goodsManagement.jsp | 850 +++ .../pagecomponent/passwordModification.jsp | 197 + .../repositoryAdminManagement.jsp | 978 +++ .../pagecomponent/repositoryManagement.jsp | 866 +++ .../pagecomponent/stock-inManagement.jsp | 563 ++ .../stock-inManagementCommon.jsp | 544 ++ .../pagecomponent/stock-outManagement.jsp | 558 ++ .../stock-outManagementCommon.jsp | 546 ++ .../pagecomponent/stockRecordManagement.jsp | 221 + .../pagecomponent/storageManagement.jsp | 878 +++ .../pagecomponent/storageManagementCommon.jsp | 342 + .../pagecomponent/supplierManagement.jsp | 902 +++ .../userOperationRecorderManagement.jsp | 133 + .../main/webapp/pagecomponent/welcomePage.jsp | 58 + .../src/test/java/com/ken/wms/MapperTest.java | 111 + .../WMS/src/test/java/com/ken/wms/MyTest.java | 13 + .../untitled1/.gitignore | 38 + .../untitled1/.idea/.gitignore | 8 + .../untitled1/.idea/misc.xml | 14 + warehouseManager-developer/untitled1/pom.xml | 17 + 204 files changed, 36101 insertions(+) create mode 100644 README.md create mode 100644 warehouseManager-developer/.gitee/ISSUE_TEMPLATE.zh-CN.md create mode 100644 warehouseManager-developer/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md create mode 100644 warehouseManager-developer/.idea/.gitignore create mode 100644 warehouseManager-developer/.idea/dataSources.xml create mode 100644 warehouseManager-developer/.idea/libraries/WMS.xml create mode 100644 warehouseManager-developer/.idea/misc.xml create mode 100644 warehouseManager-developer/.idea/modules.xml create mode 100644 warehouseManager-developer/.idea/sqldialects.xml create mode 100644 warehouseManager-developer/.idea/warehouseManager-developer.iml create mode 100644 warehouseManager-developer/.idea/webContexts.xml create mode 100644 warehouseManager-developer/LICENSE create mode 100644 warehouseManager-developer/README.md create mode 100644 warehouseManager-developer/WMS/.gitignore create mode 100644 warehouseManager-developer/WMS/pom.xml create mode 100644 warehouseManager-developer/WMS/sql/createtable.sql create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/CustomerManageHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/FileSourceHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/GoodsManageHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/RepositoryAdminManageHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/RepositoryManageHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/StockRecordManageHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/StorageManageHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/SupplierManageHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/SystemLogHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/CustomerManageServiceImpl.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/GoodsManageServiceImpl.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/RepositoryAdminManageServiceImpl.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/RepositoryManageServiceImpl.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/StockRecordManageServiceImpl.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/StorageManageServiceImpl.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/SupplierManageServiceImpl.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/SystemLogServiceImpl.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/CustomerManageService.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/GoodsManageService.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/RepositoryAdminManageService.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/RepositoryService.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/StockRecordManageService.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/StorageManageService.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/SupplierManageService.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/SystemLogService.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/EJConvertor.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/FileUtil.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/Response.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/ResponseFactory.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/AccessRecordMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/AccessRecordMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/CustomerMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/CustomerMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/GoodsMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/GoodsMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryAdminMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryAdminMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolePermissionMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolePermissionMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolesMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolesMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockInMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockInMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockOutMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockOutMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StorageMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StorageMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/SupplierMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/SupplierMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserInfoMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserInfoMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserOperationRecordMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserOperationRecordMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserPermissionMapper.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserPermissionMapper.xml create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/AccessRecordDO.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/AccessRecordDTO.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Customer.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Goods.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Repository.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RepositoryAdmin.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RoleDO.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RolePermissionDO.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockInDO.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockOutDO.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockRecordDTO.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Storage.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Supplier.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/User.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserInfoDO.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserInfoDTO.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserOperationRecordDO.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserOperationRecordDTO.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/BusinessException.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/CustomerManageServiceException.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/GoodsManageServiceException.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/RepositoryAdminManageServiceException.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/RepositoryManageServiceException.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/StockRecordManageServiceException.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/StorageManageServiceException.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/SupplierManageServiceException.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/SystemLogServiceException.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/UserAccountServiceException.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/UserInfoServiceException.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/controller/AccountHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/controller/PageForwardHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/AnyOfRolesAuthorizationFilter.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/ExtendFormAuthenticationFilter.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/KickoutSessionControlFilter.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/listener/SessionListener.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/realms/UserAuthorizingRealm.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/FilterChainDefinitionMapBuilder.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Impl/AccountServiceImpl.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Impl/UserInfoServiceImpl.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Interface/AccountService.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Interface/UserInfoService.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/util/CaptchaGenerator.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/util/MD5Util.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/GlobalExceptionHandler.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/ServiceLogging.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/UserOperation.java create mode 100644 warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/UserOperationLogging.java create mode 100644 warehouseManager-developer/WMS/src/main/resources/config/DBConfig.properties create mode 100644 warehouseManager-developer/WMS/src/main/resources/config/EJConvertor.xsd create mode 100644 warehouseManager-developer/WMS/src/main/resources/config/EJConvertorConfig.xml create mode 100644 warehouseManager-developer/WMS/src/main/resources/config/MyBatisConfiguration.xml create mode 100644 warehouseManager-developer/WMS/src/main/resources/config/ShiroConfiguration.xml create mode 100644 warehouseManager-developer/WMS/src/main/resources/config/SpringContextConfiguration.xml create mode 100644 warehouseManager-developer/WMS/src/main/resources/config/SpringMVCConfiguration.xml create mode 100644 warehouseManager-developer/WMS/src/main/resources/config/ehcache.xml create mode 100644 warehouseManager-developer/WMS/src/main/resources/config/log4j.properties create mode 100644 warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/customerInfo.xlsx create mode 100644 warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/goodsInfo.xlsx create mode 100644 warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/repositoryAdminInfo.xlsx create mode 100644 warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/repositoryInfo.xlsx create mode 100644 warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/storageRecord.xlsx create mode 100644 warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/supplierInfo.xlsx create mode 100644 warehouseManager-developer/WMS/src/main/webapp/WEB-INF/jsp/login.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/WEB-INF/jsp/mainPage.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/WEB-INF/web.xml create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-datetimepicker.min.css create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-table.css create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.css create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.css.map create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.min.css create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/bootstrap.css create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/bootstrap.css.map create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/bootstrap.min.css create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/bootstrapValidator.min.css create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/jquery-ui.css create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/jquery.mloading.css create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/mainPage.css create mode 100644 warehouseManager-developer/WMS/src/main/webapp/css/model/login/login.css create mode 100644 warehouseManager-developer/WMS/src/main/webapp/errorPage/404Error.html create mode 100644 warehouseManager-developer/WMS/src/main/webapp/errorPage/500Error.html create mode 100644 warehouseManager-developer/WMS/src/main/webapp/fonts/glyphicons-halflings-regular.eot create mode 100644 warehouseManager-developer/WMS/src/main/webapp/fonts/glyphicons-halflings-regular.svg create mode 100644 warehouseManager-developer/WMS/src/main/webapp/fonts/glyphicons-halflings-regular.ttf create mode 100644 warehouseManager-developer/WMS/src/main/webapp/fonts/glyphicons-halflings-regular.woff create mode 100644 warehouseManager-developer/WMS/src/main/webapp/fonts/glyphicons-halflings-regular.woff2 create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/ajaxfileupload.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/bootstrap-datetimepicker.min.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/bootstrap-datetimepicker.zh-CN.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/bootstrap-table-zh-CN.min.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/bootstrap-table.min.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/bootstrap.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/bootstrap.min.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/bootstrapValidator.min.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/jquery-2.2.3.min.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/jquery-ui.min.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/jquery.md5.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/jquery.mloading.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/mainPage.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/npm.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/js/zh_CN.js create mode 100644 warehouseManager-developer/WMS/src/main/webapp/media/icons/error-icon.png create mode 100644 warehouseManager-developer/WMS/src/main/webapp/media/icons/stock_in-512.png create mode 100644 warehouseManager-developer/WMS/src/main/webapp/media/icons/stock_out-512.png create mode 100644 warehouseManager-developer/WMS/src/main/webapp/media/icons/stock_search-512.png create mode 100644 warehouseManager-developer/WMS/src/main/webapp/media/icons/success-icon.png create mode 100644 warehouseManager-developer/WMS/src/main/webapp/media/icons/warning-icon.png create mode 100644 warehouseManager-developer/WMS/src/main/webapp/media/images/404.jpg create mode 100644 warehouseManager-developer/WMS/src/main/webapp/media/images/500.jpg create mode 100644 warehouseManager-developer/WMS/src/main/webapp/media/images/backgroundPic.png create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/accessRecordManagement.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/customerManagement.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/goodsManagement.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/passwordModification.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/repositoryAdminManagement.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/repositoryManagement.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/stock-inManagement.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/stock-inManagementCommon.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/stock-outManagement.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/stock-outManagementCommon.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/stockRecordManagement.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/storageManagement.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/storageManagementCommon.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/supplierManagement.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/userOperationRecorderManagement.jsp create mode 100644 warehouseManager-developer/WMS/src/main/webapp/pagecomponent/welcomePage.jsp create mode 100644 warehouseManager-developer/WMS/src/test/java/com/ken/wms/MapperTest.java create mode 100644 warehouseManager-developer/WMS/src/test/java/com/ken/wms/MyTest.java create mode 100644 warehouseManager-developer/untitled1/.gitignore create mode 100644 warehouseManager-developer/untitled1/.idea/.gitignore create mode 100644 warehouseManager-developer/untitled1/.idea/misc.xml create mode 100644 warehouseManager-developer/untitled1/pom.xml diff --git a/README.md b/README.md new file mode 100644 index 0000000..597f736 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# cangku + diff --git a/warehouseManager-developer/.gitee/ISSUE_TEMPLATE.zh-CN.md b/warehouseManager-developer/.gitee/ISSUE_TEMPLATE.zh-CN.md new file mode 100644 index 0000000..f09d98d --- /dev/null +++ b/warehouseManager-developer/.gitee/ISSUE_TEMPLATE.zh-CN.md @@ -0,0 +1,13 @@ +### 该问题是怎么引起的? + + + +### 重现步骤 + + + +### 报错信息 + + + + diff --git a/warehouseManager-developer/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md b/warehouseManager-developer/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md new file mode 100644 index 0000000..534be43 --- /dev/null +++ b/warehouseManager-developer/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md @@ -0,0 +1,15 @@ +### 该Pull Request关联的Issue + + +### 修改描述 + + + +### 测试用例 + + + +### 修复效果的截屏 + + + diff --git a/warehouseManager-developer/.idea/.gitignore b/warehouseManager-developer/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/warehouseManager-developer/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/warehouseManager-developer/.idea/dataSources.xml b/warehouseManager-developer/.idea/dataSources.xml new file mode 100644 index 0000000..5983d33 --- /dev/null +++ b/warehouseManager-developer/.idea/dataSources.xml @@ -0,0 +1,31 @@ + + + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306 + + + + + + + $ProjectFileDir$ + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306/wms_db + + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/warehouseManager-developer/.idea/libraries/WMS.xml b/warehouseManager-developer/.idea/libraries/WMS.xml new file mode 100644 index 0000000..0e14349 --- /dev/null +++ b/warehouseManager-developer/.idea/libraries/WMS.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/.idea/misc.xml b/warehouseManager-developer/.idea/misc.xml new file mode 100644 index 0000000..a289170 --- /dev/null +++ b/warehouseManager-developer/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/.idea/modules.xml b/warehouseManager-developer/.idea/modules.xml new file mode 100644 index 0000000..fd14004 --- /dev/null +++ b/warehouseManager-developer/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/.idea/sqldialects.xml b/warehouseManager-developer/.idea/sqldialects.xml new file mode 100644 index 0000000..3404959 --- /dev/null +++ b/warehouseManager-developer/.idea/sqldialects.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/.idea/warehouseManager-developer.iml b/warehouseManager-developer/.idea/warehouseManager-developer.iml new file mode 100644 index 0000000..78fa7a4 --- /dev/null +++ b/warehouseManager-developer/.idea/warehouseManager-developer.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/.idea/webContexts.xml b/warehouseManager-developer/.idea/webContexts.xml new file mode 100644 index 0000000..5ce618f --- /dev/null +++ b/warehouseManager-developer/.idea/webContexts.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/LICENSE b/warehouseManager-developer/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/warehouseManager-developer/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/warehouseManager-developer/README.md b/warehouseManager-developer/README.md new file mode 100644 index 0000000..12eaf07 --- /dev/null +++ b/warehouseManager-developer/README.md @@ -0,0 +1,112 @@ +star +fork + +# 基于SSM框架的仓库管理系统 + + +## ✅ 分支说明 + +| 分支 | spring框架 | MySQL8.0 | MySQL5.7 | 登录验证码 | +|----|----------|----------|----------|----------| +| dev-springboot | springboot | ✅ | ✅ | ✅ | +| developer | springmvc | ✅ | ✅ | ✅ | +| 去登录验证码 | springmvc | ✅ | ✅ | ❎ | +| MySQL5.7 | springmvc | ❎ | ✅ | ✅ | + + +## ✅ 非常紧急的问题或功能定制可以关注公众号->发消息:仓库管理 + +> ![输入图片说明](qrcode_for_gh_cf005810de67_258.jpg) + +## 计划 +- [x] 录制idea启动系统演示视频(价值:很多初学者需要) +- [x] 数据库驱动兼容8.0,兼容MySQL5.7的旧代码放在分支mysql5.7(价值:应届毕业生80%以上默认用的MySQL8.0+) +- [x] springmvc迁移到springboot(价值:应届毕业生80%以上默认用的springboot框架),见【dev-springboot】分支 + +![输入图片说明](video/image.png) + + +## ⭕ 视频-IDEA导入+运行项目演示 + +> [基于SSM框架的仓库管理系统演示.mp4](/video/基于SSM框架的仓库管理系统演示.mp4) + +## 📋 功能 + +* 系统操作权限管理。系统提供基本的登入登出功能,同时系统包含两个角色:系统超级管理员和普通管理员,超级管理员具有最高的操作权限,而普通管理员仅具有最基本的操作权限,而且仅能操作自己被指派的仓库。 +* 请求URL鉴权。对于系统使用者登陆后进行操作发送请求的URL,后台会根据当前用户的角色判断是否拥有请求该URL的权限。 +* 基础数据信息管理。对包括:货物信息、供应商信息、客户信息、仓库信息在内的基础数据信息进行管理,提供的操作有:添加、删除、修改、条件查询、导出为Excel和到从Excel导入。 +* 仓库管理员管理。对仓库管理员信息CRUD操作,或者为指定的仓库管理员指派所管理的仓库。上述中的仓库管理员可以以普通管理员身份登陆到系统。 +* 库存信息管理。对库存信息的CRUD操作,导入导出操作,同时查询的时候可以根据仓库以及商品ID等信息进行多条件查询。 +* 基本仓库事务操作。执行货物的入库与出库操作。 +* 系统登陆日志查询。超级管理员可以查询某一用户在特定时间段内的系统登陆日志。 +* 系统操作日志查询。超级管理员可以查询某一用户在特定时间段内对系统进行操作的操作记录。、 +* 密码修改。 + + + +## ✳️ 使用到的框架和库 + +* Apache POI +* MyBatis +* Spring Framework +* Spring MVC +* Apache Shiro +* Ehcache +* Apache Commons +* Log4j +* Slf4j +* Jackson +* C3P0 +* Junit +* MySQL-Connector +* jQuery +* Bootstrap +## ✴️ 登陆系统方式 +用户ID : 1001 +密码 :123456 +![输入图片说明](https://images.gitee.com/uploads/images/2020/0106/172938_7e1c90d9_736072.png "屏幕截图.png") +加密代码 +``` +// 用户密码(wms_user.USER_PASSWORD)加密规则 +String tempStr = MD5Util.MD5("123456");// 第一次对密码进行加密 +String encryptPassword = MD5Util.MD5(tempStr + "1001");// 第二次对密码进行加密 +//存入数据库的加密密码 +System.out.println(encryptPassword); +``` +新增用户默认密码为用户ID(比如新增一个用户ID为1012,密码也为1012) +## 📚 JDK版本 + +### jdk 1.8 + +## 📚 数据库版本 +### MySQL 8.0+ +查看版本号命令如下: +> MySQL> select version(); + +## ⭐ 数据库关系图 +![输入图片说明](https://gitee.com/uploads/images/2018/0412/194935_92258b3b_736072.png "Diagram 1.png") + +## 📚 部分截图 +![输入图片说明](https://images.gitee.com/uploads/images/2020/0106/173158_70c3cba9_736072.png "WMS-截图1.PNG") +![输入图片说明](https://images.gitee.com/uploads/images/2020/0106/173225_8869b802_736072.png "MWS-截图2.PNG") +![输入图片说明](https://images.gitee.com/uploads/images/2020/0106/173239_39be69c7_736072.png "WMS-截图3.PNG") +![输入图片说明](https://images.gitee.com/uploads/images/2020/0106/173247_db6a6bdf_736072.png "WMS-截图4.PNG") +![输入图片说明](https://images.gitee.com/uploads/images/2020/0106/173256_8b7d7df4_736072.png "WMS-截图5.PNG") +![输入图片说明](https://images.gitee.com/uploads/images/2020/0106/173311_53b058f8_736072.png "WMS-截图7.PNG") +![输入图片说明](https://images.gitee.com/uploads/images/2020/0106/173321_f828f801_736072.png "WMS-截图8.PNG") +![输入图片说明](https://images.gitee.com/uploads/images/2020/0106/173328_41f84519_736072.png "WMS-截图9.PNG") + +## 📚 常见问题 +#### ①中文乱码 +![输入图片说明](image.png) +解决方式:数据库连接后面加上编码方式jdbc.url = jdbc:mysql:///192.168.X.X:3306\WMS_DB?useUnicode=true&characterEncoding=utf8 + + +## 👍 支持 + +- If the project is very helpful to you, you can buy the author a cup of coffee☕. +- 如果这个项目对您有帮助,可以请作者喝杯咖啡哟☕ + +|支付宝 | 微信| +| :--------: | :--------:| +| ![输入图片说明](%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20230225215404.jpg)|![输入图片说明](%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20230225215651.jpg) | \ No newline at end of file diff --git a/warehouseManager-developer/WMS/.gitignore b/warehouseManager-developer/WMS/.gitignore new file mode 100644 index 0000000..269dea9 --- /dev/null +++ b/warehouseManager-developer/WMS/.gitignore @@ -0,0 +1,8 @@ +## .gitignore + +# .gitignore for maven +target/ + +# IDE support file +.idea +WMS.iml \ No newline at end of file diff --git a/warehouseManager-developer/WMS/pom.xml b/warehouseManager-developer/WMS/pom.xml new file mode 100644 index 0000000..46ef51e --- /dev/null +++ b/warehouseManager-developer/WMS/pom.xml @@ -0,0 +1,318 @@ + + + + 4.0.0 + war + + WMS + com.ken + WMS + 1.0-SNAPSHOT + + + + 3.1.0 + 4.12 + 1.0 + 1.8.0 + 1.3.1 + 2.1 + 1.9.3 + 3.4 + 3.15-beta2 + 3.4.0 + 1.3.0 + 4.1.6 + 4.3.0.RELEASE + 1.4.0 + 2.10.2 + 8.0.28 + 0.9.5.5 + 1.2.17 + 1.7.21 + 2.7.0 + + + 2.1 + 8080 + /WMS + 3.3 + 1.8 + + + + + + javax.servlet + javax.servlet-api + ${servlet.version} + provided + + + + + junit + junit + ${junit.version} + + + + aopalliance + aopalliance + ${aopalliance.version} + + + org.aspectj + aspectjweaver + ${aspectjweaver.version} + + + + + commons-fileupload + commons-fileupload + ${commons.fileuoload.version} + + + commons-io + commons-io + ${commons.io.version} + + + commons-beanutils + commons-beanutils + ${commons.beanutils.version} + + + org.apache.commons + commons-lang3 + 3.4 + + + + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-excelant + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + org.apache.poi + poi-ooxml-schemas + ${poi.version} + + + org.apache.poi + poi-scratchpad + ${poi.version} + + + + + org.mybatis + mybatis + ${mybatis.version} + + + org.mybatis + mybatis-spring + ${mybatisSpring.version} + + + com.github.pagehelper + pagehelper + ${pagehelper.version} + + + + + + org.springframework + spring-aop + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-expression + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + + + org.springframework + spring-orm + ${spring.version} + + + org.springframework + spring-test + ${spring.version} + + + org.springframework + spring-tx + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + + + org.apache.shiro + shiro-core + ${shiro.version} + + + org.apache.shiro + shiro-web + ${shiro.version} + + + org.apache.shiro + shiro-spring + ${shiro.version} + + + org.apache.shiro + shiro-ehcache + ${shiro.version} + + + + + net.sf.ehcache + ehcache + ${ehcache.version} + + + + + mysql + mysql-connector-java + ${mysqlconnector.version} + + + + + + com.mchange + c3p0 + ${c3p0.version} + + + + + log4j + log4j + ${log4j.version} + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + + + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + + + + + src/main/resources + + + src/main/java + + **/*.xml + + + + + src/main/java + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + ${plugin.tomcat.version} + + ${plugin.tomcat.port} + ${plugin.tomcat.path} + UTF-8 + tomcat7 + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${plugin.maven.varsion} + + ${plugin.maven.jdk} + ${plugin.maven.jdk} + + + + + + diff --git a/warehouseManager-developer/WMS/sql/createtable.sql b/warehouseManager-developer/WMS/sql/createtable.sql new file mode 100644 index 0000000..387e54f --- /dev/null +++ b/warehouseManager-developer/WMS/sql/createtable.sql @@ -0,0 +1,224 @@ +create database wms_db +DEFAULT CHARACTER SET utf8mb4 +DEFAULT COLLATE utf8mb4_general_ci; + +use wms_db; + +# 创建数据表 + +# 创建供应商信息表 +create table wms_supplier +( + SUPPLIER_ID int not null auto_increment, + SUPPLIER_NAME varchar(30) not null, + SUPPLIER_PERSON varchar(10) not null, + SUPPLIER_TEL varchar(20) not null, + SUPPLIER_EMAIL varchar(20) not null, + SUPPLIER_ADDRESS varchar(30) not null, + primary key(SUPPLIER_ID) +)engine=innodb; + +# 创建客户信息表 +create table wms_customer +( + CUSTOMER_ID int not null auto_increment, + CUSTOMER_NAME varchar(30) not null, + CUSTOMER_PERSON varchar(10) not null, + CUSTOMER_TEL varchar(20) not null, + CUSTOMER_EMAIL varchar(20) not null, + CUSTOMER_ADDRESS varchar(30) not null, + primary key(CUSTOMER_ID) + )engine=innodb; + + # 创建货物信息表 + create table wms_goods + ( + GOOD_ID int not null auto_increment, + GOOD_NAME varChar(30) not null, + GOOD_RYPE varchar(20), + GOOD_SIZE varchar(20), + GOOD_VALUE double not null, + primary key(GOOD_ID) + )engine=innodb; + + # 创建仓库信息表 + create table wms_respository + ( + REPO_ID int not null auto_increment, + REPO_ADDRESS varchar(30) not null, + REPO_STATUS varchar(20) not null, + REPO_AREA varchar(20) not null, + REPO_DESC varchar(50), + primary key(REPO_ID) + )engine=innodb; + + # 创建仓库管理员信息表 + create table wms_repo_admin + ( + REPO_ADMIN_ID int not null auto_increment, + REPO_ADMIN_NAME varchar(10) not null, + REPO_ADMIN_SEX varchar(10) not null, + REPO_ADMIN_TEL varchar(20) not null, + REPO_ADMIN_ADDRESS varchar(30) not null, + REPO_ADMIN_BIRTH datetime not null, + REPO_ADMIN_REPOID int, + primary key(REPO_ADMIN_ID), + foreign key (REPO_ADMIN_REPOID) references wms_respository(REPO_ID) +)engine=innodb; + +# 创建入库记录表 +create table wms_record_in +( + RECORD_ID int not null auto_increment, + RECORD_SUPPLIERID int not null, + RECORD_GOODID int not null, + RECORD_NUMBER int not null, + RECORD_TIME datetime not null, + RECORD_PERSON varchar(10) not null, + RECORD_REPOSITORYID int not null, + primary key(RECORD_ID), + foreign key(RECORD_SUPPLIERID) references wms_supplier(SUPPLIER_ID), + foreign key(RECORD_GOODID) references wms_goods(GOOD_ID), + foreign key(RECORD_REPOSITORYID) references wms_respository(REPO_ID) +)engine=innodb; + +# 创建出库记录表 +create table wms_record_out +( + RECORD_ID int not null auto_increment, + RECORD_CUSTOMERID int not null, + RECORD_GOODID int not null, + RECORD_NUMBER int not null, + RECORD_TIME datetime not null, + RECORD_PERSON varchar(10) not null, + RECORD_REPOSITORYID int not null, + primary key(RECORD_ID), + foreign key(RECORD_CUSTOMERID) references wms_customer(CUSTOMER_ID), + foreign key(RECORD_GOODID) references wms_goods(GOOD_ID), + foreign key(RECORD_REPOSITORYID) references wms_respository(REPO_ID) +)engine=innodb; + +# 创建库存记录表 +create table wms_record_storage +( + RECORD_GOODID int not null auto_increment, + RECORD_REPOSITORY int not null, + RECORD_NUMBER int not null, + primary key(RECORD_GOODID, RECORD_REPOSITORY), + foreign key (RECORD_GOODID) references wms_goods(GOOD_ID), + foreign key (RECORD_REPOSITORY) references wms_respository(REPO_ID) +)engine=innodb; + +# 创建系统用户信息表 +create table wms_user +( + USER_ID int not null auto_increment, + USER_USERNAME varchar(30) not null, + USER_PASSWORD varchar(40) not null, + USER_FIRST_LOGIN int not null, + primary key (USER_ID) +)engine=innodb; + +# 创建用户角色表 +create table wms_roles +( + ROLE_ID int not null auto_increment, + ROLE_NAME varchar(20) not null, + ROLE_DESC varchar(30), + ROLE_URL_PREFIX varchar(20) not null, + primary key(ROLE_ID) +)engine=innodb; + +# 创建URL权限表 +create table wms_action +( + ACTION_ID int not null auto_increment, + ACTION_NAME varchar(30) not null, + ACTION_DESC varchar(30), + ACTION_PARAM varchar(50) not null, + primary key(ACTION_ID) +)engine=innodb; + +# 用户 - 角色关联表 +create table wms_user_role +( + ROLE_ID int not null, + USER_ID int not null, + primary key(ROLE_ID,USER_ID), + foreign key(ROLE_ID) references wms_roles(ROLE_ID), + foreign key(USER_ID) references wms_user(USER_ID) +)engine=innodb; + +# 角色 - URL权限关联表 +create table wms_role_action +( + ACTION_ID int not null, + ROLE_ID int not null, + primary key(ACTION_ID,ROLE_ID), + foreign key(ROLE_ID) references wms_roles(ROLE_ID), + foreign key(ACTION_ID) references wms_action(ACTION_ID) +)engine=innodb; + +# 系统登入登出记录表 +create table wms_access_record +( + RECORD_ID int auto_increment primary key, + USER_ID int not null, + USER_NAME varchar(50) not null, + ACCESS_TYPE varchar(30) not null, + ACCESS_TIME datetime not null, + ACCESS_IP varchar(45) not null +); + +# 用户系统操作记录表 +create table wms_operation_record +( + RECORD_ID int auto_increment primary key, + USER_ID int not null, + USER_NAME varchar(50) not null, + OPERATION_NAME varchar(30) not null, + OPERATION_TIME datetime not null, + OPERATION_RESULT varchar(15) not null +); + + +# 导入数据 + +# 导入系统用户信息 +INSERT INTO `wms_user` VALUES (1001,'admin','6f5379e73c1a9eac6163ab8eaec7e41c',0),(1018,'王皓','50f202f4862360e55635b0a9616ded13',1),(1019,'李富荣','c4b3af5a5ab3e3d5aac4c5a5436201b8',1); + +# 导入系统角色信息 +INSERT INTO `wms_roles` VALUES (1,'systemAdmin',NULL,'systemAdmin'),(2,'commonsAdmin',NULL,'commonsAdmin'); + +# 导入 系统用户 - 角色 信息 +INSERT INTO `wms_user_role` VALUES (1,1001),(2,1018),(2,1019); + +# 导入URL权限信息 +INSERT INTO `wms_action` VALUES (1,'addSupplier',NULL,'/supplierManage/addSupplier'),(2,'deleteSupplier',NULL,'/supplierManage/deleteSupplier'),(3,'updateSupplier',NULL,'/supplierManage/updateSupplier'),(4,'selectSupplier',NULL,'/supplierManage/getSupplierList'),(5,'getSupplierInfo',NULL,'/supplierManage/getSupplierInfo'),(6,'importSupplier',NULL,'/supplierManage/importSupplier'),(7,'exportSupplier',NULL,'/supplierManage/exportSupplier'),(8,'selectCustomer',NULL,'/customerManage/getCustomerList'),(9,'addCustomer',NULL,'/customerManage/addCustomer'),(10,'getCustomerInfo',NULL,'/customerManage/getCustomerInfo'),(11,'updateCustomer',NULL,'/customerManage/updateCustomer'),(12,'deleteCustomer',NULL,'/customerManage/deleteCustomer'),(13,'importCustomer',NULL,'/customerManage/importCustomer'),(14,'exportCustomer',NULL,'/customerManage/exportCustomer'),(15,'selectGoods',NULL,'/goodsManage/getGoodsList'),(16,'addGoods',NULL,'/goodsManage/addGoods'),(17,'getGoodsInfo',NULL,'/goodsManage/getGoodsInfo'),(18,'updateGoods',NULL,'/goodsManage/updateGoods'),(19,'deleteGoods',NULL,'/goodsManage/deleteGoods'),(20,'importGoods',NULL,'/goodsManage/importGoods'),(21,'exportGoods',NULL,'/goodsManage/exportGoods'),(22,'selectRepository',NULL,'/repositoryManage/getRepositoryList'),(23,'addRepository',NULL,'/repositoryManage/addRepository'),(24,'getRepositoryInfo',NULL,'/repositoryManage/getRepository'),(25,'updateRepository',NULL,'/repositoryManage/updateRepository'),(26,'deleteRepository',NULL,'/repositoryManage/deleteRepository'),(27,'importRepository',NULL,'/repositoryManage/importRepository'),(28,'exportRepository',NULL,'/repositoryManage/exportRepository'),(29,'selectRepositoryAdmin',NULL,'/repositoryAdminManage/getRepositoryAdminList'),(30,'addRepositoryAdmin',NULL,'/repositoryAdminManage/addRepositoryAdmin'),(31,'getRepositoryAdminInfo',NULL,'/repositoryAdminManage/getRepositoryAdminInfo'),(32,'updateRepositoryAdmin',NULL,'/repositoryAdminManage/updateRepositoryAdmin'),(33,'deleteRepositoryAdmin',NULL,'/repositoryAdminManage/deleteRepositoryAdmin'),(34,'importRepositoryAd,om',NULL,'/repositoryAdminManage/importRepositoryAdmin'),(35,'exportRepository',NULL,'/repositoryAdminManage/exportRepositoryAdmin'),(36,'getUnassignRepository',NULL,'/repositoryManage/getUnassignRepository'),(37,'getStorageListWithRepository',NULL,'/storageManage/getStorageListWithRepository'),(38,'getStorageList',NULL,'/storageManage/getStorageList'),(39,'addStorageRecord',NULL,'/storageManage/addStorageRecord'),(40,'updateStorageRecord',NULL,'/storageManage/updateStorageRecord'),(41,'deleteStorageRecord',NULL,'/storageManage/deleteStorageRecord'),(42,'importStorageRecord',NULL,'/storageManage/importStorageRecord'),(43,'exportStorageRecord',NULL,'/storageManage/exportStorageRecord'),(44,' stockIn','货物进库操作','/stockRecordManage/stockIn'),(45,'stockOut','货物出库操作','/stockRecordManage/stockOut'),(46,'searchStockRecord','查询货物出入库记录','/stockRecordManage/searchStockRecord'),(47,'getAccessRecords','查询登入登出记录','/systemLog/getAccessRecords'),(48,'selectUserOperationRecords','查村用户操作记录','/systemLog/selectUserOperationRecords'); + +# 导入 角色 - URL权限 信息 +INSERT INTO `wms_role_action` VALUES (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1),(9,1),(10,1),(11,1),(12,1),(13,1),(14,1),(15,1),(16,1),(17,1),(18,1),(19,1),(20,1),(21,1),(22,1),(23,1),(24,1),(25,1),(26,1),(27,1),(28,1),(29,1),(30,1),(31,1),(32,1),(33,1),(34,1),(35,1),(36,1),(37,1),(39,1),(40,1),(41,1),(42,1),(43,1),(44,1),(45,1),(46,1),(47,1),(48,1),(4,2),(8,2),(15,2),(38,2),(43,2),(44,2),(45,2); + +# 导入供应商信息 +INSERT INTO `wms_supplier` VALUES (1013,'浙江奇同电器有限公司','王泽伟','13777771126','86827868@126.com','中国 浙江 温州市龙湾区 龙湾区永强大道1648号'),(1014,'醴陵春天陶瓷实业有限公司','温仙容','13974167256','23267999@126.com','中国 湖南 醴陵市 东正街15号'),(1015,'洛阳嘉吉利饮品有限公司','郑绮云','26391678','22390898@qq.com','中国 广东 佛山市顺德区 北滘镇怡和路2号怡和中心14楼'); + +# 导入客户信息 +INSERT INTO `wms_customer` VALUES (1214,'醴陵荣旗瓷业有限公司','陈娟','17716786888','23369888@136.com','中国 湖南 醴陵市 嘉树乡玉茶村柏树组'),(1215,'深圳市松林达电子有限公司','刘明','85263335-820','85264958@126.com','中国 广东 深圳市宝安区 深圳市宝安区福永社区桥头村桥塘路育'),(1216,'郑州绿之源饮品有限公司 ','赵志敬','87094196','87092165@qq.com','中国 河南 郑州市 郑州市嘉亿东方大厦609'); + +# 导入货物信息 +INSERT INTO `wms_goods` VALUES (103,'五孔插座西门子墙壁开关','电器','86*86',1.85),(104,'陶瓷马克杯','陶瓷','9*9*11',3.5),(105,'精酿苹果醋','饮料','312ml',300); + +# 导入仓库信息 +INSERT INTO `wms_respository` VALUES (1003,'北京顺义南彩工业园区彩祥西路9号','可用','11000㎡','提供服务完整'),(1004,'广州白云石井石潭路大基围工业区','可用','1000㎡','物流极为便利'),(1005,' 香港北区文锦渡路(红桥新村)','可用','5000.00㎡',NULL); + +# 导入仓库管理员信息 +INSERT INTO `wms_repo_admin` VALUES (1018,'王皓','女','12345874526','中国佛山','2016-12-09 00:00:00',1004),(1019,'李富荣','男','1234','广州','2016-12-07 00:00:00',1003); + +# 导入入库记录 +INSERT INTO `wms_record_in` VALUES (15,1015,105,1000,'2016-12-31 00:00:00','admin',1004),(16,1015,105,200,'2017-01-02 00:00:00','admin',1004); + +# 导入出库记录 +INSERT INTO `wms_record_out` VALUES (7,1214,104,750,'2016-12-31 00:00:00','admin',1003); + +# 导入库存信息 +INSERT INTO `wms_record_storage` VALUES (103,1005,10000),(104,1003,1750),(105,1004,2000); \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/CustomerManageHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/CustomerManageHandler.java new file mode 100644 index 0000000..5a23ddc --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/CustomerManageHandler.java @@ -0,0 +1,278 @@ +package com.ken.wms.common.controller; + +import com.ken.wms.common.service.Interface.CustomerManageService; +import com.ken.wms.common.util.Response; +import com.ken.wms.common.util.ResponseFactory; +import com.ken.wms.domain.Customer; +import com.ken.wms.domain.Supplier; +import com.ken.wms.exception.CustomerManageServiceException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; +import java.util.Map; + +/** + * 客户信息管理请求 Handler + */ +@RequestMapping(value = "/**/customerManage") +@Controller +public class CustomerManageHandler { + + @Autowired + private CustomerManageService customerManageService; + + private static final String SEARCH_BY_ID = "searchByID"; + private static final String SEARCH_BY_NAME = "searchByName"; + private static final String SEARCH_ALL = "searchAll"; + + /** + * 通用的结果查询方法 + * + * @param searchType 查询方式 + * @param keyWord 查询关键字 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 返回指定条件查询的结果 + */ + private Map query(String searchType, String keyWord, int offset, int limit) throws CustomerManageServiceException { + Map queryResult = null; + + switch (searchType) { + case SEARCH_BY_ID: + if (StringUtils.isNumeric(keyWord)) + queryResult = customerManageService.selectById(Integer.valueOf(keyWord)); + break; + case SEARCH_BY_NAME: + queryResult = customerManageService.selectByName(offset, limit, keyWord); + break; + case SEARCH_ALL: + queryResult = customerManageService.selectAll(offset, limit); + break; + default: + // do other thing + break; + } + return queryResult; + } + + /** + * 搜索客户信息 + * + * @param searchType 搜索类型 + * @param offset 如有多条记录时分页的偏移值 + * @param limit 如有多条记录时分页的大小 + * @param keyWord 搜索的关键字 + * @return 返回查询的结果,其中键值为 rows 的代表查询到的每一记录,若有分页则为分页大小的记录;键值为 total 代表查询到的符合要求的记录总条数 + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "getCustomerList", method = RequestMethod.GET) + public + @ResponseBody + Map getCustomerList(@RequestParam("searchType") String searchType, + @RequestParam("offset") int offset, + @RequestParam("limit") int limit, + @RequestParam("keyWord") String keyWord) throws CustomerManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + List rows = null; + long total = 0; + + Map queryResult = query(searchType, keyWord, offset, limit); + + if (queryResult != null) { + rows = (List) queryResult.get("data"); + total = (long) queryResult.get("total"); + } + + // 设置 Response + responseContent.setCustomerInfo("rows", rows); + responseContent.setResponseTotal(total); + responseContent.setResponseResult(Response.RESPONSE_RESULT_SUCCESS); + return responseContent.generateResponse(); + } + + /** + * 添加一条客户信息 + * + * @param customer 客户信息 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "addCustomer", method = RequestMethod.POST) + public + @ResponseBody + Map addCustomer(@RequestBody Customer customer) throws CustomerManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 添加记录 + String result = customerManageService.addCustomer(customer) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 查询指定 customer ID 客户的信息 + * + * @param customerID 客户ID + * @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data + * 的值为客户信息 + */ + @RequestMapping(value = "getCustomerInfo", method = RequestMethod.GET) + public + @ResponseBody + Map getCustomerInfo(@RequestParam("customerID") String customerID) throws CustomerManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + + // 获取客户信息 + Customer customer = null; + Map queryResult = query(SEARCH_BY_ID, customerID, -1, -1); + if (queryResult != null) { + customer = (Customer) queryResult.get("data"); + if (customer != null) { + result = Response.RESPONSE_RESULT_SUCCESS; + } + } + + // 设置 Response + responseContent.setResponseResult(result); + responseContent.setResponseData(customer); + + return responseContent.generateResponse(); + } + + /** + * 更新客户信息 + * + * @param customer 客户信息 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "updateCustomer", method = RequestMethod.POST) + public + @ResponseBody + Map updateCustomer(@RequestBody Customer customer) throws CustomerManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 更新 + String result = customerManageService.updateCustomer(customer) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 删除客户记录 + * + * @param customerIDStr 客户ID + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "deleteCustomer", method = RequestMethod.GET) + public + @ResponseBody + Map deleteCustomer(@RequestParam("customerID") String customerIDStr) throws CustomerManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 参数检查 + if (StringUtils.isNumeric(customerIDStr)) { + // 转换为 Integer + Integer customerID = Integer.valueOf(customerIDStr); + + // 刪除 + String result = customerManageService.deleteCustomer(customerID) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + responseContent.setResponseResult(result); + } else + responseContent.setResponseResult(Response.RESPONSE_RESULT_ERROR); + + return responseContent.generateResponse(); + } + + /** + * 导入客户信息 + * + * @param file 保存有客户信息的文件 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 + * error;key为total表示导入的总条数;key为available表示有效的条数 + */ + @RequestMapping(value = "importCustomer", method = RequestMethod.POST) + public + @ResponseBody + Map importCustomer(@RequestParam("file") MultipartFile file) throws CustomerManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_SUCCESS; + + // 读取文件内容 + int total = 0; + int available = 0; + if (file == null) + result = Response.RESPONSE_RESULT_ERROR; + Map importInfo = customerManageService.importCustomer(file); + if (importInfo != null) { + total = (int) importInfo.get("total"); + available = (int) importInfo.get("available"); + } + + responseContent.setResponseResult(result); + responseContent.setResponseTotal(total); + responseContent.setCustomerInfo("available", available); + return responseContent.generateResponse(); + } + + /** + * 导出客户信息 + * + * @param searchType 查找类型 + * @param keyWord 查找关键字 + * @param response HttpServletResponse + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "exportCustomer", method = RequestMethod.GET) + public void exportCustomer(@RequestParam("searchType") String searchType, @RequestParam("keyWord") String keyWord, + HttpServletResponse response) throws CustomerManageServiceException, IOException { + + String fileName = "customerInfo.xlsx"; + + List customers = null; + Map queryResult = query(searchType, keyWord, -1, -1); + + if (queryResult != null) { + customers = (List) queryResult.get("data"); + } + + // 获取生成的文件 + File file = customerManageService.exportCustomer(customers); + + // 写出文件 + if (file != null) { + // 设置响应头 + response.addHeader("Content-Disposition", "attachment;filename=" + fileName); + FileInputStream inputStream = new FileInputStream(file); + OutputStream outputStream = response.getOutputStream(); + byte[] buffer = new byte[8192]; + + int len; + while ((len = inputStream.read(buffer, 0, buffer.length)) > 0) { + outputStream.write(buffer, 0, len); + outputStream.flush(); + } + + inputStream.close(); + outputStream.close(); + + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/FileSourceHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/FileSourceHandler.java new file mode 100644 index 0000000..b3c37a2 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/FileSourceHandler.java @@ -0,0 +1,44 @@ +package com.ken.wms.common.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * 处理文件下载请求 + Spring MVC控制器类,用于处理文件下载请求 + @PathVariable获取路径中的文件名 + HttpServletRequest和HttpServletResponse用于处理请求和响应 + */ +@Controller +@RequestMapping("/commons/fileSource")//指定了基础路径 +public class FileSourceHandler { + + @RequestMapping(value = "download/{fileName:.+}", method = RequestMethod.GET)//处理GET请求路径中包含文件名参数,使用正则表达式.+匹配带扩展名的文件名 + public void fileDownload(@PathVariable("fileName") String fileName, HttpServletRequest request, + HttpServletResponse response) throws IOException { + + if (fileName == null) + return; + + // 获取文件 + ServletContext context = request.getServletContext(); + String directory = context.getRealPath("/WEB-INF/download"); + Path file = Paths.get(directory, fileName); + if (Files.exists(file)) { + // 设置响应头 + response.addHeader("Content-Disposition", "attachment;filename=" + file.getFileName()); + Files.copy(file, response.getOutputStream()); + response.getOutputStream().flush(); + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/GoodsManageHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/GoodsManageHandler.java new file mode 100644 index 0000000..eb86627 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/GoodsManageHandler.java @@ -0,0 +1,277 @@ +package com.ken.wms.common.controller; + +import com.ken.wms.common.service.Interface.GoodsManageService; +import com.ken.wms.common.util.Response; +import com.ken.wms.common.util.ResponseFactory; +import com.ken.wms.domain.Goods; +import com.ken.wms.domain.Supplier; +import com.ken.wms.exception.GoodsManageServiceException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; +import java.util.Map; + +/** + * 货物信息管理请求 Handler + + */ +@RequestMapping(value = "/**/goodsManage") +@Controller +public class GoodsManageHandler { + + @Autowired + private GoodsManageService goodsManageService; + + private static final String SEARCH_BY_ID = "searchByID"; + private static final String SEARCH_BY_NAME = "searchByName"; + private static final String SEARCH_ALL = "searchAll"; + + /** + * 通用的记录查询 + * + * @param searchType 查询类型 + * @param keyWord 查询关键字 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 返回一个 Map ,包含所有符合要求的查询结果,以及记录的条数 + */ + private Map query(String searchType, String keyWord, int offset, int limit) throws GoodsManageServiceException { + Map queryResult = null; + + switch (searchType) { + case SEARCH_BY_ID: + if (StringUtils.isNumeric(keyWord)) + queryResult = goodsManageService.selectById(Integer.valueOf(keyWord)); + break; + case SEARCH_BY_NAME: + queryResult = goodsManageService.selectByName(keyWord); + break; + case SEARCH_ALL: + queryResult = goodsManageService.selectAll(offset, limit); + break; + default: + // do other thing + break; + } + + return queryResult; + } + + /** + * 搜索货物信息 + * + * @param searchType 搜索类型 + * @param offset 如有多条记录时分页的偏移值 + * @param limit 如有多条记录时分页的大小 + * @param keyWord 搜索的关键字 + * @return 返回所有符合要求的记录 + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "getGoodsList", method = RequestMethod.GET) + public + @ResponseBody + Map getGoodsList(@RequestParam("searchType") String searchType, + @RequestParam("offset") int offset, @RequestParam("limit") int limit, + @RequestParam("keyWord") String keyWord) throws GoodsManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + List rows = null; + long total = 0; + + // 查询 + Map queryResult = query(searchType, keyWord, offset, limit); + + if (queryResult != null) { + rows = (List) queryResult.get("data"); + total = (long) queryResult.get("total"); + } + + // 设置 Response + responseContent.setCustomerInfo("rows", rows); + responseContent.setResponseTotal(total); + return responseContent.generateResponse(); + } + + /** + * 添加一条货物信息 + * + * @param goods 货物信息 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "addGoods", method = RequestMethod.POST) + public + @ResponseBody + Map addGoods(@RequestBody Goods goods) throws GoodsManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 添加记录 + String result = goodsManageService.addGoods(goods) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + + return responseContent.generateResponse(); + } + + /** + * 查询指定 goods ID 货物的信息 + * + * @param goodsID 货物ID + * @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data + * 的值为货物信息 + */ + @RequestMapping(value = "getGoodsInfo", method = RequestMethod.GET) + public + @ResponseBody + Map getGoodsInfo(@RequestParam("goodsID") Integer goodsID) throws GoodsManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + + // 获取货物信息 + Goods goods = null; + Map queryResult = goodsManageService.selectById(goodsID); + if (queryResult != null) { + goods = (Goods) queryResult.get("data"); + if (goods != null) { + result = Response.RESPONSE_RESULT_SUCCESS; + } + } + + // 设置 Response + responseContent.setResponseResult(result); + responseContent.setResponseData(goods); + return responseContent.generateResponse(); + } + + /** + * 更新货物信息 + * + * @param goods 货物信息 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "updateGoods", method = RequestMethod.POST) + public + @ResponseBody + Map updateGoods(@RequestBody Goods goods) throws GoodsManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 更新 + String result = goodsManageService.updateGoods(goods) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 删除货物记录 + * + * @param goodsID 货物ID + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "deleteGoods", method = RequestMethod.GET) + public + @ResponseBody + Map deleteGoods(@RequestParam("goodsID") Integer goodsID) throws GoodsManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 删除 + String result = goodsManageService.deleteGoods(goodsID) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 导入货物信息 + * + * @param file 保存有货物信息的文件 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 + * error;key为total表示导入的总条数;key为available表示有效的条数 + */ + @RequestMapping(value = "importGoods", method = RequestMethod.POST) + public + @ResponseBody + Map importGoods(@RequestParam("file") MultipartFile file) throws GoodsManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + + // 读取文件内容 + int total = 0; + int available = 0; + if (file != null) { + Map importInfo = goodsManageService.importGoods(file); + if (importInfo != null) { + total = (int) importInfo.get("total"); + available = (int) importInfo.get("available"); + result = Response.RESPONSE_RESULT_SUCCESS; + } + } + + // 设置 Response + responseContent.setResponseResult(result); + responseContent.setResponseTotal(total); + responseContent.setCustomerInfo("available", available); + return responseContent.generateResponse(); + } + + /** + * 导出货物信息 + * + * @param searchType 查找类型 + * @param keyWord 查找关键字 + * @param response HttpServletResponse + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "exportGoods", method = RequestMethod.GET) + public void exportGoods(@RequestParam("searchType") String searchType, @RequestParam("keyWord") String keyWord, + HttpServletResponse response) throws GoodsManageServiceException, IOException { + + String fileName = "goodsInfo.xlsx"; + + List goodsList = null; + Map queryResult = query(searchType, keyWord, -1, -1); + + if (queryResult != null) { + goodsList = (List) queryResult.get("data"); + } + + // 获取生成的文件 + File file = goodsManageService.exportGoods(goodsList); + + // 写出文件 + if (file != null) { + // 设置响应头 + response.addHeader("Content-Disposition", "attachment;filename=" + fileName); + + FileInputStream inputStream = new FileInputStream(file); + OutputStream outputStream = response.getOutputStream(); + byte[] buffer = new byte[8192]; + + int len; + while ((len = inputStream.read(buffer, 0, buffer.length)) > 0) { + outputStream.write(buffer, 0, len); + outputStream.flush(); + } + + inputStream.close(); + outputStream.close(); + + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/RepositoryAdminManageHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/RepositoryAdminManageHandler.java new file mode 100644 index 0000000..8d70d73 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/RepositoryAdminManageHandler.java @@ -0,0 +1,288 @@ +package com.ken.wms.common.controller; + +import com.ken.wms.common.service.Interface.RepositoryAdminManageService; +import com.ken.wms.common.util.Response; +import com.ken.wms.common.util.ResponseFactory; +import com.ken.wms.domain.RepositoryAdmin; +import com.ken.wms.exception.RepositoryAdminManageServiceException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 仓库管理员管理请求 Handler + + */ +@Controller +@RequestMapping(value = "/**/repositoryAdminManage") +public class RepositoryAdminManageHandler { + + @Autowired + private RepositoryAdminManageService repositoryAdminManageService; + + // 查询类型 + private static final String SEARCH_BY_ID = "searchByID"; + private static final String SEARCH_BY_NAME = "searchByName"; + private static final String SEARCH_BY_REPOSITORY_ID = "searchByRepositoryID"; + private static final String SEARCH_ALL = "searchAll"; + + /** + * 通用记录查询 + * + * @param keyWord 查询关键字 + * @param searchType 查询类型 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 返回所有符合条件的记录 + */ + private Map query(String keyWord, String searchType, int offset, int limit) throws RepositoryAdminManageServiceException { + Map queryResult = null; + + // query + switch (searchType) { + case SEARCH_ALL: + queryResult = repositoryAdminManageService.selectAll(offset, limit); + break; + case SEARCH_BY_ID: + if (StringUtils.isNumeric(keyWord)) + queryResult = repositoryAdminManageService.selectByID(Integer.valueOf(keyWord)); + break; + case SEARCH_BY_NAME: + queryResult = repositoryAdminManageService.selectByName(offset, limit, keyWord); + break; + case SEARCH_BY_REPOSITORY_ID: + if (StringUtils.isNumeric(keyWord)) + queryResult = repositoryAdminManageService.selectByRepositoryID(Integer.valueOf(keyWord)); + break; + default: + // do other things + break; + } + + return queryResult; + } + + /** + * 查询仓库管理员信息 + * + * @param searchType 查询类型 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @param keyWord 查询关键字 + * @return 返回一个Map,其中key=rows,表示查询出来的记录;key=total,表示记录的总条数 + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "getRepositoryAdminList", method = RequestMethod.GET) + public + @ResponseBody + Map getRepositoryAdmin(@RequestParam("searchType") String searchType, + @RequestParam("keyWord") String keyWord, @RequestParam("offset") int offset, + @RequestParam("limit") int limit) throws RepositoryAdminManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + List rows = null; + long total = 0; + + // 查询 + Map queryResult = query(keyWord, searchType, offset, limit); + + if (queryResult != null) { + rows = (List) queryResult.get("data"); + total = (long) queryResult.get("total"); + } + + // 设置 Response + responseContent.setCustomerInfo("rows", rows); + responseContent.setResponseTotal(total); + return responseContent.generateResponse(); + } + + /** + * 添加一条仓库管理员信息 + * + * @param repositoryAdmin 仓库管理员信息 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "addRepositoryAdmin", method = RequestMethod.POST) + public + @ResponseBody + Map addRepositoryAdmin(@RequestBody RepositoryAdmin repositoryAdmin) throws RepositoryAdminManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 添加结果 + String result = repositoryAdminManageService.addRepositoryAdmin(repositoryAdmin) + ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 查询指定 ID 的仓库管理员信息 + * + * @param repositoryAdminID 仓库管理员ID + * @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data + * 的值为仓库管理员信息 + */ + @RequestMapping(value = "getRepositoryAdminInfo", method = RequestMethod.GET) + public + @ResponseBody + Map getRepositoryAdminInfo(Integer repositoryAdminID) throws RepositoryAdminManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + + // 查询 + RepositoryAdmin repositoryAdmin = null; + Map queryResult = repositoryAdminManageService.selectByID(repositoryAdminID); + if (queryResult != null) { + if ((repositoryAdmin = (RepositoryAdmin) queryResult.get("data")) != null) + result = Response.RESPONSE_RESULT_SUCCESS; + } + + // 设置 Response + responseContent.setResponseResult(result); + responseContent.setResponseData(repositoryAdmin); + return responseContent.generateResponse(); + } + + /** + * 更新仓库管理员信息 + * + * @param repositoryAdmin 仓库管理员信息 + * @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data + * 的值为仓库管理员信息 + */ + @RequestMapping(value = "updateRepositoryAdmin", method = RequestMethod.POST) + public + @ResponseBody + Map updateRepositoryAdmin(@RequestBody RepositoryAdmin repositoryAdmin) throws RepositoryAdminManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 更新 + String result = repositoryAdminManageService.updateRepositoryAdmin(repositoryAdmin) + ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 删除指定 ID 的仓库管理员信息 + * + * @param repositoryAdminID 仓库ID + * @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data + * 的值为仓库管理员信息 + */ + @RequestMapping(value = "deleteRepositoryAdmin", method = RequestMethod.GET) + public + @ResponseBody + Map deleteRepositoryAdmin(Integer repositoryAdminID) throws RepositoryAdminManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 删除记录 + String result = repositoryAdminManageService.deleteRepositoryAdmin(repositoryAdminID) + ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 从文件中导入仓库管理员信息 + * + * @param file 保存有仓库管理员信息的文件 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 + * error;key为total表示导入的总条数;key为available表示有效的条数 + */ + @RequestMapping(value = "importRepositoryAdmin", method = RequestMethod.POST) + public + @ResponseBody + Map importRepositoryAdmin(MultipartFile file) throws RepositoryAdminManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + + // 读取文件 + long total = 0; + long available = 0; + if (file != null) { + Map importInfo = repositoryAdminManageService.importRepositoryAdmin(file); + if (importInfo != null) { + total = (long) importInfo.get("total"); + available = (long) importInfo.get("available"); + result = Response.RESPONSE_RESULT_SUCCESS; + } + } + + // 设置 Response + responseContent.setResponseResult(result); + responseContent.setResponseTotal(total); + responseContent.setCustomerInfo("available", available); + return responseContent.generateResponse(); + } + + /** + * 导出仓库管理员信息到文件中 + * + * @param searchType 查询类型 + * @param keyWord 查询关键字 + * @param response HttpServletResponse + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "exportRepositoryAdmin", method = RequestMethod.GET) + public void exportRepositoryAdmin(@RequestParam("searchType") String searchType, + @RequestParam("keyWord") String keyWord, HttpServletResponse response) throws RepositoryAdminManageServiceException, IOException { + + // 导出文件名 + String fileName = "repositoryAdminInfo.xlsx"; + + // 查询 + List repositoryAdmins; + Map queryResult = query(keyWord, searchType, -1, -1); + + if (queryResult != null) + repositoryAdmins = (List) queryResult.get("data"); + else + repositoryAdmins = new ArrayList<>(); + + // 生成文件 + File file = repositoryAdminManageService.exportRepositoryAdmin(repositoryAdmins); + + // 输出文件 + if (file != null) { + // 设置响应头 + response.addHeader("Content-Disposition", "attachment;filename=" + fileName); + FileInputStream inputStream = new FileInputStream(file); + OutputStream outputStream = response.getOutputStream(); + byte[] buffer = new byte[8192]; + + int len; + while ((len = inputStream.read(buffer, 0, buffer.length)) > 0) { + outputStream.write(buffer, 0, len); + outputStream.flush(); + } + + inputStream.close(); + outputStream.close(); + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/RepositoryManageHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/RepositoryManageHandler.java new file mode 100644 index 0000000..3a35a49 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/RepositoryManageHandler.java @@ -0,0 +1,309 @@ +package com.ken.wms.common.controller; + +import com.ken.wms.common.service.Interface.RepositoryService; +import com.ken.wms.common.util.Response; +import com.ken.wms.common.util.ResponseFactory; +import com.ken.wms.domain.Repository; +import com.ken.wms.exception.RepositoryManageServiceException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 仓库信息管理请求 Handler + */ +@Controller +@RequestMapping(value = "/**/repositoryManage") +public class RepositoryManageHandler { + + @Autowired + private RepositoryService repositoryService; + + private static final String SEARCH_BY_ID = "searchByID"; + private static final String SEARCH_BY_ADDRESS = "searchByAddress"; + private static final String SEARCH_ALL = "searchAll"; + + /** + * 通用的记录查询 + * + * @param searchType 查询方式 + * @param keyword 查询关键字 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 返回所有符合条件的查询结果 + */ + private Map query(String searchType, String keyword, int offset, int limit) throws RepositoryManageServiceException { + Map queryResult = null; + + switch (searchType) { + case SEARCH_BY_ID: + if (StringUtils.isNumeric(keyword)) { + queryResult = repositoryService.selectById(Integer.valueOf(keyword)); + } + break; + case SEARCH_BY_ADDRESS: + queryResult = repositoryService.selectByAddress(offset, limit, keyword); + break; + case SEARCH_ALL: + queryResult = repositoryService.selectAll(offset, limit); + break; + default: + // do other thing + break; + } + + return queryResult; + } + + /** + * 查询仓库信息 + * + * @param searchType 查询类型 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @param keyWord 查询关键字 + * @return 返回一个Map,其中key=rows,表示查询出来的记录;key=total,表示记录的总条数 + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "getRepositoryList", method = RequestMethod.GET) + public + @ResponseBody + Map getRepositoryList(@RequestParam("searchType") String searchType, + @RequestParam("offset") int offset, @RequestParam("limit") int limit, + @RequestParam("keyWord") String keyWord) throws RepositoryManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + List rows = null; + long total = 0; + + // 查询 + Map queryResult = query(searchType, keyWord, offset, limit); + + if (queryResult != null) { + rows = (List) queryResult.get("data"); + total = (long) queryResult.get("total"); + } + + // 设置 Response + responseContent.setCustomerInfo("rows", rows); + responseContent.setResponseTotal(total); + return responseContent.generateResponse(); + } + + /** + * 查询所有未指派管理员的仓库 + * + * @return 返回一个 map,其中key=data表示查询的记录,key=total表示记录的条数 + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "getUnassignRepository", method = RequestMethod.GET) + public + @ResponseBody + Map getUnassignRepository() throws RepositoryManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List data; + long total = 0; + + // 查询 + Map queryResult = repositoryService.selectUnassign(); + if (queryResult != null) { + data = (List) queryResult.get("data"); + total = (long) queryResult.get("total"); + } else + data = new ArrayList<>(); + + resultSet.put("data", data); + resultSet.put("total", total); + return resultSet; + } + + /** + * 添加一条仓库信息 + * + * @param repository 仓库信息 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "addRepository", method = RequestMethod.POST) + public + @ResponseBody + Map addRepository(@RequestBody Repository repository) throws RepositoryManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 添加记录 + String result = repositoryService.addRepository(repository) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 查询指定 ID 的仓库信息 + * + * @param repositoryID 仓库ID + * @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data + * 的值为仓库信息 + */ + @RequestMapping(value = "getRepositoryInfo", method = RequestMethod.GET) + public + @ResponseBody + Map getRepositoryInfo(@RequestParam("repositoryID") Integer repositoryID) throws RepositoryManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + + // 查询 + Repository repository = null; + Map queryResult = repositoryService.selectById(repositoryID); + if (queryResult != null) { + repository = (Repository) queryResult.get("data"); + if (repository != null) + result = Response.RESPONSE_RESULT_SUCCESS; + } + + // 设置 Response + responseContent.setResponseResult(result); + responseContent.setResponseData(repository); + return responseContent.generateResponse(); + } + + /** + * 更新仓库信息 + * + * @param repository 仓库信息 + * @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data + * 的值为仓库信息 + */ + @RequestMapping(value = "updateRepository", method = RequestMethod.POST) + public + @ResponseBody + Map updateRepository(@RequestBody Repository repository) throws RepositoryManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 更新 + String result = repositoryService.updateRepository(repository) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 删除指定 ID 的仓库信息 + * + * @param repositoryID 仓库ID + * @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data + * 的值为仓库信息 + */ + @RequestMapping(value = "deleteRepository", method = RequestMethod.GET) + public + @ResponseBody + Map deleteRepository(@RequestParam("repositoryID") Integer repositoryID) throws RepositoryManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 删除记录 + String result = repositoryService.deleteRepository(repositoryID) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 从文件中导入仓库信息 + * + * @param file 保存有仓库信息的文件 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 + * error;key为total表示导入的总条数;key为available表示有效的条数 + */ + @RequestMapping(value = "importRepository", method = RequestMethod.POST) + public + @ResponseBody + Map importRepository(MultipartFile file) throws RepositoryManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + + // 读取文件 + int total = 0; + int available = 0; + if (file != null) { + Map importInfo = repositoryService.importRepository(file); + if (importInfo != null) { + total = (int) importInfo.get("total"); + available = (int) importInfo.get("available"); + result = Response.RESPONSE_RESULT_SUCCESS; + } + } + + // 设置 Response + responseContent.setResponseResult(result); + responseContent.setResponseTotal(total); + responseContent.setCustomerInfo("available", available); + return responseContent.generateResponse(); + } + + /** + * 导出仓库信息到文件中 + * + * @param searchType 查询类型 + * @param keyWord 查询关键字 + * @param response HttpServletResponse + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "exportRepository", method = RequestMethod.GET) + public void exportRepository(@RequestParam("searchType") String searchType, @RequestParam("keyWord") String keyWord, + HttpServletResponse response) throws RepositoryManageServiceException, IOException { + + // 导出文件名 + String fileName = "repositoryInfo.xlsx"; + + // 查询 + List repositories; + + Map queryResult = query(searchType, keyWord, -1, -1); + + if (queryResult != null) + repositories = (List) queryResult.get("data"); + else + repositories = new ArrayList<>(); + + // 生成文件 + File file = repositoryService.exportRepository(repositories); + + // 输出文件 + if (file != null) { + // 设置响应头 + response.addHeader("Content-Disposition", "attachment;filename=" + fileName); + FileInputStream inputStream = new FileInputStream(file); + OutputStream outputStream = response.getOutputStream(); + byte[] buffer = new byte[8192]; + + int len; + while ((len = inputStream.read(buffer, 0, buffer.length)) > 0) { + outputStream.write(buffer, 0, len); + outputStream.flush(); + } + + inputStream.close(); + outputStream.close(); + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/StockRecordManageHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/StockRecordManageHandler.java new file mode 100644 index 0000000..6b1f267 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/StockRecordManageHandler.java @@ -0,0 +1,210 @@ +package com.ken.wms.common.controller; + +import com.ken.wms.common.service.Interface.StockRecordManageService; +import com.ken.wms.common.util.Response; +import com.ken.wms.common.util.ResponseFactory; +import com.ken.wms.domain.StockRecordDTO; +import com.ken.wms.domain.UserInfoDTO; +import com.ken.wms.exception.StockRecordManageServiceException; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 商品出入库管理请求Handler + */ +@Controller +@RequestMapping(value = "stockRecordManage") +public class StockRecordManageHandler { + + @Autowired + private StockRecordManageService stockRecordManageService; + + /** + * 货物出库操作 + * + * @param customerID 客户ID + * @param goodsID 货物ID + * @param repositoryIDStr 仓库ID + * @param number 出库数量 + * @return 返回一个map,key为result的值表示操作是否成功 + */ + @RequestMapping(value = "stockOut", method = RequestMethod.POST) + public + @ResponseBody + Map stockOut(@RequestParam("customerID") Integer customerID, + @RequestParam("goodsID") Integer goodsID, + @RequestParam(value = "repositoryID", required = false) String repositoryIDStr, + @RequestParam("number") long number) throws StockRecordManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + boolean authorizeCheck = true; + boolean argumentCheck = true; + Integer repositoryID = null; + + // 参数检查 + if (repositoryIDStr != null) { + if (StringUtils.isNumeric(repositoryIDStr)) { + repositoryID = Integer.valueOf(repositoryIDStr); + } else { + argumentCheck = false; + responseContent.setResponseMsg("request argument error"); + } + } + + // 获取 session 中的信息 + Subject currentUser = SecurityUtils.getSubject(); + Session session = currentUser.getSession(); + UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo"); + String personInCharge = userInfo == null ? "none" : userInfo.getUserName(); + Integer repositoryIDBelong = userInfo == null ? -1 : userInfo.getRepositoryBelong(); + + // 设置非管理员请求的仓库ID + if (!currentUser.hasRole("systemAdmin")) { + if (repositoryIDBelong < 0) { + authorizeCheck = false; + responseContent.setResponseMsg("You are not authorized"); + } else { + repositoryID = repositoryIDBelong; + } + } + + if (authorizeCheck && argumentCheck) { + if (stockRecordManageService.stockOutOperation(customerID, goodsID, repositoryID, number, personInCharge)) + result = Response.RESPONSE_RESULT_SUCCESS; + } + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 货物入库操作 + * + * @param supplierID 供应商ID + * @param goodsID 货物ID + * @param repositoryIDStr 仓库ID + * @param number 入库数目 + * @return 返回一个map,key为result的值表示操作是否成功 + */ + @RequestMapping(value = "stockIn", method = RequestMethod.POST) + public + @ResponseBody + Map stockIn(@RequestParam("supplierID") Integer supplierID, + @RequestParam("goodsID") Integer goodsID, + @RequestParam(value = "repositoryID", required = false) String repositoryIDStr, + @RequestParam("number") long number) throws StockRecordManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + boolean authorizeCheck = true; + boolean argumentCheck = true; + Integer repositoryID = null; + + // 参数检查 + if (repositoryIDStr != null) { + if (StringUtils.isNumeric(repositoryIDStr)) { + repositoryID = Integer.valueOf(repositoryIDStr); + } else { + argumentCheck = false; + responseContent.setResponseMsg("request argument error"); + } + } + + // 获取session中的信息 + Subject currentUser = SecurityUtils.getSubject(); + Session session = currentUser.getSession(); + UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo"); + String personInCharge = userInfo == null ? "none" : userInfo.getUserName(); + Integer repositoryIDBelong = userInfo == null ? -1 : userInfo.getRepositoryBelong(); + + // 设置非管理员请求的仓库ID + if (!currentUser.hasRole("systemAdmin")) { + if (repositoryIDBelong < 0) { + authorizeCheck = false; + responseContent.setResponseMsg("You are not authorized"); + } else { + repositoryID = repositoryIDBelong; + } + } + + // 执行 Service + if (authorizeCheck && argumentCheck) { + if (stockRecordManageService.stockInOperation(supplierID, goodsID, repositoryID, number, personInCharge)) { + result = Response.RESPONSE_RESULT_SUCCESS; + } + } + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 查询出入库记录 + * + * @param searchType 查询类型(查询所有或仅查询入库记录或仅查询出库记录) + * @param repositoryIDStr 查询记录所对应的仓库ID + * @param endDateStr 查询的记录起始日期 + * @param startDateStr 查询的记录结束日期 + * @param limit 分页大小 + * @param offset 分页偏移值 + * @return 返回一个Map,其中:Key为rows的值代表所有记录数据,Key为total的值代表记录的总条数 + */ + @SuppressWarnings({"SingleStatementInBlock", "unchecked"}) + @RequestMapping(value = "searchStockRecord", method = RequestMethod.GET) + public @ResponseBody + Map getStockRecord(@RequestParam("searchType") String searchType, + @RequestParam("repositoryID") String repositoryIDStr, + @RequestParam("startDate") String startDateStr, + @RequestParam("endDate") String endDateStr, + @RequestParam("limit") int limit, + @RequestParam("offset") int offset) throws ParseException, StockRecordManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + List rows = null; + long total = 0; + + // 参数检查 + String regex = "([0-9]{4})-([0-9]{2})-([0-9]{2})"; + boolean startDateFormatCheck = (StringUtils.isEmpty(startDateStr) || startDateStr.matches(regex)); + boolean endDateFormatCheck = (StringUtils.isEmpty(endDateStr) || endDateStr.matches(regex)); + boolean repositoryIDCheck = (StringUtils.isEmpty(repositoryIDStr) || StringUtils.isNumeric(repositoryIDStr)); + + if (startDateFormatCheck && endDateFormatCheck && repositoryIDCheck) { + Integer repositoryID = -1; + if (StringUtils.isNumeric(repositoryIDStr)) { + repositoryID = Integer.valueOf(repositoryIDStr); + } + + // 转到 Service 执行查询 + Map queryResult = stockRecordManageService.selectStockRecord(repositoryID, startDateStr, endDateStr, searchType, offset, limit); + if (queryResult != null) { + rows = (List) queryResult.get("data"); + total = (long) queryResult.get("total"); + } + } else + responseContent.setResponseMsg("Request argument error"); + + if (rows == null) + rows = new ArrayList<>(0); + + responseContent.setCustomerInfo("rows", rows); + responseContent.setResponseTotal(total); + return responseContent.generateResponse(); + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/StorageManageHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/StorageManageHandler.java new file mode 100644 index 0000000..8966ce8 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/StorageManageHandler.java @@ -0,0 +1,364 @@ +package com.ken.wms.common.controller; + +import com.ken.wms.common.service.Interface.StockRecordManageService; +import com.ken.wms.common.service.Interface.StorageManageService; +import com.ken.wms.common.util.Response; +import com.ken.wms.common.util.ResponseFactory; +import com.ken.wms.domain.Storage; +import com.ken.wms.domain.UserInfoDTO; +import com.ken.wms.exception.StorageManageServiceException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 库存管理请求处理 + * + */ +@Controller +@RequestMapping(value = "/**/storageManage") +public class StorageManageHandler { + + @Autowired + private StorageManageService storageManageService; + @Autowired + private StockRecordManageService stockRecordManageService; + + private static final String SEARCH_BY_GOODS_ID = "searchByGoodsID"; + private static final String SEARCH_BY_GOODS_NAME = "searchByGoodsName"; + private static final String SEARCH_BY_GOODS_TYPE = "searchByGoodsType"; + private static final String SEARCH_ALL = "searchAll"; + + /** + * 查询库存信息 + * + * @param searchType 查询类型 + * @param keyword 查询关键字 + * @param repositoryBelong 查询仓库 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + private Map query(String searchType, String keyword, String repositoryBelong, int offset, + int limit) throws StorageManageServiceException { + Map queryResult = null; + + switch (searchType) { + case SEARCH_ALL: + if (StringUtils.isNumeric(repositoryBelong)) { + Integer repositoryID = Integer.valueOf(repositoryBelong); + queryResult = storageManageService.selectAll(repositoryID, offset, limit); + } else { + queryResult = storageManageService.selectAll(-1, offset, limit); + } + break; + case SEARCH_BY_GOODS_ID: + if (StringUtils.isNumeric(keyword)) { + Integer goodsID = Integer.valueOf(keyword); + if (StringUtils.isNumeric(repositoryBelong)) { + Integer repositoryID = Integer.valueOf(repositoryBelong); + queryResult = storageManageService.selectByGoodsID(goodsID, repositoryID, offset, limit); + } else + queryResult = storageManageService.selectByGoodsID(goodsID, -1, offset, limit); + } + break; + case SEARCH_BY_GOODS_TYPE: + if (StringUtils.isNumeric(repositoryBelong)) { + Integer repositoryID = Integer.valueOf(repositoryBelong); + queryResult = storageManageService.selectByGoodsType(keyword, repositoryID, offset, limit); + } else + queryResult = storageManageService.selectByGoodsType(keyword, -1, offset, limit); + break; + case SEARCH_BY_GOODS_NAME: + if (StringUtils.isNumeric(repositoryBelong)) { + Integer repositoryID = Integer.valueOf(repositoryBelong); + queryResult = storageManageService.selectByGoodsName(keyword, repositoryID, offset, limit); + } else + queryResult = storageManageService.selectByGoodsName(keyword, -1, offset, limit); + break; + default: + // do other thing + break; + } + + return queryResult; + } + + /** + * 可指定仓库对库存信息查询 + * + * @param keyword 查询关键字 + * @param searchType 查询类型 + * @param repositoryBelong 查询所属的仓库 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 rows 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "getStorageListWithRepository", method = RequestMethod.GET) + public + @ResponseBody + Map getStorageListWithRepoID(@RequestParam("keyword") String keyword, + @RequestParam("searchType") String searchType, @RequestParam("repositoryBelong") String repositoryBelong, + @RequestParam("offset") int offset, @RequestParam("limit") int limit) throws StorageManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + List rows; + long total = 0; + + // query + Map queryResult = query(searchType, keyword, repositoryBelong, offset, limit); + if (queryResult != null) { + rows = (List) queryResult.get("data"); + total = (long) queryResult.get("total"); + } else + rows = new ArrayList<>(); + + // 设置 Response + responseContent.setCustomerInfo("rows", rows); + responseContent.setResponseTotal(total); + return responseContent.generateResponse(); + } + + /** + * 查询库存信息,查询所属的仓库为session保存的信息 + * + * @param keyword 查询关键字 + * @param searchType 查询类型 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @param request 请求 + * @return 结果的一个Map,其中: key为 rows 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "getStorageList", method = RequestMethod.GET) + public + @ResponseBody + Map getStorageList(@RequestParam("keyword") String keyword, + @RequestParam("searchType") String searchType, @RequestParam("offset") int offset, + @RequestParam("limit") int limit, HttpServletRequest request) throws StorageManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + List rows = null; + long total = 0; + + HttpSession session = request.getSession(); + UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo"); + Integer repositoryID = userInfo.getRepositoryBelong(); + if (repositoryID > 0) { + Map queryResult = query(searchType, keyword, repositoryID.toString(), offset, limit); + if (queryResult != null) { + rows = (List) queryResult.get("data"); + total = (long) queryResult.get("total"); + } + } + + if (rows == null) + rows = new ArrayList<>(); + + // 设置 Response + responseContent.setCustomerInfo("rows", rows); + responseContent.setResponseTotal(total); + return responseContent.generateResponse(); + } + + /** + * 添加一条库存信息 + * + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "addStorageRecord", method = RequestMethod.POST) + public + @ResponseBody + Map addStorageRecord(@RequestBody Map params) throws StorageManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String isSuccess = Response.RESPONSE_RESULT_ERROR; + boolean isAvailable = true; + + String goodsID = (String) params.get("goodsID"); + String repositoryID = (String) params.get("repositoryID"); + String number = (String) params.get("number"); + + if (StringUtils.isBlank(goodsID) || !StringUtils.isNumeric(goodsID)) + isAvailable = false; + if (StringUtils.isBlank(repositoryID) || !StringUtils.isNumeric(repositoryID)) + isAvailable = false; + if (StringUtils.isBlank(number) || !StringUtils.isNumeric(number)) + isAvailable = false; + + if (isAvailable) { + isSuccess = storageManageService.addNewStorage(Integer.valueOf(goodsID), Integer.valueOf(repositoryID), + Integer.valueOf(number)) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + } + + // 设置 Response + responseContent.setResponseResult(isSuccess); + return responseContent.generateResponse(); + } + + /** + * 更新库存信息 + * + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "updateStorageRecord", method = RequestMethod.POST) + public + @ResponseBody + Map updateStorageRecord(@RequestBody Map params) throws StorageManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + boolean isAvailable = true; + String result = Response.RESPONSE_RESULT_ERROR; + + String goodsID = (String) params.get("goodsID"); + String repositoryID = (String) params.get("repositoryID"); + String number = (String) params.get("number"); + + if (StringUtils.isBlank(goodsID) || !StringUtils.isNumeric(goodsID)) + isAvailable = false; + if (StringUtils.isBlank(repositoryID) || !StringUtils.isNumeric(repositoryID)) + isAvailable = false; + if (StringUtils.isBlank(number) || !StringUtils.isNumeric(number)) + isAvailable = false; + + if (isAvailable) { + result = storageManageService.updateStorage(Integer.valueOf(goodsID), Integer.valueOf(repositoryID), + Integer.valueOf(number)) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + } + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 删除一条库存信息 + * + * @param goodsID 货物ID + * @param repositoryID 仓库ID + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "deleteStorageRecord", method = RequestMethod.GET) + public + @ResponseBody + Map deleteStorageRecord(@RequestParam("goodsID") String goodsID, + @RequestParam("repositoryID") String repositoryID) throws StorageManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + String result = Response.RESPONSE_RESULT_ERROR; + boolean isAvailable = true; + + if (StringUtils.isBlank(goodsID) || !StringUtils.isNumeric(goodsID)) + isAvailable = false; + if (StringUtils.isBlank(repositoryID) || !StringUtils.isNumeric(repositoryID)) + isAvailable = false; + + if (isAvailable) { + result = storageManageService.deleteStorage(Integer.valueOf(goodsID), Integer.valueOf(repositoryID)) + ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + } + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 导入库存信息 + * + * @param file 保存有库存信息的文件 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 + * error;key为total表示导入的总条数;key为available表示有效的条数 + */ + @RequestMapping(value = "importStorageRecord", method = RequestMethod.POST) + public + @ResponseBody + Map importStorageRecord(@RequestParam("file") MultipartFile file) throws StorageManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + + int total = 0; + int available = 0; + + if (file != null) { + Map importInfo = storageManageService.importStorage(file); + if (importInfo != null) { + total = (int) importInfo.get("total"); + available = (int) importInfo.get("available"); + result = Response.RESPONSE_RESULT_SUCCESS; + } + } + + // 设置 Response + responseContent.setResponseResult(result); + responseContent.setResponseTotal(total); + responseContent.setCustomerInfo("available", available); + return responseContent.generateResponse(); + } + + /** + * 导出库存信息 + * + * @param searchType 查询类型 + * @param keyword 查询关键字 + * @param repositoryBelong 查询所属仓库 + * @param request 请求 + * @param response 响应 + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "exportStorageRecord", method = RequestMethod.GET) + public void exportStorageRecord(@RequestParam("searchType") String searchType, + @RequestParam("keyword") String keyword, + @RequestParam(value = "repositoryBelong", required = false) String repositoryBelong, + HttpServletRequest request, HttpServletResponse response) throws StorageManageServiceException, IOException { + String fileName = "storageRecord.xlsx"; + + HttpSession session = request.getSession(); + UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo"); + Integer sessionRepositoryBelong = userInfo.getRepositoryBelong(); + if (sessionRepositoryBelong > 0) + repositoryBelong = sessionRepositoryBelong.toString(); + + List storageList = null; + Map queryResult = query(searchType, keyword, repositoryBelong, -1, -1); + if (queryResult != null) + storageList = (List) queryResult.get("data"); + + File file = storageManageService.exportStorage(storageList); + if (file != null) { + // 设置响应头 + response.addHeader("Content-Disposition", "attachment;filename=" + fileName); + FileInputStream inputStream = new FileInputStream(file); + OutputStream outputStream = response.getOutputStream(); + byte[] buffer = new byte[8192]; + + int len; + while ((len = inputStream.read(buffer, 0, buffer.length)) > 0) { + outputStream.write(buffer, 0, len); + outputStream.flush(); + } + + inputStream.close(); + outputStream.close(); + + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/SupplierManageHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/SupplierManageHandler.java new file mode 100644 index 0000000..4d1b6fe --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/SupplierManageHandler.java @@ -0,0 +1,272 @@ +package com.ken.wms.common.controller; + +import com.ken.wms.common.service.Interface.SupplierManageService; +import com.ken.wms.common.util.Response; +import com.ken.wms.common.util.ResponseFactory; +import com.ken.wms.domain.Supplier; +import com.ken.wms.exception.SupplierManageServiceException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; +import java.util.Map; + +/** + * 供应商信息管理请求 Handler + + */ +@RequestMapping(value = "/**/supplierManage") +@Controller +public class SupplierManageHandler { + + @Autowired + private SupplierManageService supplierManageService; + + private static final String SEARCH_BY_ID = "searchByID"; + private static final String SEARCH_BY_NAME = "searchByName"; + private static final String SEARCH_ALL = "searchAll"; + + /** + * 通用的记录查询 + * + * @param searchType 查询类型 + * @param keyWord 查询关键字 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 返回所有符合条件的记录 + */ + private Map query(String searchType, String keyWord, int offset, int limit) throws SupplierManageServiceException { + Map queryResult = null; + + switch (searchType) { + case SEARCH_BY_ID: + if (StringUtils.isNumeric(keyWord)) { + queryResult = supplierManageService.selectById(Integer.valueOf(keyWord)); + } + break; + case SEARCH_BY_NAME: + queryResult = supplierManageService.selectByName(offset, limit, keyWord); + break; + case SEARCH_ALL: + queryResult = supplierManageService.selectAll(offset, limit); + break; + default: + // do other thing + break; + } + + return queryResult; + } + + /** + * 搜索供应商信息 + * + * @param searchType 搜索类型 + * @param offset 如有多条记录时分页的偏移值 + * @param limit 如有多条记录时分页的大小 + * @param keyWord 搜索的关键字 + * @return + */ + @RequestMapping(value = "getSupplierList", method = RequestMethod.GET) + @ResponseBody + public Map getSupplierList(@RequestParam("searchType") String searchType, + @RequestParam("offset") int offset, @RequestParam("limit") int limit, + @RequestParam("keyWord") String keyWord) throws SupplierManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + List rows = null; + long total = 0; + + Map queryResult = query(searchType, keyWord, offset, limit); + + // 结果转换 + if (queryResult != null) { + rows = (List) queryResult.get("data"); + total = (long) queryResult.get("total"); + } + + responseContent.setCustomerInfo("rows", rows); + responseContent.setResponseTotal(total); + return responseContent.generateResponse(); + } + + /** + * 添加一条供应商信息 + * + * @param supplier 供应商信息 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "addSupplier", method = RequestMethod.POST) + public + @ResponseBody + Map addSupplier(@RequestBody Supplier supplier) throws SupplierManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 添加记录 + String result = supplierManageService.addSupplier(supplier) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 查询指定 supplierID 供应商的信息 + * + * @param supplierID 供应商ID + * @return 返回一个map,其中:key 为 result 的值为操作的结果,包括:success 与 error;key 为 data + * 的值为供应商信息 + */ + @RequestMapping(value = "getSupplierInfo", method = RequestMethod.GET) + public + @ResponseBody + Map getSupplierInfo(@RequestParam("supplierID") int supplierID) throws SupplierManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + + // 获取供应点信息 + Supplier supplier = null; + Map queryResult = supplierManageService.selectById(supplierID); + if (queryResult != null) { + supplier = (Supplier) queryResult.get("data"); + if (supplier != null) + result = Response.RESPONSE_RESULT_SUCCESS; + } + + // 设置 Response + responseContent.setResponseResult(result); + responseContent.setResponseData(supplier); + return responseContent.generateResponse(); + } + + /** + * 更新供应商信息 + * + * @param supplier 供应商信息 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "updateSupplier", method = RequestMethod.POST) + public + @ResponseBody + Map updateSupplier(@RequestBody Supplier supplier) throws SupplierManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 更新 + String result = supplierManageService.updateSupplier(supplier) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 删除供应商记录 + * + * @param supplierID 供应商ID + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 error + */ + @RequestMapping(value = "deleteSupplier", method = RequestMethod.GET) + public + @ResponseBody + Map deleteSupplier(@RequestParam("supplierID") Integer supplierID) { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + // 刪除 + String result = supplierManageService.deleteSupplier(supplierID) ? Response.RESPONSE_RESULT_SUCCESS : Response.RESPONSE_RESULT_ERROR; + + // 设置 Response + responseContent.setResponseResult(result); + return responseContent.generateResponse(); + } + + /** + * 导入供应商信息 + * + * @param file 保存有供应商信息的文件 + * @return 返回一个map,其中:key 为 result表示操作的结果,包括:success 与 + * error;key为total表示导入的总条数;key为available表示有效的条数 + */ + @RequestMapping(value = "importSupplier", method = RequestMethod.POST) + public + @ResponseBody + Map importSupplier(@RequestParam("file") MultipartFile file) throws SupplierManageServiceException { + // 初始化 Response + Response responseContent = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_SUCCESS; + + // 读取文件内容 + int total = 0; + int available = 0; + if (file == null) + result = Response.RESPONSE_RESULT_ERROR; + Map importInfo = supplierManageService.importSupplier(file); + if (importInfo != null) { + total = (int) importInfo.get("total"); + available = (int) importInfo.get("available"); + } + + // 设置 Response + responseContent.setResponseResult(result); + responseContent.setResponseTotal(total); + responseContent.setCustomerInfo("available", available); + return responseContent.generateResponse(); + } + + /** + * 导出供应商信息 + * + * @param searchType 查找类型 + * @param keyWord 查找关键字 + * @param response HttpServletResponse + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "exportSupplier", method = RequestMethod.GET) + public void exportSupplier(@RequestParam("searchType") String searchType, @RequestParam("keyWord") String keyWord, + HttpServletResponse response) throws SupplierManageServiceException, IOException { + + String fileName = "supplierInfo.xlsx"; + + // 根据查询类型进行查询 + List suppliers = null; + Map queryResult; + queryResult = query(searchType, keyWord, -1, -1); + + if (queryResult != null) { + suppliers = (List) queryResult.get("data"); + } + + // 获取生成的文件 + File file = supplierManageService.exportSupplier(suppliers); + + // 写出文件 + if (file != null) { + // 设置响应头 + response.addHeader("Content-Disposition", "attachment;filename=" + fileName); + FileInputStream inputStream = new FileInputStream(file); + OutputStream outputStream = response.getOutputStream(); + byte[] buffer = new byte[8192]; + + int len; + while ((len = inputStream.read(buffer, 0, buffer.length)) > 0) { + outputStream.write(buffer, 0, len); + outputStream.flush(); + } + + inputStream.close(); + outputStream.close(); + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/SystemLogHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/SystemLogHandler.java new file mode 100644 index 0000000..906dada --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/controller/SystemLogHandler.java @@ -0,0 +1,136 @@ +package com.ken.wms.common.controller; + +import com.ken.wms.common.service.Interface.SystemLogService; +import com.ken.wms.common.util.Response; +import com.ken.wms.common.util.ResponseFactory; +import com.ken.wms.domain.AccessRecordDO; +import com.ken.wms.domain.UserOperationRecordDTO; +import com.ken.wms.exception.SystemLogServiceException; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 系统操作日志请求 Handler + * + */ +@Controller +@RequestMapping(value = "/systemLog") +public class SystemLogHandler { + + @Autowired + private SystemLogService systemLogService; + + /** + * 查询系统的登入登出日志 + * + * @param userIDStr 用户ID + * @param accessType 记录类型(登入、登出或全部) + * @param startDateStr 记录的起始日期 + * @param endDateStr 记录的结束日期 + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 返回 JSON 数据 其中:Key为rows的值代表所有记录数据,Key为total的值代表记录的总条数 + * @throws SystemLogServiceException SystemLogServiceException + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "getAccessRecords", method = RequestMethod.GET) + public @ResponseBody + Map getAccessRecords(@RequestParam("userID") String userIDStr, + @RequestParam("accessType") String accessType, + @RequestParam("startDate") String startDateStr, + @RequestParam("endDate") String endDateStr, + @RequestParam("offset") int offset, + @RequestParam("limit") int limit) throws SystemLogServiceException { + // 创建 Response 对象 + Response response = ResponseFactory.newInstance(); + List rows = null; + long total = 0; + + // 检查参数 + String regex = "([0-9]{4})-([0-9]{2})-([0-9]{2})"; + boolean startDateFormatCheck = (StringUtils.isEmpty(startDateStr) || startDateStr.matches(regex)); + boolean endDateFormatCheck = (StringUtils.isEmpty(endDateStr) || endDateStr.matches(regex)); + boolean userIDCheck = (StringUtils.isEmpty(userIDStr) || StringUtils.isNumeric(userIDStr)); + + if (startDateFormatCheck && endDateFormatCheck && userIDCheck) { + // 转到 Service 执行查询 + Integer userID = -1; + if (StringUtils.isNumeric(userIDStr)) + userID = Integer.valueOf(userIDStr); + Map queryResult = systemLogService.selectAccessRecord(userID, accessType, startDateStr, endDateStr, offset, limit); + if (queryResult != null) { + rows = (List) queryResult.get("data"); + total = (long) queryResult.get("total"); + } + } else + response.setResponseMsg("Request Argument Error"); + + if (rows == null) + rows = new ArrayList<>(0); + + // 返回 Response + response.setCustomerInfo("rows", rows); + response.setResponseTotal(total); + return response.generateResponse(); + } + + /** + * 查询系统的操作日志 + * + * @param userIDStr 用户ID + * @param startDateStr 记录的起始日期 + * @param endDateStr 记录的结束日期 + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 返回 JSON 数据 其中:Key为rows的值代表所有记录数据,Key为total的值代表记录的总条数 + * @throws SystemLogServiceException SystemLogServiceException + */ + @SuppressWarnings("unchecked") + @RequestMapping(value = "getUserOperationRecords") + public @ResponseBody + Map selectUserOperationRecords(@RequestParam("userID") String userIDStr, + @RequestParam("startDate") String startDateStr, + @RequestParam("endDate") String endDateStr, + @RequestParam("offset") int offset, + @RequestParam("limit") int limit) throws SystemLogServiceException { + // 创建 Response + Response response = ResponseFactory.newInstance(); + List rows = null; + long total = 0; + + // 检查参数 + String regex = "([0-9]{4})-([0-9]{2})-([0-9]{2})"; + boolean startDateFormatCheck = (StringUtils.isEmpty(startDateStr) || startDateStr.matches(regex)); + boolean endDateFormatCheck = (StringUtils.isEmpty(endDateStr) || endDateStr.matches(regex)); + boolean userIDCheck = (StringUtils.isEmpty(userIDStr) || StringUtils.isNumeric(userIDStr)); + + if (startDateFormatCheck && endDateFormatCheck && userIDCheck) { + // 转到 Service 进行查询 + Integer userID = -1; + if (StringUtils.isNumeric(userIDStr)) + userID = Integer.valueOf(userIDStr); + Map queryResult = systemLogService.selectUserOperationRecord(userID, startDateStr, endDateStr, offset, limit); + if (queryResult != null) { + rows = (List) queryResult.get("data"); + total = (long) queryResult.get("total"); + } + } else + response.setResponseMsg("Request argument error"); + + if (rows == null) + rows = new ArrayList<>(0); + + response.setCustomerInfo("rows", rows); + response.setResponseTotal(total); + return response.generateResponse(); + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/CustomerManageServiceImpl.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/CustomerManageServiceImpl.java new file mode 100644 index 0000000..3ed4265 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/CustomerManageServiceImpl.java @@ -0,0 +1,338 @@ +package com.ken.wms.common.service.Impl; + + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ken.wms.common.service.Interface.CustomerManageService; +import com.ken.wms.common.util.EJConvertor; +import com.ken.wms.common.util.FileUtil; +import com.ken.wms.dao.CustomerMapper; +import com.ken.wms.dao.StockOutMapper; +import com.ken.wms.domain.Customer; +import com.ken.wms.domain.StockOutDO; +import com.ken.wms.exception.CustomerManageServiceException; +import com.ken.wms.util.aop.UserOperation; +import org.apache.ibatis.exceptions.PersistenceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 客户信息管理 service 实现类 + 主要功能包括客户信息的增删改查以及导入 + */ +@Service +public class CustomerManageServiceImpl implements CustomerManageService { + + @Autowired + private CustomerMapper customerMapper; + @Autowired + private StockOutMapper stockOutMapper; + @Autowired + private EJConvertor ejConvertor; + + /** + * 返回指定customer id 的客户记录 + * + * @param customerId 客户ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectById(Integer customerId) throws CustomerManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List customers = new ArrayList<>(); + long total = 0; + + // 查询 + Customer customer; + try { + customer = customerMapper.selectById(customerId); + } catch (PersistenceException e) { + System.out.println("exception catch"); + e.printStackTrace(); + throw new CustomerManageServiceException(e); + } + + if (customer != null) { + customers.add(customer); + total = 1; + } + + resultSet.put("data", customers); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定 customer name 的客户记录 支持查询分页以及模糊查询 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @param customerName 客户的名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByName(int offset, int limit, String customerName) throws CustomerManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List customers; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + customers = customerMapper.selectApproximateByName(customerName); + if (customers != null) { + PageInfo pageInfo = new PageInfo<>(customers); + total = pageInfo.getTotal(); + } else + customers = new ArrayList<>(); + } else { + customers = customerMapper.selectApproximateByName(customerName); + if (customers != null) + total = customers.size(); + else + customers = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new CustomerManageServiceException(e); + } + + resultSet.put("data", customers); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定 customer Name 的客户记录 支持模糊查询 + * + * @param customerName 客户名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByName(String customerName) throws CustomerManageServiceException { + return selectByName(-1, -1, customerName); + } + + /** + * 分页查询客户的记录 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll(int offset, int limit) throws CustomerManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List customers; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + customers = customerMapper.selectAll(); + if (customers != null) { + PageInfo pageInfo = new PageInfo<>(customers); + total = pageInfo.getTotal(); + } else + customers = new ArrayList<>(); + } else { + customers = customerMapper.selectAll(); + if (customers != null) + total = customers.size(); + else + customers = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new CustomerManageServiceException(e); + } + + resultSet.put("data", customers); + resultSet.put("total", total); + return resultSet; + } + + /** + * 查询所有客户的记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll() throws CustomerManageServiceException { + return selectAll(-1, -1); + } + + /** + * 检查客户信息是否满足要求 + * + * @param customer 客户信息实体 + * @return 返回是否满足要求 + */ + private boolean customerCheck(Customer customer) { + return customer.getName() != null && customer.getPersonInCharge() != null && customer.getTel() != null + && customer.getEmail() != null && customer.getAddress() != null; + } + + /** + * 添加客户信息 + * + * @param customer 客户信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "添加客户信息") + @Override + public boolean addCustomer(Customer customer) throws CustomerManageServiceException { + + // 插入新的记录 + if (customer != null) { + // 验证 + if (customerCheck(customer)) { + try { + if (null == customerMapper.selectByName(customer.getName())) { + customerMapper.insert(customer); + return true; + } + } catch (PersistenceException e) { + throw new CustomerManageServiceException(e); + } + } + } + return false; + } + + /** + * 更新客户信息 + * + * @param customer 客户信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "修改客户信息") + @Override + public boolean updateCustomer(Customer customer) throws CustomerManageServiceException { + + // 更新记录 + if (customer != null) { + // 检验 + if (customerCheck(customer)) { + try { + // 检查重名 + Customer customerFromDB = customerMapper.selectByName(customer.getName()); + if (customerFromDB == null || customerFromDB.getId().equals(customer.getId())) { + customerMapper.update(customer); + return true; + } + } catch (PersistenceException e) { + throw new CustomerManageServiceException(e); + } + } + } + return false; + } + + /** + * 删除客户信息 + * + * @param customerId 客户ID + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "删除客户信息") + @Override + public boolean deleteCustomer(Integer customerId) throws CustomerManageServiceException { + + try { + // 查询该客户是否有出库记录 + List records = stockOutMapper.selectByCustomerId(customerId); + if (records != null && records.size() > 0) { + return false; + } else { + // 删除该条客户记录 + customerMapper.deleteById(customerId); + return true; + + } + } catch (PersistenceException e) { + throw new CustomerManageServiceException(e); + } + } + + /** + * 从文件中导入客户信息 + * + * @param file 导入信息的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + @UserOperation(value = "导入客户信息") + @Override + public Map importCustomer(MultipartFile file) throws CustomerManageServiceException { + // 初始化结果集 + Map result = new HashMap<>(); + int total = 0; + int available = 0; + + // 从 Excel 文件中读取 + try { + List customers = ejConvertor.excelReader(Customer.class, FileUtil.convertMultipartFileToFile(file)); + if (customers != null) { + total = customers.size(); + + // 验证每一条记录 + List availableList = new ArrayList<>(); + for (Customer customer : customers) { + if (customerCheck(customer)) { + if (customerMapper.selectByName(customer.getName()) == null) + availableList.add(customer); + } + } + + // 保存到数据库 + available = availableList.size(); + if (available > 0) { + customerMapper.insertBatch(availableList); + } + } + } catch (PersistenceException | IOException e) { + throw new CustomerManageServiceException(e); + } + + result.put("total", total); + result.put("available", available); + return result; + } + + /** + * 导出客户信息到文件中 + * + * @param customers 包含若干条 customer 信息的 List + * @return Excel 文件 + */ + @UserOperation(value = "导出客户信息") + @Override + public File exportCustomer(List customers) { + if (customers == null) + return null; + + return ejConvertor.excelWriter(Customer.class, customers); + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/GoodsManageServiceImpl.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/GoodsManageServiceImpl.java new file mode 100644 index 0000000..c045087 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/GoodsManageServiceImpl.java @@ -0,0 +1,348 @@ +package com.ken.wms.common.service.Impl; + + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ken.wms.common.service.Interface.GoodsManageService; +import com.ken.wms.common.util.EJConvertor; +import com.ken.wms.common.util.FileUtil; +import com.ken.wms.dao.GoodsMapper; +import com.ken.wms.dao.StockInMapper; +import com.ken.wms.dao.StockOutMapper; +import com.ken.wms.dao.StorageMapper; +import com.ken.wms.domain.Goods; +import com.ken.wms.domain.StockInDO; +import com.ken.wms.domain.StockOutDO; +import com.ken.wms.domain.Storage; +import com.ken.wms.exception.GoodsManageServiceException; +import com.ken.wms.util.aop.UserOperation; +import org.apache.ibatis.exceptions.PersistenceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 货物信息管理Service 实现类 + + */ +@Service +public class GoodsManageServiceImpl implements GoodsManageService { + + @Autowired + private GoodsMapper goodsMapper; + @Autowired + private StockInMapper stockInMapper; + @Autowired + private StockOutMapper stockOutMapper; + @Autowired + private StorageMapper storageMapper; + @Autowired + private EJConvertor ejConvertor; + + /** + * 返回指定goods ID 的货物记录 + * + * @param goodsId 货物ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectById(Integer goodsId) throws GoodsManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List goodsList = new ArrayList<>(); + long total = 0; + + // 查询 + Goods goods; + try { + goods = goodsMapper.selectById(goodsId); + } catch (PersistenceException e) { + throw new GoodsManageServiceException(e); + } + + if (goods != null) { + goodsList.add(goods); + total = 1; + } + + resultSet.put("data", goodsList); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定 goods name 的货物记录 支持查询分页以及模糊查询 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @param goodsName 货物的名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByName(int offset, int limit, String goodsName) throws GoodsManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List goodsList; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + goodsList = goodsMapper.selectApproximateByName(goodsName); + if (goodsList != null) { + PageInfo pageInfo = new PageInfo<>(goodsList); + total = pageInfo.getTotal(); + } else + goodsList = new ArrayList<>(); + } else { + goodsList = goodsMapper.selectApproximateByName(goodsName); + if (goodsList != null) + total = goodsList.size(); + else + goodsList = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new GoodsManageServiceException(e); + } + + resultSet.put("data", goodsList); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定 goods name 的货物记录 支持模糊查询 + * + * @param goodsName 货物名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByName(String goodsName) throws GoodsManageServiceException { + return selectByName(-1, -1, goodsName); + } + + /** + * 分页查询货物记录 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll(int offset, int limit) throws GoodsManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List goodsList; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + goodsList = goodsMapper.selectAll(); + if (goodsList != null) { + PageInfo pageInfo = new PageInfo<>(goodsList); + total = pageInfo.getTotal(); + } else + goodsList = new ArrayList<>(); + } else { + goodsList = goodsMapper.selectAll(); + if (goodsList != null) + total = goodsList.size(); + else + goodsList = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new GoodsManageServiceException(e); + } + + resultSet.put("data", goodsList); + resultSet.put("total", total); + return resultSet; + } + + /** + * 查询所有的货物记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll() throws GoodsManageServiceException { + return selectAll(-1, -1); + } + + /** + * 检查货物信息是否满足要求 + * + * @param goods 货物信息 + * @return 若货物信息满足要求则返回true,否则返回false + */ + private boolean goodsCheck(Goods goods) { + if (goods != null) { + if (goods.getName() != null && goods.getValue() != null) { + return true; + } + } + return false; + } + + /** + * 添加货物记录 + * + * @param goods 货物信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "添加货物信息") + @Override + public boolean addGoods(Goods goods) throws GoodsManageServiceException { + + try { + // 插入新的记录 + if (goods != null) { + // 验证 + if (goodsCheck(goods)) { + goodsMapper.insert(goods); + return true; + } + } + return false; + } catch (PersistenceException e) { + throw new GoodsManageServiceException(e); + } + } + + /** + * 更新货物记录 + * + * @param goods 货物信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "修改货物信息") + @Override + public boolean updateGoods(Goods goods) throws GoodsManageServiceException { + + try { + // 更新记录 + if (goods != null) { + // 检验 + if (goodsCheck(goods)) { + goodsMapper.update(goods); + return true; + } + } + return false; + } catch (PersistenceException e) { + throw new GoodsManageServiceException(e); + } + } + + /** + * 删除货物记录 + * + * @param goodsId 货物ID + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "删除货物信息") + @Override + public boolean deleteGoods(Integer goodsId) throws GoodsManageServiceException { + + try { + // 检查该货物是否有入库信息 + List stockInDORecord = stockInMapper.selectByGoodID(goodsId); + if (stockInDORecord != null && !stockInDORecord.isEmpty()) + return false; + + // 检查该货物是否有出库信息 + List stockOutDORecord = stockOutMapper.selectByGoodId(goodsId); + if (stockOutDORecord != null && !stockOutDORecord.isEmpty()) + return false; + + // 检查该货物是否有存储信息 + List storageRecord = storageMapper.selectByGoodsIDAndRepositoryID(goodsId, null); + if (storageRecord != null && !storageRecord.isEmpty()) + return false; + + // 删除货物记录 + goodsMapper.deleteById(goodsId); + return true; + } catch (PersistenceException e) { + throw new GoodsManageServiceException(e); + } + } + + /** + * 从文件中导入货物信息 + * + * @param file 导入信息的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + @UserOperation(value = "导入货物信息") + @Override + public Map importGoods(MultipartFile file) throws GoodsManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + int total = 0; + int available = 0; + + // 从 Excel 文件中读取 + try { + List goodsList = ejConvertor.excelReader(Goods.class, FileUtil.convertMultipartFileToFile(file)); + if (goodsList != null) { + total = goodsList.size(); + + // 验证每一条记录 + List availableList = new ArrayList<>(); + for (Goods goods : goodsList) { + if (goodsCheck(goods)) { + availableList.add(goods); + } + } + // 保存到数据库 + available = availableList.size(); + if (available > 0) { + goodsMapper.insertBatch(availableList); + } + } + } catch (PersistenceException | IOException e) { + throw new GoodsManageServiceException(e); + } + + resultSet.put("total", total); + resultSet.put("available", available); + return resultSet; + } + + /** + * 导出货物信息到文件中 + * + * @param goods 包含若干条 Supplier 信息的 List + * @return excel 文件 + */ + @UserOperation(value = "导出货物信息") + @Override + public File exportGoods(List goods) { + if (goods == null) + return null; + + return ejConvertor.excelWriter(Goods.class, goods); + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/RepositoryAdminManageServiceImpl.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/RepositoryAdminManageServiceImpl.java new file mode 100644 index 0000000..d267bc9 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/RepositoryAdminManageServiceImpl.java @@ -0,0 +1,405 @@ +package com.ken.wms.common.service.Impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ken.wms.common.service.Interface.RepositoryAdminManageService; +import com.ken.wms.common.util.EJConvertor; +import com.ken.wms.common.util.FileUtil; +import com.ken.wms.dao.RepositoryAdminMapper; +import com.ken.wms.domain.RepositoryAdmin; +import com.ken.wms.domain.UserInfoDTO; +import com.ken.wms.exception.RepositoryAdminManageServiceException; +import com.ken.wms.exception.UserInfoServiceException; +import com.ken.wms.security.service.Interface.UserInfoService; +import com.ken.wms.util.aop.UserOperation; +import org.apache.ibatis.exceptions.PersistenceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.*; + +/** + * 仓库管理员管理 service 实现类 + + */ +@Service +public class RepositoryAdminManageServiceImpl implements RepositoryAdminManageService { + + @Autowired + private RepositoryAdminMapper repositoryAdminMapper; + @Autowired + private EJConvertor ejConvertor; + @Autowired + private UserInfoService userInfoService; + + /** + * 返回指定repository id 的仓库管理员记录 + * + * @param repositoryAdminID 仓库管理员ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByID(Integer repositoryAdminID) throws RepositoryAdminManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List repositoryAdmins = new ArrayList<>(); + long total = 0; + + // 查询 + RepositoryAdmin repositoryAdmin; + try { + repositoryAdmin = repositoryAdminMapper.selectByID(repositoryAdminID); + } catch (PersistenceException e) { + throw new RepositoryAdminManageServiceException(e); + } + + if (repositoryAdmin != null) { + repositoryAdmins.add(repositoryAdmin); + total = 1; + } + + resultSet.put("data", repositoryAdmins); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定 repository address 的仓库管理员记录 支持查询分页以及模糊查询 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @param name 仓库管理员的名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByName(int offset, int limit, String name) { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List repositoryAdmins; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + if (isPagination) { + PageHelper.offsetPage(offset, limit); + repositoryAdmins = repositoryAdminMapper.selectByName(name); + if (repositoryAdmins != null) { + PageInfo pageInfo = new PageInfo<>(repositoryAdmins); + total = pageInfo.getTotal(); + } else + repositoryAdmins = new ArrayList<>(); + } else { + repositoryAdmins = repositoryAdminMapper.selectByName(name); + if (repositoryAdmins != null) + total = repositoryAdmins.size(); + else + repositoryAdmins = new ArrayList<>(); + } + + resultSet.put("data", repositoryAdmins); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定 repository Name 的仓库管理员记录 支持模糊查询 + * + * @param name 仓库管理员名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByName(String name) { + return selectByName(-1, -1, name); + } + + /** + * 分页查询仓库管理员的记录 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll(int offset, int limit) throws RepositoryAdminManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List repositoryAdmins; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + repositoryAdmins = repositoryAdminMapper.selectAll(); + if (repositoryAdmins != null) { + PageInfo pageInfo = new PageInfo<>(repositoryAdmins); + total = pageInfo.getTotal(); + } else + repositoryAdmins = new ArrayList<>(); + } else { + repositoryAdmins = repositoryAdminMapper.selectAll(); + if (repositoryAdmins != null) + total = repositoryAdmins.size(); + else + repositoryAdmins = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new RepositoryAdminManageServiceException(e); + } + + resultSet.put("data", repositoryAdmins); + resultSet.put("total", total); + return resultSet; + } + + /** + * 查询所有仓库管理员的记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll() throws RepositoryAdminManageServiceException { + return selectAll(-1, -1); + } + + /** + * 添加仓库管理员信息 + * + * @param repositoryAdmin 仓库管理员信息 + * @return 返回一个boolean值,值为true代表添加成功,否则代表失败 + */ + @UserOperation(value = "添加仓库管理员信息") + @Override + public boolean addRepositoryAdmin(RepositoryAdmin repositoryAdmin) throws RepositoryAdminManageServiceException { + + if (repositoryAdmin != null) { + if (repositoryAdminCheck(repositoryAdmin)) { + try { + // 添加仓库管理员信息到数据库中 + repositoryAdminMapper.insert(repositoryAdmin); + + // 获取插入数据后返回的用户ID + Integer userID = repositoryAdmin.getId(); + if (userID == null) + return false; + + // 为仓库管理员创建账户 + UserInfoDTO userInfo = new UserInfoDTO(); + userInfo.setUserID(userID); + userInfo.setUserName(repositoryAdmin.getName()); + userInfo.setPassword(repositoryAdmin.getId().toString()); + userInfo.setRole(new ArrayList<>(Collections.singletonList("commonsAdmin"))); + + // 添加新创建的仓库管理员账户信息 + return userInfoService.insertUserInfo(userInfo); + + } catch (PersistenceException | UserInfoServiceException e) { + throw new RepositoryAdminManageServiceException(e, "Fail to persist repository admin info"); + } + } + } + return false; + } + + /** + * 更新仓库管理员信息 + * + * @param repositoryAdmin 仓库管理员信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "修改仓库管理员信息") + @Override + public boolean updateRepositoryAdmin(RepositoryAdmin repositoryAdmin) throws RepositoryAdminManageServiceException { + + if (repositoryAdmin != null) { + try { + // 检查属性 + if (!repositoryAdminCheck(repositoryAdmin)) + return false; + + // 若有指派的仓库则检查 + if (repositoryAdmin.getRepositoryBelongID() != null) { + RepositoryAdmin rAdminFromDB = repositoryAdminMapper.selectByRepositoryID(repositoryAdmin.getRepositoryBelongID()); + if (rAdminFromDB != null && !Objects.equals(rAdminFromDB.getId(), repositoryAdmin.getId())) + return false; + } + + // 更新 + repositoryAdminMapper.update(repositoryAdmin); + + return true; + } catch (PersistenceException e) { + throw new RepositoryAdminManageServiceException(e); + } + } else + return false; + + } + + /** + * 删除仓库管理员信息 + * + * @param repositoryAdminID 仓库管理员ID + * @return 返回一个boolean值,值为true代表删除成功,否则代表失败 + */ + @UserOperation(value = "删除仓库管理员信息") + @Override + public boolean deleteRepositoryAdmin(Integer repositoryAdminID) throws RepositoryAdminManageServiceException { + + try { + // 判断是否已指派仓库 + RepositoryAdmin repositoryAdmin = repositoryAdminMapper.selectByID(repositoryAdminID); + if (repositoryAdmin != null && repositoryAdmin.getRepositoryBelongID() == null) { + + // 删除仓库管理员信息 + repositoryAdminMapper.deleteByID(repositoryAdminID); + + // 删除账户信息 + userInfoService.deleteUserInfo(repositoryAdminID); + + return true; + } else + return false; + } catch (PersistenceException | UserInfoServiceException e) { + throw new RepositoryAdminManageServiceException(e); + } + } + + /** + * 为仓库管理员指派指定 ID 的仓库 + * + * @param repositoryAdminID 仓库管理员ID + * @param repositoryID 所指派的仓库ID + * @return 返回一个 boolean 值,值为 true 表示仓库指派成功,否则表示失败 + */ + @UserOperation(value = "指派仓库管理员") + @Override + public boolean assignRepository(Integer repositoryAdminID, Integer repositoryID) throws RepositoryAdminManageServiceException { + + try { + RepositoryAdmin repositoryAdmin = repositoryAdminMapper.selectByID(repositoryAdminID); + if (repositoryAdmin != null) { + repositoryAdmin.setRepositoryBelongID(repositoryID); + return updateRepositoryAdmin(repositoryAdmin); + } else + return false; + } catch (PersistenceException e) { + throw new RepositoryAdminManageServiceException(e); + } + } + + /** + * 从文件中导入仓库管理员信息 + * + * @param file 导入信息的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + @UserOperation(value = "导入仓库管理员信息") + @Override + public Map importRepositoryAdmin(MultipartFile file) throws RepositoryAdminManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + long total = 0; + long available = 0; + + // 从文件中读取 + try { + List repositoryAdmins = ejConvertor.excelReader(RepositoryAdmin.class, FileUtil.convertMultipartFileToFile(file)); + + if (repositoryAdmins != null) { + total = repositoryAdmins.size(); + + // 验证记录 + List availableList = new ArrayList<>(); + for (RepositoryAdmin repositoryAdmin : repositoryAdmins) { + if (repositoryAdminCheck(repositoryAdmin)) + availableList.add(repositoryAdmin); + } + + // 保存到数据库 + available = availableList.size(); + if (available > 0) + repositoryAdminMapper.insertBatch(availableList); + } + } catch (PersistenceException | IOException e) { + throw new RepositoryAdminManageServiceException(e); + } + + resultSet.put("total", total); + resultSet.put("available", available); + return resultSet; + } + + /** + * 导出仓库管理员信息到文件中 + * + * @param repositoryAdmins 包含若干条 repository 信息的 List + * @return Excel 文件 + */ + @UserOperation(value = "导出仓库管理员信息") + @Override + public File exportRepositoryAdmin(List repositoryAdmins) { + File file = null; + + if (repositoryAdmins != null) { + file = ejConvertor.excelWriter(RepositoryAdmin.class, repositoryAdmins); + } + + return file; + } + + /** + * 检验 repositoryAdmin 信息是否有效 + * + * @param repositoryAdmin 仓库管理员信息 + * @return 返回一个 boolean 值,若仓库管理员信息中要求非空均有值,返回 true,否则返回 false + */ + private boolean repositoryAdminCheck(RepositoryAdmin repositoryAdmin) { + + return repositoryAdmin.getName() != null && repositoryAdmin.getSex() != null && repositoryAdmin.getTel() != null + && repositoryAdmin.getBirth() != null && repositoryAdmin.getBirth() != null; + } + + /** + * 返回所属指定 repositoryID 的仓库管理员信息 + * + * @param repositoryID 仓库ID 其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + * @return 返回一个Map, + */ + @Override + public Map selectByRepositoryID(Integer repositoryID) throws RepositoryAdminManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List repositoryAdmins = new ArrayList<>(); + long total = 0; + + // 查询 + RepositoryAdmin repositoryAdmin; + try { + repositoryAdmin = repositoryAdminMapper.selectByRepositoryID(repositoryID); + } catch (PersistenceException e) { + throw new RepositoryAdminManageServiceException(e); + } + + if (repositoryAdmin != null) { + repositoryAdmins.add(repositoryAdmin); + total = 1; + } + + resultSet.put("data", repositoryAdmins); + resultSet.put("total", total); + return resultSet; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/RepositoryManageServiceImpl.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/RepositoryManageServiceImpl.java new file mode 100644 index 0000000..c104e0f --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/RepositoryManageServiceImpl.java @@ -0,0 +1,377 @@ +package com.ken.wms.common.service.Impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ken.wms.common.service.Interface.RepositoryService; +import com.ken.wms.common.util.EJConvertor; +import com.ken.wms.common.util.FileUtil; +import com.ken.wms.dao.*; +import com.ken.wms.domain.*; +import com.ken.wms.exception.RepositoryManageServiceException; +import com.ken.wms.util.aop.UserOperation; +import org.apache.ibatis.exceptions.PersistenceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 仓库信息管理 service 实现类 + + */ +@Service +public class RepositoryManageServiceImpl implements RepositoryService { + + @Autowired + private RepositoryMapper repositoryMapper; + @Autowired + private EJConvertor ejConvertor; + @Autowired + private StockInMapper stockInMapper; + @Autowired + private StockOutMapper stockOutMapper; + @Autowired + private StorageMapper storageMapper; + @Autowired + private RepositoryAdminMapper repositoryAdminMapper; + + /** + * 返回指定 repository ID 的仓库记录 + * + * @param repositoryId 仓库ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectById(Integer repositoryId) throws RepositoryManageServiceException { + // 初始化結果集 + Map resultSet = new HashMap<>(); + List repositories = new ArrayList<>(); + long total = 0; + + // 查詢 + Repository repository; + try { + repository = repositoryMapper.selectByID(repositoryId); + } catch (PersistenceException e) { + throw new RepositoryManageServiceException(e); + } + + if (repository != null) { + repositories.add(repository); + total = 1; + } + + resultSet.put("data", repositories); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定 repository address 的仓库记录 支持查询分页以及模糊查询 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @param address 仓库的地址 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByAddress(int offset, int limit, String address) throws RepositoryManageServiceException { + // 初始化結果集 + Map resultSet = new HashMap<>(); + List repositories; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + repositories = repositoryMapper.selectByAddress(address); + if (repositories != null) { + PageInfo pageInfo = new PageInfo<>(repositories); + total = pageInfo.getTotal(); + } else + repositories = new ArrayList<>(); + } else { + repositories = repositoryMapper.selectByAddress(address); + if (repositories != null) + total = repositories.size(); + else + repositories = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new RepositoryManageServiceException(e); + } + + resultSet.put("data", repositories); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定 repository address 的仓库记录 支持模糊查询 + * + * @param address 仓库名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByAddress(String address) throws RepositoryManageServiceException { + return selectByAddress(-1, -1, address); + } + + /** + * 分页查询仓库记录 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll(int offset, int limit) throws RepositoryManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List repositories; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + //query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + repositories = repositoryMapper.selectAll(); + if (repositories != null) { + PageInfo pageInfo = new PageInfo<>(repositories); + total = pageInfo.getTotal(); + } else + repositories = new ArrayList<>(); + } else { + repositories = repositoryMapper.selectAll(); + if (repositories != null) + total = repositories.size(); + else + repositories = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new RepositoryManageServiceException(e); + } + + resultSet.put("data", repositories); + resultSet.put("total", total); + return resultSet; + } + + /** + * 查询所有的仓库记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll() throws RepositoryManageServiceException { + return selectAll(-1, -1); + } + + /** + * 检查仓库信息是否满足 + * + * @param repository 仓库信息 + * @return 若仓库信息满足要求则返回true,否则返回false + */ + private boolean repositoryCheck(Repository repository) { + return repository.getAddress() != null && repository.getStatus() != null && repository.getArea() != null; + } + + /** + * 添加仓库记录 + * + * @param repository 仓库信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "添加仓库信息") + @Override + public boolean addRepository(Repository repository) throws RepositoryManageServiceException { + + // 插入一条新的记录 + if (repository != null) { + try { + // 有效性验证 + if (repositoryCheck(repository)) + repositoryMapper.insert(repository); + if (repository.getId() != null) { + return true; + } + } catch (PersistenceException e) { + throw new RepositoryManageServiceException(e); + } + } + return false; + } + + /** + * 更新仓库记录 + * + * @param repository 仓库信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "修改仓库信息") + @Override + public boolean updateRepository(Repository repository) throws RepositoryManageServiceException { + + // 更新仓库记录 + if (repository != null) { + // 有效性验证 + try { + if (repositoryCheck(repository)) { + if (repository.getId() != null) { + repositoryMapper.update(repository); + return true; + } + } + } catch (PersistenceException e) { + throw new RepositoryManageServiceException(e); + } + } + return false; + } + + /** + * 删除仓库记录 + * + * @param repositoryId 仓库ID + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "删除仓库信息") + @Override + public boolean deleteRepository(Integer repositoryId) throws RepositoryManageServiceException { + + try { + // 检查是否存在出库记录 + List stockOutDOList = stockOutMapper.selectByRepositoryID(repositoryId); + if (stockOutDOList != null && !stockOutDOList.isEmpty()) + return false; + + // 检查是否存在入库记录 + List stockInDOList = stockInMapper.selectByRepositoryID(repositoryId); + if (stockInDOList != null && !stockInDOList.isEmpty()) + return false; + + // 检查是否存在库存记录 + List storageRecords = storageMapper.selectAllAndRepositoryID(repositoryId); + if (storageRecords != null && !storageRecords.isEmpty()) + return false; + + // 检查是否已指派仓库管理员 + RepositoryAdmin repositoryAdmin = repositoryAdminMapper.selectByRepositoryID(repositoryId); + if (repositoryAdmin != null) + return false; + + // 删除记录 + repositoryMapper.deleteByID(repositoryId); + + return true; + } catch (PersistenceException e) { + throw new RepositoryManageServiceException(e); + } + } + + /** + * 从文件中导入仓库信息 + * + * @param file 导入信息的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + @UserOperation(value = "导入仓库信息") + @Override + public Map importRepository(MultipartFile file) throws RepositoryManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + int total = 0; + int available = 0; + + // 从文件中读取 + try { + List repositories = ejConvertor.excelReader(Repository.class, FileUtil.convertMultipartFileToFile(file)); + + if (repositories != null) { + total = repositories.size(); + + // 验证每一条记录 + List availableList = new ArrayList<>(); + for (Repository repository : repositories) { + if (repository.getAddress() != null && repository.getStatus() != null && repository.getArea() != null) + availableList.add(repository); + } + + // 保存到数据库 + available = availableList.size(); + if (available > 0) + repositoryMapper.insertbatch(availableList); + } + } catch (PersistenceException | IOException e) { + throw new RepositoryManageServiceException(e); + } + + + resultSet.put("total", total); + resultSet.put("available", available); + return resultSet; + } + + /** + * 导出仓库信息到文件中 + * + * @param repositories 包含若干条 Supplier 信息的 List + * @return excel 文件 + */ + @UserOperation(value = "导出仓库信息") + @Override + public File exportRepository(List repositories) { + if (repositories == null) + return null; + + // 导出为文件 + return ejConvertor.excelWriter(Repository.class, repositories); + } + + /** + * 查询所有未指派仓库管理员的仓库记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectUnassign() throws RepositoryManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List repositories; + long total = 0; + + // 查询 + try { + repositories = repositoryMapper.selectUnassign(); + } catch (PersistenceException e) { + throw new RepositoryManageServiceException(e); + } + if (repositories != null) + total = repositories.size(); + else + repositories = new ArrayList<>(); + + resultSet.put("data", repositories); + resultSet.put("total", total); + return resultSet; + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/StockRecordManageServiceImpl.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/StockRecordManageServiceImpl.java new file mode 100644 index 0000000..311abcd --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/StockRecordManageServiceImpl.java @@ -0,0 +1,443 @@ +package com.ken.wms.common.service.Impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ken.wms.common.service.Interface.StockRecordManageService; +import com.ken.wms.common.service.Interface.StorageManageService; +import com.ken.wms.dao.*; +import com.ken.wms.domain.*; +import com.ken.wms.exception.StockRecordManageServiceException; +import com.ken.wms.exception.StorageManageServiceException; +import com.ken.wms.util.aop.UserOperation; +import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.exceptions.PersistenceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +@Service +public class StockRecordManageServiceImpl implements StockRecordManageService { + + @Autowired + private SupplierMapper supplierMapper; + @Autowired + private CustomerMapper customerMapper; + @Autowired + private GoodsMapper goodsMapper; + @Autowired + private RepositoryMapper repositoryMapper; + @Autowired + private StorageManageService storageManageService; + @Autowired + private StockInMapper stockinMapper; + @Autowired + private StockOutMapper stockOutMapper; + + /** + * 货物入库操作 + * + * @param supplierID 供应商ID + * @param goodsID 货物ID + * @param repositoryID 入库仓库ID + * @param number 入库数量 + * @return 返回一个boolean 值,若值为true表示入库成功,否则表示入库失败 + */ + @UserOperation(value = "货物入库") + @Override + public boolean stockInOperation(Integer supplierID, Integer goodsID, Integer repositoryID, long number, String personInCharge) throws StockRecordManageServiceException { + + // ID对应的记录是否存在 + if (!(supplierValidate(supplierID) && goodsValidate(goodsID) && repositoryValidate(repositoryID))) + return false; + + if (personInCharge == null) + return false; + + // 检查入库数量有效性 + if (number < 0) + return false; + + try { + // 更新库存记录 + boolean isSuccess; + isSuccess = storageManageService.storageIncrease(goodsID, repositoryID, number); + + // 保存入库记录 + if (isSuccess) { + StockInDO stockInDO = new StockInDO(); + stockInDO.setGoodID(goodsID); + stockInDO.setSupplierID(supplierID); + stockInDO.setNumber(number); + stockInDO.setPersonInCharge(personInCharge); + stockInDO.setTime(new Date()); + stockInDO.setRepositoryID(repositoryID); + stockinMapper.insert(stockInDO); + } + + return isSuccess; + } catch (PersistenceException | StorageManageServiceException e) { + throw new StockRecordManageServiceException(e); + } + } + + /** + * 货物出库操作 + * + * @param customerID 客户ID + * @param goodsID 货物ID + * @param repositoryID 出库仓库ID + * @param number 出库数量 + * @return 返回一个boolean值,若值为true表示出库成功,否则表示出库失败 + */ + @UserOperation(value = "货物出库") + @Override + public boolean stockOutOperation(Integer customerID, Integer goodsID, Integer repositoryID, long number, String personInCharge) throws StockRecordManageServiceException { + + // 检查ID对应的记录是否存在 + if (!(customerValidate(customerID) && goodsValidate(goodsID) && repositoryValidate(repositoryID))) + return false; + + // 检查出库数量范围是否有效 + if (number < 0) + return false; + + try { + // 更新库存信息 + boolean isSuccess; + isSuccess = storageManageService.storageDecrease(goodsID, repositoryID, number); + + // 保存出库记录 + if (isSuccess) { + StockOutDO stockOutDO = new StockOutDO(); + stockOutDO.setCustomerID(customerID); + stockOutDO.setGoodID(goodsID); + stockOutDO.setNumber(number); + stockOutDO.setPersonInCharge(personInCharge); + stockOutDO.setRepositoryID(repositoryID); + stockOutDO.setTime(new Date()); + stockOutMapper.insert(stockOutDO); + } + + return isSuccess; + } catch (PersistenceException | StorageManageServiceException e) { + throw new StockRecordManageServiceException(e); + } + } + + /** + * 查询出入库记录 + * + * @param repositoryID 仓库ID + * @param endDateStr 查询记录起始日期 + * @param startDateStr 查询记录结束日期 + * @param searchType 记录查询方式 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectStockRecord(Integer repositoryID, String startDateStr, String endDateStr, String searchType) throws StockRecordManageServiceException { + return selectStockRecord(repositoryID, startDateStr, endDateStr, searchType, -1, -1); + } + + /** + * 分页查询出入库记录 + * + * @param repositoryID 仓库ID + * @param endDateStr 查询记录起始日期 + * @param startDateStr 查询记录结束日期 + * @param searchType 记录查询方式 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @SuppressWarnings("unchecked") + @Override + public Map selectStockRecord(Integer repositoryID, String startDateStr, String endDateStr, String searchType, int offset, int limit) throws StockRecordManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + long total = 0; + + // 检查传入参数 + if (repositoryID == null || searchType == null) + throw new StockRecordManageServiceException("exception"); + + // 转换 Date 对象 + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Date startDate = null; + Date endDate = null; + try { + if (StringUtils.isNotEmpty(startDateStr)) + startDate = dateFormat.parse(startDateStr); + if (StringUtils.isNotEmpty(endDateStr)) + endDate = dateFormat.parse(endDateStr); + } catch (ParseException e) { + throw new StockRecordManageServiceException(e); + } + + // 根据查询模式执行查询 + List stockRecordDTOS = new ArrayList<>(); + Map stockInTemp; + Map stockOutTemp; + List stockInRecordDOS = null; + List stockOutRecordDOS = null; + switch (searchType) { + case "all": { + if (offset < 0 || limit < 0) { + stockInTemp = selectStockInRecord(repositoryID, startDate, endDate, offset, limit); + stockOutTemp = selectStockOutRecord(repositoryID, startDate, endDate, offset, limit); + stockInRecordDOS = (List) stockInTemp.get("data"); + stockOutRecordDOS = (List) stockOutTemp.get("data"); + } else { + int stockInRecordOffset = offset / 2; + int stockOutRecordOffset = stockInRecordOffset * 2 < offset ? stockInRecordOffset + 1 : stockInRecordOffset; + int stockInRecordLimit = limit / 2; + int stockOutRecordLimit = stockInRecordLimit * 2 < limit ? stockInRecordLimit + 1 : stockInRecordLimit; + + stockInTemp = selectStockInRecord(repositoryID, startDate, endDate, stockInRecordOffset, limit); + stockOutTemp = selectStockOutRecord(repositoryID, startDate, endDate, stockOutRecordOffset, limit); + + stockInRecordDOS = (List) stockInTemp.get("data"); + stockOutRecordDOS = (List) stockOutTemp.get("data"); + + int stockInRecordDosSize = stockInRecordDOS.size(); + int stockOutRecordDoSize = stockOutRecordDOS.size(); + if (stockInRecordDosSize >= stockInRecordLimit && stockOutRecordDoSize >= stockOutRecordLimit) { + stockInRecordDOS = stockInRecordDOS.subList(0, stockInRecordLimit); + stockOutRecordDOS = stockOutRecordDOS.subList(0, stockOutRecordLimit); + } else if (stockInRecordDosSize < stockInRecordLimit && stockOutRecordDoSize > stockOutRecordLimit) { + int appendSize = (stockOutRecordDoSize - stockOutRecordLimit) > (stockInRecordLimit - stockInRecordDosSize) ? + (stockInRecordLimit - stockInRecordDosSize) : (stockOutRecordDoSize - stockOutRecordLimit); + stockOutRecordDOS = stockOutRecordDOS.subList(0, stockInRecordLimit + appendSize - 1); + } else if (stockOutRecordDoSize < stockOutRecordLimit && stockInRecordDosSize > stockInRecordLimit) { + int appendSize = (stockInRecordDosSize - stockInRecordLimit) > (stockOutRecordLimit - stockOutRecordDoSize) ? + (stockOutRecordLimit - stockOutRecordDoSize) : (stockInRecordDosSize - stockInRecordLimit); + stockInRecordDOS = stockInRecordDOS.subList(0, stockInRecordLimit + appendSize); + } + } + long stockInRecordDOSTotal = (long) stockInTemp.get("total"); + long stockOutRecordDOSTotal = (long) stockOutTemp.get("total"); + total = stockInRecordDOSTotal + stockOutRecordDOSTotal; + break; + } + case "stockInOnly": { + stockInTemp = selectStockInRecord(repositoryID, startDate, endDate, offset, limit); + total = (long) stockInTemp.get("total"); + stockInRecordDOS = (List) stockInTemp.get("data"); + break; + } + case "stockOutOnly": { + stockOutTemp = selectStockOutRecord(repositoryID, startDate, endDate, offset, limit); + total = (long) stockOutTemp.get("total"); + stockOutRecordDOS = (List) stockOutTemp.get("data"); + break; + } + case "none": { + break; + } + } + + if (stockInRecordDOS != null) + stockInRecordDOS.forEach(stockInDO -> stockRecordDTOS.add(stockInRecordConvertToStockRecordDTO(stockInDO))); + if (stockOutRecordDOS != null) + stockOutRecordDOS.forEach(stockOutDO -> stockRecordDTOS.add(stockOutDoConvertToStockRecordDTO(stockOutDO))); + + resultSet.put("data", stockRecordDTOS); + resultSet.put("total", total); + return resultSet; + } + + /** + * 查询入库记录 + * + * @param repositoryID 入库仓库ID + * @param startDate 入库记录起始日期 + * @param endDate 入库记录结束日期 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 返回所有符合要求的入库记录 + */ + private Map selectStockInRecord(Integer repositoryID, Date startDate, Date endDate, int offset, int limit) throws StockRecordManageServiceException { + Map result = new HashMap<>(); + List stockInRecords; + long stockInTotal = 0; + boolean isPagination = true; + + // 检查是否需要分页查询 + if (offset < 0 || limit < 0) + isPagination = false; + + // 查询记录 + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + stockInRecords = stockinMapper.selectByRepositoryIDAndDate(repositoryID, startDate, endDate); + if (stockInRecords != null) + stockInTotal = new PageInfo<>(stockInRecords).getTotal(); + else + stockInRecords = new ArrayList<>(10); + } else { + stockInRecords = stockinMapper.selectByRepositoryIDAndDate(repositoryID, startDate, endDate); + if (stockInRecords != null) + stockInTotal = stockInRecords.size(); + else + stockInRecords = new ArrayList<>(10); + } + } catch (PersistenceException e) { + throw new StockRecordManageServiceException(e); + } + + result.put("data", stockInRecords); + result.put("total", stockInTotal); + return result; + } + + /** + * 查询出库记录 + * + * @param repositoryID 出库仓库ID + * @param startDate 出库记录起始日期 + * @param endDate 出库记录结束日期 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 返回所有符合要求的出库记录 + */ + private Map selectStockOutRecord(Integer repositoryID, Date startDate, Date endDate, int offset, int limit) throws StockRecordManageServiceException { + Map result = new HashMap<>(); + List stockOutRecords; + long stockOutRecordTotal = 0; + boolean isPagination = true; + + // 检查是否需要分页 + if (offset < 0 || limit < 0) + isPagination = false; + + // 查询记录 + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + stockOutRecords = stockOutMapper.selectByRepositoryIDAndDate(repositoryID, startDate, endDate); + if (stockOutRecords != null) + stockOutRecordTotal = new PageInfo<>(stockOutRecords).getTotal(); + else + stockOutRecords = new ArrayList<>(10); + } else { + stockOutRecords = stockOutMapper.selectByRepositoryIDAndDate(repositoryID, startDate, endDate); + if (stockOutRecords != null) + stockOutRecordTotal = stockOutRecords.size(); + else + stockOutRecords = new ArrayList<>(10); + } + } catch (PersistenceException e) { + throw new StockRecordManageServiceException(e); + } + + result.put("data", stockOutRecords); + result.put("total", stockOutRecordTotal); + return result; + } + + private DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm"); + + /** + * 将 StockInDO 转换为 StockRecordDTO + * + * @param stockInDO StockInDO 对象 + * @return 返回 StockRecordDTO 对象 + */ + private StockRecordDTO stockInRecordConvertToStockRecordDTO(StockInDO stockInDO) { + StockRecordDTO stockRecordDTO = new StockRecordDTO(); + stockRecordDTO.setRecordID(stockInDO.getId()); + stockRecordDTO.setSupplierOrCustomerName(stockInDO.getSupplierName()); + stockRecordDTO.setGoodsName(stockInDO.getGoodName()); + stockRecordDTO.setNumber(stockInDO.getNumber()); + stockRecordDTO.setTime(dateFormat.format(stockInDO.getTime())); + stockRecordDTO.setRepositoryID(stockInDO.getRepositoryID()); + stockRecordDTO.setPersonInCharge(stockInDO.getPersonInCharge()); + stockRecordDTO.setType("入库"); + return stockRecordDTO; + } + + /** + * 将 StockOutDO 转换为 StockRecordDTO 对象 + * + * @param stockOutDO StockOutDO 对象 + * @return 返回 StockRecordDTO 对象 + */ + private StockRecordDTO stockOutDoConvertToStockRecordDTO(StockOutDO stockOutDO) { + StockRecordDTO stockRecordDTO = new StockRecordDTO(); + stockRecordDTO.setRecordID(stockOutDO.getId()); + stockRecordDTO.setSupplierOrCustomerName(stockOutDO.getCustomerName()); + stockRecordDTO.setGoodsName(stockOutDO.getGoodName()); + stockRecordDTO.setNumber(stockOutDO.getNumber()); + stockRecordDTO.setTime(dateFormat.format(stockOutDO.getTime())); + stockRecordDTO.setRepositoryID(stockOutDO.getRepositoryID()); + stockRecordDTO.setPersonInCharge(stockOutDO.getPersonInCharge()); + stockRecordDTO.setType("出库"); + return stockRecordDTO; + } + + + /** + * 检查货物ID对应的记录是否存在 + * + * @param goodsID 货物ID + * @return 若存在则返回true,否则返回false + */ + private boolean goodsValidate(Integer goodsID) throws StockRecordManageServiceException { + try { + Goods goods = goodsMapper.selectById(goodsID); + return goods != null; + } catch (PersistenceException e) { + throw new StockRecordManageServiceException(e); + } + } + + /** + * 检查仓库ID对应的记录是否存在 + * + * @param repositoryID 仓库ID + * @return 若存在则返回true,否则返回false + */ + private boolean repositoryValidate(Integer repositoryID) throws StockRecordManageServiceException { + try { + Repository repository = repositoryMapper.selectByID(repositoryID); + return repository != null; + } catch (PersistenceException e) { + throw new StockRecordManageServiceException(e); + } + } + + /** + * 检查供应商ID对应的记录是否存在 + * + * @param supplierID 供应商ID + * @return 若存在则返回true,否则返回false + */ + private boolean supplierValidate(Integer supplierID) throws StockRecordManageServiceException { + try { + Supplier supplier = supplierMapper.selectById(supplierID); + return supplier != null; + } catch (PersistenceException e) { + throw new StockRecordManageServiceException(e); + } + } + + /** + * 检查客户ID对应的记录是否存在 + * + * @param cumtomerID 客户ID + * @return 若存在则返回true,否则返回false + */ + private boolean customerValidate(Integer cumtomerID) throws StockRecordManageServiceException { + try { + Customer customer = customerMapper.selectById(cumtomerID); + return customer != null; + } catch (PersistenceException e) { + throw new StockRecordManageServiceException(e); + } + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/StorageManageServiceImpl.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/StorageManageServiceImpl.java new file mode 100644 index 0000000..eaac191 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/StorageManageServiceImpl.java @@ -0,0 +1,514 @@ +package com.ken.wms.common.service.Impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ken.wms.common.service.Interface.StorageManageService; +import com.ken.wms.common.util.EJConvertor; +import com.ken.wms.common.util.FileUtil; +import com.ken.wms.dao.GoodsMapper; +import com.ken.wms.dao.RepositoryMapper; +import com.ken.wms.dao.StorageMapper; +import com.ken.wms.domain.Goods; +import com.ken.wms.domain.Repository; +import com.ken.wms.domain.Storage; +import com.ken.wms.exception.StorageManageServiceException; +import com.ken.wms.util.aop.UserOperation; +import org.apache.ibatis.exceptions.PersistenceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 库存信息管理 service 实现类 + + */ +@Service +public class StorageManageServiceImpl implements StorageManageService { + + @Autowired + private StorageMapper storageMapper; + @Autowired + private GoodsMapper goodsMapper; + @Autowired + private RepositoryMapper repositoryMapper; + @Autowired + private EJConvertor ejConvertor; + + /** + * 返回所有的库存记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll(Integer repository) throws StorageManageServiceException { + return selectAll(repository, -1, -1); + } + + /** + * 分页返回所有的库存记录 + * + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll(Integer repositoryID, int offset, int limit) throws StorageManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List storageList; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + storageList = storageMapper.selectAllAndRepositoryID(repositoryID); + if (storageList != null) { + PageInfo pageInfo = new PageInfo<>(storageList); + total = pageInfo.getTotal(); + } else + storageList = new ArrayList<>(); + } else { + storageList = storageMapper.selectAllAndRepositoryID(repositoryID); + if (storageList != null) + total = storageList.size(); + else + storageList = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new StorageManageServiceException(e); + } + + resultSet.put("data", storageList); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定货物ID的库存记录 + * + * @param goodsID 指定的货物ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByGoodsID(Integer goodsID, Integer repository) throws StorageManageServiceException { + return selectByGoodsID(goodsID, repository, -1, -1); + } + + /** + * 分页返回指定的货物库存记录 + * + * @param goodsID 指定的货物ID + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByGoodsID(Integer goodsID, Integer repositoryID, int offset, int limit) throws StorageManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List storageList; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + storageList = storageMapper.selectByGoodsIDAndRepositoryID(goodsID, repositoryID); + if (storageList != null) { + PageInfo pageInfo = new PageInfo<>(storageList); + total = pageInfo.getTotal(); + } else + storageList = new ArrayList<>(); + } else { + storageList = storageMapper.selectByGoodsIDAndRepositoryID(goodsID, repositoryID); + if (storageList != null) + total = storageList.size(); + else + storageList = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new StorageManageServiceException(e); + } + + resultSet.put("data", storageList); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定货物名称的库存记录 + * + * @param goodsName 货物名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByGoodsName(String goodsName, Integer repository) throws StorageManageServiceException { + return selectByGoodsName(goodsName, repository, -1, -1); + } + + /** + * 分页返回指定货物名称的库存记录 + * + * @param goodsName 货物名称 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByGoodsName(String goodsName, Integer repositoryID, int offset, int limit) throws StorageManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List storageList; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + storageList = storageMapper.selectByGoodsNameAndRepositoryID(goodsName, repositoryID); + if (storageList != null) { + PageInfo pageInfo = new PageInfo<>(storageList); + total = pageInfo.getTotal(); + } else + storageList = new ArrayList<>(); + } else { + storageList = storageMapper.selectByGoodsNameAndRepositoryID(goodsName, repositoryID); + if (storageList != null) + total = storageList.size(); + else + storageList = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new StorageManageServiceException(e); + } + + resultSet.put("data", storageList); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定货物类型的库存记录 + * + * @param goodsType 指定的货物类型 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByGoodsType(String goodsType, Integer repositoryID) throws StorageManageServiceException { + return selectByGoodsType(goodsType, repositoryID, -1, -1); + } + + /** + * 分页返回指定货物类型的库存记录 + * + * @param goodsType 指定的货物类型 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByGoodsType(String goodsType, Integer repositoryID, int offset, int limit) throws StorageManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List storageList; + long total = 0; + boolean isPaginatin = true; + + // validate + if (offset < 0 || limit < 0) + isPaginatin = false; + + // query + try { + if (isPaginatin) { + PageHelper.offsetPage(offset, limit); + storageList = storageMapper.selectByGoodsTypeAndRepositoryID(goodsType, repositoryID); + if (storageList != null) { + PageInfo pageInfo = new PageInfo<>(storageList); + total = pageInfo.getTotal(); + } else + storageList = new ArrayList<>(); + } else { + storageList = storageMapper.selectByGoodsTypeAndRepositoryID(goodsType, repositoryID); + if (storageList != null) + total = storageList.size(); + else + storageList = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new StorageManageServiceException(e); + } + + resultSet.put("data", storageList); + resultSet.put("total", total); + return resultSet; + } + + /** + * 添加一条库存记录 + * + * @param goodsID 指定的货物ID + * @param repositoryID 指定的仓库ID + * @param number 库存数量 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "添加库存记录") + @Override + public boolean addNewStorage(Integer goodsID, Integer repositoryID, long number) throws StorageManageServiceException { + try { + boolean isAvailable = true; + + // validate + Goods goods = goodsMapper.selectById(goodsID); + Repository repository = repositoryMapper.selectByID(repositoryID); + if (goods == null) + isAvailable = false; + if (repository == null) + isAvailable = false; + if (number < 0) + isAvailable = false; + List storageList = storageMapper.selectByGoodsIDAndRepositoryID(goodsID, repositoryID); + if (!(storageList != null && storageList.isEmpty())) + isAvailable = false; + + if (isAvailable) { + // insert + Storage storage = new Storage(); + storage.setGoodsID(goodsID); + storage.setRepositoryID(repositoryID); + storage.setNumber(number); + storageMapper.insert(storage); + } + + return isAvailable; + } catch (PersistenceException e) { + throw new StorageManageServiceException(e); + } + } + + /** + * 更新一条库存记录 + * + * @param goodsID 指定的货物ID + * @param repositoryID 指定的仓库ID + * @param number 更新的库存数量 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "修改库存记录") + @Override + public boolean updateStorage(Integer goodsID, Integer repositoryID, long number) throws StorageManageServiceException { + try { + boolean isUpdate = false; + + // validate + List storageList = storageMapper.selectByGoodsIDAndRepositoryID(goodsID, repositoryID); + if (storageList != null && !storageList.isEmpty()) { + if (number >= 0) { + // update + Storage storage = storageList.get(0); + storage.setNumber(number); + storageMapper.update(storage); + isUpdate = true; + } + } + + return isUpdate; + } catch (PersistenceException e) { + throw new StorageManageServiceException(e); + } + } + + /** + * 删除一条库存记录 + * 货物ID与仓库ID可唯一确定一条库存记录 + * + * @param goodsID 指定的货物ID + * @param repositoryID 指定的仓库ID + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "删除库存记录") + @Override + public boolean deleteStorage(Integer goodsID, Integer repositoryID) throws StorageManageServiceException { + try { + boolean isDelete = false; + + // validate + List storageList = storageMapper.selectByGoodsIDAndRepositoryID(goodsID, repositoryID); + if (storageList != null && !storageList.isEmpty()) { + // delete + storageMapper.deleteByRepositoryIDAndGoodsID(goodsID, repositoryID); + isDelete = true; + } + + return isDelete; + } catch (PersistenceException e) { + throw new StorageManageServiceException(e); + } + } + + /** + * 导入库存记录 + * + * @param file 保存有的库存记录的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + @UserOperation(value = "导入库存记录") + @Override + public Map importStorage(MultipartFile file) throws StorageManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + int total = 0; + int available = 0; + + // 从文件中读取 + try { + List storageList = ejConvertor.excelReader(Storage.class, FileUtil.convertMultipartFileToFile(file)); + if (storageList != null) { + total = storageList.size(); + + boolean isAvailable; + List availableList = new ArrayList<>(); + Goods goods; + Repository repository; + for (Storage storage : storageList) { + isAvailable = true; + + // validate + goods = goodsMapper.selectById(storage.getGoodsID()); + repository = repositoryMapper.selectByID(storage.getRepositoryID()); + if (goods == null) + isAvailable = false; + if (repository == null) + isAvailable = false; + if (storage.getNumber() < 0) + isAvailable = false; + List temp = storageMapper.selectByGoodsIDAndRepositoryID(storage.getGoodsID(), storage.getRepositoryID()); + if (!(temp != null && temp.isEmpty())) + isAvailable = false; + + if (isAvailable) { + availableList.add(storage); + } + } + // 保存到数据库 + available = availableList.size(); + System.out.println(available); + if (available > 0) + storageMapper.insertBatch(availableList); + } + } catch (PersistenceException | IOException e) { + throw new StorageManageServiceException(e); + } + + resultSet.put("total", total); + resultSet.put("available", available); + return resultSet; + } + + /** + * 导出库存记录 + * + * @param storageList 保存有库存记录的List + * @return excel 文件 + */ + @UserOperation(value = "导出库存记录") + @Override + public File exportStorage(List storageList) { + if (storageList == null) + return null; + return ejConvertor.excelWriter(Storage.class, storageList); + } + + /** + * 为指定的货物库存记录增加指定数目 + * + * @param goodsID 货物ID + * @param repositoryID 仓库ID + * @param number 增加的数量 + * @return 返回一个 boolean 值,若值为true表示数目增加成功,否则表示增加失败 + */ + @Override + public boolean storageIncrease(Integer goodsID, Integer repositoryID, long number) throws StorageManageServiceException { + + // 检查货物库存增加数目的有效性 + if (number < 0) + return false; + + synchronized (this) { + // 检查对应的库存记录是否存在 + Storage storage = getStorage(goodsID, repositoryID); + if (storage != null) { + long newStorage = storage.getNumber() + number; + updateStorage(goodsID, repositoryID, newStorage); + } else { + addNewStorage(goodsID, repositoryID, number); + } + } + return true; + } + + /** + * 为指定的货物库存记录减少指定的数目 + * + * @param goodsID 货物ID + * @param repositoryID 仓库ID + * @param number 减少的数量 + * @return 返回一个 boolean 值,若值为 true 表示数目减少成功,否则表示减少失败 + */ + @Override + public boolean storageDecrease(Integer goodsID, Integer repositoryID, long number) throws StorageManageServiceException { + + synchronized (this) { + // 检查对应的库存记录是否存在 + Storage storage = getStorage(goodsID, repositoryID); + if (null != storage) { + // 检查库存减少数目的范围是否合理 + if (number < 0 || storage.getNumber() < number) + return false; + + long newStorage = storage.getNumber() - number; + updateStorage(goodsID, repositoryID, newStorage); + return true; + } else + return false; + } + } + + /** + * 获取指定货物ID,仓库ID对应的库存记录 + * + * @param goodsID 货物ID + * @param repositoryID 仓库ID + * @return 若存在则返回对应的记录,否则返回null + */ + private Storage getStorage(Integer goodsID, Integer repositoryID) { + Storage storage = null; + List storageList = storageMapper.selectByGoodsIDAndRepositoryID(goodsID, repositoryID); + if (!storageList.isEmpty()) + storage = storageList.get(0); + return storage; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/SupplierManageServiceImpl.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/SupplierManageServiceImpl.java new file mode 100644 index 0000000..3796a49 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/SupplierManageServiceImpl.java @@ -0,0 +1,333 @@ +package com.ken.wms.common.service.Impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ken.wms.common.service.Interface.SupplierManageService; +import com.ken.wms.common.util.EJConvertor; +import com.ken.wms.common.util.FileUtil; +import com.ken.wms.dao.StockInMapper; +import com.ken.wms.dao.SupplierMapper; +import com.ken.wms.domain.StockInDO; +import com.ken.wms.domain.Supplier; +import com.ken.wms.exception.SupplierManageServiceException; +import com.ken.wms.util.aop.UserOperation; +import org.apache.ibatis.exceptions.PersistenceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 供应商信息管理 service 实现类 + + */ +@Service +public class SupplierManageServiceImpl implements SupplierManageService { + + @Autowired + private SupplierMapper supplierMapper; + @Autowired + private StockInMapper stockInMapper; + @Autowired + private EJConvertor ejConvertor; + + /** + * 返回指定supplierID 的供应商记录 + * + * @param supplierId 供应商ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectById(Integer supplierId) throws SupplierManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List suppliers = new ArrayList<>(); + long total = 0; + + // 查询 + Supplier supplier; + try { + supplier = supplierMapper.selectById(supplierId); + } catch (PersistenceException e) { + throw new SupplierManageServiceException(e); + } + if (supplier != null) { + suppliers.add(supplier); + total = 1; + } + + resultSet.put("data", suppliers); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定 supplierName 的供应商记录 支持查询分页以及模糊查询 + * + * @param offset 分页的偏移值 + * @param limit 分页德大小 + * @param supplierName 供应商德名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByName(int offset, int limit, String supplierName) throws SupplierManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List suppliers; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + suppliers = supplierMapper.selectApproximateByName(supplierName); + if (suppliers != null) { + PageInfo pageInfo = new PageInfo<>(suppliers); + total = pageInfo.getTotal(); + } else + suppliers = new ArrayList<>(); + } else { + suppliers = supplierMapper.selectApproximateByName(supplierName); + if (suppliers != null) + total = suppliers.size(); + else + suppliers = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new SupplierManageServiceException(e); + } + + resultSet.put("data", suppliers); + resultSet.put("total", total); + return resultSet; + } + + /** + * 返回指定 supplierName 的供应商记录 支持模糊查询 + * + * @param supplierName supplierName 供应商德名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectByName(String supplierName) throws SupplierManageServiceException { + return selectByName(-1, -1, supplierName); + } + + /** + * 分页查询供应商记录 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll(int offset, int limit) throws SupplierManageServiceException { + // 初始化结果集 + Map resultSet = new HashMap<>(); + List suppliers; + long total = 0; + boolean isPagination = true; + + // validate + if (offset < 0 || limit < 0) + isPagination = false; + + // query + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + suppliers = supplierMapper.selectAll(); + if (suppliers != null) { + PageInfo pageInfo = new PageInfo<>(suppliers); + total = pageInfo.getTotal(); + } else + suppliers = new ArrayList<>(); + } else { + suppliers = supplierMapper.selectAll(); + if (suppliers != null) + total = suppliers.size(); + else + suppliers = new ArrayList<>(); + } + } catch (PersistenceException e) { + throw new SupplierManageServiceException(e); + } + + resultSet.put("data", suppliers); + resultSet.put("total", total); + return resultSet; + } + + /** + * 查询所有的供应商记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + @Override + public Map selectAll() throws SupplierManageServiceException { + return selectAll(-1, -1); + } + + /** + * 检验供应商信息是否满足要求 + * + * @param supplier 供应商信息 + * @return 若供应商上的属性均有满足要求则返回true,否则返回false + */ + private boolean supplierCheck(Supplier supplier) { + // 检查是否已填写属性 + return supplier.getName() != null && supplier.getPersonInCharge() != null + && supplier.getTel() != null && supplier.getEmail() != null && supplier.getAddress() != null; + } + + /** + * 添加供应商记录 + * + * @param supplier 供应商信息 + * @return 返回添加结果 + */ + @UserOperation(value = "添加供应商信息") + @Override + public boolean addSupplier(Supplier supplier) throws SupplierManageServiceException { + + // 插入新的记录 + if (supplier != null) { + try { + if (supplierCheck(supplier)) { + // 检查重名 + if (null == supplierMapper.selectBuName(supplier.getName())) { + supplierMapper.insert(supplier); + if (supplier.getId() != null) { + return true; + } + } + } + } catch (PersistenceException e) { + throw new SupplierManageServiceException(e); + } + } + return false; + } + + /** + * 更新供应商记录 + * + * @param supplier 供应商信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "修改供应商信息") + @Override + public boolean updateSupplier(Supplier supplier) throws SupplierManageServiceException { + + // 更新记录 + if (supplier != null) { + // 检验 + try { + if (supplierCheck(supplier)) { + if (supplier.getId() != null) { + // 检查重名 + Supplier supplierFromDB = supplierMapper.selectBuName(supplier.getName()); + if (supplierFromDB == null || supplier.getId().equals(supplierFromDB.getId())) { + supplierMapper.update(supplier); + return true; + } + } + } + } catch (PersistenceException e) { + throw new SupplierManageServiceException(e); + } + } + return false; + } + + /** + * 删除供应商记录 + * + * @param supplierId 供应商ID + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + @UserOperation(value = "删除供应商信息") + @Override + public boolean deleteSupplier(Integer supplierId) { + + // 查询该供应商是否有入库记录 + List records = stockInMapper.selectBySupplierId(supplierId); + if (records == null || records.size() > 0) + return false; + + // 删除该条供应商记录 + supplierMapper.deleteById(supplierId); + return true; + } + + /** + * 从文件中导入供应商信息 + * + * @param file 导入信息的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + @UserOperation(value = "导入供应商信息") + @Override + public Map importSupplier(MultipartFile file) throws SupplierManageServiceException { + // 初始化结果集 + Map result = new HashMap<>(); + int total = 0; + int available = 0; + + // 从 Excel 文件中读取 + try { + List suppliers = ejConvertor.excelReader(Supplier.class, FileUtil.convertMultipartFileToFile(file)); + if (suppliers != null) { + total = suppliers.size(); + + // 验证每一条供应商记录 + List availableList = new ArrayList<>(); + for (Supplier supplier : suppliers) { + if (supplierCheck(supplier)) { + // 检查重名 + if (null == supplierMapper.selectBuName(supplier.getName())) + availableList.add(supplier); + } + } + + // 保存到数据库 + available = availableList.size(); + if (available > 0) { + supplierMapper.insertBatch(availableList); + } + } + } catch (IOException | PersistenceException e) { + throw new SupplierManageServiceException(e); + } + + result.put("total", total); + result.put("available", available); + return result; + } + + /** + * 导出供应商信息到文件中 + * + * @param suppliers 包含若干条 Supplier 信息的 List + * @return excel 文件 + */ + @UserOperation(value = "导出供应商信息") + @Override + public File exportSupplier(List suppliers) { + if (suppliers == null) + return null; + + return ejConvertor.excelWriter(Supplier.class, suppliers); + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/SystemLogServiceImpl.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/SystemLogServiceImpl.java new file mode 100644 index 0000000..492df3f --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Impl/SystemLogServiceImpl.java @@ -0,0 +1,292 @@ +package com.ken.wms.common.service.Impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ken.wms.common.service.Interface.SystemLogService; +import com.ken.wms.dao.AccessRecordMapper; +import com.ken.wms.dao.UserOperationRecordMapper; +import com.ken.wms.domain.AccessRecordDO; +import com.ken.wms.domain.AccessRecordDTO; +import com.ken.wms.domain.UserOperationRecordDO; +import com.ken.wms.domain.UserOperationRecordDTO; +import com.ken.wms.exception.SystemLogServiceException; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.DateUtils; +import org.apache.ibatis.exceptions.PersistenceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 系统操作日志 Service 实现 + + */ +@Service +public class SystemLogServiceImpl implements SystemLogService { + + @Autowired + private AccessRecordMapper accessRecordMapper; + @Autowired + private UserOperationRecordMapper userOperationRecordMapper; + + /** + * 插入用户登入登出记录 + * + * @param userID 用户ID + * @param userName 用户名 + * @param accessIP 登陆IP + * @param accessType 记录类型 + */ + @Override + public void insertAccessRecord(Integer userID, String userName, String accessIP, String accessType) throws SystemLogServiceException { + // 创建 AccessRecordDO 对象 + AccessRecordDO accessRecordDO = new AccessRecordDO(); + accessRecordDO.setUserID(userID); + accessRecordDO.setUserName(userName); + accessRecordDO.setAccessTime(new Date()); + accessRecordDO.setAccessIP(accessIP); + accessRecordDO.setAccessType(accessType); + + // 持久化 AccessRecordDO 对象到数据库 + try { + accessRecordMapper.insertAccessRecord(accessRecordDO); + } catch (PersistenceException e) { + throw new SystemLogServiceException(e, "Fail to persist AccessRecordDO Object"); + } + } + + /** + * 选择指定用户ID、记录类型或日期范围的登入登出记录 + * + * @param userID 用户ID + * @param accessType 记录类型 + * @param startDateStr 记录起始日期 + * @param endDateStr 记录结束日期 + * @return 返回一个Map, 其中键值为 data 的值为所有符合条件的记录, 而键值为 total 的值为符合条件的记录总条数 + */ + @Override + public Map selectAccessRecord(Integer userID, String accessType, String startDateStr, String endDateStr) throws SystemLogServiceException { + return selectAccessRecord(userID, accessType, startDateStr, endDateStr, -1, -1); + } + + /** + * 分页查询指定用户ID、记录类型或日期范围的登入登出记录 + * + * @param userID 用户ID + * @param accessType 记录类型 + * @param startDateStr 记录起始日期 + * @param endDateStr 记录结束日期 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 返回一个Map, 其中键值为 data 的值为所有符合条件的记录, 而键值为 total 的值为符合条件的记录总条数 + */ + @Override + public Map selectAccessRecord(Integer userID, String accessType, String startDateStr, String endDateStr, int offset, int limit) throws SystemLogServiceException { + // 准备结果集 + Map resultSet = new HashMap<>(); + List accessRecordDTOS = new ArrayList<>(); + long total = 0; + boolean isPagination = true; + + // 检查是否需要分页查询 + if (offset < 0 || limit < 0) + isPagination = false; + + // 转换 Date 对象 + Date startDate = null; + Date endDate = null; + try { + if (StringUtils.isNotEmpty(startDateStr)) + startDate = dateFormatSimple.parse(startDateStr); + if (StringUtils.isNotEmpty(endDateStr)) { + endDate = dateFormatSimple.parse(endDateStr); + endDate = DateUtils.addDays(endDate, 1); + } + + } catch (ParseException e) { + throw new SystemLogServiceException(e, "Fail to convert string to Date Object"); + } + + // 转换 accessType + switch (accessType) { + case "loginOnly": + accessType = SystemLogService.ACCESS_TYPE_LOGIN; + break; + case "logoutOnly": + accessType = SystemLogService.ACCESS_TYPE_LOGOUT; + break; + default: + accessType = "all"; + break; + } + + // 执行查询操作 + List accessRecordDOS; + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + accessRecordDOS = accessRecordMapper.selectAccessRecords(userID, accessType, startDate, endDate); + if (accessRecordDOS != null) { + accessRecordDOS.forEach(accessRecordDO -> accessRecordDTOS.add(convertAccessRecordDOToAccessRecordDTO(accessRecordDO))); + total = new PageInfo<>(accessRecordDOS).getTotal(); + } + } else { + accessRecordDOS = accessRecordMapper.selectAccessRecords(userID, accessType, startDate, endDate); + if (accessRecordDOS != null) { + accessRecordDOS.forEach(accessRecordDO -> accessRecordDTOS.add(convertAccessRecordDOToAccessRecordDTO(accessRecordDO))); + total = accessRecordDOS.size(); + } + } + } catch (PersistenceException e) { + throw new SystemLogServiceException(e); + } + + resultSet.put("data", accessRecordDTOS); + resultSet.put("total", total); + return resultSet; + } + + /** + * 插入用户操作记录 + * + * @param userID 执行操作的用户ID + * @param userName 执行操作的用户名 + * @param operationName 操作的名称 + * @param operationResult 操作的记过 + */ + @Override + public void insertUserOperationRecord(Integer userID, String userName, String operationName, String operationResult) throws SystemLogServiceException { + // 创建 UserOperationRecordDO 对象 + UserOperationRecordDO userOperationRecordDO = new UserOperationRecordDO(); + userOperationRecordDO.setUserID(userID); + userOperationRecordDO.setUserName(userName); + userOperationRecordDO.setOperationName(operationName); + userOperationRecordDO.setOperationResult(operationResult); + userOperationRecordDO.setOperationTime(new Date()); + + // 将数据持久化到数据库 + try { + userOperationRecordMapper.insertUserOperationRecord(userOperationRecordDO); + } catch (PersistenceException e) { + throw new SystemLogServiceException(e, "Fail to persist usrOperationRecordDo Object"); + } + } + + /** + * 查询指定用户ID或日期范围的用户操作记录 + * + * @param userID 用户ID + * @param startDateStr 记录的起始日期 + * @param endDateStr 记录的结束日期 + * @return 返回一个Map, 其中键值为 data 的值为所有符合条件的记录, 而键值为 total 的值为符合条件的记录总条数 + */ + @Override + public Map selectUserOperationRecord(Integer userID, String startDateStr, String endDateStr) throws SystemLogServiceException { + return selectUserOperationRecord(userID, startDateStr, endDateStr, -1, -1); + } + + /** + * 分页查询指定用户ID或日期范围的用户操作记录 + * + * @param userID 用户ID + * @param startDateStr 记录的起始日期 + * @param endDateStr 记录的结束日期 + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 返回一个Map, 其中键值为 data 的值为所有符合条件的记录, 而键值为 total 的值为符合条件的记录总条数 + */ + @Override + public Map selectUserOperationRecord(Integer userID, String startDateStr, String endDateStr, int offset, int limit) throws SystemLogServiceException { + // 准备结果集 + Map resultSet = new HashMap<>(); + List userOperationRecordDTOS = new ArrayList<>(); + long total = 0; + boolean isPagination = true; + + // 检查是否需要分页 + if (offset < 0 && limit < 0) + isPagination = false; + + // Date 转换 + Date startDate = null; + Date endDate = null; + try { + if (StringUtils.isNotEmpty(startDateStr)) + startDate = dateFormatSimple.parse(startDateStr); + if (StringUtils.isNotEmpty(endDateStr)) { + endDate = dateFormatSimple.parse(endDateStr); + endDate = DateUtils.addDays(endDate, 1); + } + } catch (ParseException e) { + throw new SystemLogServiceException(e, "Fail to convert String format date to Date Object"); + } + + // 执行查询操作 + List userOperationRecordDOS; + try { + if (isPagination) { + PageHelper.offsetPage(offset, limit); + userOperationRecordDOS = userOperationRecordMapper.selectUserOperationRecord(userID, startDate, endDate); + if (userOperationRecordDOS != null) { + userOperationRecordDOS.forEach(userOperationRecordDO -> userOperationRecordDTOS.add(convertUserOperationRecordDOToUserOperationRecordDTO(userOperationRecordDO))); + total = new PageInfo<>(userOperationRecordDOS).getTotal(); + } + } else { + userOperationRecordDOS = userOperationRecordMapper.selectUserOperationRecord(userID, startDate, endDate); + if (userOperationRecordDOS != null) + userOperationRecordDOS.forEach(userOperationRecordDO -> userOperationRecordDTOS.add(convertUserOperationRecordDOToUserOperationRecordDTO(userOperationRecordDO))); + } + } catch (PersistenceException e) { + throw new SystemLogServiceException(e); + } + + resultSet.put("data", userOperationRecordDTOS); + resultSet.put("total", total); + return resultSet; + } + + /** + * Date 具体格式 + */ + private DateFormat dateFormatDetail = new SimpleDateFormat("yyyy-MM-dd hh:mm"); + + private DateFormat dateFormatSimple = new SimpleDateFormat("yyyy-MM-dd"); + + /** + * 将 AccessRecordDO 对象转换为 AccessRecordDTO 对象 + * + * @param accessRecordDO AccessRecordDO 对象 + * @return 返回 AccessRecordDTO 对象 + */ + private AccessRecordDTO convertAccessRecordDOToAccessRecordDTO(AccessRecordDO accessRecordDO) { + AccessRecordDTO accessRecordDTO = new AccessRecordDTO(); + accessRecordDTO.setId(accessRecordDO.getId()); + accessRecordDTO.setUserID(accessRecordDO.getUserID()); + accessRecordDTO.setUserName(accessRecordDO.getUserName()); + accessRecordDTO.setAccessIP(accessRecordDO.getAccessIP()); + accessRecordDTO.setAccessType(accessRecordDO.getAccessType().equals(SystemLogService.ACCESS_TYPE_LOGIN) ? "登入" : "登出"); + accessRecordDTO.setAccessTime(dateFormatDetail.format(accessRecordDO.getAccessTime())); + return accessRecordDTO; + } + + /** + * 将 UserOperationRecordDO 对象转换为 UserOperationRecordDTO 对象 + * + * @param userOperationRecordDO UserOperationRecordDO 对象 + * @return 返回 UserOperationRecordDTO 对象 + */ + private UserOperationRecordDTO convertUserOperationRecordDOToUserOperationRecordDTO(UserOperationRecordDO userOperationRecordDO) { + UserOperationRecordDTO userOperationRecordDTO = new UserOperationRecordDTO(); + userOperationRecordDTO.setId(userOperationRecordDO.getId()); + userOperationRecordDTO.setUserID(userOperationRecordDO.getUserID()); + userOperationRecordDTO.setUserName(userOperationRecordDO.getUserName()); + userOperationRecordDTO.setOperationName(userOperationRecordDO.getOperationName()); + userOperationRecordDTO.setOperationResult(userOperationRecordDO.getOperationResult()); + userOperationRecordDTO.setOperationTime(dateFormatDetail.format(userOperationRecordDO.getOperationTime())); + return userOperationRecordDTO; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/CustomerManageService.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/CustomerManageService.java new file mode 100644 index 0000000..2b1d620 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/CustomerManageService.java @@ -0,0 +1,101 @@ +package com.ken.wms.common.service.Interface; + + +import com.ken.wms.domain.Customer; +import com.ken.wms.exception.CustomerManageServiceException; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; +import java.util.Map; + +/** + * 客户信息管理 service + + */ +public interface CustomerManageService { + + /** + * 返回指定customer id 的客户记录 + * + * @param customerId 客户ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectById(Integer customerId) throws CustomerManageServiceException; + + /** + * 返回指定 customer name 的客户记录 + * 支持查询分页以及模糊查询 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @param customerName 客户的名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByName(int offset, int limit, String customerName) throws CustomerManageServiceException; + + /** + * 返回指定 customer Name 的客户记录 + * 支持模糊查询 + * + * @param customerName 客户名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByName(String customerName) throws CustomerManageServiceException; + + /** + * 分页查询客户的记录 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll(int offset, int limit) throws CustomerManageServiceException; + + /** + * 查询所有客户的记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll() throws CustomerManageServiceException; + + /** + * 添加客户信息 + * + * @param customer 客户信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean addCustomer(Customer customer) throws CustomerManageServiceException; + + /** + * 更新客户信息 + * + * @param customer 客户信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean updateCustomer(Customer customer) throws CustomerManageServiceException; + + /** + * 删除客户信息 + * + * @param customerId 客户ID + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean deleteCustomer(Integer customerId) throws CustomerManageServiceException; + + /** + * 从文件中导入客户信息 + * + * @param file 导入信息的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + Map importCustomer(MultipartFile file) throws CustomerManageServiceException; + + /** + * 导出客户信息到文件中 + * + * @param customers 包含若干条 customer 信息的 List + * @return Excel 文件 + */ + File exportCustomer(List customers); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/GoodsManageService.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/GoodsManageService.java new file mode 100644 index 0000000..b2b68a5 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/GoodsManageService.java @@ -0,0 +1,101 @@ +package com.ken.wms.common.service.Interface; + + +import com.ken.wms.domain.Goods; +import com.ken.wms.exception.GoodsManageServiceException; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; +import java.util.Map; + +/** + * 货物信息管理 service + + */ +public interface GoodsManageService { + + /** + * 返回指定goods ID 的货物记录 + * + * @param goodsId 货物ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectById(Integer goodsId) throws GoodsManageServiceException; + + /** + * 返回指定 goods name 的货物记录 + * 支持查询分页以及模糊查询 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @param goodsName 货物的名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByName(int offset, int limit, String goodsName) throws GoodsManageServiceException; + + /** + * 返回指定 goods name 的货物记录 + * 支持模糊查询 + * + * @param goodsName 货物名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByName(String goodsName) throws GoodsManageServiceException; + + /** + * 分页查询货物记录 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll(int offset, int limit) throws GoodsManageServiceException; + + /** + * 查询所有的货物记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll() throws GoodsManageServiceException; + + /** + * 添加货物记录 + * + * @param goods 货物信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean addGoods(Goods goods) throws GoodsManageServiceException; + + /** + * 更新货物记录 + * + * @param goods 供应商信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean updateGoods(Goods goods) throws GoodsManageServiceException; + + /** + * 删除货物记录 + * + * @param goodsId 货物ID + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean deleteGoods(Integer goodsId) throws GoodsManageServiceException; + + /** + * 从文件中导入货物信息 + * + * @param file 导入信息的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + Map importGoods(MultipartFile file) throws GoodsManageServiceException; + + /** + * 导出货物信息到文件中 + * + * @param goods 包含若干条 Supplier 信息的 List + * @return excel 文件 + */ + File exportGoods(List goods); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/RepositoryAdminManageService.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/RepositoryAdminManageService.java new file mode 100644 index 0000000..b6a62f4 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/RepositoryAdminManageService.java @@ -0,0 +1,118 @@ +package com.ken.wms.common.service.Interface; + + +import com.ken.wms.domain.RepositoryAdmin; +import com.ken.wms.exception.RepositoryAdminManageServiceException; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; +import java.util.Map; + +/** + * 仓库管理员管理 service + + */ +public interface RepositoryAdminManageService { + + /** + * 返回指定repository id 的仓库管理员记录 + * + * @param repositoryAdminID 仓库管理员ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByID(Integer repositoryAdminID) throws RepositoryAdminManageServiceException; + + /** + * 返回所属指定 repositoryID 的仓库管理员信息 + * + * @param repositoryID 仓库ID 其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + * @return 返回一个Map, + */ + Map selectByRepositoryID(Integer repositoryID) throws RepositoryAdminManageServiceException; + + /** + * 返回指定 repository address 的仓库管理员记录 + * 支持查询分页以及模糊查询 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @param name 仓库管理员的名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByName(int offset, int limit, String name); + + /** + * 返回指定 repository Name 的仓库管理员记录 + * 支持模糊查询 + * + * @param name 仓库管理员名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByName(String name); + + /** + * 分页查询仓库管理员的记录 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll(int offset, int limit) throws RepositoryAdminManageServiceException; + + /** + * 查询所有仓库管理员的记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll() throws RepositoryAdminManageServiceException; + + /** + * 添加仓库管理员信息 + * + * @param repositoryAdmin 仓库管理员信息 + * @return 返回一个boolean值,值为true代表添加成功,否则代表失败 + */ + boolean addRepositoryAdmin(RepositoryAdmin repositoryAdmin) throws RepositoryAdminManageServiceException; + + /** + * 更新仓库管理员信息 + * + * @param repositoryAdmin 仓库管理员信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean updateRepositoryAdmin(RepositoryAdmin repositoryAdmin) throws RepositoryAdminManageServiceException; + + /** + * 删除仓库管理员信息 + * + * @param repositoryAdminID 仓库管理员ID + * @return 返回一个boolean值,值为true代表删除成功,否则代表失败 + */ + boolean deleteRepositoryAdmin(Integer repositoryAdminID) throws RepositoryAdminManageServiceException; + + /** + * 为仓库管理员指派指定 ID 的仓库 + * + * @param repositoryAdminID 仓库管理员ID + * @param repositoryID 所指派的仓库ID + * @return 返回一个 boolean 值,值为 true 表示仓库指派成功,否则表示失败 + */ + boolean assignRepository(Integer repositoryAdminID, Integer repositoryID) throws RepositoryAdminManageServiceException; + + /** + * 从文件中导入仓库管理员信息 + * + * @param file 导入信息的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + Map importRepositoryAdmin(MultipartFile file) throws RepositoryAdminManageServiceException; + + /** + * 导出仓库管理员信息到文件中 + * + * @param repositoryAdmins 包含若干条 repository 信息的 List + * @return Excel 文件 + */ + File exportRepositoryAdmin(List repositoryAdmins); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/RepositoryService.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/RepositoryService.java new file mode 100644 index 0000000..3ddc1e8 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/RepositoryService.java @@ -0,0 +1,108 @@ +package com.ken.wms.common.service.Interface; + + +import com.ken.wms.domain.Repository; +import com.ken.wms.exception.RepositoryManageServiceException; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; +import java.util.Map; + +/** + * 仓库信息管理 service + + */ +public interface RepositoryService { + + /** + * 返回指定 repository ID 的仓库记录 + * + * @param repositoryId 仓库ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectById(Integer repositoryId) throws RepositoryManageServiceException; + + /** + * 返回指定 repository address 的仓库记录 + * 支持查询分页以及模糊查询 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @param address 仓库的地址 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByAddress(int offset, int limit, String address) throws RepositoryManageServiceException; + + /** + * 返回指定 repository address 的仓库记录 + * 支持模糊查询 + * + * @param address 仓库名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByAddress(String address) throws RepositoryManageServiceException; + + /** + * 分页查询仓库记录 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll(int offset, int limit) throws RepositoryManageServiceException; + + /** + * 查询所有的仓库记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll() throws RepositoryManageServiceException; + + /** + * 查询所有未指派仓库管理员的仓库记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectUnassign() throws RepositoryManageServiceException; + + /** + * 添加仓库记录 + * + * @param repository 仓库信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean addRepository(Repository repository) throws RepositoryManageServiceException; + + /** + * 更新仓库记录 + * + * @param repository 仓库信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean updateRepository(Repository repository) throws RepositoryManageServiceException; + + /** + * 删除仓库记录 + * + * @param repositoryId 仓库ID + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean deleteRepository(Integer repositoryId) throws RepositoryManageServiceException; + + /** + * 从文件中导入仓库信息 + * + * @param file 导入信息的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + Map importRepository(MultipartFile file) throws RepositoryManageServiceException; + + /** + * 导出仓库信息到文件中 + * + * @param repositories 包含若干条 Supplier 信息的 List + * @return excel 文件 + */ + File exportRepository(List repositories); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/StockRecordManageService.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/StockRecordManageService.java new file mode 100644 index 0000000..ae6358e --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/StockRecordManageService.java @@ -0,0 +1,58 @@ +package com.ken.wms.common.service.Interface; + +import com.ken.wms.exception.StockRecordManageServiceException; + +import java.util.Map; + +/** + * 出入库管理 + + */ +public interface StockRecordManageService { + + /** + * 货物入库操作 + * + * @param supplierID 供应商ID + * @param goodsID 货物ID + * @param repositoryID 入库仓库ID + * @param number 入库数量 + * @return 返回一个boolean 值,若值为true表示入库成功,否则表示入库失败 + */ + boolean stockInOperation(Integer supplierID, Integer goodsID, Integer repositoryID, long number, String personInCharge) throws StockRecordManageServiceException; + + /** + * 货物出库操作 + * + * @param customerID 客户ID + * @param goodsID 货物ID + * @param repositoryID 出库仓库ID + * @param number 出库数量 + * @return 返回一个boolean值,若值为true表示出库成功,否则表示出库失败 + */ + boolean stockOutOperation(Integer customerID, Integer goodsID, Integer repositoryID, long number, String personInCharge) throws StockRecordManageServiceException; + + /** + * 查询出入库记录 + * + * @param repositoryID 仓库ID + * @param endDateStr 查询记录起始日期 + * @param startDateStr 查询记录结束日期 + * @param searchType 记录查询方式 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectStockRecord(Integer repositoryID, String startDateStr, String endDateStr, String searchType) throws StockRecordManageServiceException; + + /** + * 分页查询出入库记录 + * + * @param repositoryID 仓库ID + * @param endDateStr 查询记录起始日期 + * @param startDateStr 查询记录结束日期 + * @param searchType 记录查询方式 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectStockRecord(Integer repositoryID, String startDateStr, String endDateStr, String searchType, int offset, int limit) throws StockRecordManageServiceException; +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/StorageManageService.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/StorageManageService.java new file mode 100644 index 0000000..cbc034c --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/StorageManageService.java @@ -0,0 +1,153 @@ +package com.ken.wms.common.service.Interface; + + +import com.ken.wms.domain.Storage; +import com.ken.wms.exception.StorageManageServiceException; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; +import java.util.Map; + +/** + * 库存信息管理 service + * + */ +public interface StorageManageService { + + /** + * 返回所有的库存记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll(Integer repositoryID) throws StorageManageServiceException; + + /** + * 分页返回所有的库存记录 + * + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll(Integer repositoryID, int offset, int limit) throws StorageManageServiceException; + + /** + * 返回指定货物ID的库存记录 + * + * @param goodsID 指定的货物ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByGoodsID(Integer goodsID, Integer repositoryID) throws StorageManageServiceException; + + /** + * 分页返回指定的货物库存记录 + * + * @param goodsID 指定的货物ID + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByGoodsID(Integer goodsID, Integer repositoryID, int offset, int limit) throws StorageManageServiceException; + + /** + * 返回指定货物名称的库存记录 + * + * @param goodsName 货物名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByGoodsName(String goodsName, Integer repositoryID) throws StorageManageServiceException; + + /** + * 分页返回指定货物名称的库存记录 + * + * @param goodsName 货物名称 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByGoodsName(String goodsName, Integer repositoryID, int offset, int limit) throws StorageManageServiceException; + + /** + * 返回指定货物类型的库存记录 + * + * @param goodsType 指定的货物类型 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByGoodsType(String goodsType, Integer Repository) throws StorageManageServiceException; + + /** + * 分页返回指定货物类型的库存记录 + * + * @param goodsType 指定的货物类型 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByGoodsType(String goodsType, Integer repositoryID, int offset, int limit) throws StorageManageServiceException; + + /** + * 添加一条库存记录 + * + * @param goodsID 指定的货物ID + * @param repositoryID 指定的仓库ID + * @param number 库存数量 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean addNewStorage(Integer goodsID, Integer repositoryID, long number) throws StorageManageServiceException; + + /** + * 更新一条库存记录 + * + * @param goodsID 指定的货物ID + * @param repositoryID 指定的仓库ID + * @param number 更新的库存数量 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean updateStorage(Integer goodsID, Integer repositoryID, long number) throws StorageManageServiceException; + + /** + * 为指定的货物库存记录增加指定数目 + * + * @param goodsID 货物ID + * @param repositoryID 仓库ID + * @param number 增加的数量 + * @return 返回一个 boolean 值,若值为true表示数目增加成功,否则表示增加失败 + */ + boolean storageIncrease(Integer goodsID, Integer repositoryID, long number) throws StorageManageServiceException; + + /** + * 为指定的货物库存记录减少指定的数目 + * + * @param goodsID 货物ID + * @param repositoryID 仓库ID + * @param number 减少的数量 + * @return 返回一个 boolean 值,若值为 true 表示数目减少成功,否则表示增加失败 + */ + boolean storageDecrease(Integer goodsID, Integer repositoryID, long number) throws StorageManageServiceException; + + /** + * 删除一条库存记录 + * 货物ID与仓库ID可唯一确定一条库存记录 + * + * @param goodsID 指定的货物ID + * @param repositoryID 指定的仓库ID + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean deleteStorage(Integer goodsID, Integer repositoryID) throws StorageManageServiceException; + + /** + * 导入库存记录 + * + * @param file 保存有的库存记录的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + Map importStorage(MultipartFile file) throws StorageManageServiceException; + + /** + * 导出库存记录 + * + * @param storages 保存有库存记录的List + * @return excel 文件 + */ + File exportStorage(List storages); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/SupplierManageService.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/SupplierManageService.java new file mode 100644 index 0000000..2aaac65 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/SupplierManageService.java @@ -0,0 +1,101 @@ +package com.ken.wms.common.service.Interface; + + +import com.ken.wms.domain.Supplier; +import com.ken.wms.exception.SupplierManageServiceException; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; +import java.util.Map; + +/** + * 供应商信息管理 service + + */ +public interface SupplierManageService { + + /** + * 返回指定supplierID 的供应商记录 + * + * @param supplierId 供应商ID + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectById(Integer supplierId) throws SupplierManageServiceException; + + /** + * 返回指定 supplierName 的供应商记录 + * 支持查询分页以及模糊查询 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @param supplierName 供应商的名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByName(int offset, int limit, String supplierName) throws SupplierManageServiceException; + + /** + * 返回指定 supplierName 的供应商记录 + * 支持模糊查询 + * + * @param supplierName supplierName 供应商名称 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectByName(String supplierName) throws SupplierManageServiceException; + + /** + * 分页查询供应商记录 + * + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll(int offset, int limit) throws SupplierManageServiceException; + + /** + * 查询所有的供应商记录 + * + * @return 结果的一个Map,其中: key为 data 的代表记录数据;key 为 total 代表结果记录的数量 + */ + Map selectAll() throws SupplierManageServiceException; + + /** + * 添加供应商记录 + * + * @param supplier 供应商信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean addSupplier(Supplier supplier) throws SupplierManageServiceException; + + /** + * 更新供应商记录 + * + * @param supplier 供应商信息 + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean updateSupplier(Supplier supplier) throws SupplierManageServiceException; + + /** + * 删除供应商记录 + * + * @param supplierId 供应商ID + * @return 返回一个boolean值,值为true代表更新成功,否则代表失败 + */ + boolean deleteSupplier(Integer supplierId); + + /** + * 从文件中导入供应商信息 + * + * @param file 导入信息的文件 + * @return 返回一个Map,其中:key为total代表导入的总记录数,key为available代表有效导入的记录数 + */ + Map importSupplier(MultipartFile file) throws SupplierManageServiceException; + + /** + * 导出供应商信息到文件中 + * + * @param suppliers 包含若干条 Supplier 信息的 List + * @return excel 文件 + */ + File exportSupplier(List suppliers); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/SystemLogService.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/SystemLogService.java new file mode 100644 index 0000000..a12a9a2 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/service/Interface/SystemLogService.java @@ -0,0 +1,81 @@ +package com.ken.wms.common.service.Interface; + +import com.ken.wms.exception.SystemLogServiceException; + +import java.util.Map; + +/** + * 系统操作日志Service接口 + * + */ +public interface SystemLogService { + + String ACCESS_TYPE_LOGIN = "login"; + String ACCESS_TYPE_LOGOUT = "logout"; + + /** + * 插入用户登入登出记录 + * + * @param userID 用户ID + * @param userName 用户名 + * @param accessIP 登陆IP + * @param accessType 记录类型 + */ + void insertAccessRecord(Integer userID, String userName, String accessIP, String accessType) throws SystemLogServiceException; + + /** + * 查询指定用户ID、记录类型或日期范围的登入登出记录 + * + * @param userID 用户ID + * @param accessType 记录类型 + * @param startDateStr 记录起始日期 + * @param endDateStr 记录结束日期 + * @return 返回一个Map, 其中键值为 data 的值为所有符合条件的记录, 而键值为 total 的值为符合条件的记录总条数 + */ + Map selectAccessRecord(Integer userID, String accessType, String startDateStr, String endDateStr) throws SystemLogServiceException; + + /** + * 分页查询指定用户ID、记录类型或日期范围的登入登出记录 + * + * @param userID 用户ID + * @param accessType 记录类型 + * @param startDateStr 记录起始日期 + * @param endDateStr 记录结束日期 + * @param offset 分页偏移值 + * @param limit 分页大小 + * @return 返回一个Map, 其中键值为 data 的值为所有符合条件的记录, 而键值为 total 的值为符合条件的记录总条数 + */ + Map selectAccessRecord(Integer userID, String accessType, String startDateStr, String endDateStr, int offset, int limit) throws SystemLogServiceException; + + /** + * 插入用户操作记录 + * + * @param userID 执行操作的用户ID + * @param userName 执行操作的用户名 + * @param operationName 操作的名称 + * @param operationResult 操作的记过 + */ + void insertUserOperationRecord(Integer userID, String userName, String operationName, String operationResult) throws SystemLogServiceException; + + /** + * 查询指定用户ID或日期范围的用户操作记录 + * + * @param userID 用户ID + * @param startDateStr 记录的起始日期 + * @param endDateStr 记录的结束日期 + * @return 返回一个Map, 其中键值为 data 的值为所有符合条件的记录, 而键值为 total 的值为符合条件的记录总条数 + */ + Map selectUserOperationRecord(Integer userID, String startDateStr, String endDateStr) throws SystemLogServiceException; + + /** + * 分页查询指定用户ID或日期范围的用户操作记录 + * + * @param userID 用户ID + * @param startDateStr 记录的起始日期 + * @param endDateStr 记录的结束日期 + * @param offset 分页的偏移值 + * @param limit 分页的大小 + * @return 返回一个Map, 其中键值为 data 的值为所有符合条件的记录, 而键值为 total 的值为符合条件的记录总条数 + */ + Map selectUserOperationRecord(Integer userID, String startDateStr, String endDateStr, int offset, int limit) throws SystemLogServiceException; +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/EJConvertor.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/EJConvertor.java new file mode 100644 index 0000000..fed523a --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/EJConvertor.java @@ -0,0 +1,684 @@ +package com.ken.wms.common.util; + +import org.apache.commons.lang3.math.NumberUtils; +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFFont; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.core.io.ClassPathResource; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.*; + +/** + * Excel -JavaBean 转换器 + + */ +public class EJConvertor { + + /** + * 默认配置文件名 + */ + private static final String DEFAULT_CONFIG_FILE_NAME = "EJConvertorConfig.xml"; + + /** + * Entity 节点名称 + */ + private static final String ENTITY_ELEMENT = "entity"; + + /** + * Property 节点名称 + */ + private static final String PROPERTY_ELEMENT = "property"; + + + /** + * Field 节点信息 + */ + private static final String FIELD_ELEMENT = "field"; + + /** + * Value 节点信息 + */ + private static final String VALUE_ELEMENT = "value"; + + /** + * class 属性 + */ + private static final String CLASS_ATTRIBUTE = "class"; + + /** + * sheetName 属性 + */ + private static final String SHEET_NAME_ATTRIBUTE = "sheetName"; + + /** + * boldHeading 属性 + */ + private static final String BOLD_HEADING_ATTRIBUTE = "boldHeading"; + + /** + * JavaBean的映射信息 + */ + private Map excelJavaBeanMap; + + public EJConvertor() { + init(DEFAULT_CONFIG_FILE_NAME); + } + + public EJConvertor(String filePath) { + init(filePath); + } + + /** + * 初始化映射信息 + * + * @param fileLocation 配置文件路径 + */ + private void init(String fileLocation) { + try { + // 读取配置文件 + File configFile = new ClassPathResource(fileLocation).getFile(); + DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + Document doc = documentBuilder.parse(configFile); + + // 解析配置文件 + this.excelJavaBeanMap = parseMappingInfo(doc); + + } catch (ParserConfigurationException | SAXException | IOException e) { + e.printStackTrace(); + } + } + + /** + * 解析 Document root 下配置的所有 excel-javaBean 映射信息 + * + * @param root Document 根节点 + * @return 返回 excel-javaBean 映射信息 + */ + private Map parseMappingInfo(Document root) { + // 获取 root 下的所有 entity 节点 + NodeList entities = root.getElementsByTagName(ENTITY_ELEMENT); + + // 创建承载 MappingInfo 信息的Map + Map mappingInfoMap = new HashMap<>(entities.getLength()); + + // 解析 entity 节点 + for (int index = 0; index < entities.getLength(); index++) { + // 创建 mappingInfo + MappingInfo mappingInfo = new MappingInfo(); + + // 解析节点信息 + Node entityNode = entities.item(index); + if (entityNode.getNodeType() == Node.ELEMENT_NODE) { + Element entityElement = (Element) entityNode; + parseEntityElement(entityElement, mappingInfo); + } + + // 保存节点信息 + mappingInfoMap.put(mappingInfo.getClassName(), mappingInfo); + } + return mappingInfoMap; + } + + /** + * 解析 entity 节点信息 + * + * @param entityElement entity 节点 + * @param mappingInfo 本 entity 节点包含的映射信息 + */ + private void parseEntityElement(Element entityElement, MappingInfo mappingInfo) { + // 解析 entity 的 class 属性 + String className = entityElement.getAttribute(CLASS_ATTRIBUTE); + mappingInfo.setClassName(className); + + // 解析 entity 的 sheetName 属性 + if (entityElement.hasAttribute(SHEET_NAME_ATTRIBUTE)) + mappingInfo.setSheetName(entityElement.getAttribute(SHEET_NAME_ATTRIBUTE)); + + // 解析 entity 的 boldHeading 属性 + if (entityElement.hasAttribute(BOLD_HEADING_ATTRIBUTE)) { + String isBoldHeading = entityElement.getAttribute(BOLD_HEADING_ATTRIBUTE); + mappingInfo.setBoldHeading(isBoldHeading.equals("true")); + } + + // 读取并解析 property 节点 + NodeList properties = entityElement.getElementsByTagName(PROPERTY_ELEMENT); + for (int index = 0; index < properties.getLength(); index++) { + Node propertyNode = properties.item(index); + if (propertyNode.getNodeType() == Node.ELEMENT_NODE) { + Element propertyElement = (Element) propertyNode; + parsePropertyElement(propertyElement, mappingInfo); + } + } + } + + /** + * 解析 property 节点信息 + * + * @param propertyElement property 节点 + * @param mappingInfo 承载映射信息 + */ + private void parsePropertyElement(Element propertyElement, MappingInfo mappingInfo) { + NodeList infoNodes = propertyElement.getChildNodes(); + String field = null; + String value = null; + + for (int infoNode_index = 0; infoNode_index < infoNodes.getLength(); infoNode_index++) { + Node infoNode = infoNodes.item(infoNode_index); + if (infoNode.getNodeName().equals(FIELD_ELEMENT)) + field = infoNode.getTextContent(); + if (infoNode.getNodeName().equals(VALUE_ELEMENT)) + value = infoNode.getTextContent(); + } + + // 添加到映射信息中 + if (field != null && value != null) { + mappingInfo.addFieldValueMapping(field, value); + mappingInfo.addValueFieldMapping(value, field); + } + } + + /** + * 讀取 Excel 文件中的内容 Excel 文件中的每一行代表了一个对象实例,而行中各列的属性值对应为对象中的各个属性值 + * 读取时,需要指定读取目标对象的类型以获得相关的映射信息,并且要求该对象已在配置文件中注册 + * + * @param javaBeanClass 目标对象的类型 + * @param file 数据来源的 Excel 文件 + * @return 包含若干个目标对象实例的 List + */ + public List excelReader(Class javaBeanClass, File file) { + // 参数检查 + if (file == null || javaBeanClass == null) + return null; + + // 初始化存放读取结果的 List + List javaBeans = new ArrayList<>(); + + // 获取类名和映射信息 + String className = javaBeanClass.getName(); + MappingInfo mappingInfo = excelJavaBeanMap.get(className); + if (mappingInfo == null) + return null; + + // 读取 Excel 文件 + try (Workbook workbook = new XSSFWorkbook(new FileInputStream(file))) { + Sheet dataSheet = workbook.getSheetAt(0); + Row row; + Cell cell; + + Iterator rowIterator = dataSheet.iterator(); + Iterator cellIterator; + + // 读取第一行表头信息 + if (!rowIterator.hasNext()) + return null; + String fieldName; + Field fieldInstance; + Class fieldClass; + List fieldNameList = new ArrayList<>();// 目标对象的 field 名称列表 + List> fieldClassList = new ArrayList<>();// 目标对象 field 类型列表 + row = rowIterator.next(); + cellIterator = row.iterator(); + while (cellIterator.hasNext()) { + cell = cellIterator.next(); + + // 获取 value 对应的 field 的名称以及类型 + fieldName = mappingInfo.getValueFieldMapping(cell.getStringCellValue()); + fieldClass = (fieldName != null && (fieldInstance = javaBeanClass.getDeclaredField(fieldName)) != null) ? + fieldInstance.getType() : null; + + // 保存 value 对应的 field 的名称和类型 + fieldClassList.add(cell.getColumnIndex(), fieldClass); + fieldNameList.add(cell.getColumnIndex(), fieldName); + } + + // 读取表格内容 + while (rowIterator.hasNext()) { + row = rowIterator.next(); + cellIterator = row.iterator(); + T javaBean = javaBeanClass.newInstance(); + + // 读取单元格 + while (cellIterator.hasNext()) { + cell = cellIterator.next(); + int columnIndex = cell.getColumnIndex(); + + // 获取单元格的值,并设置对象中对应的属性 + Object fieldValue = getCellValue(fieldClassList.get(columnIndex), cell); + if (fieldValue == null) continue; + setField(javaBean, fieldNameList.get(columnIndex), fieldValue); + } + // 放入结果 + javaBeans.add(javaBean); + } + } catch (Exception e) { + e.printStackTrace(); + } + return javaBeans; + } + + /** + * 将 List 中的元素对象写入到 Excel 中,其中每一个对象的一行,每一列的内容为对象的属性 + * + * @param classType 目标对象的类型 + * @param javaBeans 数据来源的 List + * @return 返回excel文件 + */ + public File excelWriter(Class classType, List javaBeans) { + // 参数检查 + if (classType == null || javaBeans == null) + return null; + + // 获取类名和映射信息 + String className = classType.getName(); + MappingInfo mappingInfo = excelJavaBeanMap.get(className); + if (mappingInfo == null) + return null; + + // 获取该 javaBean 注册需要写到 excel 的 field + Set fields = mappingInfo.getFieldValueMapping().keySet();// 注册的 field 列表 + List valuesList = new ArrayList<>();// field 对应的 excel 表头 value 列表 + fields.forEach(field -> valuesList.add(mappingInfo.getFieldValueMapping(field))); + + // 创建对应的 excel 文件 + File excel = null; + try { + // 创建临时文件 + excel = File.createTempFile("excel", ".xlsx"); + // 创建 workBook 对象 + Workbook workbook = new XSSFWorkbook(); + // 创建 sheet 对象 + Sheet sheet = workbook.createSheet(mappingInfo.getSheetName()); + + int rowIndex = 0; + int cellIndex; + Row row; + Cell cell; + + // 写入第一行表头 + cellIndex = 0; + row = sheet.createRow(rowIndex++); + XSSFFont font = (XSSFFont) workbook.createFont(); + font.setBold(mappingInfo.isBoldHeading()); + CellStyle cellStyle = workbook.createCellStyle(); + cellStyle.setFont(font); + for (String value : valuesList) { + cell = row.createCell(cellIndex); + cell.setCellValue(value); + cellIndex++; + + // 设置样式 + cell.setCellStyle(cellStyle); + } + + // 写入内容数据 + for (Object javaBean : javaBeans) { + row = sheet.createRow(rowIndex++); + cellIndex = 0; + for (String fieldName : fields) { + Object value = getField(javaBean, getGetterMethodName(fieldName)); + cell = row.createCell(cellIndex++); + setCellValue1(value, workbook, cell); + } + } + + // 调整 cell 大小 + for (int i = 0; i < valuesList.size(); i++) { + sheet.autoSizeColumn(i); + } + + // 将 workBook 写入到 tempFile 中 + FileOutputStream outputStream = new FileOutputStream(excel); + workbook.write(outputStream); + outputStream.flush(); + outputStream.close(); + workbook.close(); + + } catch (Exception e) { + e.printStackTrace(); + } + return excel; + } + + /** + * 获取 Excel 单元格中的值 + * + * @param fieldClass JavaBean 属性字段的类型 + * @param cell 单元格 + * @param 泛型类型 + * @return 返回 JavaBean 属性类型对应的值 + */ + @SuppressWarnings("unchecked") + private T getCellValue(Class fieldClass, Cell cell) { + + // field 对值 + T fieldValue = null; + + if (fieldClass == int.class || fieldClass == Integer.class) { + // convert to Integer + cell.setCellType(Cell.CELL_TYPE_STRING); + String cellValue = cell.getStringCellValue(); + Integer integer = NumberUtils.isNumber(cellValue) ? Double.valueOf(cellValue).intValue() : 0; + fieldValue = (T) integer; + } else if (fieldClass == long.class || fieldClass == Long.class) { + // convert to Long + cell.setCellType(Cell.CELL_TYPE_STRING); + String cellValue = cell.getStringCellValue(); + Long l = NumberUtils.isNumber(cellValue) ? Double.valueOf(cellValue).longValue() : 0; + fieldValue = (T) l; + } else if (fieldClass == float.class || fieldClass == Float.class) { + // convert to Float + cell.setCellType(Cell.CELL_TYPE_STRING); + String cellValue = cell.getStringCellValue(); + Float f = NumberUtils.isNumber(cellValue) ? Float.valueOf(cellValue) : 0; + fieldValue = (T) f; + } else if (fieldClass == double.class || fieldClass == Double.class) { + // convert to Double + cell.setCellType(Cell.CELL_TYPE_STRING); + String cellValue = cell.getStringCellValue(); + Double d = NumberUtils.isNumber(cellValue) ? Double.valueOf(cellValue) : 0; + fieldValue = (T) d; + } else if (fieldClass == short.class || fieldClass == Short.class) { + // convert to Short + cell.setCellType(Cell.CELL_TYPE_STRING); + String cellValue = cell.getStringCellValue(); + Short s = NumberUtils.isNumber(cellValue) ? Double.valueOf(cellValue).shortValue() : 0; + fieldValue = (T) s; + } else if (fieldClass == boolean.class || fieldClass == Boolean.class) { + // get Boolean + cell.setCellType(Cell.CELL_TYPE_BOOLEAN); + Boolean b = cell.getBooleanCellValue(); + fieldValue = (T) b; + } else if (fieldClass == char.class || fieldClass == Character.class) { + // convert to Character + cell.setCellType(Cell.CELL_TYPE_STRING); + String cellValue = cell.getStringCellValue(); + Character c = cellValue.charAt(0); + fieldValue = (T) c; + } else if (fieldClass == byte.class || fieldClass == Byte.class) { + // convert to Byte + cell.setCellType(Cell.CELL_TYPE_STRING); + String cellValue = cell.getStringCellValue(); + Byte b = NumberUtils.isNumber(cellValue) ? Double.valueOf(cellValue).byteValue() : 0; + fieldValue = (T) b; + } else if (fieldClass == String.class) { + // convert to String + cell.setCellType(Cell.CELL_TYPE_STRING); + String cellValue = cell.getStringCellValue(); + fieldValue = (T) cellValue; + } else if (fieldClass == Date.class) { + // convert to java.util.Date + fieldValue = HSSFDateUtil.isCellDateFormatted(cell) ? (T) cell.getDateCellValue() : null; + } else if (fieldClass == java.sql.Date.class) { + // convert to java.sql.Date + fieldValue = null; + if (HSSFDateUtil.isCellDateFormatted(cell)) { + java.sql.Date date = new java.sql.Date(cell.getDateCellValue().getTime()); + fieldValue = (T) date; + } + } + return fieldValue; + } + + /** + * 设置单元格的值 + * + * @param cellValue 单元格的值 + * @param workbook workbook + * @param cell 单元格 + */ + private void setCellValue1(Object cellValue, Workbook workbook, Cell cell) { + // 参数检查 + if (cell == null || cellValue == null || workbook == null) + return; + + Class cellValueClass = cellValue.getClass(); + if (cellValueClass == boolean.class || cellValueClass == Boolean.class) { + cell.setCellValue((Boolean) cellValue); + } else if (cellValueClass == char.class || cellValueClass == Character.class) { + cell.setCellValue(String.valueOf(cellValue)); + } else if (cellValueClass == byte.class || cellValueClass == Byte.class) { + cell.setCellValue((Byte) cellValue); + } else if (cellValueClass == short.class || cellValueClass == Short.class) { + cell.setCellValue((Short) cellValue); + } else if (cellValueClass == int.class || cellValueClass == Integer.class) { + cell.setCellValue((Integer) cellValue); + } else if (cellValueClass == long.class || cellValueClass == Long.class) { + cell.setCellValue((Long) cellValue); + } else if (cellValueClass == float.class || cellValueClass == Float.class) { + cell.setCellValue(String.valueOf(cellValue)); +// cell.setCellValue((Float) cellValue); + } else if (cellValueClass == double.class || cellValueClass == Double.class) { + cell.setCellValue((Double) cellValue); + } else if (cellValueClass == String.class) { + cell.setCellValue((String) cellValue); + } else if (cellValueClass == Date.class) { + Date v = (Date) cellValue; + CellStyle cellStyle = workbook.createCellStyle(); + CreationHelper creationHelper = workbook.getCreationHelper(); + cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy/mm/dd")); + cell.setCellValue(v); + cell.setCellStyle(cellStyle); + } else if (cellValueClass == java.sql.Date.class) { + java.sql.Date v = (java.sql.Date) cellValue; + CellStyle cellStyle = workbook.createCellStyle(); + CreationHelper creationHelper = workbook.getCreationHelper(); + cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy/mm/dd")); + cell.setCellValue(v); + cell.setCellStyle(cellStyle); + } + } + + /** + * 设置 JavaBean 指定 field 的值 + * + * @param targetObject 指定的 JavaBean 对象 + * @param fieldName 属性字段的名称 + * @param fieldValue 属性字段的值 + * @throws Exception Exception + */ + private void setField(Object targetObject, String fieldName, Object fieldValue) throws Exception { + // 获取对应的 setter 方法 + Class targetObjectClass = targetObject.getClass(); + Class fieldClass = targetObjectClass.getDeclaredField(fieldName).getType(); + Method setterMethod = targetObjectClass.getMethod(getSetterMethodName(fieldName), fieldClass); + + // 调用 setter 方法,设置 field 的值 + setterMethod.invoke(targetObject, fieldValue); + } + + /** + * 获取目标对象中某个属性的值,通过调用目标对象属性对应的 getter 方法,因而要求目标对象必须设置 getter 对象,否则赋值不成功 + * + * @param targetObject 目标对象 + * @param methodName getter 方法名 + * @return 返回该属性的值 + * @throws Exception Exception + */ + private Object getField(Object targetObject, String methodName) throws Exception { + // 获得 getter 方法实例 + Class targetObjectType = targetObject.getClass(); + Method getterMethod = targetObjectType.getMethod(methodName); + + // 调用方法 + return getterMethod.invoke(targetObject); + } + + /** + * setter 方法名缓存 + */ + private Map setterMethodNameCache = new HashMap<>(64); + + /** + * getter 方法名缓存 + */ + private Map getterMethodNameCache = new HashMap<>(64); + + /** + * 构造 setter 方法的方法名 + * + * @param fieldName 字段名 + * @return field对应的Setter方法名 + */ + private String getSetterMethodName(String fieldName) { + // 尝试从缓存中取出, 若没有则生成再放入 + return setterMethodNameCache.computeIfAbsent(fieldName, n -> "set" + n.replaceFirst(n.substring(0, 1), n.substring(0, 1).toUpperCase())); + } + + /** + * 构造 getter 方法的方法名 + * + * @param fieldName 字段名 + * @return field对应的Getter方法名 + */ + private String getGetterMethodName(String fieldName) { + return getterMethodNameCache.computeIfAbsent(fieldName, n -> "get" + n.replaceFirst(n.substring(0, 1), n.substring(0, 1).toUpperCase())); + } + + /** + * Excel-JavaBean映射信息 + */ + private class MappingInfo { + /** + * 映射的JavaBean的全限定类名 + */ + private String className; + + /** + * excel 表中 sheet 的名称 + */ + private String sheetName = "sheet1"; + + /** + * 表格标题加粗 + */ + private boolean boldHeading = false; + + /** + * Field - Value 映射 + */ + private Map fieldValueMapping = new LinkedHashMap<>(); + + /** + * Value - Field 映射 + */ + private Map valueFieldMapping = new LinkedHashMap<>(); + + /** + * 设置映射信息的JavaBean的全称类名 + * + * @param className JavaBean全称类名 + */ + void setClassName(String className) { + this.className = className; + } + + /** + * 返回 mappingInfo 对应的 className + * + * @return className + */ + String getClassName() { + return className; + } + + /** + * 设置表格的 sheet 名称 + * + * @param sheetName sheet 名称 + */ + void setSheetName(String sheetName) { + this.sheetName = sheetName; + } + + /** + * 获取表格的 sheet 名称 + * + * @return 返回表格的 sheet 名称 + */ + String getSheetName() { + return sheetName; + } + + /** + * 设置表头标题是否加粗 + * + * @param boldHeading 是否加粗 + */ + void setBoldHeading(boolean boldHeading) { + this.boldHeading = boldHeading; + } + + /** + * 获取表头标题是否加粗 + * + * @return 返回表头标题是否加粗 + */ + boolean isBoldHeading() { + return boldHeading; + } + + /** + * 添加 Field - Value 映射 + * + * @param field Field域 + * @param value Value域 + */ + void addFieldValueMapping(String field, String value) { + fieldValueMapping.put(field, value); + } + + /** + * 返回指定Field映射的Value + * + * @param field Field域 + * @return 返回映射的Value + */ + String getFieldValueMapping(String field) { + return fieldValueMapping.get(field); + } + + /** + * 添加 Value - Field 映射 + * + * @param value Value域 + * @param field Field域 + */ + void addValueFieldMapping(String value, String field) { + valueFieldMapping.put(value, field); + } + + /** + * 返回指定的Value 映射的 Field + * + * @param value Value域 + * @return 返回映射的Field + */ + String getValueFieldMapping(String value) { + return valueFieldMapping.get(value); + } + + /** + * 获得 Field - Value 映射 + * + * @return 返回Field - Value 映射 + */ + Map getFieldValueMapping() { + return fieldValueMapping; + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/FileUtil.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/FileUtil.java new file mode 100644 index 0000000..2cc3dc3 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/FileUtil.java @@ -0,0 +1,27 @@ +package com.ken.wms.common.util; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; + +/** + * 文件操作工具类 + * + + */ +public class FileUtil { + + /** + * 将 org.springframework.web.multipart.MultipartFile 类型的文件转换为 java.io.File 类型的文件 + * + * @param multipartFile org.springframework.web.multipart.MultipartFile 类型的文件 + * @return 返回转换后的 java.io.File 类型的文件 + * @throws IOException IOException + */ + public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException { + File convertedFile = new File(multipartFile.getOriginalFilename()); + multipartFile.transferTo(convertedFile); + return convertedFile; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/Response.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/Response.java new file mode 100644 index 0000000..c8a844a --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/Response.java @@ -0,0 +1,78 @@ +package com.ken.wms.common.util; + +import org.apache.commons.collections.map.HashedMap; + +import java.util.Map; + +/** + * controller 返回的信息载体 response + + */ +public class Response { + + public static final String RESPONSE_RESULT_SUCCESS = "success"; + public static final String RESPONSE_RESULT_ERROR = "error"; + + // response 中可能使用的值 + private static final String RESPONSE_RESULT = "result"; + private static final String RESPONSE_MSG = "msg"; + private static final String RESPONSE_DATA = "data"; + private static final String RESPONSE_TOTAL = "total"; + + // 存放响应中的信息 + private Map responseContent; + + // Constructor + Response() { + this.responseContent = new HashedMap(10); + } + + /** + * 设置 response 的状态 + * @param result response 的状态,值为 success 或 error + */ + public void setResponseResult(String result){ + this.responseContent.put(Response.RESPONSE_RESULT,result); + } + + /** + * 设置 response 的附加信息 + * @param msg response 的附加信息 + */ + public void setResponseMsg(String msg){ + this.responseContent.put(Response.RESPONSE_MSG,msg); + } + + /** + * 设置 response 中携带的数据 + * @param data response 中携带的数据 + */ + public void setResponseData(Object data){ + this.responseContent.put(Response.RESPONSE_DATA,data); + } + + /** + * 设置 response 中携带数据的数量,与 RESPONSE_DATA 配合使用 + * @param total 携带数据的数量 + */ + public void setResponseTotal(long total){ + this.responseContent.put(Response.RESPONSE_TOTAL,total); + } + + /** + * 设置 response 自定义信息 + * @param key 自定义信息的 key + * @param value 自定义信息的值 + */ + public void setCustomerInfo(String key, Object value){ + this.responseContent.put(key,value); + } + + /** + * 生成 response + * @return 代表 response 的一个 Map 对象 + */ + public Map generateResponse(){ + return this.responseContent; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/ResponseFactory.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/ResponseFactory.java new file mode 100644 index 0000000..67735b2 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/common/util/ResponseFactory.java @@ -0,0 +1,18 @@ +package com.ken.wms.common.util; + +/** + * Response 工厂类 + * + */ +public class ResponseFactory { + + /** + * 生成一个 Response 对象 + * + * @return response 对象 + */ + public static Response newInstance() { + return new Response(); + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/AccessRecordMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/AccessRecordMapper.java new file mode 100644 index 0000000..48ea038 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/AccessRecordMapper.java @@ -0,0 +1,36 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.AccessRecordDO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 用户登入登出记录因映射器 + * + + */ +public interface AccessRecordMapper { + + /** + * 插入一条用户用户登入登出记录 + * + * @param accessRecordDO 用户登入登出记录 + */ + void insertAccessRecord(AccessRecordDO accessRecordDO); + + /** + * 选择指定用户ID、记录类型、时间范围的登入登出记录 + * + * @param userID 用户ID + * @param accessType 记录类型(登入、登出或所有) + * @param startDate 记录的起始日期 + * @param endDate 记录的结束日期 + * @return 返回所有符合条件的记录 + */ + List selectAccessRecords(@Param("userID") Integer userID, + @Param("accessType") String accessType, + @Param("startDate") Date startDate, + @Param("endDate") Date endDate); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/AccessRecordMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/AccessRecordMapper.xml new file mode 100644 index 0000000..42b77de --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/AccessRecordMapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + insert into wms_access_record(USER_ID, USER_NAME, ACCESS_TYPE, ACCESS_TIME, ACCESS_IP) + values(#{userID}, #{userName}, #{accessType}, #{accessTime}, #{accessIP}) + + + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/CustomerMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/CustomerMapper.java new file mode 100644 index 0000000..3d26d7f --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/CustomerMapper.java @@ -0,0 +1,72 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.Customer; + +import java.util.List; + +/** + * 客户信息 Customer 映射器 + * + */ +public interface CustomerMapper { + + /** + * 选择所有的 Customer + * @return 返回所有的 Customer + */ + List selectAll(); + + /** + * 选择指定 id 的 Supplier + * @param id Customer的ID + * @return 返回指定ID对应的Customer + */ + Customer selectById(Integer id); + + /** + * 选择指定 Customer name 的 customer + * @param customerName 客户的名称 + * @return 返回指定CustomerName对应的Customer + */ + Customer selectByName(String customerName); + + /** + * 选择指定 customer name 的 Customer + * 与 selectByName 方法的区别在于本方法将返回相似匹配的结果 + * @param customerName Customer 供应商名 + * @return 返回模糊匹配指定customerName 对应的Customer + */ + List selectApproximateByName(String customerName); + + /** + * 插入 Customer 到数据库中 + * 不需要指定 Customer 的主键,采用的数据库 AI 方式 + * @param customer Customer 实例 + */ + void insert(Customer customer); + + /** + * 批量插入 Customer 到数据库中 + * @param customers 存放 Customer 实例的 List + */ + void insertBatch(List customers); + + /** + * 更新 Customer 到数据库 + * 该 Customer 必须已经存在于数据库中,即已经分配主键,否则将更新失败 + * @param customer customer 实例 + */ + void update(Customer customer); + + /** + * 删除指定 id 的 customer + * @param id customer ID + */ + void deleteById(Integer id); + + /** + * 删除指定 customerName 的 customer + * @param customerName 客户名称 + */ + void deleteByName(String customerName); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/CustomerMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/CustomerMapper.xml new file mode 100644 index 0000000..5ea7104 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/CustomerMapper.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + insert into wms_customer(CUSTOMER_NAME,CUSTOMER_PERSON,CUSTOMER_TEL,CUSTOMER_EMAIL,CUSTOMER_ADDRESS) + values (#{name},#{personInCharge},#{tel},#{email},#{address}) + + + + insert into wms_customer(CUSTOMER_NAME,CUSTOMER_PERSON,CUSTOMER_TEL,CUSTOMER_EMAIL,CUSTOMER_ADDRESS) + values + + (#{customer.name},#{customer.personInCharge},#{customer.tel},#{customer.email},#{customer.address}) + + + + + update + wms_customer + set + CUSTOMER_NAME = #{name}, + CUSTOMER_PERSON = #{personInCharge}, + CUSTOMER_TEL = #{tel}, + CUSTOMER_EMAIL = #{email}, + CUSTOMER_ADDRESS = #{address} + where + CUSTOMER_ID = #{id} + + + + delete from wms_customer + where CUSTOMER_ID = #{id} + + + + delete from wms_customer + where CUSTOMER_NAME = #{name} + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/GoodsMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/GoodsMapper.java new file mode 100644 index 0000000..feb800d --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/GoodsMapper.java @@ -0,0 +1,73 @@ +package com.ken.wms.dao; + + +import com.ken.wms.domain.Goods; + +import java.util.List; + +/** + * 货物信息映射器 + + * + */ +public interface GoodsMapper { + + /** + * 选择所有的 Goods + * @return 返回所有的Goods + */ + List selectAll(); + + /** + * 选择指定 id 的 Goods + * @param id 货物的ID + * @return 返回执行ID对应的Goods + */ + Goods selectById(Integer id); + + /** + * 选择指定 Goods name 的 Goods + * @param goodsName 货物的名称 + * @return 返回指定GoodsName对应的货物 + */ + Goods selectByName(String goodsName); + + /** + * 选择制定 goods name 的 goods + * 模糊匹配 + * @param goodsName 货物德名称 + * @return 返回模糊匹配指定goodsName的货物 + */ + List selectApproximateByName(String goodsName); + + /** + * 插入一条新的记录到数据库 + * @param goods 货物信息 + */ + void insert(Goods goods); + + /** + * 批量插入新的记录到数据库中 + * @param goods 存放 goods 信息的 List + */ + void insertBatch(List goods); + + /** + * 更新 Goods 到数据库中 + * 该 Customer 必须已经存在于数据库中,即已经分配主键,否则将更新失败 + * @param goods 货物信息 + */ + void update(Goods goods); + + /** + * 删除指定 id 的 goods + * @param id 货物ID + */ + void deleteById(Integer id); + + /** + * 删除指定 goods name 的 goods + * @param goodsName 货物的名称 + */ + void deleteByName(String goodsName); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/GoodsMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/GoodsMapper.xml new file mode 100644 index 0000000..133611b --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/GoodsMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + insert into wms_goods(GOOD_NAME,GOOD_RYPE,GOOD_SIZE,GOOD_VALUE) + values (#{name},#{type},#{size},#{value}) + + + + insert into wms_goods(GOOD_NAME,GOOD_RYPE,GOOD_SIZE,GOOD_VALUE) + values + + (#{goods.name},#{goods.type},#{goods.size},#{goods.value}) + + + + + update + wms_goods + set + GOOD_NAME = #{name}, + GOOD_RYPE = #{type}, + GOOD_SIZE = #{size}, + GOOD_VALUE = #{value} + where + GOOD_ID = #{id} + + + + delete from wms_goods + where GOOD_ID = #{id} + + + + delete from wms_goods + where GOOD_NAME = #{goodsName} + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryAdminMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryAdminMapper.java new file mode 100644 index 0000000..c74f634 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryAdminMapper.java @@ -0,0 +1,64 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.RepositoryAdmin; + +import java.util.List; + +/** + * RepositoryAdmin 映射器 + + */ +public interface RepositoryAdminMapper { + + /** + * 选择指定 ID 的仓库管理员信息 + * @param id 仓库管理员ID + * @return 返回指定 ID 的仓库管理员信息 + */ + RepositoryAdmin selectByID(Integer id); + + /** + * 选择指定 name 的仓库管理员信息。 + * 支持模糊查找 + * @param name 仓库管理员名字 + * @return 返回若干条指定 name 的仓库管理员信息 + */ + List selectByName(String name); + + /** + * 选择所有的仓库管理员信息 + * @return 返回所有的仓库管理员信息 + */ + List selectAll(); + + /** + * 选择已指派指定 repositoryID 的仓库管理员信息 + * @param repositoryID 指派的仓库ID + * @return 返回已指派指定 repositoryID 的仓库管理员信息 + */ + RepositoryAdmin selectByRepositoryID(Integer repositoryID); + + /** + * 插入一条仓库管理员信息 + * @param repositoryAdmin 仓库管理员信息 + */ + void insert(RepositoryAdmin repositoryAdmin); + + /** + * 批量插入仓库管理员信息 + * @param repositoryAdmins 存放若干条仓库管理员信息的 List + */ + void insertBatch(List repositoryAdmins); + + /** + * 更新仓库管理员信息 + * @param repositoryAdmin 仓库管理员信息 + */ + void update(RepositoryAdmin repositoryAdmin); + + /** + * 删除指定 ID 的仓库管理员信息 + * @param id 仓库管理员 ID + */ + void deleteByID(Integer id); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryAdminMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryAdminMapper.xml new file mode 100644 index 0000000..2ae4f60 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryAdminMapper.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + insert into wms_repo_admin(REPO_ADMIN_NAME,REPO_ADMIN_SEX,REPO_ADMIN_TEL,REPO_ADMIN_ADDRESS,REPO_ADMIN_BIRTH,REPO_ADMIN_REPOID) + values(#{name},#{sex},#{tel},#{address},#{birth},#{repositoryBelongID}) + + + + insert into wms_repo_admin(REPO_ADMIN_NAME,REPO_ADMIN_SEX,REPO_ADMIN_TEL,REPO_ADMIN_ADDRESS,REPO_ADMIN_BIRTH,REPO_ADMIN_REPOID) + values + + (#{repositoryAdmin.name},#{repositoryAdmin.sex},#{repositoryAdmin.tel},#{repositoryAdmin.address},#{repositoryAdmin.birth},#{repositoryAdmin.repositoryBelongID}) + + + + + update + wms_repo_admin + set + REPO_ADMIN_NAME = #{name}, + REPO_ADMIN_SEX = #{sex}, + REPO_ADMIN_TEL = #{tel}, + REPO_ADMIN_ADDRESS = #{address}, + REPO_ADMIN_BIRTH = #{birth}, + REPO_ADMIN_REPOID = #{repositoryBelongID} + where + REPO_ADMIN_ID = #{id} + + + + delete from wms_repo_admin + where REPO_ADMIN_ID = #{id} + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryMapper.java new file mode 100644 index 0000000..f22dc6f --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryMapper.java @@ -0,0 +1,63 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.Repository; + +import java.util.List; + +/** + * Repository 映射器 + * @author Ken + * + */ +public interface RepositoryMapper { + + /** + * 选择全部的 Repository 记录 + * @return 返回全部的 Repository + */ + List selectAll(); + + /** + * 选择全部的未分配的 repository 记录 + * @return 返回所有未分配的 Repository + */ + List selectUnassign(); + + /** + * 选择指定 Repository ID 的 Repository 记录 + * @param repositoryID 仓库ID + * @return 返回指定的Repository + */ + Repository selectByID(Integer repositoryID); + + /** + * 选择指定 repository Address 的 repository 记录 + * @param address 仓库地址 + * @return 返回指定的Repository + */ + List selectByAddress(String address); + + /** + * 插入一条新的 Repository 记录 + * @param repository 仓库信息 + */ + void insert(Repository repository); + + /** + * 批量插入 Repository 记录 + * @param repositories 存有若干条记录的 List + */ + void insertbatch(List repositories); + + /** + * 更新 Repository 记录 + * @param repository 仓库信息 + */ + void update(Repository repository); + + /** + * 删除指定 Repository ID 的 Repository 记录 + * @param repositoryID 仓库ID + */ + void deleteByID(Integer repositoryID); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryMapper.xml new file mode 100644 index 0000000..5851c3d --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RepositoryMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + insert into wms_respository(REPO_ADDRESS,REPO_STATUS,REPO_AREA,REPO_DESC) + values(#{address},#{status},#{area},#{desc}) + + + + insert into wms_respository(REPO_ADDRESS,REPO_STATUS,REPO_AREA,REPO_DESC) + values + + (#{repository.address},#{repository.status},#{repository.area},#{repository.desc}) + + + + + update + wms_respository + set + REPO_ADDRESS = #{address}, + REPO_STATUS = #{status}, + REPO_AREA = #{area}, + REPO_desc = #{desc} + where + REPO_ID = #{id} + + + + delete from wms_respository + where REPO_ID = #{id} + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolePermissionMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolePermissionMapper.java new file mode 100644 index 0000000..b8cc2ef --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolePermissionMapper.java @@ -0,0 +1,14 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.RolePermissionDO; + +import java.util.List; + +/** + * 角色权限信息 Mapper + + */ +public interface RolePermissionMapper { + + List selectAll(); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolePermissionMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolePermissionMapper.xml new file mode 100644 index 0000000..506b03b --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolePermissionMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolesMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolesMapper.java new file mode 100644 index 0000000..6560a66 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolesMapper.java @@ -0,0 +1,15 @@ +package com.ken.wms.dao; + +/** + * + */ +public interface RolesMapper { + + /** + * 获取角色对应的ID + * @param roleName 角色名 + * @return 返回角色的ID + */ + Integer getRoleID(String roleName); + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolesMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolesMapper.xml new file mode 100644 index 0000000..4280fcd --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/RolesMapper.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockInMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockInMapper.java new file mode 100644 index 0000000..6f4724a --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockInMapper.java @@ -0,0 +1,87 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.StockInDO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 入库记录映射器 + * + + */ +public interface StockInMapper { + + /** + * 选择全部的入库记录 + * + * @return 返回全部的入库记录 + */ + List selectAll(); + + /** + * 选择指定供应商ID相关的入库记录 + * + * @param supplierID 指定的供应商ID + * @return 返回指定供应商相关的入库记录 + */ + List selectBySupplierId(Integer supplierID); + + /** + * 选择指定货物ID相关的入库记录 + * + * @param goodID 指定的货物ID + * @return 返回指定货物相关的入库记录 + */ + List selectByGoodID(Integer goodID); + + /** + * 选择指定仓库ID相关的入库记录 + * + * @param repositoryID 指定的仓库ID + * @return 返回指定仓库相关的入库记录 + */ + List selectByRepositoryID(Integer repositoryID); + + /** + * 选择指定仓库ID以及指定日期范围内的入库记录 + * + * @param repositoryID 指定的仓库ID + * @param startDate 记录的起始日期 + * @param endDate 记录的结束日期 + * @return 返回所有符合要求的入库记录 + */ + List selectByRepositoryIDAndDate(@Param("repositoryID") Integer repositoryID, + @Param("startDate") Date startDate, + @Param("endDate") Date endDate); + + /** + * 选择指定入库记录的ID的入库记录 + * + * @param id 入库记录ID + * @return 返回指定ID的入库记录 + */ + StockInDO selectByID(Integer id); + + /** + * 添加一条新的入库记录 + * + * @param stockInDO 入库记录 + */ + void insert(StockInDO stockInDO); + + /** + * 更新入库记录 + * + * @param stockInDO 入库记录 + */ + void update(StockInDO stockInDO); + + /** + * 删除指定ID的入库记录 + * + * @param id 指定删除入库记录的ID + */ + void deleteByID(Integer id); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockInMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockInMapper.xml new file mode 100644 index 0000000..15eb864 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockInMapper.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into wms_record_in(RECORD_SUPPLIERID,RECORD_GOODID,RECORD_NUMBER,RECORD_TIME,RECORD_PERSON,RECORD_REPOSITORYID) + values(#{supplierID},#{goodID},#{number},#{time},#{personInCharge},#{repositoryID}) + + + + update + wms_record_in + set + RECORD_SUPPLIERID = #{supplierID}, + RECORD_GOODID = #{goodID}, + RECORD_NUMBER = #{number}, + RECORD_TIME = #{time}, + RECORD_PERSON = #{personInCharge} + where + RECORD_ID = #{id} + + + + delete from wms_record_in + where RECORD_ID = #{id} + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockOutMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockOutMapper.java new file mode 100644 index 0000000..db7e6c5 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockOutMapper.java @@ -0,0 +1,86 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.StockOutDO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 出库记录 映射器 + + */ +public interface StockOutMapper { + + /** + * 选择全部的出库记录 + * + * @return 返回所有的出库记录 + */ + List selectAll(); + + /** + * 选择指定客户ID相关的出库记录 + * + * @param customerId 指定的客户ID + * @return 返回指定客户相关的出库记录 + */ + List selectByCustomerId(Integer customerId); + + /** + * 选择指定货物ID相关的出库记录 + * + * @param goodId 指定的货物ID + * @return 返回指定货物ID相关的出库记录 + */ + List selectByGoodId(Integer goodId); + + /** + * 选择指定仓库ID关联的出库记录 + * + * @param repositoryID 指定的仓库ID + * @return 返回指定仓库ID相关的出库记录 + */ + List selectByRepositoryID(Integer repositoryID); + + /** + * 选择指定仓库ID以及指定日期范围内的出库记录 + * + * @param repositoryID 指定的仓库ID + * @param startDate 记录起始日期 + * @param endDate 记录结束日期 + * @return 返回所有符合指定要求的出库记录 + */ + List selectByRepositoryIDAndDate(@Param("repositoryID") Integer repositoryID, + @Param("startDate") Date startDate, + @Param("endDate") Date endDate); + + /** + * 选择指定ID的出库记录 + * + * @param id 指定的出库记录ID + * @return 返回指定ID的出库记录 + */ + StockOutDO selectById(Integer id); + + /** + * 插入一条新的出库记录 + * + * @param stockOutDO 出库记录 + */ + void insert(StockOutDO stockOutDO); + + /** + * 更新出库记录 + * + * @param stockOutDO 出库记录 + */ + void update(StockOutDO stockOutDO); + + /** + * 删除指定ID的出库记录 + * + * @param id 指定的出库记录ID + */ + void deleteById(Integer id); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockOutMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockOutMapper.xml new file mode 100644 index 0000000..f8ae6b8 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StockOutMapper.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into wms_record_out(RECORD_CUSTOMERID,RECORD_GOODID,RECORD_NUMBER,RECORD_TIME,RECORD_PERSON,RECORD_REPOSITORYID) + values(#{customerID},#{goodID},#{number},#{time},#{personInCharge},#{repositoryID}) + + + + update + wms_record_out + set + RECORD_CUSTOMERID = #{customerID}, + RECORD_GOODID = #{goodID}, + RECORD_NUMBER = #{number}, + RECORD_TIME = #{time}, + RECORD_PERSON = #{personInCharge} + where + RECORD_ID = #{id} + + + + delete from wms_record_out + where RECORD_ID = #{id} + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StorageMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StorageMapper.java new file mode 100644 index 0000000..c7e883b --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StorageMapper.java @@ -0,0 +1,83 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.Storage; +import org.apache.ibatis.annotations.Param; + + +import java.util.List; + +/** + * 库存信息映射器 + * + */ +public interface StorageMapper { + + /** + * 选择所有的库存信息 + * @return 返回所有的库存信息 + */ + List selectAllAndRepositoryID(@Param("repositoryID") Integer repositoryID); + + /** + * 选择指定货物ID和仓库ID的库存信息 + * @param goodsID 货物ID + * @param repositoryID 库存ID + * @return 返回所有指定货物ID和仓库ID的库存信息 + */ + List selectByGoodsIDAndRepositoryID(@Param("goodsID") Integer goodsID, + @Param("repositoryID") Integer repositoryID); + + /** + * 选择指定货物名的库存信息 + * @param goodsName 货物名称 + * @return 返回所有指定货物名称的库存信息 + */ + List selectByGoodsNameAndRepositoryID(@Param("goodsName") String goodsName, + @Param("repositoryID") Integer repositoryID); + + /** + * 选择指定货物类型的库存信息 + * @param goodsType 货物类型 + * @return 返回所有指定货物类型的库存信息 + */ + List selectByGoodsTypeAndRepositoryID(@Param("goodsType") String goodsType, + @Param("repositoryID") Integer repositoryID); + + /** + * 更新库存信息 + * 该库存信息必需已经存在于数据库当中,否则更新无效 + * @param storage 库存信息 + */ + void update(Storage storage); + + /** + * 插入新的库存信息 + * @param storage 库存信息 + */ + void insert(Storage storage); + + /** + * 批量导入库存信息 + * @param storages 若干条库存信息 + */ + void insertBatch(List storages); + + /** + * 删除指定货物ID的库存信息 + * @param goodsID 货物ID + */ + void deleteByGoodsID(Integer goodsID); + + /** + * 删除指定仓库的库存信息 + * @param repositoryID 仓库ID + */ + void deleteByRepositoryID(Integer repositoryID); + + /** + * 删除指定仓库中的指定货物的库存信息 + * @param goodsID 货物ID + * @param repositoryID 仓库ID + */ + void deleteByRepositoryIDAndGoodsID(@Param("goodsID") Integer goodsID, @Param("repositoryID") Integer repositoryID); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StorageMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StorageMapper.xml new file mode 100644 index 0000000..cbf47a1 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/StorageMapper.xml @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + update + wms_record_storage + set + RECORD_GOODID = #{goodsID}, + RECORD_REPOSITORY = #{repositoryID}, + RECORD_NUMBER = #{number} + where + RECORD_GOODID = #{goodsID} and + RECORD_REPOSITORY = #{repositoryID} + + + + insert into wms_record_storage + ( + RECORD_GOODID, + RECORD_REPOSITORY, + RECORD_NUMBER + ) + values + ( + #{goodsID}, + #{repositoryID}, + #{number} + ) + + + + insert into wms_record_storage(RECORD_GOODID,RECORD_REPOSITORY,RECORD_NUMBER) + values + + ( + #{storage.goodsID},#{storage.repositoryID},#{storage.number}) + + + + + delete from + wms_record_storage + where + RECORD_GOODID = #{goodsID} + + + + delete from + wms_record_storage + where + wms_record_storage.RECORD_REPOSITORY = #{repositoryID} + + + + delete from + wms_record_storage + where + RECORD_GOODID = #{goodsID} and + wms_record_storage.RECORD_REPOSITORY = #{repositoryID} + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/SupplierMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/SupplierMapper.java new file mode 100644 index 0000000..1aba872 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/SupplierMapper.java @@ -0,0 +1,74 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.Supplier; + +import java.util.List; + +/** + * Supplier 映射器 + * @author Ken + * + */ +public interface SupplierMapper { + + /** + * 选择全部的 Supplier + * @return 返回所有的供应商 + */ + List selectAll(); + + /** + * 选择指定 id 的 Supplier + * @param id 供应商ID + * @return 返回指定ID对应的供应商 + */ + Supplier selectById(Integer id); + + /** + * 选择指定 supplier name 的 Supplier + * @param supplierName 供应商名称 + * @return 返回supplierName对应的供应商 + */ + Supplier selectBuName(String supplierName); + + /** + * 选择指定 supplier name 的 Supplier + * 与 selectBuName 方法的区别在于本方法将返回相似匹配的结果 + * @param supplierName 供应商名 + * @return 返回所有模糊匹配指定supplierName的供应商 + */ + List selectApproximateByName(String supplierName); + + /** + * 插入 Supplier 到数据库中 + * 不需要指定 Supplier 的主键,采用的数据库 AI 方式 + * @param supplier Supplier 实例 + */ + void insert(Supplier supplier); + + /** + * 批量插入 Supplier 到数据库中 + * @param suppliers 存放 Supplier 实例的 Lists + */ + void insertBatch(List suppliers); + + /** + * 更新 Supplier 到数据库 + * 该 Supplier 必须已经存在于数据库中,即已经分配主键,否则将更新失败 + * @param supplier Supplier 实例 + */ + void update(Supplier supplier); + + /** + * 删除指定 id 的Supplier + * @param id 供应商ID + */ + void deleteById(Integer id); + + /** + * 删除指定 supplierName 的 Supplier + * @param supplierName 供应商名称 + */ + void deleteByName(String supplierName); + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/SupplierMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/SupplierMapper.xml new file mode 100644 index 0000000..33f0096 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/SupplierMapper.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + insert into wms_supplier(SUPPLIER_NAME,SUPPLIER_PERSON,SUPPLIER_TEL,SUPPLIER_EMAIL,SUPPLIER_ADDRESS) + values(#{name},#{personInCharge},#{tel},#{email},#{address}) + + + + insert into wms_supplier(SUPPLIER_NAME,SUPPLIER_PERSON,SUPPLIER_TEL,SUPPLIER_EMAIL,SUPPLIER_ADDRESS) + values + + (#{supplier.name},#{supplier.personInCharge},#{supplier.tel},#{supplier.email},#{supplier.address}) + + + + + update + wms_supplier + set + SUPPLIER_NAME = #{name}, + SUPPLIER_PERSON = #{personInCharge}, + SUPPLIER_TEL = #{tel}, + SUPPLIER_EMAIL = #{email}, + SUPPLIER_ADDRESS = #{address} + where + SUPPLIER_ID = #{id} + + + + delete from wms_supplier + where SUPPLIER_ID = #{id} + + + + delete from wms_supplier + where SUPPLIER_NAME = #{name} + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserInfoMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserInfoMapper.java new file mode 100644 index 0000000..3799582 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserInfoMapper.java @@ -0,0 +1,61 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.UserInfoDO; + +import java.util.List; + +/** + * 用户账户信息 Mapper + * + * @author ken + * @since 2017/2/26. + */ +public interface UserInfoMapper { + + /** + * 选择指定 id 的 user 信息 + * + * @param userID 用户ID + * @return 返回指定 userID 对应的 user 信息 + */ + UserInfoDO selectByUserID(Integer userID); + + /** + * 选择指定 userName 的 user 信息 + * + * @param userName 用户名 + * @return 返回指定 userName 对应的 user 信息 + */ + UserInfoDO selectByName(String userName); + + /** + * 选择全部的 user 信息 + * + * @return 返回所有的 user 信息 + */ + List selectAll(); + + + /** + * 更新 user 对象信息 + * + * @param user 更新 user 对象信息 + */ + void update(UserInfoDO user); + + /** + * 删除指定 id 的user 信息 + * + * @param id 用户ID + */ + void deleteById(Integer id); + + /** + * 插入一个 user 对象信息 + * 不需指定对象的主键id,数据库自动生成 + * + * @param user 需要插入的用户信息 + */ + void insert(UserInfoDO user); + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserInfoMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserInfoMapper.xml new file mode 100644 index 0000000..45dc4e2 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserInfoMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + insert into wms_user(USER_ID,USER_USERNAME,USER_PASSWORD, USER_FIRST_LOGIN) + values (#{userID},#{userName},#{password}, #{firstLogin}) + + + + update wms_user set + USER_USERNAME = #{userName}, + USER_PASSWORD = #{password}, + USER_FIRST_LOGIN = #{firstLogin} + where + USER_ID = #{userID} + + + + delete from wms_user + where + USER_ID = #{userID} + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserOperationRecordMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserOperationRecordMapper.java new file mode 100644 index 0000000..72073d5 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserOperationRecordMapper.java @@ -0,0 +1,34 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.UserOperationRecordDO; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * 用户操作记录Mapper + * + + */ +public interface UserOperationRecordMapper { + + /** + * 选择指定用户ID,或时间范围的用户操作记录 + * + * @param userID 指定的用户ID + * @param startDate 记录的起始日期 + * @param endDate 记录的结束日期 + * @return 返回所有符合条件的记录 + */ + List selectUserOperationRecord(@Param("userID") Integer userID, + @Param("startDate") Date startDate, + @Param("endDate") Date endDate); + + /** + * 插入用户操作记录 + * + * @param userOperationRecordDO 用户操作记录 + */ + void insertUserOperationRecord(UserOperationRecordDO userOperationRecordDO); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserOperationRecordMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserOperationRecordMapper.xml new file mode 100644 index 0000000..37148f2 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserOperationRecordMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + insert into wms_operation_record(USER_ID, USER_NAME, OPERATION_NAME, OPERATION_TIME, OPERATION_RESULT) + values(#{userID}, #{userName}, #{operationName}, #{operationTime}, #{operationResult}) + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserPermissionMapper.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserPermissionMapper.java new file mode 100644 index 0000000..eb48e2e --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserPermissionMapper.java @@ -0,0 +1,33 @@ +package com.ken.wms.dao; + +import com.ken.wms.domain.RoleDO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户角色权限映射器 + * + */ +public interface UserPermissionMapper { + + /** + * 为指定 userID 用户指派指定 roleID 的角色 + * @param userID 用户ID + * @param roleID 角色ID + */ + void insert(@Param("userID") Integer userID, @Param("roleID") Integer roleID); + + /** + * 删除指定用户的角色 + * @param userID 用户ID + */ + void deleteByUserID(Integer userID); + + /** + * 获取指定 userID 对应用户拥有的角色 + * @param userID 用户ID + * @return 返回 userID 指定用户的角色 + */ + List selectUserRole(Integer userID); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserPermissionMapper.xml b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserPermissionMapper.xml new file mode 100644 index 0000000..d663a56 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/dao/UserPermissionMapper.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + insert into wms_user_role(ROLE_ID,USER_ID) + values(#{roleID},#{userID}) + + + + delete from wms_user_role + where USER_ID = #{userID} + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/AccessRecordDO.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/AccessRecordDO.java new file mode 100644 index 0000000..e034372 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/AccessRecordDO.java @@ -0,0 +1,103 @@ +package com.ken.wms.domain; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户登入登出记录 + * + + */ +public class AccessRecordDO implements Serializable { + + /** + * 登入登出记录ID + * 仅当该记录从数据库取出时有效 + */ + private Integer id; + + /** + * 登陆用户ID + */ + private Integer userID; + + /** + * 登陆用户名 + */ + private String userName; + + /** + * 记录类型,登入或登出 + */ + private String accessType; + + /** + * 登入或登出时间 + */ + private Date accessTime; + + /** + * 用户登入或登出对应的IP地址 + */ + private String accessIP; + + public Integer getId() { + return id; + } + + public Integer getUserID() { + return userID; + } + + public String getUserName() { + return userName; + } + + public String getAccessIP() { + return accessIP; + } + + public String getAccessType() { + return accessType; + } + + public Date getAccessTime() { + return accessTime; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setUserID(Integer userID) { + this.userID = userID; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public void setAccessType(String accessType) { + this.accessType = accessType; + } + + public void setAccessTime(Date accessTime) { + this.accessTime = accessTime; + } + + public void setAccessIP(String accessIP) { + this.accessIP = accessIP; + } + + @Override + public String toString() { + return "AccessRecordDO{" + + "id=" + id + + ", userID=" + userID + + ", userName='" + userName + '\'' + + ", accessType='" + accessType + '\'' + + ", accessTime=" + accessTime + + ", accessIP='" + accessIP + '\'' + + '}'; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/AccessRecordDTO.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/AccessRecordDTO.java new file mode 100644 index 0000000..22b2c0b --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/AccessRecordDTO.java @@ -0,0 +1,101 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * 登入登出记录DTO + * + + */ +public class AccessRecordDTO implements Serializable { + + /** + * 登入登出记录ID + */ + private Integer id; + + /** + * 登陆用户ID + */ + private Integer userID; + + /** + * 登陆用户名 + */ + private String userName; + + /** + * 登入或登出时间 + */ + private String accessTime; + + /** + * 用户登入或登出对应的IP地址 + */ + private String accessIP; + + /** + * 记录类型,登入或登出 + */ + private String accessType; + + public Integer getId() { + return id; + } + + public Integer getUserID() { + return userID; + } + + public String getUserName() { + return userName; + } + + public String getAccessTime() { + return accessTime; + } + + public String getAccessIP() { + return accessIP; + } + + public String getAccessType() { + return accessType; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setUserID(Integer userID) { + this.userID = userID; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public void setAccessTime(String accessTime) { + this.accessTime = accessTime; + } + + public void setAccessIP(String accessIP) { + this.accessIP = accessIP; + } + + public void setAccessType(String accessType) { + this.accessType = accessType; + } + + @Override + public String toString() { + return "AccessRecordDTO{" + + "id=" + id + + ", userID=" + userID + + ", userName='" + userName + '\'' + + ", accessTime='" + accessTime + '\'' + + ", accessIP='" + accessIP + '\'' + + ", accessType='" + accessType + '\'' + + '}'; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Customer.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Customer.java new file mode 100644 index 0000000..0969e75 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Customer.java @@ -0,0 +1,73 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * 客户信息 + + * + */ +public class Customer implements Serializable { + + private Integer id;// 客户ID + private String name;// 客户名 + private String personInCharge;// 负责人 + private String tel;// 联系电话 + private String email;// 电子邮件 + private String address;// 地址 + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPersonInCharge() { + return personInCharge; + } + + public void setPersonInCharge(String personInCharge) { + this.personInCharge = personInCharge; + } + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + @Override + public String toString() { + return "Customer [id=" + id + ", name=" + name + ", personInCharge=" + personInCharge + ", tel=" + tel + + ", email=" + email + ", address=" + address + "]"; + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Goods.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Goods.java new file mode 100644 index 0000000..479e032 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Goods.java @@ -0,0 +1,62 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * 货物信息 + * + */ +public class Goods implements Serializable { + + private Integer id;// 货物ID + private String name;// 货物名 + private String type;// 货物类型 + private String size;// 货物规格 + private Double value;// 货物价值 + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public Double getValue() { + return value; + } + + public void setValue(Double value) { + this.value = value; + } + + @Override + public String toString() { + return "Goods [id=" + id + ", name=" + name + ", type=" + type + ", size=" + size + ", value=" + value + "]"; + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Repository.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Repository.java new file mode 100644 index 0000000..3376d7b --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Repository.java @@ -0,0 +1,82 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * 仓库信息 + * @author Ken + * + */ +public class Repository implements Serializable { + + private Integer id;// 仓库ID + private String address;// 仓库地址 + private String status;// 仓库状态 + private String area;// 仓库面积 + private String desc;// 仓库描述 + private Integer adminID;//仓库管理员ID + private String adminName; //仓库管理员名字 + + public Integer getAdminID() { + return adminID; + } + + public void setAdminID(Integer adminID) { + this.adminID = adminID; + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public String getAdminName() { + return adminName; + } + + public void setAdminName(String adminName) { + this.adminName = adminName; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return "Repository [id=" + id + ", address=" + address + ", status=" + status + ", area=" + area + ", desc=" + + desc + ", adminID=" + adminID + ", adminName=" + adminName + "]"; + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RepositoryAdmin.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RepositoryAdmin.java new file mode 100644 index 0000000..0b8cc12 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RepositoryAdmin.java @@ -0,0 +1,84 @@ +package com.ken.wms.domain; + +import java.io.Serializable; +import java.sql.Date; + +/** + * 仓库管理员信息 + + * + */ +public class RepositoryAdmin implements Serializable { + + private Integer id;// 仓库管理员ID + private String name;// 姓名 + private String sex;// 性别 + private String tel;// 联系电话 + private String address;// 地址 + private Date birth;// 出生日期 + private Integer repositoryBelongID;// 所属仓库ID + + + public Integer getRepositoryBelongID() { + return repositoryBelongID; + } + + public void setRepositoryBelongID(Integer repositoryBelongID) { + this.repositoryBelongID = repositoryBelongID; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public Date getBirth() { + return birth; + } + + public void setBirth(Date birth) { + this.birth = birth; + } + + @Override + public String toString() { + return "RepositoryAdmin [id=" + id + ", name=" + name + ", sex=" + sex + ", tel=" + tel + ", address=" + address + + ", birth=" + birth + ", repositoryBelongID=" + repositoryBelongID + "]"; + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RoleDO.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RoleDO.java new file mode 100644 index 0000000..8ea7ef9 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RoleDO.java @@ -0,0 +1,48 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * 系统使用的角色信息 + + * + */ +public class RoleDO implements Serializable { + + private Integer id;// 角色ID + private String roleName;// 角色名 + private String roleDesc;// 角色描述 + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRoleDesc() { + return roleDesc; + } + + public void setRoleDesc(String roleDesc) { + this.roleDesc = roleDesc; + } + + @Override + public String toString() { + return "RoleDO{" + + "id=" + id + + ", roleName='" + roleName + '\'' + + ", roleDesc='" + roleDesc + '\'' + + '}'; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RolePermissionDO.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RolePermissionDO.java new file mode 100644 index 0000000..20af1d8 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/RolePermissionDO.java @@ -0,0 +1,64 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * URL 的角色角色权限信息 + * + + */ +public class RolePermissionDO implements Serializable { + + /** + * URL 的角色角色权限信息名称 + */ + private String name; + + /** + * URL 的角色角色权限信息对应的 URL + */ + private String url; + + /** + * URL 的角色角色权限信息对应的角色 + */ + private String role; + + + /** + * 对应的 getter & setter + */ + + public void setName(String name) { + this.name = name; + } + + public void setUrl(String url) { + this.url = url; + } + + public void setRole(String role) { + this.role = role; + } + + public String getName() { + return name; + } + + public String getUrl() { + return url; + } + + public String getRole() { + return role; + } + + @Override + public String toString() { + return "RolePermissionDO{" + + "name='" + name + '\'' + + ", url='" + url + '\'' + + ", role='" + role + '\'' + + '}'; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockInDO.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockInDO.java new file mode 100644 index 0000000..99182d3 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockInDO.java @@ -0,0 +1,137 @@ +package com.ken.wms.domain; + + +import java.io.Serializable; +import java.util.Date; + +/** + * 入库记录 + + */ +public class StockInDO implements Serializable { + + /** + * 入库记录 + */ + private Integer id; + + /** + * 供应商ID + */ + private Integer supplierID; + + /** + * 供应商名称 + */ + private String supplierName; + + /** + * 商品ID + */ + private Integer goodID; + + /** + * 商品名称 + */ + private String goodName; + + /** + * 入库仓库ID + */ + private Integer repositoryID; + + /** + * 入库数量 + */ + private long number; + + /** + * 入库日期 + */ + private Date time; + + /** + * 入库经手人 + */ + private String personInCharge; + + public Integer getRepositoryID() { + return repositoryID; + } + + public void setRepositoryID(Integer repositoryID) { + this.repositoryID = repositoryID; + } + + public Integer getSupplierID() { + return supplierID; + } + + public void setSupplierID(Integer supplierID) { + this.supplierID = supplierID; + } + + public Integer getGoodID() { + return goodID; + } + + public void setGoodID(Integer goodID) { + this.goodID = goodID; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getGoodName() { + return goodName; + } + + public void setGoodName(String goodName) { + this.goodName = goodName; + } + + public long getNumber() { + return number; + } + + public void setNumber(long number) { + this.number = number; + } + + public Date getTime() { + return time; + } + + public void setTime(Date time) { + this.time = time; + } + + public String getPersonInCharge() { + return personInCharge; + } + + public void setPersonInCharge(String personInCharge) { + this.personInCharge = personInCharge; + } + + @Override + public String toString() { + return "StockInDO [id=" + id + ", supplierID=" + supplierID + ", supplierName=" + supplierName + ", goodID=" + + goodID + ", goodName=" + goodName + ", repositoryID=" + repositoryID + ", number=" + number + + ", time=" + time + ", personInCharge=" + personInCharge + "]"; + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockOutDO.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockOutDO.java new file mode 100644 index 0000000..04b7f41 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockOutDO.java @@ -0,0 +1,137 @@ +package com.ken.wms.domain; + + +import java.io.Serializable; +import java.util.Date; + +/** + * 出库记录 + + */ +public class StockOutDO implements Serializable { + + /** + * 出库记录ID + */ + private Integer id; + + /** + * 客户ID + */ + private Integer customerID; + + /** + * 客户名称 + */ + private String customerName; + + /** + * 商品ID + */ + private Integer goodID; + + /** + * 商品名称 + */ + private String goodName; + + /** + * 出库仓库ID + */ + private Integer repositoryID; + + /** + * 商品出库数量 + */ + private long number; + + /** + * 出库日期 + */ + private Date time; + + /** + * 出库经手人 + */ + private String personInCharge;// 经手人 + + public Integer getRepositoryID() { + return repositoryID; + } + + public void setRepositoryID(Integer repositoryID) { + this.repositoryID = repositoryID; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getCustomerID() { + return customerID; + } + + public void setCustomerID(Integer customerID) { + this.customerID = customerID; + } + + public String getCustomerName() { + return customerName; + } + + public void setCustomerName(String customerName) { + this.customerName = customerName; + } + + public Integer getGoodID() { + return goodID; + } + + public void setGoodID(Integer goodID) { + this.goodID = goodID; + } + + public String getGoodName() { + return goodName; + } + + public void setGoodName(String goodName) { + this.goodName = goodName; + } + + public long getNumber() { + return number; + } + + public void setNumber(long number) { + this.number = number; + } + + public Date getTime() { + return time; + } + + public void setTime(Date time) { + this.time = time; + } + + public String getPersonInCharge() { + return personInCharge; + } + + public void setPersonInCharge(String personInCharge) { + this.personInCharge = personInCharge; + } + + @Override + public String toString() { + return "StockOutDO [id=" + id + ", customerID=" + customerID + ", customerName=" + customerName + ", goodID=" + + goodID + ", goodName=" + goodName + ", repositoryID=" + repositoryID + ", number=" + number + + ", time=" + time + ", personInCharge=" + personInCharge + "]"; + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockRecordDTO.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockRecordDTO.java new file mode 100644 index 0000000..a66569a --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/StockRecordDTO.java @@ -0,0 +1,129 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * 出库/入库记录DO + + */ +public class StockRecordDTO implements Serializable { + + /** + * 记录ID + */ + private Integer recordID; + + /** + * 记录的类型(出库/入库) + */ + private String type; + + /** + * 供应商(入库)或客户(出库)名称 + */ + private String supplierOrCustomerName; + + /** + * 商品名称 + */ + private String goodsName; + + /** + * 出库或入库仓库ID + */ + private Integer repositoryID; + + /** + * 出库或入库数量 + */ + private long number; + + /** + * 出库或入库时间 + */ + private String time; + + /** + * 出库或入库经手人 + */ + private String personInCharge; + + + public Integer getRecordID() { + return recordID; + } + + public String getType() { + return type; + } + + public String getSupplierOrCustomerName() { + return supplierOrCustomerName; + } + + public String getGoodsName() { + return goodsName; + } + + public Integer getRepositoryID() { + return repositoryID; + } + + public long getNumber() { + return number; + } + + public String getTime() { + return time; + } + + public String getPersonInCharge() { + return personInCharge; + } + + public void setRecordID(Integer recordID) { + this.recordID = recordID; + } + + public void setType(String type) { + this.type = type; + } + + public void setSupplierOrCustomerName(String supplierOrCustomerName) { + this.supplierOrCustomerName = supplierOrCustomerName; + } + + public void setGoodsName(String goodsName) { + this.goodsName = goodsName; + } + + public void setRepositoryID(Integer repositoryID) { + this.repositoryID = repositoryID; + } + + public void setNumber(long number) { + this.number = number; + } + + public void setTime(String time) { + this.time = time; + } + + public void setPersonInCharge(String personInCharge) { + this.personInCharge = personInCharge; + } + + @Override + public String toString() { + return "StockRecordDTO{" + + "recordID=" + recordID + + ", type='" + type + '\'' + + ", supplierOrCustomerName='" + supplierOrCustomerName + '\'' + + ", goodsName='" + goodsName + '\'' + + ", repositoryID=" + repositoryID + + ", number=" + number + + ", time=" + time + + ", personInCharge='" + personInCharge + '\'' + + '}'; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Storage.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Storage.java new file mode 100644 index 0000000..60f71fd --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Storage.java @@ -0,0 +1,83 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * 仓库库存 + + * + */ +public class Storage implements Serializable { + + private Integer goodsID;// 货物ID + private String goodsName;// 货物名称 + private String goodsSize;// 货物规格 + private String goodsType;// 货物类型 + private Double goodsValue;// 货物价值 + private Integer repositoryID;// 仓库ID + private Long number;// 库存数量 + + public Integer getGoodsID() { + return goodsID; + } + + public void setGoodsID(Integer goodsID) { + this.goodsID = goodsID; + } + + public String getGoodsName() { + return goodsName; + } + + public void setGoodsName(String goodsName) { + this.goodsName = goodsName; + } + + public String getGoodsSize() { + return goodsSize; + } + + public void setGoodsSize(String goodsSize) { + this.goodsSize = goodsSize; + } + + public String getGoodsType() { + return goodsType; + } + + public void setGoodsType(String goodsType) { + this.goodsType = goodsType; + } + + public Double getGoodsValue() { + return goodsValue; + } + + public void setGoodsValue(Double goodsValue) { + this.goodsValue = goodsValue; + } + + public Integer getRepositoryID() { + return repositoryID; + } + + public void setRepositoryID(Integer repositoryID) { + this.repositoryID = repositoryID; + } + + public Long getNumber() { + return number; + } + + public void setNumber(Long number) { + this.number = number; + } + + @Override + public String toString() { + return "Storage [goodsID=" + goodsID + ", goodsName=" + goodsName + ", goodsSize=" + goodsSize + ", goodsType=" + + goodsType + ", goodsValue=" + goodsValue + ", repositoryID=" + repositoryID + ", number=" + number + + "]"; + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Supplier.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Supplier.java new file mode 100644 index 0000000..947cd40 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/Supplier.java @@ -0,0 +1,73 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * 供应商信息 + + * + */ +public class Supplier implements Serializable { + + private Integer id;// 供应商ID + private String name;// 供应商名 + private String personInCharge;// 负责人 + private String tel;// 联系电话 + private String email;// 电子邮件 + private String address;// 供应商地址 + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPersonInCharge() { + return personInCharge; + } + + public void setPersonInCharge(String personInCharge) { + this.personInCharge = personInCharge; + } + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + @Override + public String toString() { + return "Supplier [id=" + id + ", name=" + name + ", personInCharge=" + personInCharge + ", tel=" + tel + + ", email=" + email + ", address=" + address + "]"; + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/User.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/User.java new file mode 100644 index 0000000..ab7d178 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/User.java @@ -0,0 +1,44 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * 系统的使用用户 + + */ +public class User implements Serializable { + + private Integer id;// 用户ID + private String userName;// 用户名 + private String password;// 用户密码 + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public String toString() { + return "User [id=" + id + ", userName=" + userName + ", password=" + password + "]"; + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserInfoDO.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserInfoDO.java new file mode 100644 index 0000000..5bb2ee6 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserInfoDO.java @@ -0,0 +1,76 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * 用户账户信息(数据传输对象) + + */ +public class UserInfoDO implements Serializable { + + /** + * 用户ID + */ + private Integer userID; + + /** + * 用户名 + */ + private String userName; + + /** + * 用户密码(已加密) + */ + private String password; + + /** + * 是否为初次登陆 + */ + private int firstLogin; + + /** + * 用户账户属性的 getter 以及 setter + */ + + public String getUserName() { + return userName; + } + + public int getFirstLogin() { + return firstLogin; + } + + public void setFirstLogin(int firstLogin) { + this.firstLogin = firstLogin; + } + + public Integer getUserID() { + return userID; + } + + public String getPassword() { + return password; + } + + public void setUserID(Integer userID) { + this.userID = userID; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public String toString() { + return "UserInfoDO{" + + "userID=" + userID + + ", userName='" + userName + '\'' + + ", password='" + password + '\'' + + ", firstLogin=" + firstLogin + + '}'; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserInfoDTO.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserInfoDTO.java new file mode 100644 index 0000000..3644588 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserInfoDTO.java @@ -0,0 +1,119 @@ +package com.ken.wms.domain; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 用户账户信息(数据传输对象) + * + + */ +public class UserInfoDTO implements Serializable { + + /** + * 用户ID + */ + private Integer userID; + + /** + * 用户名 + */ + private String userName; + + /** + * 用户密码(已加密) + */ + private String password; + + /** + * 是否为初次登陆 + */ + private boolean firstLogin; + + /** + * 用户登陆的IP + */ + private String accessIP; + + /** + * 用户角色 + */ + private List role = new ArrayList<>(); + + /** + * 用户指派的仓库 + */ + private Integer repositoryBelong; + + /** + * 用户账户属性的 getter 以及 setter + */ + + public String getUserName() { + return userName; + } + + public void setFirstLogin(boolean firstLogin) { + this.firstLogin = firstLogin; + } + + public List getRole() { + return role; + } + + public Integer getUserID() { + return userID; + } + + public String getPassword() { + return password; + } + + public void setUserID(Integer userID) { + this.userID = userID; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public void setPassword(String password) { + this.password = password; + } + + public void setRole(List role) { + this.role = role; + } + + public boolean isFirstLogin() { + return firstLogin; + } + + public Integer getRepositoryBelong() { + return repositoryBelong; + } + + public void setRepositoryBelong(Integer repositoryBelong) { + this.repositoryBelong = repositoryBelong; + } + + public String getAccessIP() { + return accessIP; + } + + public void setAccessIP(String accessIP) { + this.accessIP = accessIP; + } + + @Override + public String toString() { + return "UserInfoDTO{" + + "userID=" + userID + + ", userName='" + userName + '\'' + + ", password='" + password + '\'' + + ", firstLogin=" + firstLogin + + ", role=" + role + + '}'; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserOperationRecordDO.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserOperationRecordDO.java new file mode 100644 index 0000000..4a44334 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserOperationRecordDO.java @@ -0,0 +1,102 @@ +package com.ken.wms.domain; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户操作记录DO + * + + */ +public class UserOperationRecordDO implements Serializable { + + /** + * 记录ID + */ + private Integer id; + + /** + * 执行操作的用户ID + */ + private Integer userID; + + /** + * 执行操作的用户名 + */ + private String userName; + + /** + * 操作的名称 + */ + private String operationName; + + /** + * 执行操作的时间 + */ + private Date operationTime; + + /** + * 执行操作结果 + */ + private String operationResult; + + public void setId(Integer id) { + this.id = id; + } + + public void setUserID(Integer userID) { + this.userID = userID; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public void setOperationName(String operationName) { + this.operationName = operationName; + } + + public void setOperationTime(Date operationTime) { + this.operationTime = operationTime; + } + + public void setOperationResult(String operationResult) { + this.operationResult = operationResult; + } + + public Integer getId() { + return id; + } + + public Integer getUserID() { + return userID; + } + + public String getUserName() { + return userName; + } + + public String getOperationName() { + return operationName; + } + + public Date getOperationTime() { + return operationTime; + } + + public String getOperationResult() { + return operationResult; + } + + @Override + public String toString() { + return "UserOperationRecordDO{" + + "id=" + id + + ", userID=" + userID + + ", userName='" + userName + '\'' + + ", operationName='" + operationName + '\'' + + ", operationTime=" + operationTime + + ", operationResult='" + operationResult + '\'' + + '}'; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserOperationRecordDTO.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserOperationRecordDTO.java new file mode 100644 index 0000000..bf26ab3 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/domain/UserOperationRecordDTO.java @@ -0,0 +1,101 @@ +package com.ken.wms.domain; + +import java.io.Serializable; + +/** + * 用户操作记录DTO + * + + */ +public class UserOperationRecordDTO implements Serializable { + + /** + * 操作记录ID + */ + private Integer id; + + /** + * 执行操作的用户ID + */ + private Integer userID; + + /** + * 执行操作的用户名 + */ + private String userName; + + /** + * 操作的名称 + */ + private String operationName; + + /** + * 操作执行的时间 + */ + private String operationTime; + + /** + * 操作执行的结果 + */ + private String operationResult; + + public Integer getId() { + return id; + } + + public Integer getUserID() { + return userID; + } + + public String getUserName() { + return userName; + } + + public String getOperationName() { + return operationName; + } + + public String getOperationTime() { + return operationTime; + } + + public String getOperationResult() { + return operationResult; + } + + public void setId(Integer id) { + this.id = id; + } + + public void setUserID(Integer userID) { + this.userID = userID; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public void setOperationName(String operationName) { + this.operationName = operationName; + } + + public void setOperationTime(String operationTime) { + this.operationTime = operationTime; + } + + public void setOperationResult(String operationResult) { + this.operationResult = operationResult; + } + + @Override + public String toString() { + return "UserOperationRecordDTO{" + + "id=" + id + + ", userID=" + userID + + ", userName='" + userName + '\'' + + ", operationName='" + operationName + '\'' + + ", operationTime='" + operationTime + '\'' + + ", operationResult='" + operationResult + '\'' + + '}'; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/BusinessException.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/BusinessException.java new file mode 100644 index 0000000..2536bf2 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/BusinessException.java @@ -0,0 +1,33 @@ +package com.ken.wms.exception; + +/** + * 业务层异常的父类 + + */ +public class BusinessException extends Exception{ + + private String exceptionDesc; + + public BusinessException(Exception e){ + super(e); + } + + BusinessException(Exception e, String exceptionDesc){ + super(e); + this.exceptionDesc = exceptionDesc; + } + + BusinessException(String exceptionDesc){ + this.exceptionDesc = exceptionDesc; + } + + BusinessException(){} + + public String getExceptionDesc() { + return exceptionDesc; + } + + public void setExceptionDesc(String exceptionDesc) { + this.exceptionDesc = exceptionDesc; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/CustomerManageServiceException.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/CustomerManageServiceException.java new file mode 100644 index 0000000..15b4836 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/CustomerManageServiceException.java @@ -0,0 +1,21 @@ +package com.ken.wms.exception; + +/** + * CustomerManageService异常 + * + + */ +public class CustomerManageServiceException extends BusinessException{ + + public CustomerManageServiceException(){ + super(); + } + + public CustomerManageServiceException(Exception e, String exception){ + super(e, exception); + } + + public CustomerManageServiceException(Exception e){ + super(e); + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/GoodsManageServiceException.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/GoodsManageServiceException.java new file mode 100644 index 0000000..10ab817 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/GoodsManageServiceException.java @@ -0,0 +1,21 @@ +package com.ken.wms.exception; + +/** + * GoodsManageService异常 + + */ +public class GoodsManageServiceException extends com.ken.wms.exception.BusinessException { + + GoodsManageServiceException(){ + super(); + } + + public GoodsManageServiceException(Exception e){ + super(e); + } + + GoodsManageServiceException(Exception e, String exceptionDesc){ + super(e, exceptionDesc); + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/RepositoryAdminManageServiceException.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/RepositoryAdminManageServiceException.java new file mode 100644 index 0000000..55a0ce9 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/RepositoryAdminManageServiceException.java @@ -0,0 +1,25 @@ +package com.ken.wms.exception; + +/** + * RepositoryAdminManageService异常 + * + + */ +public class RepositoryAdminManageServiceException extends BusinessException { + + public RepositoryAdminManageServiceException(){ + super(); + } + + public RepositoryAdminManageServiceException(Exception e){ + super(e); + } + + public RepositoryAdminManageServiceException(Exception e, String exceptionDesc){ + super(e, exceptionDesc); + } + + public RepositoryAdminManageServiceException(String exceptionDesc){ + super(exceptionDesc); + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/RepositoryManageServiceException.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/RepositoryManageServiceException.java new file mode 100644 index 0000000..b28a977 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/RepositoryManageServiceException.java @@ -0,0 +1,21 @@ +package com.ken.wms.exception; + +/** + * RepositoryManageService异常 + + */ +public class RepositoryManageServiceException extends BusinessException { + + RepositoryManageServiceException(){ + super(); + } + + public RepositoryManageServiceException(Exception e){ + super(e); + } + + RepositoryManageServiceException(Exception e, String exceptionDesc){ + super(e, exceptionDesc); + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/StockRecordManageServiceException.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/StockRecordManageServiceException.java new file mode 100644 index 0000000..f91f826 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/StockRecordManageServiceException.java @@ -0,0 +1,26 @@ +package com.ken.wms.exception; + +/** + * StockRecordManageService异常 + * + + */ +public class StockRecordManageServiceException extends BusinessException { + + public StockRecordManageServiceException(){ + super(); + } + + public StockRecordManageServiceException(Exception e){ + super(e); + } + + public StockRecordManageServiceException(Exception e, String exceptionDesc){ + super(e, exceptionDesc); + } + + public StockRecordManageServiceException(String exceptionDesc){ + super(exceptionDesc); + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/StorageManageServiceException.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/StorageManageServiceException.java new file mode 100644 index 0000000..f486b41 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/StorageManageServiceException.java @@ -0,0 +1,21 @@ +package com.ken.wms.exception; + +/** + * StorageManageServiceException异常 + + */ +public class StorageManageServiceException extends BusinessException { + + StorageManageServiceException(){ + super(); + } + + public StorageManageServiceException(Exception e){ + super(e); + } + + StorageManageServiceException(Exception e, String exceptionDesc){ + super(e, exceptionDesc); + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/SupplierManageServiceException.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/SupplierManageServiceException.java new file mode 100644 index 0000000..3481bf9 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/SupplierManageServiceException.java @@ -0,0 +1,21 @@ +package com.ken.wms.exception; + +/** + * SupplierManageService异常 + + */ +public class SupplierManageServiceException extends BusinessException { + + SupplierManageServiceException(){ + super(); + } + + public SupplierManageServiceException(Exception e){ + super(e); + } + + SupplierManageServiceException(Exception e, String exceptionDesc){ + super(e, exceptionDesc); + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/SystemLogServiceException.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/SystemLogServiceException.java new file mode 100644 index 0000000..38c7fcd --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/SystemLogServiceException.java @@ -0,0 +1,24 @@ +package com.ken.wms.exception; + +/** + * 系统操作日志 Service 异常 + + */ +public class SystemLogServiceException extends BusinessException { + + public SystemLogServiceException(){ + super(); + } + + public SystemLogServiceException(Exception e){ + super(e); + } + + public SystemLogServiceException(Exception e, String exceptionDesc){ + super(e, exceptionDesc); + } + + public SystemLogServiceException(String exceptionDesc){ + super(exceptionDesc); + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/UserAccountServiceException.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/UserAccountServiceException.java new file mode 100644 index 0000000..c47609f --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/UserAccountServiceException.java @@ -0,0 +1,28 @@ +package com.ken.wms.exception; + +/** + * AccountServiceException异常 + + */ +public class UserAccountServiceException extends BusinessException { + + public static final String PASSWORD_ERROR = "passwordError"; + public static final String PASSWORD_UNMATCH = "passwordUnmatched"; + + public UserAccountServiceException() { + super(); + } + + public UserAccountServiceException(String exceptionDesc) { + super(null, exceptionDesc); + } + + UserAccountServiceException(Exception e) { + super(e); + } + + UserAccountServiceException(Exception e, String exceptionDesc) { + super(e, exceptionDesc); + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/UserInfoServiceException.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/UserInfoServiceException.java new file mode 100644 index 0000000..386378f --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/exception/UserInfoServiceException.java @@ -0,0 +1,25 @@ +package com.ken.wms.exception; + +/** + * UserInfoService异常 + + */ +public class UserInfoServiceException extends BusinessException { + + public UserInfoServiceException(){ + super(); + } + + public UserInfoServiceException(Exception e){ + super(e); + } + + public UserInfoServiceException(Exception e, String exceptionDesc){ + super(e, exceptionDesc); + } + + public UserInfoServiceException(String exceptionDesc){ + super(exceptionDesc); + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/controller/AccountHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/controller/AccountHandler.java new file mode 100644 index 0000000..1a44b1a --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/controller/AccountHandler.java @@ -0,0 +1,232 @@ +package com.ken.wms.security.controller; + +import com.ken.wms.common.service.Interface.RepositoryAdminManageService; +import com.ken.wms.common.service.Interface.SystemLogService; +import com.ken.wms.common.util.Response; +import com.ken.wms.common.util.ResponseFactory; +import com.ken.wms.domain.RepositoryAdmin; +import com.ken.wms.domain.UserInfoDTO; +import com.ken.wms.exception.RepositoryAdminManageServiceException; +import com.ken.wms.exception.SystemLogServiceException; +import com.ken.wms.exception.UserAccountServiceException; +import com.ken.wms.security.service.Interface.AccountService; +import com.ken.wms.security.util.CaptchaGenerator; +import org.apache.log4j.Logger; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * 用户账户请求 Handler + + */ +@Controller +@RequestMapping("/account") +public class AccountHandler { + + private static Logger log = Logger.getLogger("application"); + + @Autowired + private AccountService accountService; + @Autowired + private SystemLogService systemLogService; + @Autowired + private RepositoryAdminManageService repositoryAdminManageService; + + private static final String USER_ID = "id"; + private static final String USER_NAME = "userName"; + private static final String USER_PASSWORD = "password"; + + /** + * 登陆账户 + * + * @param user 账户信息 + * @return 返回一个 Map 对象,其中包含登陆操作的结果 + */ + @RequestMapping(value = "login", method = RequestMethod.POST) + @ResponseBody + public Map login(@RequestBody Map user) { + // 初始化 Response + Response response = ResponseFactory.newInstance(); + String result = Response.RESPONSE_RESULT_ERROR; + String errorMsg = ""; + + // 获取当前的用户的 Subject + Subject currentUser = SecurityUtils.getSubject(); + + // 判断用户是否已经登陆 + if (currentUser != null && !currentUser.isAuthenticated()) { + String id = (String) user.get(USER_ID); + String password = (String) user.get(USER_PASSWORD); + Session session = currentUser.getSession(); + UsernamePasswordToken token = new UsernamePasswordToken(id, password); + + try { + // 执行登陆操作 + currentUser.login(token); + + /* 设置 session 中 userInfo 的其他信息 */ + UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo"); + // 设置登陆IP + userInfo.setAccessIP(session.getHost()); + // 查询并设置用户所属的仓库ID + List repositoryAdmin = (List) repositoryAdminManageService.selectByID(userInfo.getUserID()).get("data"); + userInfo.setRepositoryBelong(-1); + if (!repositoryAdmin.isEmpty()) { + Integer repositoryBelong = repositoryAdmin.get(0).getRepositoryBelongID(); + if (repositoryBelong != null) { + userInfo.setRepositoryBelong(repositoryBelong); + } + } + + // 记录登陆日志 + systemLogService.insertAccessRecord(userInfo.getUserID(), userInfo.getUserName(), + userInfo.getAccessIP(), SystemLogService.ACCESS_TYPE_LOGIN); + + // 设置登陆成功响应 + result = Response.RESPONSE_RESULT_SUCCESS; + + } catch (UnknownAccountException e) { + errorMsg = "unknownAccount"; + } catch (IncorrectCredentialsException e) { + errorMsg = "incorrectCredentials"; + } catch (AuthenticationException e) { + errorMsg = "authenticationError"; + e.printStackTrace(); + } catch (SystemLogServiceException | RepositoryAdminManageServiceException e) { + errorMsg = "ServerError"; + } finally { + // 当登陆失败则清除session中的用户信息 + if (result.equals(Response.RESPONSE_RESULT_ERROR)) { + session.setAttribute("userInfo", null); + } + } + } else { + errorMsg = "already login"; + } + + // 设置 Response + response.setResponseResult(result); + response.setResponseMsg(errorMsg); + return response.generateResponse(); + } + + /** + * 注销账户 + * + * @return 返回一个 Map 对象,键值为 result 的内容代表注销操作的结果,值为 success 或 error + */ + @RequestMapping(value = "logout", method = RequestMethod.GET) + public + @ResponseBody + Map logout() { + // 初始化 Response + Response response = ResponseFactory.newInstance(); + + Subject currentSubject = SecurityUtils.getSubject(); + if (currentSubject != null && currentSubject.isAuthenticated()) { + // 执行账户注销操作 + currentSubject.logout(); + response.setResponseResult(Response.RESPONSE_RESULT_SUCCESS); + } else { + response.setResponseResult(Response.RESPONSE_RESULT_ERROR); + response.setResponseMsg("did not login"); + } + + return response.generateResponse(); + } + + /** + * 修改账户密码 + * + * @param passwordInfo 密码信息 + * @param request 请求 + * @return 返回一个 Map 对象,其中键值为 result 代表修改密码操作的结果, + * 值为 success 或 error;键值为 msg 代表需要返回给用户的信息 + */ + @RequestMapping(value = "passwordModify", method = RequestMethod.POST) + public + @ResponseBody + Map passwordModify(@RequestBody Map passwordInfo, + HttpServletRequest request) { + //初始化 Response + Response responseContent = ResponseFactory.newInstance(); + + String errorMsg = null; + String result = Response.RESPONSE_RESULT_ERROR; + + // 获取用户 ID + HttpSession session = request.getSession(); + UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo"); + Integer userID = userInfo.getUserID(); + + try { + // 更改密码 + accountService.passwordModify(userID, passwordInfo); + + result = Response.RESPONSE_RESULT_SUCCESS; + } catch (UserAccountServiceException e) { + errorMsg = e.getExceptionDesc(); + } + // 设置 Response + responseContent.setResponseResult(result); + responseContent.setResponseMsg(errorMsg); + return responseContent.generateResponse(); + } + + /** + * 获取图形验证码 将返回一个包含4位字符(字母或数字)的图形验证码,并且将图形验证码的值设置到用户的 session 中 + * + * @param time 时间戳 + * @param response 返回的 HttpServletResponse 响应 + */ + @RequestMapping(value = "checkCode/{time}", method = RequestMethod.GET) + public void getCheckCode(@PathVariable("time") String time, HttpServletResponse response, HttpServletRequest request) { + + BufferedImage checkCodeImage = null; + String checkCodeString = null; + + // 获取图形验证码 + Map checkCode = CaptchaGenerator.generateCaptcha(); + + if (checkCode != null) { + checkCodeString = (String) checkCode.get("captchaString"); + checkCodeImage = (BufferedImage) checkCode.get("captchaImage"); + } + + if (checkCodeString != null && checkCodeImage != null) { + try (ServletOutputStream outputStream = response.getOutputStream()) { + // 设置 Session + HttpSession session = request.getSession(); + session.setAttribute("checkCode", checkCodeString); + + // 将验证码输出 + ImageIO.write(checkCodeImage, "png", outputStream); + + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); + response.setContentType("image/png"); + } catch (IOException e) { + log.error("fail to get the ServletOutputStream"); + } + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/controller/PageForwardHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/controller/PageForwardHandler.java new file mode 100644 index 0000000..06c662e --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/controller/PageForwardHandler.java @@ -0,0 +1,41 @@ +package com.ken.wms.security.controller; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * 页面重定向 + * +. + */ +@RequestMapping("/") +@Controller +public class PageForwardHandler { + + /** + * 内部重定向到登陆页面 + * + * @return 跳转的 jsp + */ + @RequestMapping("login") + public String loginPageForward() { + // 判断但钱用户是否已经登陆 + Subject currentSubject = SecurityUtils.getSubject(); + if (!currentSubject.isAuthenticated()) + return "login"; + else + return "mainPage"; + } + + /** + * 内部重定向到主页面 + * + * @return 跳转的 jsp + */ + @RequestMapping("") + public String showLoginView() { + return "mainPage"; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/AnyOfRolesAuthorizationFilter.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/AnyOfRolesAuthorizationFilter.java new file mode 100644 index 0000000..c61c2d1 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/AnyOfRolesAuthorizationFilter.java @@ -0,0 +1,38 @@ +package com.ken.wms.security.filter; + +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; + +/** + * 自定义过滤器,继承自 RolesAuthorizationFilter ,实现了多个角色可以访问某一条url + + */ +public class AnyOfRolesAuthorizationFilter extends RolesAuthorizationFilter{ + + @Override + public boolean isAccessAllowed(ServletRequest request, ServletResponse response, + Object mappedValue) throws IOException{ + + final Subject subject = getSubject(request, response); + final String[] rolesArray = (String[]) mappedValue; + + if (rolesArray == null || rolesArray.length == 0){ + // no roles specified, so nothing to check - allow access +// System.out.println("no roles"); + return true; + } + + for (String role : rolesArray){ +// System.out.println(role); + if (subject.hasRole(role)){ + return true; + } + } + + return false; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/ExtendFormAuthenticationFilter.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/ExtendFormAuthenticationFilter.java new file mode 100644 index 0000000..9684592 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/ExtendFormAuthenticationFilter.java @@ -0,0 +1,95 @@ +package com.ken.wms.security.filter; + +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 扩展 FormAuthenticationFilter ,对部分方法重写,使其支持 Ajax 请求 + * + + */ +public class ExtendFormAuthenticationFilter extends FormAuthenticationFilter { + private static final Logger log = LoggerFactory.getLogger(FormAuthenticationFilter.class); + + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception{ + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + + if (!"XMLHttpRequest".equalsIgnoreCase(httpServletRequest.getHeader("X-Requested-with"))){ + // 请求为普通请求 + if(this.isLoginRequest(request, response)) { + if(this.isLoginSubmission(request, response)) { + if(log.isTraceEnabled()) { + log.trace("Login submission detected. Attempting to execute login."); + } + + return this.executeLogin(request, response); + } else { + if(log.isTraceEnabled()) { + log.trace("Login page view."); + } + + return true; + } + } else { + if(log.isTraceEnabled()) { + log.trace("Attempting to access a path which requires authentication. Forwarding to the Authentication url [" + this.getLoginUrl() + "]"); + } + + this.saveRequestAndRedirectToLogin(request, response); + return false; + } + }else{ + // 请求为 Ajax 请求 + httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN); + return false; + } + } + + @Override + protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + + if (!"XMLHttpRequest".equalsIgnoreCase(httpServletRequest.getHeader("X-Requested-with"))){ + // 请求为普通请求 + this.issueSuccessRedirect(request, response); + }else{ + // 请求为 Ajax 请求 + httpServletResponse.setStatus(HttpServletResponse.SC_OK); + } + + return false; + } + + @Override + protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) { + if(log.isDebugEnabled()) { + log.debug("Authentication exception", e); + } + + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + + if (!"XMLHttpRequest".equalsIgnoreCase(httpServletRequest.getHeader("X-Requested-With"))){ + // 请求为普通请求 + this.setFailureAttribute(request, e); + return true; + }else{ + // 请求为 Ajax 请求 + // do some thing to return a json + httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN); + return false; + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/KickoutSessionControlFilter.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/KickoutSessionControlFilter.java new file mode 100644 index 0000000..5be3d5c --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/filter/KickoutSessionControlFilter.java @@ -0,0 +1,151 @@ +package com.ken.wms.security.filter; + +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheManager; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.mgt.DefaultSessionKey; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.AccessControlFilter; +import org.apache.shiro.web.util.WebUtils; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.Serializable; +import java.util.Deque; +import java.util.LinkedList; + +/** + * 实现并发登陆人数控制 + * + + */ +public class KickoutSessionControlFilter extends AccessControlFilter { + + /** + * 用户踢出后跳转地址 + */ + private String kickOutUrl; + + /** + * 是否踢出之后登陆的用户 + */ + private boolean kickOutAfter; + + /** + * 同一账号最大登陆数目 + */ + private int maxSessionNum; + + private SessionManager sessionManager; + private Cache> cache; + + public void setKickOutUrl(String kickOutUrl) { + this.kickOutUrl = kickOutUrl; + } + + public void setKickOutAfter(boolean kickOutAfter) { + this.kickOutAfter = kickOutAfter; + } + + public void setMaxSessionNum(int maxSessionNum) { + this.maxSessionNum = maxSessionNum; + } + + public void setSessionManager(SessionManager sessionManager) { + this.sessionManager = sessionManager; + } + + public void setCacheManager(CacheManager cacheManager) { + this.cache = cacheManager.getCache("sessionCache"); + } + + @Override + protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception { + return false; + } + + /** + * 表示访问拒绝时是否自己处理,如果返回true表示自己不处理且继续拦截器链执行, + * 返回false表示自己已经处理了(比如重定向到另一个页面)。 + * 根据 isAccessAllowed 方法的返回值 + * + * @param servletRequest request + * @param servletResponse response + * @return 返回是否已经处理访问拒绝 + * @throws Exception exception + */ + @Override + protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { + // 如果用户还没有登陆则继续后续的流程 + Subject subject = getSubject(servletRequest, servletResponse); + if (!subject.isAuthenticated() && !subject.isRemembered()) + return true; + + // 判断当前用户登陆数量是否超出 + Session session = subject.getSession(); + String userName = (String) subject.getPrincipal(); + Serializable sessionId = session.getId(); + + // 初始化用户的登陆队列,将用户的队列放入到缓存中 + Deque deque = cache.get(userName); + if (deque == null) { + deque = new LinkedList<>(); + cache.put(userName, deque); + } + + // 如果队列中没有此用户的 sessionId 且用户没有被踢出,则放入队列 + if (!deque.contains(sessionId) && session.getAttribute("kickOut") == null) { + deque.push(sessionId); + } + + // 若队列中的 sessionId 是否超出最大会话数目, 则踢出用户 + while (deque.size() > maxSessionNum) { + Serializable kickOutSessionId; + if (kickOutAfter) { + kickOutSessionId = deque.removeFirst(); + } else { + kickOutSessionId = deque.removeLast(); + } + + // 设置 sessionId 对应的 session 中的字段,表示该用户已经被踢出 + try { + Session kickOutSession = sessionManager.getSession(new DefaultSessionKey(kickOutSessionId)); + if (kickOutSession != null) { + kickOutSession.setAttribute("kickOut", true); + } + } catch (Exception e) { + // do logging + e.printStackTrace(); + } + } + + // 如果当前登陆用户被踢出,则退出并跳转 + if (session.getAttribute("kickOut") != null && Boolean.TRUE.equals(session.getAttribute("kickOut"))) { + try { + // 登出 + subject.logout(); + + // 根据请求类型作出处理 + HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; + HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; + if (!"XMLHttpRequest".equalsIgnoreCase(httpServletRequest.getHeader("X-Requested-with"))) { + // 普通请求 + WebUtils.issueRedirect(httpServletRequest, httpServletResponse, kickOutUrl); + } else { + // ajax 请求 + httpServletResponse.setStatus(430); + } + + } catch (Exception e) { + // do nothing + } + return false; + } + + return true; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/listener/SessionListener.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/listener/SessionListener.java new file mode 100644 index 0000000..d60633c --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/listener/SessionListener.java @@ -0,0 +1,55 @@ +package com.ken.wms.security.listener; + +import com.ken.wms.common.service.Interface.SystemLogService; +import com.ken.wms.domain.UserInfoDTO; +import com.ken.wms.exception.SystemLogServiceException; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.SessionListenerAdapter; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Shiro Session 监听器 + * 当Shiro 的 session 被创建、注销或过期的时候触发 + + */ +public class SessionListener extends SessionListenerAdapter { + + @Autowired + private SystemLogService systemLogService; + + @Override + public void onStart(Session session) { + super.onStart(session); + } + + @Override + public void onStop(Session session) { + super.onStop(session); + sessionDestroyedLog(session); + } + + @Override + public void onExpiration(Session session) { + super.onExpiration(session); + sessionDestroyedLog(session); + } + + /** + * 当 Shiro Session 被销毁时, 对已登陆的用户记录访问日志 + * + * @param session 被销毁的 Session + */ + private void sessionDestroyedLog(Session session) { + // 判断是否为已经登陆的用户, 判断依据是isAuthentication的值 + UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo"); + if (userInfo != null) { + try { + // 记录登出日志 + systemLogService.insertAccessRecord(userInfo.getUserID(), userInfo.getUserName(), + userInfo.getAccessIP(), SystemLogService.ACCESS_TYPE_LOGOUT); + } catch (SystemLogServiceException e) { + // do log + } + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/realms/UserAuthorizingRealm.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/realms/UserAuthorizingRealm.java new file mode 100644 index 0000000..51d8430 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/realms/UserAuthorizingRealm.java @@ -0,0 +1,104 @@ +package com.ken.wms.security.realms; + +import com.ken.wms.domain.UserInfoDTO; +import com.ken.wms.exception.UserInfoServiceException; +import com.ken.wms.security.service.Interface.UserInfoService; +import com.ken.wms.security.util.MD5Util; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.*; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.subject.Subject; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashSet; +import java.util.Set; + +/** + * 用户的认证与授权 + * + + */ +public class UserAuthorizingRealm extends AuthorizingRealm { + + @Autowired + private UserInfoService userInfoService; + + /** + * 对用户进行角色授权 + * + * @param principalCollection 用户信息 + * @return 返回用户授权信息 + */ + @SuppressWarnings("unchecked") + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { + // 创建存放用户角色的 Set + Set roles = new HashSet<>(); + + //获取用户角色 + Subject currentSubject = SecurityUtils.getSubject(); + Session session = currentSubject.getSession(); + UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo"); + roles.addAll(userInfo.getRole()); + + return new SimpleAuthorizationInfo(roles); + } + + /** + * 对用户进行认证 + * + * @param authenticationToken 用户凭证 + * @return 返回用户的认证信息 + * @throws AuthenticationException 用户认证异常信息 + */ + @SuppressWarnings("unchecked") + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws + AuthenticationException { + + String realmName = getName(); + String credentials = ""; + + try { + // 获取用户名对应的用户账户信息 + UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken; + String principal = usernamePasswordToken.getUsername(); + + if (!StringUtils.isNumeric(principal)) + throw new AuthenticationException(); + + Integer userID = Integer.valueOf(principal); + UserInfoDTO userInfoDTO = userInfoService.getUserInfo(userID); + + if (userInfoDTO != null) { + Subject currentSubject = SecurityUtils.getSubject(); + Session session = currentSubject.getSession(); + + // 设置用户信息到 Session + session.setAttribute("userInfo", userInfoDTO); + + // 结合验证码对密码进行处理 + String checkCode = (String) session.getAttribute("checkCode"); + String password = userInfoDTO.getPassword(); + if (checkCode != null && password != null) { + checkCode = checkCode.toUpperCase(); + credentials = MD5Util.MD5(password + checkCode); + } + + // 清除 session 中的 userInfo 密码敏感信息 + userInfoDTO.setPassword(null); + } + + // 返回封装的认证信息 + return new SimpleAuthenticationInfo(principal, credentials, realmName); + + } catch (UserInfoServiceException e) { + throw new AuthenticationException(); + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/FilterChainDefinitionMapBuilder.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/FilterChainDefinitionMapBuilder.java new file mode 100644 index 0000000..5b1416b --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/FilterChainDefinitionMapBuilder.java @@ -0,0 +1,95 @@ +package com.ken.wms.security.service; + +import com.ken.wms.dao.RolePermissionMapper; +import com.ken.wms.domain.RolePermissionDO; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.LinkedHashMap; +import java.util.List; + +/** + * 获取 URL 权限信息工厂类 + + */ +public class FilterChainDefinitionMapBuilder { + @Autowired + private RolePermissionMapper rolePermissionMapper; + private StringBuilder builder = new StringBuilder(); + + /** + * 获取授权信息 + * @return 返回授权信息列表 + */ + public LinkedHashMap builderFilterChainDefinitionMap(){ + LinkedHashMap permissionMap = new LinkedHashMap<>(); + + // 固定的权限配置 + permissionMap.put("/css/**", "anon"); + permissionMap.put("/js/**", "anon"); + permissionMap.put("/fonts/**", "anon"); + permissionMap.put("/media/**", "anon"); + permissionMap.put("/pagecomponent/**", "anon"); + permissionMap.put("/login", "anon, kickOut"); + permissionMap.put("/account/login", "anon"); + permissionMap.put("/account/checkCode/**", "anon"); + + // 可变化的权限配置 + LinkedHashMap permissions = getPermissionDataFromDB(); + if (permissions != null){ + permissionMap.putAll(permissions); + } + + // 其余权限配置 + permissionMap.put("/", "authc"); + +// permissionMap.forEach((s, s2) -> {System.out.println(s + ":" + s2);}); + + return permissionMap; + } + + /** + * 获取配置在数据库中的 URL 权限信息 + * @return 返回所有保存在数据库中的 URL 保存信息 + */ + private LinkedHashMap getPermissionDataFromDB(){ + LinkedHashMap permissionData = null; + + List rolePermissionDOS = rolePermissionMapper.selectAll(); + if (rolePermissionDOS != null){ + permissionData = new LinkedHashMap<>(rolePermissionDOS.size()); + String url; + String role; + String permission; + for (RolePermissionDO rolePermissionDO : rolePermissionDOS){ + url = rolePermissionDO.getUrl(); + role = rolePermissionDO.getRole(); + + // 判断该 url 是否已经存在 + if (permissionData.containsKey(url)){ + builder.delete(0, builder.length()); + builder.append(permissionData.get(url)); + builder.insert(builder.length() - 1, ","); + builder.insert(builder.length() - 1, role); + }else{ + builder.delete(0, builder.length()); + builder.append("authc,kickOut,roles[").append(role).append("]"); + } + permission = builder.toString(); +// System.out.println(url + ":" + permission); + permissionData.put(url, permission); + } + } + + return permissionData; + } + +// /** +// * 构造角色权限 +// * @param role 角色 +// * @return 返回 roles[role name] 格式的字符串 +// */ +// private String permissionStringBuilder(String role){ +// builder.delete(0, builder.length()); +// return builder.append("authc,roles[").append(role).append("]").toString(); +// } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Impl/AccountServiceImpl.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Impl/AccountServiceImpl.java new file mode 100644 index 0000000..2f49627 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Impl/AccountServiceImpl.java @@ -0,0 +1,86 @@ +package com.ken.wms.security.service.Impl; + + +import com.ken.wms.domain.UserInfoDTO; +import com.ken.wms.exception.UserAccountServiceException; +import com.ken.wms.exception.UserInfoServiceException; +import com.ken.wms.security.service.Interface.AccountService; +import com.ken.wms.security.service.Interface.UserInfoService; +import com.ken.wms.security.util.MD5Util; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; + +/** + * 账户Service + + */ +@Service +public class AccountServiceImpl implements AccountService { + + @Autowired + private UserInfoService userInfoService; + + private static final String OLD_PASSWORD = "oldPassword"; + private static final String NEW_PASSWORD = "newPassword"; + private static final String REPEAT_PASSWORD = "rePassword"; + + /** + * 密码更改 + */ + @Override + public void passwordModify(Integer userID, Map passwordInfo) throws UserAccountServiceException { + + if (passwordInfo == null) + throw new UserAccountServiceException(UserAccountServiceException.PASSWORD_ERROR); + + // 获取更改密码信息 + String rePassword = (String) passwordInfo.get(REPEAT_PASSWORD); + String newPassword = (String) passwordInfo.get(NEW_PASSWORD); + String oldPassword = (String) passwordInfo.get(OLD_PASSWORD); + if (rePassword == null || newPassword == null || oldPassword == null) + throw new UserAccountServiceException(UserAccountServiceException.PASSWORD_ERROR); + + try { + // 获取用户的账户信息 + UserInfoDTO user = userInfoService.getUserInfo(userID); + if (user == null) { + throw new UserAccountServiceException(UserAccountServiceException.PASSWORD_ERROR); + } + + // 新密码一致性验证 + if (!newPassword.equals(rePassword)) { + throw new UserAccountServiceException(UserAccountServiceException.PASSWORD_UNMATCH); + } + + // 原密码正确性验证 + String password; + password = MD5Util.MD5(oldPassword + userID); + if (!password.equals(user.getPassword())) + throw new UserAccountServiceException(UserAccountServiceException.PASSWORD_ERROR); + + // 获得新的密码并加密 + password = MD5Util.MD5(newPassword + userID); + + // 验证成功后更新数据库 + user.setPassword(password); + user.setFirstLogin(false); + userInfoService.updateUserInfo(user); + + // 更新密码修改信息(是否为初次修改密码) + Subject currentSubject = SecurityUtils.getSubject(); + Session session = currentSubject.getSession(); + session.setAttribute("firstLogin", false); + + } catch (NullPointerException | UserInfoServiceException e) { + throw new UserAccountServiceException(UserAccountServiceException.PASSWORD_ERROR); + } + + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Impl/UserInfoServiceImpl.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Impl/UserInfoServiceImpl.java new file mode 100644 index 0000000..362c63c --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Impl/UserInfoServiceImpl.java @@ -0,0 +1,265 @@ +package com.ken.wms.security.service.Impl; + +import com.ken.wms.dao.RolesMapper; +import com.ken.wms.dao.UserInfoMapper; +import com.ken.wms.dao.UserPermissionMapper; +import com.ken.wms.domain.RoleDO; +import com.ken.wms.domain.UserInfoDO; +import com.ken.wms.domain.UserInfoDTO; +import com.ken.wms.exception.UserInfoServiceException; +import com.ken.wms.security.service.Interface.UserInfoService; +import com.ken.wms.security.util.MD5Util; +import org.apache.ibatis.exceptions.PersistenceException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 用户账户信息 service 实现类 + + */ +@Service +public class UserInfoServiceImpl implements UserInfoService { + + @Autowired + private UserInfoMapper userInfoMapper; + @Autowired + private UserPermissionMapper userPermissionMapper; + @Autowired + private RolesMapper rolesMapper; + @Autowired + UserInfoService userInfoService; + + /** + * 获取指定用户ID对应的用户账户信息 + * + * @param userID 用户ID + * @return 返回用户账户信息 + */ + @Override + public UserInfoDTO getUserInfo(Integer userID) throws UserInfoServiceException { + if (userID == null) + return null; + + try { + // 获取用户信息 + UserInfoDO userInfoDO = userInfoMapper.selectByUserID(userID); + // 获取用户角色信息 + List roles = userPermissionMapper.selectUserRole(userID); + + return assembleUserInfo(userInfoDO, roles); + } catch (PersistenceException e) { + throw new UserInfoServiceException(e); + } + } + + /** + * 获取指定 userName 对应的用户账户信息 + * + * @param userName 用户名 + * @return 返回用户账户信息 + */ + @Override + public UserInfoDTO getUserInfo(String userName) throws UserInfoServiceException { + if (userName == null) + return null; + + try { + // 获取用户信息 + UserInfoDO userInfoDO = userInfoMapper.selectByName(userName); + // 获取用户角色信息 + if (userInfoDO != null) { + List roles = userPermissionMapper.selectUserRole(userInfoDO.getUserID()); + return assembleUserInfo(userInfoDO, roles); + } else + return null; + } catch (PersistenceException e) { + throw new UserInfoServiceException(e); + } + } + + /** + * 获取所有用户账户信息 + * + * @return 返回所有的用户账户信息 + */ + @Override + public List getAllUserInfo() throws UserInfoServiceException { + // 保存所有用户的 UserInfoDTO 对象 + List userInfoDTOS = null; + + // 获取所有用户的账户信息(不包含角色信息) + try { + List userInfoDOS = userInfoMapper.selectAll(); + if (userInfoDOS != null) { + List roles; + UserInfoDTO userInfoDTO; + userInfoDTOS = new ArrayList<>(userInfoDOS.size()); + for (UserInfoDO userInfoDO : userInfoDOS) { + // 获取用户对应的角色信息 + roles = userPermissionMapper.selectUserRole(userInfoDO.getUserID()); + userInfoDTO = assembleUserInfo(userInfoDO, roles); + userInfoDTOS.add(userInfoDTO); + } + } + + return userInfoDTOS; + } catch (PersistenceException e) { + throw new UserInfoServiceException(e); + } + } + + /** + * 更新用户的账户信息 + * + * @param userInfoDTO 用户账户信息 + */ + @Override + public void updateUserInfo(UserInfoDTO userInfoDTO) throws UserInfoServiceException { + if (userInfoDTO != null) { + try { + // 更新 UserDo 对象信息 + Integer userID = userInfoDTO.getUserID(); + String userName = userInfoDTO.getUserName(); + String password = userInfoDTO.getPassword(); + if (userID != null && userName != null && password != null) { + UserInfoDO userInfoDO = new UserInfoDO(); + userInfoDO.setUserID(userID); + userInfoDO.setUserName(userName); + userInfoDO.setPassword(password); + userInfoDO.setFirstLogin(userInfoDTO.isFirstLogin() ? 1 : 0); + + // update + userInfoMapper.update(userInfoDO); + } + + // 更新角色信息 + } catch (PersistenceException e) { + throw new UserInfoServiceException(e); + } + } + + } + + /** + * 删除指定 userID 的用户账户信息 + * + * @param userID 指定的用户ID + */ + @Override + public void deleteUserInfo(Integer userID) throws UserInfoServiceException { + if (userID == null) + return; + + try { + // 删除用户角色信息 + userPermissionMapper.deleteByUserID(userID); + + // 删除用户信息 + userInfoMapper.deleteById(userID); + } catch (PersistenceException e) { + throw new UserInfoServiceException(e); + } + + } + + /** + * 添加一条用户账户信息 + * + * @param userInfoDTO 需要添加的用户账户信息 + */ + @Override + public boolean insertUserInfo(UserInfoDTO userInfoDTO) throws UserInfoServiceException { + if (userInfoDTO == null) + return false; + + // 检查数据是否有效 + Integer userID = userInfoDTO.getUserID(); + String userName = userInfoDTO.getUserName(); + String password = userInfoDTO.getPassword(); + if (userName == null || password == null) + return false; + + try { + // 对密码进行加密 + String tempStr = MD5Util.MD5(password); + String encryptPassword = MD5Util.MD5(tempStr + userID.toString()); + + // 创建用户信息数据实体 + UserInfoDO userInfoDO = new UserInfoDO(); + userInfoDO.setUserID(userID); + userInfoDO.setUserName(userName); + userInfoDO.setPassword(encryptPassword); + userInfoDO.setFirstLogin(1); + + // 持久化用户信息 + userInfoMapper.insert(userInfoDO); + + // 获取用户角色信息 + List roles = userInfoDTO.getRole(); + Integer roleID; + + // 持久化用户角色信息 + for (String role : roles) { + roleID = rolesMapper.getRoleID(role); + if (roleID != null) + userPermissionMapper.insert(userID, roleID); + else + throw new UserInfoServiceException("The role of userInfo unavailable"); + } + + return true; + + } catch (PersistenceException e) { + throw new UserInfoServiceException(e); + } + } + + /** + * 组装 UserInfoDTO 对象,包括用户账户信息和角色信息 + * + * @param userInfoDO 用户账户信息 + * @param roles 用户角色信息 + * @return 返回组装后的UserInfoDTO + */ + private UserInfoDTO assembleUserInfo(UserInfoDO userInfoDO, List roles) { + UserInfoDTO userInfoDTO = null; + if (userInfoDO != null && roles != null) { + userInfoDTO = new UserInfoDTO(); + userInfoDTO.setUserID(userInfoDO.getUserID()); + userInfoDTO.setUserName(userInfoDO.getUserName()); + userInfoDTO.setPassword(userInfoDO.getPassword()); + userInfoDTO.setFirstLogin(userInfoDO.getFirstLogin() == 1); + + for (RoleDO role : roles) { + userInfoDTO.getRole().add(role.getRoleName()); + } + } + return userInfoDTO; + } + + /** + * 获取用户的权限角色 + * + * @param userID 用户 ID + * @return 返回一个保存有用户角色的 Set,若该用户没有任何角色,则返回一个不包含任何元素的 Set + */ + @Override + public Set getUserRoles(Integer userID) throws UserInfoServiceException { + // 获取用户信息 + UserInfoDTO userInfo = getUserInfo(userID); + + // 返回用户的角色 + if (userInfo != null) { + return new HashSet<>(userInfo.getRole()); + } else { + return new HashSet<>(); + } + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Interface/AccountService.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Interface/AccountService.java new file mode 100644 index 0000000..5c293ee --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Interface/AccountService.java @@ -0,0 +1,20 @@ +package com.ken.wms.security.service.Interface; + +import com.ken.wms.exception.UserAccountServiceException; + +import java.util.Map; + +/** + * 账号相关服务 + + * + */ +public interface AccountService { + + /** + * 密码更改 + * @param userID 用户ID + * @param passwordInfo 更改的密码信息 + */ + public void passwordModify(Integer userID, Map passwordInfo) throws UserAccountServiceException; +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Interface/UserInfoService.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Interface/UserInfoService.java new file mode 100644 index 0000000..d12be8e --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/service/Interface/UserInfoService.java @@ -0,0 +1,59 @@ +package com.ken.wms.security.service.Interface; + +import com.ken.wms.domain.UserInfoDTO; +import com.ken.wms.exception.UserInfoServiceException; + +import java.util.List; +import java.util.Set; + +/** + * 用户账户信息 service + + */ +public interface UserInfoService { + + /** + * 获取指定用户ID对应的用户账户信息 + * @param userID 用户ID + * @return 返回用户账户信息 + */ + UserInfoDTO getUserInfo(Integer userID) throws UserInfoServiceException; + + /** + * 获取指定 userName 对应的用户账户信息 + * @param userName 用户名 + * @return 返回用户账户信息 + */ + UserInfoDTO getUserInfo(String userName) throws UserInfoServiceException; + + /** + * 获取所有用户账户信息 + * @return 返回所有的用户账户信息 + */ + List getAllUserInfo() throws UserInfoServiceException; + + /** + * 更新用户的账户信息 + * @param userInfoDTO 用户账户信息 + */ + void updateUserInfo(UserInfoDTO userInfoDTO) throws UserInfoServiceException; + + /** + * 删除指定 userID 的用户账户信息 + * @param userID 指定的用户ID + */ + void deleteUserInfo(Integer userID) throws UserInfoServiceException; + + /** + * 添加一条用户账户信息 + * @param userInfoDTO 需要添加的用户账户信息 + */ + boolean insertUserInfo(UserInfoDTO userInfoDTO) throws UserInfoServiceException; + + /** + * 获取用户的权限角色 + * @param userID 用户 ID + * @return 返回一个保存有用户角色的 Set,若该用户没有任何角色,则返回一个不包含任何元素的 Set + */ + Set getUserRoles(Integer userID) throws UserInfoServiceException; +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/util/CaptchaGenerator.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/util/CaptchaGenerator.java new file mode 100644 index 0000000..958ef67 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/util/CaptchaGenerator.java @@ -0,0 +1,101 @@ +package com.ken.wms.security.util; + + +import java.awt.*; +import java.awt.geom.Line2D; +import java.awt.image.BufferedImage; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +/** + * 图形验证码生成器 + * + */ +public class CaptchaGenerator { + + /** + * 图形验证码中包含的字符 + */ + private static char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; + + /** + * 图形验证码参数 + */ + private static final int width = 80;// 验证码图片的宽度 + private static final int height = 35;// 验证码图片的高度 + private static final int characterCount = 4;// 验证码图片字符的个数 + private static final int lineCount = 8;// 验证码干扰线数目 + private static Font font;// 验证码字体样式 + private static Color captchaBgColor = Color.white;// 验证码图片背景颜色 + private static Color lineColor = Color.gray;// 验证码干扰线颜色 + + static { + font = new Font("Arial", Font.BOLD | Font.ITALIC, 25); + } + + /** + * 随机生成图形验证码 + * + * @return 返回一个Map,其中包含图形验证码图片以及其对应的文本 + */ + public static Map generateCaptcha() { + + // 存储验证码 + char[] code = new char[characterCount]; + + Random random = new Random(); + + // 创建 BufferedImage 对象 + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); + // 创建Graphics2D对象 + Graphics graphics = image.getGraphics(); + Graphics2D graphics2d = (Graphics2D) graphics; + + // 设置图片 + graphics.setColor(captchaBgColor); + graphics.fillRect(1, 1, width - 2, height - 2); + graphics.setFont(font); + graphics.setColor(lineColor); + + // 绘制颜色和位置全部为随机产生的线条 + for (int i = 1; i <= lineCount; i++) { + int x = random.nextInt(width - 1); + int y = random.nextInt(height - 1); + int x1 = random.nextInt(width - 1); + int y1 = random.nextInt(height - 1); + + Line2D line2d = new Line2D.Double(x, y, x1, y1); + graphics2d.draw(line2d); + } + + // 设置验证码中的字符 + for (int i = 0; i < characterCount; i++) { + graphics.setColor(getRandColor()); + code[i] = codeSequence[random.nextInt(codeSequence.length - 1)]; + graphics2d.drawString(String.valueOf(code[i]), random.nextInt(10) + 15 * i, 20 + random.nextInt(10)); + } + + Map captcha = new HashMap<>(); + captcha.put("captchaString", String.valueOf(code)); + captcha.put("captchaImage", image); + return captcha; + } + + /** + * 随机生成颜色 + * + * @return 返回随机生成的颜色 + */ + private static Color getRandColor() { + Random random = new Random(); + + int r, g, b; + r = random.nextInt(255); + g = random.nextInt(255); + b = random.nextInt(255); + + return new Color(r, g, b); + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/util/MD5Util.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/util/MD5Util.java new file mode 100644 index 0000000..eef3e3c --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/security/util/MD5Util.java @@ -0,0 +1,39 @@ +package com.ken.wms.security.util; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * MD5 + * + * @author Ken + */ +public class MD5Util { + + /** + * 使用 MD5 算法对字符串进行处理 + * + * @param plainString 需要处理的字符串 + * @return 返回处理后的字符串 + */ + public static String MD5(String plainString) { + + if (plainString != null) { + try { + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.update(plainString.getBytes()); + byte[] byteData = messageDigest.digest(); + + StringBuilder hexString = new StringBuilder(); + for (byte aByteData : byteData) { + String hex = Integer.toHexString(0xff & aByteData); + if (hex.length() == 1) + hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } catch (NoSuchAlgorithmException e) {/* log */} + } + return ""; + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/GlobalExceptionHandler.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/GlobalExceptionHandler.java new file mode 100644 index 0000000..726be79 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/GlobalExceptionHandler.java @@ -0,0 +1,39 @@ +package com.ken.wms.util; + +import com.ken.wms.exception.BusinessException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +/** + * 全局异常处理器 + * + * @author Ken + * @since 2017/3/8. + */ +@ControllerAdvice +public class GlobalExceptionHandler { + + private static Logger logger = LoggerFactory.getLogger("ExceptionLogging"); + + /** + * 捕获并记录Controller层抛出的非BusinessException异常 + */ + @ExceptionHandler(value = Exception.class) + public void handleException(Exception e){ + if (!(e instanceof BusinessException)){ + if (logger.isErrorEnabled()){ + StringBuilder builder = new StringBuilder(); + builder.append("cause:").append(e.getMessage()); + builder.append("\n\tstackTrack:\n"); + for (StackTraceElement stack : e.getStackTrace()) { + builder.append("\t\t"); + builder.append(stack.toString()); + builder.append("\n"); + } + logger.error(builder.toString()); + } + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/ServiceLogging.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/ServiceLogging.java new file mode 100644 index 0000000..f658e6c --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/ServiceLogging.java @@ -0,0 +1,57 @@ +package com.ken.wms.util.aop; + +import org.aspectj.lang.JoinPoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * Service层日志处理 + * + * @author Ken + * @since 2017/3/8. + */ +public class ServiceLogging { + + private static Logger exceptionLogger = LoggerFactory.getLogger("ExceptionLogging"); + private static Logger methodInvokeLogger = LoggerFactory.getLogger("MethodInvokeLogging"); + + /** + * 捕获Service层抛出的异常并做日志 + * + * @param throwable 方法抛出的异常 + */ + public void loggingServiceException(Throwable throwable) { + if (exceptionLogger.isErrorEnabled()) { + StringBuilder builder = new StringBuilder(); + builder.append("cause:").append(throwable.getMessage()); + builder.append("\n\tstackTrack:\n"); + for (StackTraceElement stack : throwable.getStackTrace()) { + builder.append("\t\t"); + builder.append(stack.toString()); + builder.append("\n"); + } + exceptionLogger.error(builder.toString()); + } + } + + /** + * 记录Service方法的调用 + * + * @param joinPoint 切入点 + */ + public void loggingMethodInvoked(JoinPoint joinPoint) { + if (methodInvokeLogger.isDebugEnabled()) { + String methodName = joinPoint.getSignature().getName(); + Object[] args = joinPoint.getArgs(); + StringBuilder builder = new StringBuilder(); + builder.append("Invoked Method:").append(methodName); + builder.append("\targs:"); + for (Object arg : args) { + builder.append(arg.toString()); + } + methodInvokeLogger.debug(builder.toString()); + } + } + +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/UserOperation.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/UserOperation.java new file mode 100644 index 0000000..682f1c5 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/UserOperation.java @@ -0,0 +1,17 @@ +package com.ken.wms.util.aop; + +import java.lang.annotation.*; + +/** + * 用户操作注解 + * 用于标注用户操作的方法名称 + * + * @author Ken + * @since 2017/4/8. + */ +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface UserOperation { + String value(); +} diff --git a/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/UserOperationLogging.java b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/UserOperationLogging.java new file mode 100644 index 0000000..b33957c --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/java/com/ken/wms/util/aop/UserOperationLogging.java @@ -0,0 +1,61 @@ +package com.ken.wms.util.aop; + +import com.ken.wms.common.service.Interface.SystemLogService; +import com.ken.wms.domain.UserInfoDTO; +import com.ken.wms.exception.SystemLogServiceException; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.aspectj.lang.JoinPoint; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 用户操作日志记录 + * + * @author Ken + * @since 2017/4/8. + */ +public class UserOperationLogging { + + @Autowired + private SystemLogService systemLogService; + + /** + * 记录用户操作 + * + * @param joinPoint 切入点信息 + */ + public void loggingUserOperation(JoinPoint joinPoint, Object returnValue, UserOperation userOperation) { + + if (userOperation != null) { + // 获取 annotation 的值 + String userOperationValue = userOperation.value(); + + // 获取调用的方法名 + String methodName = joinPoint.getSignature().getName(); + + // 获取除 import* export* 外的方法的返回值 + String invokedResult = "-"; + if (!methodName.matches("^import\\w*") && !methodName.matches("^export\\w*")) { + if (returnValue instanceof Boolean) { + boolean result = (boolean) returnValue; + invokedResult = result ? "成功" : "失败"; + } + } + + // 获取用户信息 + Subject currentSubject = SecurityUtils.getSubject(); + Session session = currentSubject.getSession(); + UserInfoDTO userInfo = (UserInfoDTO) session.getAttribute("userInfo"); + Integer userID = userInfo.getUserID(); + String userName = userInfo.getUserName(); + + // 插入记录 + try { + systemLogService.insertUserOperationRecord(userID, userName, userOperationValue, invokedResult); + } catch (SystemLogServiceException e) { + // do log + } + } + } +} diff --git a/warehouseManager-developer/WMS/src/main/resources/config/DBConfig.properties b/warehouseManager-developer/WMS/src/main/resources/config/DBConfig.properties new file mode 100644 index 0000000..0819738 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/resources/config/DBConfig.properties @@ -0,0 +1,10 @@ +#改成你数据库的账号 +jdbc.user=root +#改成你数据库的密码 +jdbc.password=200299 +#数据库驱动【不用改】 +jdbc.driverClass=com.mysql.jdbc.Driver +#改成你数据库的链接方式 +jdbc.jdbcUrl=jdbc:mysql://localhost:3306/wms_db?useSSL=false&useUnicode=true&characterEncoding=UTF-8 +#验证数据库连接是否有效 +jdbc.testConnectionOnCheckout=true \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/resources/config/EJConvertor.xsd b/warehouseManager-developer/WMS/src/main/resources/config/EJConvertor.xsd new file mode 100644 index 0000000..0d9fd8b --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/resources/config/EJConvertor.xsd @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/warehouseManager-developer/WMS/src/main/resources/config/EJConvertorConfig.xml b/warehouseManager-developer/WMS/src/main/resources/config/EJConvertorConfig.xml new file mode 100644 index 0000000..db78971 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/resources/config/EJConvertorConfig.xml @@ -0,0 +1,172 @@ + + + + + + name + 供应商名 + + + personInCharge + 负责人 + + + tel + 联系电话 + + + email + 电子邮件 + + + address + 供应商地址 + + + + + + name + 客户名称 + + + personInCharge + 负责人 + + + tel + 联系电话 + + + email + 电子邮件 + + + address + 地址 + + + + + + id + 货物ID + + + name + 货物名称 + + + type + 货物类型 + + + size + 货物规格 + + + value + 货物价值 + + + + + + id + 仓库ID + + + address + 仓库地址 + + + status + 仓库状态 + + + area + 仓库面积 + + + desc + 仓库描述 + + + adminID + 仓库管理员ID + + + adminName + 仓库管理员名字 + + + + + + id + ID + + + name + 姓名 + + + sex + 性别 + + + tel + 联系电话 + + + address + 联系地址 + + + birth + 出生日期 + + + repositoryBelongID + 所属仓库ID + + + + + + goodsID + 货物ID + + + goodsName + 货物名称 + + + goodsSize + 货物规格 + + + goodsType + 货物类型 + + + goodsValue + 货物价值 + + + repositoryID + 仓库ID + + + number + 库存数量 + + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/resources/config/MyBatisConfiguration.xml b/warehouseManager-developer/WMS/src/main/resources/config/MyBatisConfiguration.xml new file mode 100644 index 0000000..ba9d694 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/resources/config/MyBatisConfiguration.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/resources/config/ShiroConfiguration.xml b/warehouseManager-developer/WMS/src/main/resources/config/ShiroConfiguration.xml new file mode 100644 index 0000000..7c2b64a --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/resources/config/ShiroConfiguration.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/resources/config/SpringContextConfiguration.xml b/warehouseManager-developer/WMS/src/main/resources/config/SpringContextConfiguration.xml new file mode 100644 index 0000000..91db441 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/resources/config/SpringContextConfiguration.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/warehouseManager-developer/WMS/src/main/resources/config/SpringMVCConfiguration.xml b/warehouseManager-developer/WMS/src/main/resources/config/SpringMVCConfiguration.xml new file mode 100644 index 0000000..23e9fcd --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/resources/config/SpringMVCConfiguration.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/warehouseManager-developer/WMS/src/main/resources/config/ehcache.xml b/warehouseManager-developer/WMS/src/main/resources/config/ehcache.xml new file mode 100644 index 0000000..c107203 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/resources/config/ehcache.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + --> + + + + + + + diff --git a/warehouseManager-developer/WMS/src/main/resources/config/log4j.properties b/warehouseManager-developer/WMS/src/main/resources/config/log4j.properties new file mode 100644 index 0000000..6d5637d --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/resources/config/log4j.properties @@ -0,0 +1,52 @@ +log4j.rootLogger=INFO,stdout,info,warn,error + +#\u63A7\u5236\u53F0\u8F93\u51FA +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.Threshold=INFO +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %m %n + +#INFO\u65E5\u5FD7 +log4j.logger.info=info +log4j.appender.info=org.apache.log4j.DailyRollingFileAppender +log4j.appender.info.File = ${catalina.base}/logs/wms/info.log +log4j.appender.info.datePattern='.'yyyy-MM-dd +log4j.appender.info.append=true +log4j.appender.info.Threshold=INFO +log4j.appender.info.layout=org.apache.log4j.PatternLayout +log4j.appender.info.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %m %n + +#WARN\u65E5\u5FD7 +log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender +log4j.appender.warn.File = ${catalina.base}/logs/wms/warn.log +log4j.appender.warn.datePattern='.'yyyy-MM-dd +log4j.appender.warn.append=true +log4j.appender.warn.Threshold=WARN +log4j.appender.warn.layout=org.apache.log4j.PatternLayout +log4j.appender.warn.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %m %n + +#ERROR\u65E5\u5FD7 +log4j.appender.error=org.apache.log4j.DailyRollingFileAppender +log4j.appender.error.File = ${catalina.base}/logs/wms/error.log +log4j.appender.error.datePattern='.'yyyy-MM-dd +log4j.appender.error.append=true +log4j.appender.error.Threshold=ERROR +log4j.appender.error.layout=org.apache.log4j.PatternLayout +log4j.appender.error.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}] %l %m %n + +#\u6267\u884C\u6162\u7684SQL +log4j.logger.com.alibaba.druid.filter.stat.StatFilter=ERROR,slowsql +log4j.appender.slowsql=org.apache.log4j.DailyRollingFileAppender +log4j.appender.slowsql.File = ${catalina.base}/logs/wms/slow_sql.log +log4j.appender.slowsql.datePattern='.'yyyy-MM-dd +log4j.appender.slowsql.append=true +log4j.appender.slowsql.layout=org.apache.log4j.PatternLayout +log4j.appender.slowsql.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %m %n + +#\u63A7\u5236\u53F0\u8F93\u51FA\u6240\u6709SQL +log4j.logger.com.ken.wms.dao=DEBUG,sql +log4j.appender.sql=org.apache.log4j.ConsoleAppender +log4j.appender.sql.Target=System.out +log4j.appender.sql.layout=org.apache.log4j.PatternLayout +log4j.appender.sql.layout.ConversionPattern=%m %n \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/customerInfo.xlsx b/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/customerInfo.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4872600d2fea42ad2eb58d658e6792f12fe52d09 GIT binary patch literal 8680 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 literal 0 HcmV?d00001 diff --git a/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/goodsInfo.xlsx b/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/goodsInfo.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9c68e67000793f9e1928897ad8fc3bf5dff6c6bf GIT binary patch literal 8652 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 literal 0 HcmV?d00001 diff --git a/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/storageRecord.xlsx b/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/storageRecord.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ad0ef69c82ce627d7eddda4f11352dbbe912a645 GIT binary patch literal 8700 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 literal 0 HcmV?d00001 diff --git a/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/supplierInfo.xlsx b/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/download/supplierInfo.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..14e5bdf990273f1d9dc5d93a9f79a5ce1f98c10c GIT binary patch literal 8651 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 E17Q!AlK=n! literal 0 HcmV?d00001 diff --git a/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/jsp/login.jsp b/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/jsp/login.jsp new file mode 100644 index 0000000..e5e174f --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/jsp/login.jsp @@ -0,0 +1,219 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + + +登陆 + + + + + +

+
+
+ + +
+
+ + +
+

登录

+
+ + +
+ + +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ checkCodeImg +
+
+ +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/jsp/mainPage.jsp b/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/jsp/mainPage.jsp new file mode 100644 index 0000000..5918f8b --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/jsp/mainPage.jsp @@ -0,0 +1,437 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" +pageEncoding="UTF-8"%> +<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> + + + + + 仓库管理系统 + + + + + + + + + + +
+ +
+
+ + + + +
+ + + +
+ + + + +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/web.xml b/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..efe73d2 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,79 @@ + + + WMS + + + + springDispatcherServlet + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:config/SpringMVCConfiguration.xml + + 1 + + + springDispatcherServlet + / + + + + + + log4jConfigLocation + classpath:config/log4j.properties + + + org.springframework.web.util.Log4jConfigListener + + + + + + shiroFilter + org.springframework.web.filter.DelegatingFilterProxy + + targetFilterLifecycle + true + + + + shiroFilter + /* + + + + + + contextConfigLocation + classpath:config/SpringContextConfiguration.xml + + + org.springframework.web.context.ContextLoaderListener + + + + + + 404 + /errorPage/404Error.html + + + 500 + /errorPage/500Error.html + + + \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-datetimepicker.min.css b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-datetimepicker.min.css new file mode 100644 index 0000000..d0f3dff --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-datetimepicker.min.css @@ -0,0 +1,9 @@ +/*! + * Datetimepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */.datetimepicker{padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr}.datetimepicker-inline{width:220px}.datetimepicker.datetimepicker-rtl{direction:rtl}.datetimepicker.datetimepicker-rtl table tr td span{float:right}.datetimepicker-dropdown,.datetimepicker-dropdown-left{top:0;left:0}[class*=" datetimepicker-dropdown"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute}[class*=" datetimepicker-dropdown"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute}[class*=" datetimepicker-dropdown-top"]:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);border-bottom:0}[class*=" datetimepicker-dropdown-top"]:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #fff;border-bottom:0}.datetimepicker-dropdown-bottom-left:before{top:-7px;right:6px}.datetimepicker-dropdown-bottom-left:after{top:-6px;right:7px}.datetimepicker-dropdown-bottom-right:before{top:-7px;left:6px}.datetimepicker-dropdown-bottom-right:after{top:-6px;left:7px}.datetimepicker-dropdown-top-left:before{bottom:-7px;right:6px}.datetimepicker-dropdown-top-left:after{bottom:-6px;right:7px}.datetimepicker-dropdown-top-right:before{bottom:-7px;left:6px}.datetimepicker-dropdown-top-right:after{bottom:-6px;left:7px}.datetimepicker>div{display:none}.datetimepicker.minutes div.datetimepicker-minutes{display:block}.datetimepicker.hours div.datetimepicker-hours{display:block}.datetimepicker.days div.datetimepicker-days{display:block}.datetimepicker.months div.datetimepicker-months{display:block}.datetimepicker.years div.datetimepicker-years{display:block}.datetimepicker table{margin:0}.datetimepicker td,.datetimepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:0}.table-striped .datetimepicker table tr td,.table-striped .datetimepicker table tr th{background-color:transparent}.datetimepicker table tr td.minute:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.hour:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.day:hover{background:#eee;cursor:pointer}.datetimepicker table tr td.old,.datetimepicker table tr td.new{color:#999}.datetimepicker table tr td.disabled,.datetimepicker table tr td.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td.today,.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-moz-linear-gradient(top,#fdd49a,#fdf59a);background-image:-ms-linear-gradient(top,#fdd49a,#fdf59a);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fdd49a),to(#fdf59a));background-image:-webkit-linear-gradient(top,#fdd49a,#fdf59a);background-image:-o-linear-gradient(top,#fdd49a,#fdf59a);background-image:linear-gradient(top,#fdd49a,#fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a',endColorstr='#fdf59a',GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.datetimepicker table tr td.today:hover,.datetimepicker table tr td.today:hover:hover,.datetimepicker table tr td.today.disabled:hover,.datetimepicker table tr td.today.disabled:hover:hover,.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active,.datetimepicker table tr td.today.disabled,.datetimepicker table tr td.today:hover.disabled,.datetimepicker table tr td.today.disabled.disabled,.datetimepicker table tr td.today.disabled:hover.disabled,.datetimepicker table tr td.today[disabled],.datetimepicker table tr td.today:hover[disabled],.datetimepicker table tr td.today.disabled[disabled],.datetimepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datetimepicker table tr td.today:active,.datetimepicker table tr td.today:hover:active,.datetimepicker table tr td.today.disabled:active,.datetimepicker table tr td.today.disabled:hover:active,.datetimepicker table tr td.today.active,.datetimepicker table tr td.today:hover.active,.datetimepicker table tr td.today.disabled.active,.datetimepicker table tr td.today.disabled:hover.active{background-color:#fbf069}.datetimepicker table tr td.active,.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-ms-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(top,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td.active:hover,.datetimepicker table tr td.active:hover:hover,.datetimepicker table tr td.active.disabled:hover,.datetimepicker table tr td.active.disabled:hover:hover,.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active,.datetimepicker table tr td.active.disabled,.datetimepicker table tr td.active:hover.disabled,.datetimepicker table tr td.active.disabled.disabled,.datetimepicker table tr td.active.disabled:hover.disabled,.datetimepicker table tr td.active[disabled],.datetimepicker table tr td.active:hover[disabled],.datetimepicker table tr td.active.disabled[disabled],.datetimepicker table tr td.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td.active:active,.datetimepicker table tr td.active:hover:active,.datetimepicker table tr td.active.disabled:active,.datetimepicker table tr td.active.disabled:hover:active,.datetimepicker table tr td.active.active,.datetimepicker table tr td.active:hover.active,.datetimepicker table tr td.active.disabled.active,.datetimepicker table tr td.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.datetimepicker .datetimepicker-hours span{height:26px;line-height:26px}.datetimepicker .datetimepicker-hours table tr td span.hour_am,.datetimepicker .datetimepicker-hours table tr td span.hour_pm{width:14.6%}.datetimepicker .datetimepicker-hours fieldset legend,.datetimepicker .datetimepicker-minutes fieldset legend{margin-bottom:inherit;line-height:30px}.datetimepicker .datetimepicker-minutes span{height:26px;line-height:26px}.datetimepicker table tr td span:hover{background:#eee}.datetimepicker table tr td span.disabled,.datetimepicker table tr td span.disabled:hover{background:0;color:#999;cursor:default}.datetimepicker table tr td span.active,.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-ms-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(top,#08c,#04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc',endColorstr='#0044cc',GradientType=0);border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datetimepicker table tr td span.active:hover,.datetimepicker table tr td span.active:hover:hover,.datetimepicker table tr td span.active.disabled:hover,.datetimepicker table tr td span.active.disabled:hover:hover,.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active,.datetimepicker table tr td span.active.disabled,.datetimepicker table tr td span.active:hover.disabled,.datetimepicker table tr td span.active.disabled.disabled,.datetimepicker table tr td span.active.disabled:hover.disabled,.datetimepicker table tr td span.active[disabled],.datetimepicker table tr td span.active:hover[disabled],.datetimepicker table tr td span.active.disabled[disabled],.datetimepicker table tr td span.active.disabled:hover[disabled]{background-color:#04c}.datetimepicker table tr td span.active:active,.datetimepicker table tr td span.active:hover:active,.datetimepicker table tr td span.active.disabled:active,.datetimepicker table tr td span.active.disabled:hover:active,.datetimepicker table tr td span.active.active,.datetimepicker table tr td span.active:hover.active,.datetimepicker table tr td span.active.disabled.active,.datetimepicker table tr td span.active.disabled:hover.active{background-color:#039}.datetimepicker table tr td span.old{color:#999}.datetimepicker th.switch{width:145px}.datetimepicker th span.glyphicon{pointer-events:none}.datetimepicker thead tr:first-child th,.datetimepicker tfoot th{cursor:pointer}.datetimepicker thead tr:first-child th:hover,.datetimepicker tfoot th:hover{background:#eee}.input-append.date .add-on i,.input-prepend.date .add-on i,.input-group.date .input-group-addon span{cursor:pointer;width:14px;height:14px} \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-table.css b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-table.css new file mode 100644 index 0000000..f3ef858 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-table.css @@ -0,0 +1,306 @@ +/** + * @author zhixin wen + * version: 1.11.0 + * https://github.com/wenzhixin/bootstrap-table/ + */ + +.bootstrap-table .table { + margin-bottom: 0 !important; + border-bottom: 1px solid #dddddd; + border-collapse: collapse !important; + border-radius: 1px; +} + +.bootstrap-table .table:not(.table-condensed), +.bootstrap-table .table:not(.table-condensed) > tbody > tr > th, +.bootstrap-table .table:not(.table-condensed) > tfoot > tr > th, +.bootstrap-table .table:not(.table-condensed) > thead > tr > td, +.bootstrap-table .table:not(.table-condensed) > tbody > tr > td, +.bootstrap-table .table:not(.table-condensed) > tfoot > tr > td { + padding: 8px; +} + +.bootstrap-table .table.table-no-bordered > thead > tr > th, +.bootstrap-table .table.table-no-bordered > tbody > tr > td { + border-right: 2px solid transparent; +} + +.bootstrap-table .table.table-no-bordered > tbody > tr > td:last-child { + border-right: none; +} + +.fixed-table-container { + position: relative; + clear: both; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; +} + +.fixed-table-container.table-no-bordered { + border: 1px solid transparent; +} + +.fixed-table-footer, +.fixed-table-header { + overflow: hidden; +} + +.fixed-table-footer { + border-top: 1px solid #dddddd; +} + +.fixed-table-body { + overflow-x: auto; + overflow-y: auto; + height: 100%; +} + +.fixed-table-container table { + width: 100%; +} + +.fixed-table-container thead th { + height: 0; + padding: 0; + margin: 0; + border-left: 1px solid #dddddd; +} + +.fixed-table-container thead th:focus { + outline: 0 solid transparent; +} + +.fixed-table-container thead th:first-child { + border-left: none; + border-top-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.fixed-table-container thead th .th-inner, +.fixed-table-container tbody td .th-inner { + padding: 8px; + line-height: 24px; + vertical-align: top; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.fixed-table-container thead th .sortable { + cursor: pointer; + background-position: right; + background-repeat: no-repeat; + padding-right: 30px; +} + +.fixed-table-container thead th .both { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC'); +} + +.fixed-table-container thead th .asc { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg=='); +} + +.fixed-table-container thead th .desc { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= '); +} + +.fixed-table-container th.detail { + width: 30px; +} + +.fixed-table-container tbody td { + border-left: 1px solid #dddddd; +} + +.fixed-table-container tbody tr:first-child td { + border-top: none; +} + +.fixed-table-container tbody td:first-child { + border-left: none; +} + +/* the same color with .active */ +.fixed-table-container tbody .selected td { + background-color: #f5f5f5; +} + +.fixed-table-container .bs-checkbox { + text-align: center; +} + +.fixed-table-container .bs-checkbox .th-inner { + padding: 8px 0; +} + +.fixed-table-container input[type="radio"], +.fixed-table-container input[type="checkbox"] { + margin: 0 auto !important; +} + +.fixed-table-container .no-records-found { + text-align: center; +} + +.fixed-table-pagination div.pagination, +.fixed-table-pagination .pagination-detail { + margin-top: 10px; + margin-bottom: 10px; +} + +.fixed-table-pagination div.pagination .pagination { + margin: 0; +} + +.fixed-table-pagination .pagination a { + padding: 6px 12px; + line-height: 1.428571429; +} + +.fixed-table-pagination .pagination-info { + line-height: 34px; + margin-right: 5px; +} + +.fixed-table-pagination .btn-group { + position: relative; + display: inline-block; + vertical-align: middle; +} + +.fixed-table-pagination .dropup .dropdown-menu { + margin-bottom: 0; +} + +.fixed-table-pagination .page-list { + display: inline-block; +} + +.fixed-table-toolbar .columns-left { + margin-right: 5px; +} + +.fixed-table-toolbar .columns-right { + margin-left: 5px; +} + +.fixed-table-toolbar .columns label { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; +} + +.fixed-table-toolbar .bs-bars, +.fixed-table-toolbar .search, +.fixed-table-toolbar .columns { + position: relative; + margin-top: 10px; + margin-bottom: 10px; + line-height: 34px; +} + +.fixed-table-pagination li.disabled a { + pointer-events: none; + cursor: default; +} + +.fixed-table-loading { + display: none; + position: absolute; + top: 42px; + right: 0; + bottom: 0; + left: 0; + z-index: 99; + background-color: #fff; + text-align: center; +} + +.fixed-table-body .card-view .title { + font-weight: bold; + display: inline-block; + min-width: 30%; + text-align: left !important; +} + +/* support bootstrap 2 */ +.fixed-table-body thead th .th-inner { + box-sizing: border-box; +} + +.table th, .table td { + vertical-align: middle; + box-sizing: border-box; +} + +.fixed-table-toolbar .dropdown-menu { + text-align: left; + max-height: 300px; + overflow: auto; +} + +.fixed-table-toolbar .btn-group > .btn-group { + display: inline-block; + margin-left: -1px !important; +} + +.fixed-table-toolbar .btn-group > .btn-group > .btn { + border-radius: 0; +} + +.fixed-table-toolbar .btn-group > .btn-group:first-child > .btn { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} + +.fixed-table-toolbar .btn-group > .btn-group:last-child > .btn { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.bootstrap-table .table > thead > tr > th { + vertical-align: bottom; + border-bottom: 1px solid #ddd; +} + +/* support bootstrap 3 */ +.bootstrap-table .table thead > tr > th { + padding: 0; + margin: 0; +} + +.bootstrap-table .fixed-table-footer tbody > tr > td { + padding: 0 !important; +} + +.bootstrap-table .fixed-table-footer .table { + border-bottom: none; + border-radius: 0; + padding: 0 !important; +} + +.pull-right .dropdown-menu { + right: 0; + left: auto; +} + +/* calculate scrollbar width */ +p.fixed-table-scroll-inner { + width: 100%; + height: 200px; +} + +div.fixed-table-scroll-outer { + top: 0; + left: 0; + visibility: hidden; + width: 200px; + height: 150px; + overflow: hidden; +} diff --git a/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.css b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.css new file mode 100644 index 0000000..c19cd5c --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #2e6da4; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.css.map b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.css.map new file mode 100644 index 0000000..7535311 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.min.css b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.min.css new file mode 100644 index 0000000..61358b1 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap-theme.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap.css b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap.css new file mode 100644 index 0000000..680e768 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap.css @@ -0,0 +1,6800 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 3; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + min-height: 16.42857143px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap.css.map b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap.css.map new file mode 100644 index 0000000..9f60ed2 --- /dev/null +++ b/warehouseManager-developer/WMS/src/main/webapp/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,0BAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EErDA,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNqkCD;AIxgCD;EACE,UAAA;CJ0gCD;AIpgCD;EACE,uBAAA;CJsgCD;AIlgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CPglCD;AItgCD;EACE,mBAAA;CJwgCD;AIlgCD;EACE,aAAA;EACA,wBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CPgmCD;AIlgCD;EACE,mBAAA;CJogCD;AI9/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJggCD;AIx/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJ0/BD;AIl/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJo/BH;AIz+BD;EACE,gBAAA;CJ2+BD;AQloCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR8oCD;AQnpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRoqCH;AQhqCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRqqCD;AQzqCD;;;;;;;;;;;;EAQI,eAAA;CR+qCH;AQ5qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRirCD;AQrrCD;;;;;;;;;;;;EAQI,eAAA;CR2rCH;AQvrCD;;EAAU,gBAAA;CR2rCT;AQ1rCD;;EAAU,gBAAA;CR8rCT;AQ7rCD;;EAAU,gBAAA;CRisCT;AQhsCD;;EAAU,gBAAA;CRosCT;AQnsCD;;EAAU,gBAAA;CRusCT;AQtsCD;;EAAU,gBAAA;CR0sCT;AQpsCD;EACE,iBAAA;CRssCD;AQnsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRqsCD;AQhsCD;EAAA;IAFI,gBAAA;GRssCD;CACF;AQ9rCD;;EAEE,eAAA;CRgsCD;AQ7rCD;;EAEE,0BAAA;EACA,cAAA;CR+rCD;AQ3rCD;EAAuB,iBAAA;CR8rCtB;AQ7rCD;EAAuB,kBAAA;CRgsCtB;AQ/rCD;EAAuB,mBAAA;CRksCtB;AQjsCD;EAAuB,oBAAA;CRosCtB;AQnsCD;EAAuB,oBAAA;CRssCtB;AQnsCD;EAAuB,0BAAA;CRssCtB;AQrsCD;EAAuB,0BAAA;CRwsCtB;AQvsCD;EAAuB,2BAAA;CR0sCtB;AQvsCD;EACE,eAAA;CRysCD;AQvsCD;ECrGE,eAAA;CT+yCD;AS9yCC;;EAEE,eAAA;CTgzCH;AQ3sCD;ECxGE,eAAA;CTszCD;ASrzCC;;EAEE,eAAA;CTuzCH;AQ/sCD;EC3GE,eAAA;CT6zCD;AS5zCC;;EAEE,eAAA;CT8zCH;AQntCD;EC9GE,eAAA;CTo0CD;ASn0CC;;EAEE,eAAA;CTq0CH;AQvtCD;ECjHE,eAAA;CT20CD;AS10CC;;EAEE,eAAA;CT40CH;AQvtCD;EAGE,YAAA;EE3HA,0BAAA;CVm1CD;AUl1CC;;EAEE,0BAAA;CVo1CH;AQztCD;EE9HE,0BAAA;CV01CD;AUz1CC;;EAEE,0BAAA;CV21CH;AQ7tCD;EEjIE,0BAAA;CVi2CD;AUh2CC;;EAEE,0BAAA;CVk2CH;AQjuCD;EEpIE,0BAAA;CVw2CD;AUv2CC;;EAEE,0BAAA;CVy2CH;AQruCD;EEvIE,0BAAA;CV+2CD;AU92CC;;EAEE,0BAAA;CVg3CH;AQpuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRsuCD;AQ9tCD;;EAEE,cAAA;EACA,oBAAA;CRguCD;AQnuCD;;;;EAMI,iBAAA;CRmuCH;AQ5tCD;EACE,gBAAA;EACA,iBAAA;CR8tCD;AQ1tCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR6tCD;AQ/tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR6tCH;AQxtCD;EACE,cAAA;EACA,oBAAA;CR0tCD;AQxtCD;;EAEE,wBAAA;CR0tCD;AQxtCD;EACE,kBAAA;CR0tCD;AQxtCD;EACE,eAAA;CR0tCD;AQjsCD;EAAA;IAVM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXs6CC;EQ3sCH;IAHM,mBAAA;GRitCH;CACF;AQxsCD;;EAGE,aAAA;EACA,kCAAA;CRysCD;AQvsCD;EACE,eAAA;EA9IqB,0BAAA;CRw1CtB;AQrsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRusCD;AQlsCG;;;EACE,iBAAA;CRssCL;AQhtCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRksCH;AQhsCG;;;EACE,uBAAA;CRosCL;AQ5rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR8rCD;AQxrCG;;;;;;EAAW,YAAA;CRgsCd;AQ/rCG;;;;;;EACE,uBAAA;CRssCL;AQhsCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRksCD;AYx+CD;;;;EAIE,+DAAA;CZ0+CD;AYt+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZw+CD;AYp+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZs+CD;AY5+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZs+CH;AYj+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;CZm+CD;AY9+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZk+CH;AY79CD;EACE,kBAAA;EACA,mBAAA;CZ+9CD;AazhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd+hDD;AazhDC;EAAA;IAFE,aAAA;Gb+hDD;CACF;Aa3hDC;EAAA;IAFE,aAAA;GbiiDD;CACF;Aa7hDD;EAAA;IAFI,cAAA;GbmiDD;CACF;Aa1hDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdojDD;AavhDD;ECvBE,mBAAA;EACA,oBAAA;CdijDD;AejjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfijDL;AejiDG;EACE,YAAA;CfmiDL;Ae5hDC;EACE,YAAA;Cf8hDH;Ae/hDC;EACE,oBAAA;CfiiDH;AeliDC;EACE,oBAAA;CfoiDH;AeriDC;EACE,WAAA;CfuiDH;AexiDC;EACE,oBAAA;Cf0iDH;Ae3iDC;EACE,oBAAA;Cf6iDH;Ae9iDC;EACE,WAAA;CfgjDH;AejjDC;EACE,oBAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,WAAA;CfyjDH;Ae1jDC;EACE,oBAAA;Cf4jDH;Ae7jDC;EACE,mBAAA;Cf+jDH;AejjDC;EACE,YAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,oBAAA;CfyjDH;Ae1jDC;EACE,WAAA;Cf4jDH;Ae7jDC;EACE,oBAAA;Cf+jDH;AehkDC;EACE,oBAAA;CfkkDH;AenkDC;EACE,WAAA;CfqkDH;AetkDC;EACE,oBAAA;CfwkDH;AezkDC;EACE,oBAAA;Cf2kDH;Ae5kDC;EACE,WAAA;Cf8kDH;Ae/kDC;EACE,oBAAA;CfilDH;AellDC;EACE,mBAAA;CfolDH;AehlDC;EACE,YAAA;CfklDH;AelmDC;EACE,WAAA;CfomDH;AermDC;EACE,mBAAA;CfumDH;AexmDC;EACE,mBAAA;Cf0mDH;Ae3mDC;EACE,UAAA;Cf6mDH;Ae9mDC;EACE,mBAAA;CfgnDH;AejnDC;EACE,mBAAA;CfmnDH;AepnDC;EACE,UAAA;CfsnDH;AevnDC;EACE,mBAAA;CfynDH;Ae1nDC;EACE,mBAAA;Cf4nDH;Ae7nDC;EACE,UAAA;Cf+nDH;AehoDC;EACE,mBAAA;CfkoDH;AenoDC;EACE,kBAAA;CfqoDH;AejoDC;EACE,WAAA;CfmoDH;AernDC;EACE,kBAAA;CfunDH;AexnDC;EACE,0BAAA;Cf0nDH;Ae3nDC;EACE,0BAAA;Cf6nDH;Ae9nDC;EACE,iBAAA;CfgoDH;AejoDC;EACE,0BAAA;CfmoDH;AepoDC;EACE,0BAAA;CfsoDH;AevoDC;EACE,iBAAA;CfyoDH;Ae1oDC;EACE,0BAAA;Cf4oDH;Ae7oDC;EACE,0BAAA;Cf+oDH;AehpDC;EACE,iBAAA;CfkpDH;AenpDC;EACE,0BAAA;CfqpDH;AetpDC;EACE,yBAAA;CfwpDH;AezpDC;EACE,gBAAA;Cf2pDH;Aa3pDD;EElCI;IACE,YAAA;GfgsDH;EezrDD;IACE,YAAA;Gf2rDD;Ee5rDD;IACE,oBAAA;Gf8rDD;Ee/rDD;IACE,oBAAA;GfisDD;EelsDD;IACE,WAAA;GfosDD;EersDD;IACE,oBAAA;GfusDD;EexsDD;IACE,oBAAA;Gf0sDD;Ee3sDD;IACE,WAAA;Gf6sDD;Ee9sDD;IACE,oBAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,WAAA;GfstDD;EevtDD;IACE,oBAAA;GfytDD;Ee1tDD;IACE,mBAAA;Gf4tDD;Ee9sDD;IACE,YAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,oBAAA;GfstDD;EevtDD;IACE,WAAA;GfytDD;Ee1tDD;IACE,oBAAA;Gf4tDD;Ee7tDD;IACE,oBAAA;Gf+tDD;EehuDD;IACE,WAAA;GfkuDD;EenuDD;IACE,oBAAA;GfquDD;EetuDD;IACE,oBAAA;GfwuDD;EezuDD;IACE,WAAA;Gf2uDD;Ee5uDD;IACE,oBAAA;Gf8uDD;Ee/uDD;IACE,mBAAA;GfivDD;Ee7uDD;IACE,YAAA;Gf+uDD;Ee/vDD;IACE,WAAA;GfiwDD;EelwDD;IACE,mBAAA;GfowDD;EerwDD;IACE,mBAAA;GfuwDD;EexwDD;IACE,UAAA;Gf0wDD;Ee3wDD;IACE,mBAAA;Gf6wDD;Ee9wDD;IACE,mBAAA;GfgxDD;EejxDD;IACE,UAAA;GfmxDD;EepxDD;IACE,mBAAA;GfsxDD;EevxDD;IACE,mBAAA;GfyxDD;Ee1xDD;IACE,UAAA;Gf4xDD;Ee7xDD;IACE,mBAAA;Gf+xDD;EehyDD;IACE,kBAAA;GfkyDD;Ee9xDD;IACE,WAAA;GfgyDD;EelxDD;IACE,kBAAA;GfoxDD;EerxDD;IACE,0BAAA;GfuxDD;EexxDD;IACE,0BAAA;Gf0xDD;Ee3xDD;IACE,iBAAA;Gf6xDD;Ee9xDD;IACE,0BAAA;GfgyDD;EejyDD;IACE,0BAAA;GfmyDD;EepyDD;IACE,iBAAA;GfsyDD;EevyDD;IACE,0BAAA;GfyyDD;Ee1yDD;IACE,0BAAA;Gf4yDD;Ee7yDD;IACE,iBAAA;Gf+yDD;EehzDD;IACE,0BAAA;GfkzDD;EenzDD;IACE,yBAAA;GfqzDD;EetzDD;IACE,gBAAA;GfwzDD;CACF;AahzDD;EE3CI;IACE,YAAA;Gf81DH;Eev1DD;IACE,YAAA;Gfy1DD;Ee11DD;IACE,oBAAA;Gf41DD;Ee71DD;IACE,oBAAA;Gf+1DD;Eeh2DD;IACE,WAAA;Gfk2DD;Een2DD;IACE,oBAAA;Gfq2DD;Eet2DD;IACE,oBAAA;Gfw2DD;Eez2DD;IACE,WAAA;Gf22DD;Ee52DD;IACE,oBAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,WAAA;Gfo3DD;Eer3DD;IACE,oBAAA;Gfu3DD;Eex3DD;IACE,mBAAA;Gf03DD;Ee52DD;IACE,YAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,oBAAA;Gfo3DD;Eer3DD;IACE,WAAA;Gfu3DD;Eex3DD;IACE,oBAAA;Gf03DD;Ee33DD;IACE,oBAAA;Gf63DD;Ee93DD;IACE,WAAA;Gfg4DD;Eej4DD;IACE,oBAAA;Gfm4DD;Eep4DD;IACE,oBAAA;Gfs4DD;Eev4DD;IACE,WAAA;Gfy4DD;Ee14DD;IACE,oBAAA;Gf44DD;Ee74DD;IACE,mBAAA;Gf+4DD;Ee34DD;IACE,YAAA;Gf64DD;Ee75DD;IACE,WAAA;Gf+5DD;Eeh6DD;IACE,mBAAA;Gfk6DD;Een6DD;IACE,mBAAA;Gfq6DD;Eet6DD;IACE,UAAA;Gfw6DD;Eez6DD;IACE,mBAAA;Gf26DD;Ee56DD;IACE,mBAAA;Gf86DD;Ee/6DD;IACE,UAAA;Gfi7DD;Eel7DD;IACE,mBAAA;Gfo7DD;Eer7DD;IACE,mBAAA;Gfu7DD;Eex7DD;IACE,UAAA;Gf07DD;Ee37DD;IACE,mBAAA;Gf67DD;Ee97DD;IACE,kBAAA;Gfg8DD;Ee57DD;IACE,WAAA;Gf87DD;Eeh7DD;IACE,kBAAA;Gfk7DD;Een7DD;IACE,0BAAA;Gfq7DD;Eet7DD;IACE,0BAAA;Gfw7DD;Eez7DD;IACE,iBAAA;Gf27DD;Ee57DD;IACE,0BAAA;Gf87DD;Ee/7DD;IACE,0BAAA;Gfi8DD;Eel8DD;IACE,iBAAA;Gfo8DD;Eer8DD;IACE,0BAAA;Gfu8DD;Eex8DD;IACE,0BAAA;Gf08DD;Ee38DD;IACE,iBAAA;Gf68DD;Ee98DD;IACE,0BAAA;Gfg9DD;Eej9DD;IACE,yBAAA;Gfm9DD;Eep9DD;IACE,gBAAA;Gfs9DD;CACF;Aa38DD;EE9CI;IACE,YAAA;Gf4/DH;Eer/DD;IACE,YAAA;Gfu/DD;Eex/DD;IACE,oBAAA;Gf0/DD;Ee3/DD;IACE,oBAAA;Gf6/DD;Ee9/DD;IACE,WAAA;GfggED;EejgED;IACE,oBAAA;GfmgED;EepgED;IACE,oBAAA;GfsgED;EevgED;IACE,WAAA;GfygED;Ee1gED;IACE,oBAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,WAAA;GfkhED;EenhED;IACE,oBAAA;GfqhED;EethED;IACE,mBAAA;GfwhED;Ee1gED;IACE,YAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,oBAAA;GfkhED;EenhED;IACE,WAAA;GfqhED;EethED;IACE,oBAAA;GfwhED;EezhED;IACE,oBAAA;Gf2hED;Ee5hED;IACE,WAAA;Gf8hED;Ee/hED;IACE,oBAAA;GfiiED;EeliED;IACE,oBAAA;GfoiED;EeriED;IACE,WAAA;GfuiED;EexiED;IACE,oBAAA;Gf0iED;Ee3iED;IACE,mBAAA;Gf6iED;EeziED;IACE,YAAA;Gf2iED;Ee3jED;IACE,WAAA;Gf6jED;Ee9jED;IACE,mBAAA;GfgkED;EejkED;IACE,mBAAA;GfmkED;EepkED;IACE,UAAA;GfskED;EevkED;IACE,mBAAA;GfykED;Ee1kED;IACE,mBAAA;Gf4kED;Ee7kED;IACE,UAAA;Gf+kED;EehlED;IACE,mBAAA;GfklED;EenlED;IACE,mBAAA;GfqlED;EetlED;IACE,UAAA;GfwlED;EezlED;IACE,mBAAA;Gf2lED;Ee5lED;IACE,kBAAA;Gf8lED;Ee1lED;IACE,WAAA;Gf4lED;Ee9kED;IACE,kBAAA;GfglED;EejlED;IACE,0BAAA;GfmlED;EeplED;IACE,0BAAA;GfslED;EevlED;IACE,iBAAA;GfylED;Ee1lED;IACE,0BAAA;Gf4lED;Ee7lED;IACE,0BAAA;Gf+lED;EehmED;IACE,iBAAA;GfkmED;EenmED;IACE,0BAAA;GfqmED;EetmED;IACE,0BAAA;GfwmED;EezmED;IACE,iBAAA;Gf2mED;Ee5mED;IACE,0BAAA;Gf8mED;Ee/mED;IACE,yBAAA;GfinED;EelnED;IACE,gBAAA;GfonED;CACF;AgBxrED;EACE,8BAAA;ChB0rED;AgBxrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChB0rED;AgBxrED;EACE,iBAAA;ChB0rED;AgBprED;EACE,YAAA;EACA,gBAAA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","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.333333px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #ffffff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #ffffff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #ffffff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #ffffff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #ffffff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #ffffff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #ffffff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 3;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: @input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because