From cf1cc735edf48181b5d3f2a670b70582aeb8b2ee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=82=96=E5=B0=8F=E7=90=BC?=
Date: Mon, 3 Sep 2018 17:35:41 +0800
Subject: [PATCH] init
---
.gitignore | 24 +
LICENSE | 201 +
README.md | 69 +
api-gateway/pom.xml | 115 +
.../dingdong/mall/ApiGatewayApplication.java | 21 +
.../mall/aspect/ControllerAspect.java | 59 +
.../mall/config/OAuth2ServerConfig.java | 57 +
.../mall/config/ResourceServerConfig.java | 34 +
.../dingdong/mall/config/SecurityConfig.java | 46 +
.../mall/config/UserDetailsServiceImpl.java | 54 +
.../mall/controller/BaseController.java | 82 +
.../v1/ProductCategoryController.java | 43 +
.../mall/controller/v1/ProductController.java | 42 +
.../mall/controller/v1/UserController.java | 56 +
.../adlx/dingdong/mall/dto/PageResult.java | 45 +
.../com/adlx/dingdong/mall/dto/Response.java | 35 +
.../com/adlx/dingdong/mall/dto/Result.java | 98 +
.../mall/security/WebSecurityConfig.java | 17 +
.../com/adlx/dingdong/mall/util/MapUtil.java | 134 +
.../src/main/resources/application.yml | 75 +
api-gateway/src/main/resources/static/1.css | 0
.../src/main/resources/static/api/apidoc.json | 26 +
.../main/resources/static/api/doc/api_data.js | 224 +
.../resources/static/api/doc/api_data.json | 224 +
.../resources/static/api/doc/api_project.js | 33 +
.../resources/static/api/doc/api_project.json | 33 +
.../resources/static/api/doc/css/style.css | 569 +++
.../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
.../resources/static/api/doc/img/favicon.ico | Bin 0 -> 894 bytes
.../doc/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes
.../api/doc/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes
.../main/resources/static/api/doc/index.html | 669 +++
.../resources/static/api/doc/locales/ca.js | 25 +
.../resources/static/api/doc/locales/de.js | 25 +
.../resources/static/api/doc/locales/es.js | 25 +
.../resources/static/api/doc/locales/fr.js | 25 +
.../resources/static/api/doc/locales/it.js | 25 +
.../static/api/doc/locales/locale.js | 50 +
.../resources/static/api/doc/locales/nl.js | 25 +
.../resources/static/api/doc/locales/pl.js | 25 +
.../resources/static/api/doc/locales/pt_br.js | 25 +
.../resources/static/api/doc/locales/ro.js | 25 +
.../resources/static/api/doc/locales/ru.js | 25 +
.../resources/static/api/doc/locales/tr.js | 25 +
.../resources/static/api/doc/locales/vi.js | 25 +
.../resources/static/api/doc/locales/zh.js | 25 +
.../resources/static/api/doc/locales/zh_cn.js | 25 +
.../src/main/resources/static/api/doc/main.js | 827 ++++
.../static/api/doc/utils/handlebars_helper.js | 357 ++
.../api/doc/utils/send_sample_request.js | 184 +
.../doc/vendor/bootstrap-responsive.min.css | 9 +
.../static/api/doc/vendor/bootstrap.min.css | 6 +
.../static/api/doc/vendor/bootstrap.min.js | 7 +
.../api/doc/vendor/diff_match_patch.min.js | 49 +
.../static/api/doc/vendor/handlebars.min.js | 29 +
.../static/api/doc/vendor/jquery.min.js | 4 +
.../static/api/doc/vendor/list.min.js | 2 +
.../api/doc/vendor/lodash.custom.min.js | 41 +
.../static/api/doc/vendor/lodash.min.js | 61 +
.../api/doc/vendor/path-to-regexp/LICENSE | 21 +
.../api/doc/vendor/path-to-regexp/index.js | 204 +
.../static/api/doc/vendor/polyfill.js | 96 +
.../static/api/doc/vendor/prettify.css | 51 +
.../api/doc/vendor/prettify/lang-Splus.js | 18 +
.../api/doc/vendor/prettify/lang-aea.js | 18 +
.../api/doc/vendor/prettify/lang-agc.js | 18 +
.../api/doc/vendor/prettify/lang-apollo.js | 18 +
.../api/doc/vendor/prettify/lang-basic.js | 18 +
.../api/doc/vendor/prettify/lang-cbm.js | 18 +
.../static/api/doc/vendor/prettify/lang-cl.js | 18 +
.../api/doc/vendor/prettify/lang-clj.js | 17 +
.../api/doc/vendor/prettify/lang-css.js | 18 +
.../api/doc/vendor/prettify/lang-dart.js | 19 +
.../static/api/doc/vendor/prettify/lang-el.js | 18 +
.../api/doc/vendor/prettify/lang-erl.js | 18 +
.../api/doc/vendor/prettify/lang-erlang.js | 18 +
.../static/api/doc/vendor/prettify/lang-fs.js | 18 +
.../static/api/doc/vendor/prettify/lang-go.js | 17 +
.../static/api/doc/vendor/prettify/lang-hs.js | 18 +
.../api/doc/vendor/prettify/lang-lasso.js | 19 +
.../doc/vendor/prettify/lang-lassoscript.js | 19 +
.../api/doc/vendor/prettify/lang-latex.js | 17 +
.../api/doc/vendor/prettify/lang-lgt.js | 18 +
.../api/doc/vendor/prettify/lang-lisp.js | 18 +
.../static/api/doc/vendor/prettify/lang-ll.js | 17 +
.../api/doc/vendor/prettify/lang-llvm.js | 17 +
.../api/doc/vendor/prettify/lang-logtalk.js | 18 +
.../static/api/doc/vendor/prettify/lang-ls.js | 19 +
.../api/doc/vendor/prettify/lang-lsp.js | 18 +
.../api/doc/vendor/prettify/lang-lua.js | 18 +
.../api/doc/vendor/prettify/lang-matlab.js | 29 +
.../static/api/doc/vendor/prettify/lang-ml.js | 18 +
.../api/doc/vendor/prettify/lang-mumps.js | 18 +
.../static/api/doc/vendor/prettify/lang-n.js | 19 +
.../api/doc/vendor/prettify/lang-nemerle.js | 19 +
.../api/doc/vendor/prettify/lang-pascal.js | 18 +
.../api/doc/vendor/prettify/lang-proto.js | 17 +
.../static/api/doc/vendor/prettify/lang-r.js | 18 +
.../static/api/doc/vendor/prettify/lang-rd.js | 17 +
.../api/doc/vendor/prettify/lang-rkt.js | 18 +
.../api/doc/vendor/prettify/lang-rust.js | 20 +
.../static/api/doc/vendor/prettify/lang-s.js | 18 +
.../api/doc/vendor/prettify/lang-scala.js | 18 +
.../api/doc/vendor/prettify/lang-scm.js | 18 +
.../api/doc/vendor/prettify/lang-sql.js | 18 +
.../static/api/doc/vendor/prettify/lang-ss.js | 18 +
.../api/doc/vendor/prettify/lang-swift.js | 16 +
.../api/doc/vendor/prettify/lang-tcl.js | 18 +
.../api/doc/vendor/prettify/lang-tex.js | 17 +
.../static/api/doc/vendor/prettify/lang-vb.js | 19 +
.../api/doc/vendor/prettify/lang-vbs.js | 19 +
.../api/doc/vendor/prettify/lang-vhd.js | 19 +
.../api/doc/vendor/prettify/lang-vhdl.js | 19 +
.../api/doc/vendor/prettify/lang-wiki.js | 18 +
.../static/api/doc/vendor/prettify/lang-xq.js | 19 +
.../api/doc/vendor/prettify/lang-xquery.js | 19 +
.../api/doc/vendor/prettify/lang-yaml.js | 18 +
.../api/doc/vendor/prettify/lang-yml.js | 18 +
.../api/doc/vendor/prettify/prettify.css | 1 +
.../api/doc/vendor/prettify/prettify.js | 46 +
.../api/doc/vendor/prettify/run_prettify.js | 63 +
.../static/api/doc/vendor/require.min.js | 37 +
.../static/api/doc/vendor/semver.min.js | 1 +
.../static/api/doc/vendor/webfontloader.js | 17 +
.../src/main/resources/static/api/footer.md | 0
.../src/main/resources/static/api/header.md | 40 +
.../src/main/resources/static/api/main.js | 27 +
.../main/resources/static/api/oauth2-api.js | 37 +
api-gateway/src/main/webapp/api/apidoc.json | 26 +
.../src/main/webapp/api/doc/api_data.js | 227 +
.../src/main/webapp/api/doc/api_data.json | 227 +
.../src/main/webapp/api/doc/api_project.js | 33 +
.../src/main/webapp/api/doc/api_project.json | 33 +
.../src/main/webapp/api/doc/css/style.css | 569 +++
.../fonts/glyphicons-halflings-regular.eot | 0
.../fonts/glyphicons-halflings-regular.svg | 288 ++
.../fonts/glyphicons-halflings-regular.ttf | 0
.../fonts/glyphicons-halflings-regular.woff | 0
.../fonts/glyphicons-halflings-regular.woff2 | 0
.../src/main/webapp/api/doc/img/favicon.ico | Bin 0 -> 894 bytes
.../doc/img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes
.../api/doc/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes
.../src/main/webapp/api/doc/index.html | 669 +++
.../src/main/webapp/api/doc/locales/ca.js | 25 +
.../src/main/webapp/api/doc/locales/de.js | 25 +
.../src/main/webapp/api/doc/locales/es.js | 25 +
.../src/main/webapp/api/doc/locales/fr.js | 25 +
.../src/main/webapp/api/doc/locales/it.js | 25 +
.../src/main/webapp/api/doc/locales/locale.js | 50 +
.../src/main/webapp/api/doc/locales/nl.js | 25 +
.../src/main/webapp/api/doc/locales/pl.js | 25 +
.../src/main/webapp/api/doc/locales/pt_br.js | 25 +
.../src/main/webapp/api/doc/locales/ro.js | 25 +
.../src/main/webapp/api/doc/locales/ru.js | 25 +
.../src/main/webapp/api/doc/locales/tr.js | 25 +
.../src/main/webapp/api/doc/locales/vi.js | 25 +
.../src/main/webapp/api/doc/locales/zh.js | 25 +
.../src/main/webapp/api/doc/locales/zh_cn.js | 25 +
api-gateway/src/main/webapp/api/doc/main.js | 827 ++++
.../webapp/api/doc/utils/handlebars_helper.js | 357 ++
.../api/doc/utils/send_sample_request.js | 184 +
.../doc/vendor/bootstrap-responsive.min.css | 9 +
.../webapp/api/doc/vendor/bootstrap.min.css | 6 +
.../webapp/api/doc/vendor/bootstrap.min.js | 7 +
.../api/doc/vendor/diff_match_patch.min.js | 49 +
.../webapp/api/doc/vendor/handlebars.min.js | 29 +
.../main/webapp/api/doc/vendor/jquery.min.js | 4 +
.../main/webapp/api/doc/vendor/list.min.js | 2 +
.../api/doc/vendor/lodash.custom.min.js | 41 +
.../main/webapp/api/doc/vendor/lodash.min.js | 61 +
.../api/doc/vendor/path-to-regexp/LICENSE | 21 +
.../api/doc/vendor/path-to-regexp/index.js | 204 +
.../main/webapp/api/doc/vendor/polyfill.js | 96 +
.../main/webapp/api/doc/vendor/prettify.css | 51 +
.../api/doc/vendor/prettify/lang-Splus.js | 18 +
.../api/doc/vendor/prettify/lang-aea.js | 18 +
.../api/doc/vendor/prettify/lang-agc.js | 18 +
.../api/doc/vendor/prettify/lang-apollo.js | 18 +
.../api/doc/vendor/prettify/lang-basic.js | 18 +
.../api/doc/vendor/prettify/lang-cbm.js | 18 +
.../webapp/api/doc/vendor/prettify/lang-cl.js | 18 +
.../api/doc/vendor/prettify/lang-clj.js | 17 +
.../api/doc/vendor/prettify/lang-css.js | 18 +
.../api/doc/vendor/prettify/lang-dart.js | 19 +
.../webapp/api/doc/vendor/prettify/lang-el.js | 18 +
.../api/doc/vendor/prettify/lang-erl.js | 18 +
.../api/doc/vendor/prettify/lang-erlang.js | 18 +
.../webapp/api/doc/vendor/prettify/lang-fs.js | 18 +
.../webapp/api/doc/vendor/prettify/lang-go.js | 17 +
.../webapp/api/doc/vendor/prettify/lang-hs.js | 18 +
.../api/doc/vendor/prettify/lang-lasso.js | 19 +
.../doc/vendor/prettify/lang-lassoscript.js | 19 +
.../api/doc/vendor/prettify/lang-latex.js | 17 +
.../api/doc/vendor/prettify/lang-lgt.js | 18 +
.../api/doc/vendor/prettify/lang-lisp.js | 18 +
.../webapp/api/doc/vendor/prettify/lang-ll.js | 17 +
.../api/doc/vendor/prettify/lang-llvm.js | 17 +
.../api/doc/vendor/prettify/lang-logtalk.js | 18 +
.../webapp/api/doc/vendor/prettify/lang-ls.js | 19 +
.../api/doc/vendor/prettify/lang-lsp.js | 18 +
.../api/doc/vendor/prettify/lang-lua.js | 18 +
.../api/doc/vendor/prettify/lang-matlab.js | 29 +
.../webapp/api/doc/vendor/prettify/lang-ml.js | 18 +
.../api/doc/vendor/prettify/lang-mumps.js | 18 +
.../webapp/api/doc/vendor/prettify/lang-n.js | 19 +
.../api/doc/vendor/prettify/lang-nemerle.js | 19 +
.../api/doc/vendor/prettify/lang-pascal.js | 18 +
.../api/doc/vendor/prettify/lang-proto.js | 17 +
.../webapp/api/doc/vendor/prettify/lang-r.js | 18 +
.../webapp/api/doc/vendor/prettify/lang-rd.js | 17 +
.../api/doc/vendor/prettify/lang-rkt.js | 18 +
.../api/doc/vendor/prettify/lang-rust.js | 20 +
.../webapp/api/doc/vendor/prettify/lang-s.js | 18 +
.../api/doc/vendor/prettify/lang-scala.js | 18 +
.../api/doc/vendor/prettify/lang-scm.js | 18 +
.../api/doc/vendor/prettify/lang-sql.js | 18 +
.../webapp/api/doc/vendor/prettify/lang-ss.js | 18 +
.../api/doc/vendor/prettify/lang-swift.js | 16 +
.../api/doc/vendor/prettify/lang-tcl.js | 18 +
.../api/doc/vendor/prettify/lang-tex.js | 17 +
.../webapp/api/doc/vendor/prettify/lang-vb.js | 19 +
.../api/doc/vendor/prettify/lang-vbs.js | 19 +
.../api/doc/vendor/prettify/lang-vhd.js | 19 +
.../api/doc/vendor/prettify/lang-vhdl.js | 19 +
.../api/doc/vendor/prettify/lang-wiki.js | 18 +
.../webapp/api/doc/vendor/prettify/lang-xq.js | 19 +
.../api/doc/vendor/prettify/lang-xquery.js | 19 +
.../api/doc/vendor/prettify/lang-yaml.js | 18 +
.../api/doc/vendor/prettify/lang-yml.js | 18 +
.../api/doc/vendor/prettify/prettify.css | 1 +
.../api/doc/vendor/prettify/prettify.js | 46 +
.../api/doc/vendor/prettify/run_prettify.js | 63 +
.../main/webapp/api/doc/vendor/require.min.js | 37 +
.../main/webapp/api/doc/vendor/semver.min.js | 1 +
.../webapp/api/doc/vendor/webfontloader.js | 17 +
api-gateway/src/main/webapp/api/footer.md | 0
api-gateway/src/main/webapp/api/header.md | 40 +
api-gateway/src/main/webapp/api/main.js | 27 +
api-gateway/src/main/webapp/api/oauth2-api.js | 35 +
.../mall/DingdongmallApplicationTests.java | 31 +
.../192_168_0_159_eureka_8501/bytetcc-1.log | Bin 0 -> 1048576 bytes
.../192_168_0_159_eureka_8501/bytetcc-2.log | Bin 0 -> 1048576 bytes
.../192_168_0_159_eureka_8501/resource1.log | Bin 0 -> 48 bytes
.../192_168_0_159_eureka_8501/resource2.log | Bin 0 -> 48 bytes
.../bytetcc-1.log | Bin 0 -> 1048576 bytes
.../bytetcc-2.log | Bin 0 -> 1048576 bytes
.../resource1.log | Bin 0 -> 48 bytes
.../resource2.log | Bin 0 -> 48 bytes
.../bytetcc-1.log | Bin 0 -> 1048576 bytes
.../bytetcc-2.log | Bin 0 -> 1048576 bytes
.../resource1.log | Bin 0 -> 48 bytes
.../resource2.log | Bin 0 -> 48 bytes
commons/pom.xml | 25 +
.../mall/commons/enums/ProductDescEnum.java | 22 +
.../commons/h2/H2ServerConfiguration.java | 34 +
.../dingdong/mall/commons/utils/Beans.java | 238 +
config-server/pom.xml | 64 +
.../mall/ConfigServerApplication.java | 17 +
.../src/main/resources/application.yml | 22 +
.../resources/config/user-service-dev.yml | 1 +
.../main/resources/config/user-service.yml | 1 +
dockerBuildAndRun.sh | 31 +
docs/create_order.asta | Bin 0 -> 19304 bytes
docs/create_order.png | Bin 0 -> 85591 bytes
docs/images/h2_web_utils.jpg | Bin 0 -> 51164 bytes
eureka-server/pom.xml | 59 +
.../adlx/dingdong/mall/EurekaApplication.java | 14 +
.../src/main/resources/application.yml | 21 +
mvnw | 286 ++
mvnw.cmd | 161 +
order-service/order-service-api/pom.xml | 20 +
.../mall/order/core/api/OrderService.java | 17 +
order-service/order-service-core/pom.xml | 55 +
.../mall/OrderServiceApplication.java | 22 +
.../mall/order/core/OrderServiceImpl.java | 44 +
.../dingdong/mall/order/db/domain/Order.java | 28 +
.../mall/order/db/reposity/OrderReposity.java | 12 +
.../mall/order/db/status/OrderStatus.java | 5 +
.../src/main/resources/application.yml | 24 +
order-service/pom.xml | 20 +
pom.xml | 75 +
product-service/pom.xml | 20 +
product-service/product-service-api/pom.xml | 27 +
.../mall/client/ProductCategoryClient.java | 21 +
.../dingdong/mall/client/ProductClient.java | 21 +
.../ProductCategoryFeignClientHystrix.java | 18 +
.../hystrix/ProductFeignClientHystrix.java | 17 +
.../com/adlx/dingdong/mall/dto/PageBean.java | 12 +
.../mall/dto/ShopGoodsCategoryDTO.java | 8 +
.../adlx/dingdong/mall/dto/ShopGoodsDTO.java | 11 +
.../dingdong/mall/vo/ShopGoodsCategoryVO.java | 383 ++
.../adlx/dingdong/mall/vo/ShopGoodsVO.java | 2134 +++++++++
product-service/product-service-core/pom.xml | 149 +
.../mall/ProductServiceApplication.java | 18 +
.../mall/config/DataSourceProperties.java | 196 +
.../mall/config/DruidDataSourceConfig.java | 51 +
.../mall/config/SqlSessionFactoryConfig.java | 55 +
.../mall/core/ProductCategoryClientImpl.java | 53 +
.../dingdong/mall/core/ProductClientImpl.java | 61 +
.../adlx/dingdong/mall/domain/ShopGoods.java | 2259 +++++++++
.../mall/domain/ShopGoodsCategory.java | 402 ++
.../domain/ShopGoodsCategoryCriteria.java | 922 ++++
.../mall/domain/ShopGoodsCriteria.java | 4173 +++++++++++++++++
.../mall/domain/ShopGoodsWithBLOBs.java | 248 +
.../mall/mapper/ShopGoodsCategoryMapper.java | 108 +
.../dingdong/mall/mapper/ShopGoodsMapper.java | 141 +
.../src/main/resources/application.yml | 60 +
.../src/main/resources/bootstrap.yml | 12 +
.../resources/generator/generatorConfig.xml | 54 +
.../mapper/ShopGoodsCategoryMapper.xml | 379 ++
.../main/resources/mapper/ShopGoodsMapper.xml | 1453 ++++++
run.sh | 37 +
score-service/pom.xml | 61 +
score-service/score-service-api/pom.xml | 20 +
.../mall/score/core/api/ScoreService.java | 16 +
.../mall/score/core/api/TCCScoreService.java | 17 +
score-service/score-service-core/nohup.out | 3 +
score-service/score-service-core/pom.xml | 63 +
.../mall/ScoreServiceApplication.java | 22 +
.../mall/score/core/ScoreServiceImpl.java | 24 +
.../mall/score/core/TCCScoreServiceImpl.java | 47 +
.../dingdong/mall/score/db/domain/Score.java | 26 +
.../mall/score/db/reposity/ScoreReposity.java | 12 +
.../src/main/resources/application.yml | 24 +
user-service/pom.xml | 22 +
user-service/user-service-api/pom.xml | 23 +
.../mall/user/api/UserFeignClient.java | 28 +
.../api/hystrix/UserFeignClientHystrix.java | 30 +
.../adlx/dingdong/mall/user/dto/UserDTO.java | 16 +
.../dingdong/mall/user/dto/UserRegDTO.java | 12 +
.../adlx/dingdong/mall/user/vo/UserVO.java | 371 ++
user-service/user-service-core/pom.xml | 153 +
.../dingdong/mall/UserServiceApplication.java | 18 +
.../mall/config/DataSourceProperties.java | 196 +
.../mall/config/DruidDataSourceConfig.java | 51 +
.../mall/config/SqlSessionFactoryConfig.java | 55 +
.../com/adlx/dingdong/mall/domain/User.java | 1629 +++++++
.../adlx/dingdong/mall/domain/UserCopy.java | 1349 ++++++
.../mall/domain/UserCopyCriteria.java | 2673 +++++++++++
.../dingdong/mall/domain/UserCriteria.java | 3173 +++++++++++++
.../mall/health/MyHealthCheckHandler.java | 29 +
.../mall/health/MyHealthIndicator.java | 20 +
.../dingdong/mall/mapper/UserCopyMapper.java | 105 +
.../adlx/dingdong/mall/mapper/UserMapper.java | 108 +
.../service/impl/UserFeignClientImpl.java | 64 +
.../src/main/resources/application.yml | 60 +
.../src/main/resources/bootstrap.yml | 12 +
.../resources/generator/generatorConfig-A.xml | 37 +
.../resources/generator/generatorConfig-B.xml | 52 +
.../resources/generator/generatorConfig.xml | 53 +
.../main/resources/mapper/UserCopyMapper.xml | 805 ++++
.../src/main/resources/mapper/UserMapper.xml | 930 ++++
zipkinserver/pom.xml | 72 +
.../mall/ZipkinServerApplication.java | 16 +
.../src/main/resources/application.yml | 30 +
359 files changed, 40066 insertions(+)
create mode 100644 .gitignore
create mode 100644 LICENSE
create mode 100644 api-gateway/pom.xml
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/ApiGatewayApplication.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/aspect/ControllerAspect.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/config/OAuth2ServerConfig.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/config/ResourceServerConfig.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/config/SecurityConfig.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/config/UserDetailsServiceImpl.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/controller/BaseController.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/ProductCategoryController.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/ProductController.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/UserController.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/dto/PageResult.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/dto/Response.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/dto/Result.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/security/WebSecurityConfig.java
create mode 100644 api-gateway/src/main/java/com/adlx/dingdong/mall/util/MapUtil.java
create mode 100644 api-gateway/src/main/resources/application.yml
create mode 100644 api-gateway/src/main/resources/static/1.css
create mode 100644 api-gateway/src/main/resources/static/api/apidoc.json
create mode 100644 api-gateway/src/main/resources/static/api/doc/api_data.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/api_data.json
create mode 100644 api-gateway/src/main/resources/static/api/doc/api_project.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/api_project.json
create mode 100644 api-gateway/src/main/resources/static/api/doc/css/style.css
create mode 100644 api-gateway/src/main/resources/static/api/doc/fonts/glyphicons-halflings-regular.eot
create mode 100644 api-gateway/src/main/resources/static/api/doc/fonts/glyphicons-halflings-regular.svg
create mode 100644 api-gateway/src/main/resources/static/api/doc/fonts/glyphicons-halflings-regular.ttf
create mode 100644 api-gateway/src/main/resources/static/api/doc/fonts/glyphicons-halflings-regular.woff
create mode 100644 api-gateway/src/main/resources/static/api/doc/fonts/glyphicons-halflings-regular.woff2
create mode 100644 api-gateway/src/main/resources/static/api/doc/img/favicon.ico
create mode 100644 api-gateway/src/main/resources/static/api/doc/img/glyphicons-halflings-white.png
create mode 100644 api-gateway/src/main/resources/static/api/doc/img/glyphicons-halflings.png
create mode 100644 api-gateway/src/main/resources/static/api/doc/index.html
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/ca.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/de.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/es.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/fr.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/it.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/locale.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/nl.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/pl.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/pt_br.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/ro.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/ru.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/tr.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/vi.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/zh.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/locales/zh_cn.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/main.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/utils/handlebars_helper.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/utils/send_sample_request.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/bootstrap-responsive.min.css
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/bootstrap.min.css
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/bootstrap.min.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/diff_match_patch.min.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/handlebars.min.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/jquery.min.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/list.min.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/lodash.custom.min.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/lodash.min.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/path-to-regexp/LICENSE
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/path-to-regexp/index.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/polyfill.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify.css
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-Splus.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-aea.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-agc.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-apollo.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-basic.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-cbm.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-cl.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-clj.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-css.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-dart.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-el.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-erl.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-erlang.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-fs.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-go.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-hs.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-lasso.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-lassoscript.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-latex.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-lgt.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-lisp.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-ll.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-llvm.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-logtalk.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-ls.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-lsp.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-lua.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-matlab.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-ml.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-mumps.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-n.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-nemerle.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-pascal.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-proto.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-r.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-rd.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-rkt.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-rust.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-s.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-scala.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-scm.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-sql.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-ss.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-swift.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-tcl.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-tex.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-vb.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-vbs.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-vhd.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-vhdl.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-wiki.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-xq.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-xquery.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-yaml.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/lang-yml.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/prettify.css
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/prettify.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/prettify/run_prettify.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/require.min.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/semver.min.js
create mode 100644 api-gateway/src/main/resources/static/api/doc/vendor/webfontloader.js
create mode 100644 api-gateway/src/main/resources/static/api/footer.md
create mode 100644 api-gateway/src/main/resources/static/api/header.md
create mode 100644 api-gateway/src/main/resources/static/api/main.js
create mode 100644 api-gateway/src/main/resources/static/api/oauth2-api.js
create mode 100644 api-gateway/src/main/webapp/api/apidoc.json
create mode 100644 api-gateway/src/main/webapp/api/doc/api_data.js
create mode 100644 api-gateway/src/main/webapp/api/doc/api_data.json
create mode 100644 api-gateway/src/main/webapp/api/doc/api_project.js
create mode 100644 api-gateway/src/main/webapp/api/doc/api_project.json
create mode 100644 api-gateway/src/main/webapp/api/doc/css/style.css
create mode 100644 api-gateway/src/main/webapp/api/doc/fonts/glyphicons-halflings-regular.eot
create mode 100644 api-gateway/src/main/webapp/api/doc/fonts/glyphicons-halflings-regular.svg
create mode 100644 api-gateway/src/main/webapp/api/doc/fonts/glyphicons-halflings-regular.ttf
create mode 100644 api-gateway/src/main/webapp/api/doc/fonts/glyphicons-halflings-regular.woff
create mode 100644 api-gateway/src/main/webapp/api/doc/fonts/glyphicons-halflings-regular.woff2
create mode 100644 api-gateway/src/main/webapp/api/doc/img/favicon.ico
create mode 100644 api-gateway/src/main/webapp/api/doc/img/glyphicons-halflings-white.png
create mode 100644 api-gateway/src/main/webapp/api/doc/img/glyphicons-halflings.png
create mode 100644 api-gateway/src/main/webapp/api/doc/index.html
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/ca.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/de.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/es.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/fr.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/it.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/locale.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/nl.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/pl.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/pt_br.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/ro.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/ru.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/tr.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/vi.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/zh.js
create mode 100644 api-gateway/src/main/webapp/api/doc/locales/zh_cn.js
create mode 100644 api-gateway/src/main/webapp/api/doc/main.js
create mode 100644 api-gateway/src/main/webapp/api/doc/utils/handlebars_helper.js
create mode 100644 api-gateway/src/main/webapp/api/doc/utils/send_sample_request.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/bootstrap-responsive.min.css
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/bootstrap.min.css
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/bootstrap.min.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/diff_match_patch.min.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/handlebars.min.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/jquery.min.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/list.min.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/lodash.custom.min.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/lodash.min.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/path-to-regexp/LICENSE
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/path-to-regexp/index.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/polyfill.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify.css
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-Splus.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-aea.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-agc.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-apollo.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-basic.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-cbm.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-cl.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-clj.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-css.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-dart.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-el.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-erl.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-erlang.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-fs.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-go.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-hs.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-lasso.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-lassoscript.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-latex.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-lgt.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-lisp.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-ll.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-llvm.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-logtalk.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-ls.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-lsp.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-lua.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-matlab.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-ml.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-mumps.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-n.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-nemerle.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-pascal.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-proto.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-r.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-rd.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-rkt.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-rust.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-s.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-scala.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-scm.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-sql.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-ss.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-swift.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-tcl.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-tex.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-vb.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-vbs.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-vhd.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-vhdl.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-wiki.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-xq.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-xquery.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-yaml.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/lang-yml.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/prettify.css
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/prettify.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/prettify/run_prettify.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/require.min.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/semver.min.js
create mode 100644 api-gateway/src/main/webapp/api/doc/vendor/webfontloader.js
create mode 100644 api-gateway/src/main/webapp/api/footer.md
create mode 100644 api-gateway/src/main/webapp/api/header.md
create mode 100644 api-gateway/src/main/webapp/api/main.js
create mode 100644 api-gateway/src/main/webapp/api/oauth2-api.js
create mode 100644 api-gateway/src/test/java/com/adlx/dingdong/mall/DingdongmallApplicationTests.java
create mode 100644 bytetcc/192_168_0_159_eureka_8501/bytetcc-1.log
create mode 100644 bytetcc/192_168_0_159_eureka_8501/bytetcc-2.log
create mode 100644 bytetcc/192_168_0_159_eureka_8501/resource1.log
create mode 100644 bytetcc/192_168_0_159_eureka_8501/resource2.log
create mode 100644 bytetcc/192_168_0_159_order_service_8004/bytetcc-1.log
create mode 100644 bytetcc/192_168_0_159_order_service_8004/bytetcc-2.log
create mode 100644 bytetcc/192_168_0_159_order_service_8004/resource1.log
create mode 100644 bytetcc/192_168_0_159_order_service_8004/resource2.log
create mode 100644 bytetcc/192_168_0_159_score_service_8002/bytetcc-1.log
create mode 100644 bytetcc/192_168_0_159_score_service_8002/bytetcc-2.log
create mode 100644 bytetcc/192_168_0_159_score_service_8002/resource1.log
create mode 100644 bytetcc/192_168_0_159_score_service_8002/resource2.log
create mode 100644 commons/pom.xml
create mode 100644 commons/src/main/java/com/adlx/dingdong/mall/commons/enums/ProductDescEnum.java
create mode 100644 commons/src/main/java/com/adlx/dingdong/mall/commons/h2/H2ServerConfiguration.java
create mode 100644 commons/src/main/java/com/adlx/dingdong/mall/commons/utils/Beans.java
create mode 100644 config-server/pom.xml
create mode 100644 config-server/src/main/java/com/adlx/dingdong/mall/ConfigServerApplication.java
create mode 100644 config-server/src/main/resources/application.yml
create mode 100644 config-server/src/main/resources/config/user-service-dev.yml
create mode 100644 config-server/src/main/resources/config/user-service.yml
create mode 100644 dockerBuildAndRun.sh
create mode 100644 docs/create_order.asta
create mode 100644 docs/create_order.png
create mode 100644 docs/images/h2_web_utils.jpg
create mode 100644 eureka-server/pom.xml
create mode 100644 eureka-server/src/main/java/com/adlx/dingdong/mall/EurekaApplication.java
create mode 100644 eureka-server/src/main/resources/application.yml
create mode 100644 mvnw
create mode 100644 mvnw.cmd
create mode 100644 order-service/order-service-api/pom.xml
create mode 100644 order-service/order-service-api/src/main/java/com/adlx/dingdong/mall/order/core/api/OrderService.java
create mode 100644 order-service/order-service-core/pom.xml
create mode 100644 order-service/order-service-core/src/main/java/com/adlx/dingdong/mall/OrderServiceApplication.java
create mode 100644 order-service/order-service-core/src/main/java/com/adlx/dingdong/mall/order/core/OrderServiceImpl.java
create mode 100644 order-service/order-service-core/src/main/java/com/adlx/dingdong/mall/order/db/domain/Order.java
create mode 100644 order-service/order-service-core/src/main/java/com/adlx/dingdong/mall/order/db/reposity/OrderReposity.java
create mode 100644 order-service/order-service-core/src/main/java/com/adlx/dingdong/mall/order/db/status/OrderStatus.java
create mode 100644 order-service/order-service-core/src/main/resources/application.yml
create mode 100644 order-service/pom.xml
create mode 100644 pom.xml
create mode 100644 product-service/pom.xml
create mode 100644 product-service/product-service-api/pom.xml
create mode 100644 product-service/product-service-api/src/main/java/com/adlx/dingdong/mall/client/ProductCategoryClient.java
create mode 100644 product-service/product-service-api/src/main/java/com/adlx/dingdong/mall/client/ProductClient.java
create mode 100644 product-service/product-service-api/src/main/java/com/adlx/dingdong/mall/client/hystrix/ProductCategoryFeignClientHystrix.java
create mode 100644 product-service/product-service-api/src/main/java/com/adlx/dingdong/mall/client/hystrix/ProductFeignClientHystrix.java
create mode 100644 product-service/product-service-api/src/main/java/com/adlx/dingdong/mall/dto/PageBean.java
create mode 100644 product-service/product-service-api/src/main/java/com/adlx/dingdong/mall/dto/ShopGoodsCategoryDTO.java
create mode 100644 product-service/product-service-api/src/main/java/com/adlx/dingdong/mall/dto/ShopGoodsDTO.java
create mode 100644 product-service/product-service-api/src/main/java/com/adlx/dingdong/mall/vo/ShopGoodsCategoryVO.java
create mode 100644 product-service/product-service-api/src/main/java/com/adlx/dingdong/mall/vo/ShopGoodsVO.java
create mode 100644 product-service/product-service-core/pom.xml
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/ProductServiceApplication.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/config/DataSourceProperties.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/config/DruidDataSourceConfig.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/config/SqlSessionFactoryConfig.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/core/ProductCategoryClientImpl.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/core/ProductClientImpl.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/domain/ShopGoods.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/domain/ShopGoodsCategory.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/domain/ShopGoodsCategoryCriteria.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/domain/ShopGoodsCriteria.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/domain/ShopGoodsWithBLOBs.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/mapper/ShopGoodsCategoryMapper.java
create mode 100644 product-service/product-service-core/src/main/java/com/adlx/dingdong/mall/mapper/ShopGoodsMapper.java
create mode 100644 product-service/product-service-core/src/main/resources/application.yml
create mode 100644 product-service/product-service-core/src/main/resources/bootstrap.yml
create mode 100644 product-service/product-service-core/src/main/resources/generator/generatorConfig.xml
create mode 100644 product-service/product-service-core/src/main/resources/mapper/ShopGoodsCategoryMapper.xml
create mode 100644 product-service/product-service-core/src/main/resources/mapper/ShopGoodsMapper.xml
create mode 100644 run.sh
create mode 100644 score-service/pom.xml
create mode 100644 score-service/score-service-api/pom.xml
create mode 100644 score-service/score-service-api/src/main/java/com/adlx/dingdong/mall/score/core/api/ScoreService.java
create mode 100644 score-service/score-service-api/src/main/java/com/adlx/dingdong/mall/score/core/api/TCCScoreService.java
create mode 100644 score-service/score-service-core/nohup.out
create mode 100644 score-service/score-service-core/pom.xml
create mode 100644 score-service/score-service-core/src/main/java/com/adlx/dingdong/mall/ScoreServiceApplication.java
create mode 100644 score-service/score-service-core/src/main/java/com/adlx/dingdong/mall/score/core/ScoreServiceImpl.java
create mode 100644 score-service/score-service-core/src/main/java/com/adlx/dingdong/mall/score/core/TCCScoreServiceImpl.java
create mode 100644 score-service/score-service-core/src/main/java/com/adlx/dingdong/mall/score/db/domain/Score.java
create mode 100644 score-service/score-service-core/src/main/java/com/adlx/dingdong/mall/score/db/reposity/ScoreReposity.java
create mode 100644 score-service/score-service-core/src/main/resources/application.yml
create mode 100644 user-service/pom.xml
create mode 100644 user-service/user-service-api/pom.xml
create mode 100644 user-service/user-service-api/src/main/java/com/adlx/dingdong/mall/user/api/UserFeignClient.java
create mode 100644 user-service/user-service-api/src/main/java/com/adlx/dingdong/mall/user/api/hystrix/UserFeignClientHystrix.java
create mode 100644 user-service/user-service-api/src/main/java/com/adlx/dingdong/mall/user/dto/UserDTO.java
create mode 100644 user-service/user-service-api/src/main/java/com/adlx/dingdong/mall/user/dto/UserRegDTO.java
create mode 100644 user-service/user-service-api/src/main/java/com/adlx/dingdong/mall/user/vo/UserVO.java
create mode 100644 user-service/user-service-core/pom.xml
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/UserServiceApplication.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/config/DataSourceProperties.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/config/DruidDataSourceConfig.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/config/SqlSessionFactoryConfig.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/domain/User.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/domain/UserCopy.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/domain/UserCopyCriteria.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/domain/UserCriteria.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/health/MyHealthCheckHandler.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/health/MyHealthIndicator.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/mapper/UserCopyMapper.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/mapper/UserMapper.java
create mode 100644 user-service/user-service-core/src/main/java/com/adlx/dingdong/mall/service/impl/UserFeignClientImpl.java
create mode 100644 user-service/user-service-core/src/main/resources/application.yml
create mode 100644 user-service/user-service-core/src/main/resources/bootstrap.yml
create mode 100644 user-service/user-service-core/src/main/resources/generator/generatorConfig-A.xml
create mode 100644 user-service/user-service-core/src/main/resources/generator/generatorConfig-B.xml
create mode 100644 user-service/user-service-core/src/main/resources/generator/generatorConfig.xml
create mode 100644 user-service/user-service-core/src/main/resources/mapper/UserCopyMapper.xml
create mode 100644 user-service/user-service-core/src/main/resources/mapper/UserMapper.xml
create mode 100644 zipkinserver/pom.xml
create mode 100644 zipkinserver/src/main/java/com/adlx/dingdong/mall/ZipkinServerApplication.java
create mode 100644 zipkinserver/src/main/resources/application.yml
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..2af7cef
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/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/README.md b/README.md
index e69de29..46980c6 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,69 @@
+# 项目简介
+
+1. 此商城项目,使用spring cloud 全家桶进行开发
+
+2. 事务处理使用两种:强一致性(TCC),最终一致性(EDA)
+
+
+## 使用技术
+
+1. java 8 : 使用lambda表达式,简化写法
+
+1. lombok : 简化java bean的写法
+
+1. docker-maven-plugin : 直接生成Dockerfile (本地需更换成阿里云镜像,速度和成功率会提升很多)
+
+1. mysql : 数据库
+
+1. mybatis : ORM持久层框架
+
+1. Druid : 数据库连接池
+
+1. spring cloud eureka : 用于服务注册发现
+
+1. spring mvc : 访问控制层技术
+
+1. spring cloud robbin : 使用客户端负载均衡,进行服务提供者的调用
+
+1. spring cloud feign : 分装了ribbon的使用,直接使用注解的方式,进行调用
+
+1. spring boot actuate : spring boot项目的健康检查,此项目整合了应用服务的健康状态
+
+1. spring security-oauth2 : 权限管理
+
+1. spring cloud zuul : 网关服务,用来聚合和管理底层微服务接口
+
+1. spring cloud config : 集中配置管理,整合各个微服务下的不同配置文件
+
+1. spring cloud zipkin : 微服务调用监控系统,可以监听整个调用连
+
+1. ByteTCC:TCC事务实现框架 [点击进入TCC的github地址](https://github.com/liuyangming/ByteTCC/)
+
+### 接口文档
+http://localhost:9999/api/doc/index.html
+
+## 项目分级
+
+### 业务分级
+
+此项目分为四个核心模块:
+
+1. 用户模块(user-service):
+
+1. 产品模块(product-service):
+
+1. 订单模块(order-service):
+
+1. 积分模块(score-service):
+
+
+### 核心模块分层:
+
+{模块名}-service-api: 微服务的模块api定义
+
+{模块名}-service-core: 微服务的模块业务逻辑实现
+
+### 从 Feign 使用注意点到 RESTFUL 接口设计规范
+ http://www.importnew.com/27266.html
+
+
diff --git a/api-gateway/pom.xml b/api-gateway/pom.xml
new file mode 100644
index 0000000..41620d8
--- /dev/null
+++ b/api-gateway/pom.xml
@@ -0,0 +1,115 @@
+
+
+
+ shop
+ com.adlx.dingdong
+ 0.0.1-SNAPSHOT
+
+ 4.0.0
+
+ api-gateway
+
+
+
+ com.adlx.dingdong
+ user-service-api
+ 0.0.1-SNAPSHOT
+
+
+ com.adlx.dingdong
+ product-service-api
+ 0.0.1-SNAPSHOT
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zuul
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-eureka-client
+
+
+ org.springframework.cloud
+ spring-cloud-starter-hystrix
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+ org.springframework.security.oauth
+ spring-security-oauth2
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.15
+
+
+
+ org.aspectj
+ aspectjrt
+ ${aspectj.version}
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+ com.spotify
+ docker-maven-plugin
+ 0.4.13
+
+
+
+ ${project.name}:${project.version}
+ java
+ ["java", "-jar", "/${project.build.finalName}.jar"]
+
+
+ /
+ ${project.build.directory}
+ ${project.build.finalName}.jar
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/ApiGatewayApplication.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/ApiGatewayApplication.java
new file mode 100644
index 0000000..ce85d9f
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/ApiGatewayApplication.java
@@ -0,0 +1,21 @@
+package com.adlx.dingdong.mall;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.cloud.client.SpringCloudApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+
+@EnableFeignClients
+@EnableDiscoveryClient
+@EnableEurekaClient
+@EnableZuulProxy
+@SpringCloudApplication
+public class ApiGatewayApplication {
+
+ public static void main(String[] args) {
+ new SpringApplicationBuilder(ApiGatewayApplication.class).web(true).run(args);
+ }
+
+}
\ No newline at end of file
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/aspect/ControllerAspect.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/aspect/ControllerAspect.java
new file mode 100644
index 0000000..7e3eba8
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/aspect/ControllerAspect.java
@@ -0,0 +1,59 @@
+package com.adlx.dingdong.mall.aspect;
+
+import com.adlx.dingdong.mall.util.MapUtil;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Iterator;
+import java.util.Map;
+
+
+/**
+ * 控制器切面日志
+ */
+@Aspect
+@Component
+@Slf4j
+public class ControllerAspect {
+
+
+ ThreadLocal startTime = new ThreadLocal();
+
+ @Pointcut("execution(public * com.adlx.dingdong.mall.controller..*.*(..))")
+ public void webLog() {
+ }
+
+ @Before("webLog()")
+ public void doBefore(JoinPoint joinPoint) throws Throwable {
+ startTime.set(System.currentTimeMillis());
+ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+ HttpServletRequest request = attributes.getRequest();
+ Map parameterMap = MapUtil.getParameterMap(request);
+ Iterator> entries = parameterMap.entrySet().iterator();
+ while (entries.hasNext()) {
+ Map.Entry entry = entries.next();
+ if (entry.getValue() != null && entry.getValue().length() > 1000) {
+ parameterMap.put(entry.getKey(), " value is too long");
+ }
+ }
+ log.info("接口请求URL:{} 参数:{}", request.getRequestURL().toString(), JSON.toJSONString(parameterMap));
+ }
+
+ @AfterReturning(returning = "object", pointcut = "webLog()")
+ public void doAfterReturning(Object object) throws Throwable {
+ log.info("耗时:{}ms 接口调用返回:{} ", System.currentTimeMillis() - startTime.get(), JSON.toJSONString(object));
+ }
+
+ @AfterThrowing(pointcut = "webLog()", throwing = "e")
+ public void handle(JoinPoint point, Exception e) {
+ String methodName = point.getTarget().getClass() + "." + point.getSignature().getName();
+ log.error("耗时:{}ms 调用方法{}错误:{} ", System.currentTimeMillis() - startTime.get(), methodName, e.getMessage());
+ }
+
+}
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/config/OAuth2ServerConfig.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/config/OAuth2ServerConfig.java
new file mode 100644
index 0000000..ab5c02d
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/config/OAuth2ServerConfig.java
@@ -0,0 +1,57 @@
+package com.adlx.dingdong.mall.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
+import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
+
+import javax.annotation.Resource;
+
+@Configuration
+@EnableAuthorizationServer
+public class OAuth2ServerConfig extends AuthorizationServerConfigurerAdapter {
+
+ @Autowired
+ private AuthenticationManager authenticationManager;
+
+ @Autowired
+ private RedisConnectionFactory connectionFactory;
+
+ @Resource
+ private UserDetailsService userDetailsService;
+
+
+ @Override
+ public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
+ endpoints.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
+ .userDetailsService(userDetailsService)
+ .authenticationManager(authenticationManager).tokenStore(tokenStore());
+ }
+
+ @Bean
+ public TokenStore tokenStore() {
+ RedisTokenStore redis = new RedisTokenStore(connectionFactory);
+ return redis;
+ }
+
+ @Override
+ public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
+ clients.inMemory()
+ .withClient("demoApp")
+ .secret("123456")
+ .authorizedGrantTypes("authorization_code", "password", "client_credentials")
+// .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT")
+ .scopes("read", "write", "trust"); //授权用户的操作权限
+ }
+
+
+}
\ No newline at end of file
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/config/ResourceServerConfig.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/config/ResourceServerConfig.java
new file mode 100644
index 0000000..312152b
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/config/ResourceServerConfig.java
@@ -0,0 +1,34 @@
+package com.adlx.dingdong.mall.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+
+@Configuration
+@EnableResourceServer
+public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
+
+ @Override
+ public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
+ resources.resourceId("api-gateway").stateless(false);
+ }
+
+ @Override
+ public void configure(HttpSecurity http) throws Exception {
+ http
+ .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+ .and()
+ .requestMatcher(new AntPathRequestMatcher("/v1/**"))
+ .authorizeRequests()
+// .antMatchers("/v1/product/**").access("#oauth2.hasScope('public')")
+ .antMatchers("/v1/user/**").access("#oauth2.hasScope('write')")
+// .antMatchers("/v3/user/**").access("#oauth2.hasScope('write')")
+ //TODO: add more
+ ;
+ }
+
+}
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/config/SecurityConfig.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/config/SecurityConfig.java
new file mode 100644
index 0000000..c77ba05
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/config/SecurityConfig.java
@@ -0,0 +1,46 @@
+package com.adlx.dingdong.mall.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.builders.WebSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+@EnableWebSecurity
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Bean
+ public UserDetailsServiceImpl userDetailsService() {
+ return new UserDetailsServiceImpl();
+ }
+
+ @Bean
+ @Override
+ public AuthenticationManager authenticationManagerBean() throws Exception {
+ return super.authenticationManagerBean();
+ }
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+ auth.userDetailsService(userDetailsService()).passwordEncoder(new Md5PasswordEncoder());
+ }
+
+ @Override
+ public void configure(WebSecurity web) throws Exception {
+ web.ignoring().antMatchers("/index.html", "/api/doc/**");
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.authorizeRequests()
+ .antMatchers("/v1/**").access("hasRole('ROLE_USER')")
+ .and()
+ .csrf().disable();
+ }
+
+}
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/config/UserDetailsServiceImpl.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/config/UserDetailsServiceImpl.java
new file mode 100644
index 0000000..d0bb067
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/config/UserDetailsServiceImpl.java
@@ -0,0 +1,54 @@
+package com.adlx.dingdong.mall.config;
+
+import com.adlx.dingdong.mall.user.api.UserFeignClient;
+import com.adlx.dingdong.mall.user.dto.UserDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.util.StringUtils;
+
+import java.util.Collections;
+
+public class UserDetailsServiceImpl implements UserDetailsService {
+
+ @Autowired
+ private UserFeignClient userService;
+
+ private String defaultSecret;
+ private String defaultPassword;
+ private Md5PasswordEncoder encoder = new Md5PasswordEncoder();
+
+
+ @Override
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+ UserDTO user = userService.getUserByUsername(username);
+ if (user == null) {
+ throw new UsernameNotFoundException(String.format("User doesn't exist: username=%s", username));
+ }
+ return new org.springframework.security.core.userdetails.User(username, user.getPassword(), Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")));
+ }
+
+ public String getDefaultPassword() {
+ return defaultPassword;
+ }
+
+ public void setDefaultPassword(String defaultPassword) {
+ this.defaultPassword = StringUtils.hasText(defaultPassword) ? defaultPassword : "123456";
+ setDefaultSecret(encoder.encodePassword(this.defaultPassword, null));
+ }
+
+ public String getDefaultSecret() {
+ if (defaultSecret == null) {
+ setDefaultPassword(null);
+ }
+ return defaultSecret;
+ }
+
+ public void setDefaultSecret(String defaultSecret) {
+ this.defaultSecret = defaultSecret;
+ }
+
+}
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/BaseController.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/BaseController.java
new file mode 100644
index 0000000..9b5cdad
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/BaseController.java
@@ -0,0 +1,82 @@
+package com.adlx.dingdong.mall.controller;
+
+import com.adlx.dingdong.mall.user.api.UserFeignClient;
+import com.adlx.dingdong.mall.user.dto.UserDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.propertyeditors.CustomDateEditor;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.crypto.codec.Base64;
+import org.springframework.security.oauth2.provider.ClientDetails;
+import org.springframework.security.oauth2.provider.ClientDetailsService;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+
+import javax.servlet.http.HttpServletRequest;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Enumeration;
+
+@Slf4j
+public class BaseController {
+
+ @Autowired
+ private UserFeignClient userFeignClient;
+
+ @Autowired
+ private ClientDetailsService clientDetailsService;
+
+ @InitBinder
+ public void InitBinder(WebDataBinder dataBinder) {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ dateFormat.setLenient(false);
+ dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
+ }
+
+
+ /**
+ * 从Oauth认证获取用户ID
+ *
+ * @return
+ */
+ public Integer getCurrentUid() {
+ String userName = SecurityContextHolder.getContext().getAuthentication().getName();
+ log.info("授权认证用户:" + userName);
+ UserDTO user = userFeignClient.getUserByUsername(userName);
+ return user != null ? user.getId().intValue() : null;
+ }
+
+ /**
+ * 客户验证
+ *
+ * @param request
+ * @return
+ */
+ protected Boolean checkOauthClient(HttpServletRequest request) {
+ Enumeration headers = request.getHeaders("Authorization");
+ String value;
+ do {
+ if (!headers.hasMoreElements()) {
+ return false;
+ }
+ value = (String) headers.nextElement();
+ } while (!value.toLowerCase().startsWith("Basic".toLowerCase()));
+
+ String clientIdValue = value.substring("Basic".length()).trim();
+ byte[] encodeBase64 = Base64.decode(clientIdValue.getBytes());
+ String client = new String(encodeBase64);
+ String[] clientId = client.split(":");
+ log.info("RESULT: " + clientId[0]);
+ try {
+ ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId[0]);
+ if (null != clientDetails && clientId.length == 2 && clientDetails.getClientSecret().equals(clientId[1])) {
+ return true;
+ }
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ return false;
+ }
+
+
+}
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/ProductCategoryController.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/ProductCategoryController.java
new file mode 100644
index 0000000..258fb76
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/ProductCategoryController.java
@@ -0,0 +1,43 @@
+package com.adlx.dingdong.mall.controller.v1;
+
+import com.adlx.dingdong.mall.client.ProductCategoryClient;
+import com.adlx.dingdong.mall.controller.BaseController;
+import com.adlx.dingdong.mall.dto.Result;
+import com.adlx.dingdong.mall.dto.ShopGoodsCategoryDTO;
+import com.adlx.dingdong.mall.vo.ShopGoodsCategoryVO;
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+//import com.github.pagehelper.PageInfo;
+
+/**
+ * Created by administrator on 18/8/31
+ */
+@RestController
+@RequestMapping(value = {"/v1/productCategory"})
+public class ProductCategoryController extends BaseController {
+
+
+ @Autowired
+ private ProductCategoryClient productCategoryClient;
+
+
+ @RequestMapping(value = "list", method = RequestMethod.GET)
+ public Result getList(ShopGoodsCategoryDTO categoryDTO) {
+ PageInfo> pageInfo = productCategoryClient.getList(categoryDTO);
+ return Result.success(pageInfo);
+ }
+
+//
+// @RequestMapping(value = "filter", method = RequestMethod.GET)
+// public Result filter(ShopGoodsDTO shopGoodsDTO) {
+// PageInfo> pageInfo = productClient.getList(shopGoodsDTO);
+// return Result.success(pageInfo);
+// }
+
+}
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/ProductController.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/ProductController.java
new file mode 100644
index 0000000..1a1a9fa
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/ProductController.java
@@ -0,0 +1,42 @@
+package com.adlx.dingdong.mall.controller.v1;
+
+import com.adlx.dingdong.mall.controller.BaseController;
+import com.adlx.dingdong.mall.client.ProductClient;
+//import com.github.pagehelper.PageInfo;
+import com.adlx.dingdong.mall.dto.Result;
+import com.adlx.dingdong.mall.dto.ShopGoodsDTO;
+import com.adlx.dingdong.mall.vo.ShopGoodsVO;
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * Created by administrator on 18/8/31
+ */
+@RestController
+@RequestMapping(value = {"/v1/product"})
+public class ProductController extends BaseController {
+
+
+ @Autowired
+ private ProductClient productClient;
+
+
+ @RequestMapping(value = "list", method = RequestMethod.GET)
+ public Result getList(ShopGoodsDTO shopGoodsDTO) {
+ PageInfo> pageInfo = productClient.getList(shopGoodsDTO);
+ return Result.success(pageInfo);
+ }
+
+//
+// @RequestMapping(value = "filter", method = RequestMethod.GET)
+// public Result filter(ShopGoodsDTO shopGoodsDTO) {
+// PageInfo> pageInfo = productClient.getList(shopGoodsDTO);
+// return Result.success(pageInfo);
+// }
+
+}
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/UserController.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/UserController.java
new file mode 100644
index 0000000..6848735
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/controller/v1/UserController.java
@@ -0,0 +1,56 @@
+package com.adlx.dingdong.mall.controller.v1;
+
+import com.adlx.dingdong.mall.controller.BaseController;
+import com.adlx.dingdong.mall.dto.Result;
+import com.adlx.dingdong.mall.user.api.UserFeignClient;
+import com.adlx.dingdong.mall.user.vo.UserVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Created by dulei on 18/1/10.
+ */
+@RestController
+@RequestMapping(value = {"/v1/user"})
+public class UserController extends BaseController {
+
+ @Autowired
+ private UserFeignClient userFeignClient;
+
+ @RequestMapping("/currentUser")
+ public Result getCurrentUser() {
+ Integer uid = getCurrentUid();
+ Assert.notNull(uid, "用户ID不能为空");
+ //安全对象拿到用户id
+ UserVO userVO = userFeignClient.get(uid.longValue());
+ return Result.success(userVO);
+ }
+
+ @RequestMapping(value = "/regUser",method = RequestMethod.POST)
+ public UserVO regUser() {
+ Integer uid = getCurrentUid();
+ Assert.notNull(uid, "用户ID不能为空");
+ //安全对象拿到用户id
+ return null;
+ }
+
+
+
+ @RequestMapping("/info")
+ public UserVO getCurrentInfo() {
+ //安全对象拿到用户id
+ return userFeignClient.get(1L);
+ }
+
+ @RequestMapping("/get/{uid}")
+ public Result get(@PathVariable("uid") Long uid) {
+ //安全对象拿到用户id
+ return Result.success(userFeignClient.get(uid));
+ }
+
+
+}
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/dto/PageResult.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/dto/PageResult.java
new file mode 100644
index 0000000..79a1847
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/dto/PageResult.java
@@ -0,0 +1,45 @@
+package com.adlx.dingdong.mall.dto;
+
+public class PageResult extends Result {
+
+ private long total;
+ private int start;
+ private int pageSize;
+
+ public PageResult() {
+ super();
+ }
+
+ public PageResult(int total) {
+ super();
+ this.total = total;
+ }
+
+
+ public long getTotal() {
+ return total;
+ }
+
+ public void setTotal(long total) {
+ this.total = total;
+ }
+
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ public int getStart() {
+ return start;
+ }
+
+ public void setStart(int start) {
+ this.start = start;
+ }
+
+
+}
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/dto/Response.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/dto/Response.java
new file mode 100644
index 0000000..e96d4a3
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/dto/Response.java
@@ -0,0 +1,35 @@
+package com.adlx.dingdong.mall.dto;
+
+import java.io.Serializable;
+
+@SuppressWarnings("serial")
+public class Response implements Serializable {
+
+ public static final int SUCCESS = 0;
+ public static final int ERROR = 1;
+
+ private int code;
+ private T result;
+
+ private Response(int code, T result) {
+ this.code = code;
+ this.result = result;
+ }
+
+ public static Response success(T result) {
+ return new Response(SUCCESS, result);
+ }
+
+ public static Response error(String message) {
+ return new Response(ERROR, message);
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public T getResult() {
+ return result;
+ }
+
+}
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/dto/Result.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/dto/Result.java
new file mode 100644
index 0000000..c832dfd
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/dto/Result.java
@@ -0,0 +1,98 @@
+package com.adlx.dingdong.mall.dto;
+
+import com.alibaba.fastjson.JSON;
+
+public class Result {
+
+ private boolean success;
+ private String msg;
+ private Integer code;
+ private T data;
+
+ public static Result success(T result) {
+ return new Result(true, 200, "", result);
+ }
+
+ public static Result success(T result, String msg) {
+ return new Result(true, 200, msg, result);
+ }
+
+ public static Result error(String message) {
+ return new Result(false, 404, message);
+ }
+
+ public static Result error(String message, Integer code) {
+ return new Result(false, code, message);
+ }
+
+ public Result() {
+ super();
+ this.success = true;
+ this.code = 200;
+ }
+
+ public Result(boolean success) {
+ super();
+ this.success = success;
+ }
+
+ public Result(boolean success, int code, String msg) {
+ super();
+ this.success = success;
+ this.code = code;
+ this.msg = msg;
+ }
+
+ public Result(boolean success, T data) {
+ super();
+ this.success = success;
+ this.data = data;
+ }
+
+ public Result(boolean success, Integer code, String msg, T data) {
+ super();
+ this.success = success;
+ this.msg = msg;
+ this.code = code;
+ this.data = data;
+ }
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ public void setSuccess(boolean success) {
+ this.success = success;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+
+ @Override
+ public String toString() {
+ return JSON.toJSONString(this);
+ }
+
+
+}
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/security/WebSecurityConfig.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/security/WebSecurityConfig.java
new file mode 100644
index 0000000..47a084a
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/security/WebSecurityConfig.java
@@ -0,0 +1,17 @@
+//package com.adlx.dingdong.mall.securit;
+//
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+//import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+//import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+//
+//@EnableWebSecurity
+//public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
+//
+// @Autowired
+// public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
+// auth
+// .inMemoryAuthentication()
+// .withUser("admin").password("admin").roles("USER");
+// }
+//}
\ No newline at end of file
diff --git a/api-gateway/src/main/java/com/adlx/dingdong/mall/util/MapUtil.java b/api-gateway/src/main/java/com/adlx/dingdong/mall/util/MapUtil.java
new file mode 100644
index 0000000..41568d8
--- /dev/null
+++ b/api-gateway/src/main/java/com/adlx/dingdong/mall/util/MapUtil.java
@@ -0,0 +1,134 @@
+package com.adlx.dingdong.mall.util;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.*;
+
+/**
+ * 操作一些Map的方法
+ *
+ * @author administator
+ * @date 2018-8-27
+ * @Description
+ */
+public class MapUtil {
+
+ /**
+ * 将这个对象中的get方法放入Map Map中的键值对
+ * ---><传入的对象的属性名称(去掉get,全部转成大写),该对象的属性方法返回的数据(没有就是"")>
+ *
+ * @param c
+ * @return
+ */
+ public static Map getMapByClassAttributeValue(Object c) {
+ Map classAttributeValue = new HashMap();
+ return getMapByClassAttributeValue(classAttributeValue,c);
+ }
+
+ /**
+ * 需要传入的map
+ * @param classAttributeValue
+ * @param c
+ * @return
+ */
+ public static Map getMapByClassAttributeValue(Map classAttributeValue,Object c) {
+ try {
+ Class extends Object> clazz = c.getClass();
+ Method[] methods = clazz.getMethods();
+ for (int i = 0; i < methods.length; i++) {
+ if (methods[i].getName().startsWith("get")
+ && !methods[i].getName().equals("getClass")) {
+ String methodName = methods[i].getName().substring(3);
+ //转成大写
+ methodName = methodName.toUpperCase();
+ Object o = methods[i].invoke(c);// 执行get方法返回一个Object
+ classAttributeValue.put(methodName, o);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return classAttributeValue;
+ }
+
+ /**
+ * 对map按照key值进行排序
+ * @param map
+ * @return Map.Entry[]
+ */
+ public static Map.Entry[] getSortedHashtableByValue(Map map) {
+ Set set = map.entrySet();
+ Map.Entry[] entries = (Map.Entry[]) set.toArray(new Map.Entry[set.size()]);
+ Arrays.sort(entries, new Comparator() {
+ public int compare(Object arg0, Object arg1) {
+ String key1 = ((Map.Entry) arg0).getKey().toString();
+ String key2 = ((Map.Entry) arg1).getKey().toString();
+ return key1.compareTo(key2);
+ }
+ });
+
+ return entries;
+ }
+
+ /**
+ * 按属性-值组装Map
+ * @param objects
+ * @return
+ * @throws Exception
+ */
+ public static Map getMapFromObject(Object...objects) throws Exception{
+ Map map = new HashMap();
+ for(Object obj:objects){
+ Class cls = obj.getClass();
+ getBeanFields(cls,obj,map);
+ }
+
+ return map;
+ }
+
+ private static void getBeanFields(Class cls, Object obj, Map map) throws IllegalArgumentException, IllegalAccessException {
+
+
+ for(Field field:cls.getDeclaredFields()) {
+ String fieldName = field.getName();
+
+ field.setAccessible(true);
+ Type type = field.getGenericType();
+
+ map.put(field.getName(), field.get(obj));
+ }
+ if(cls.getSuperclass()!=null) {
+ getBeanFields(cls.getSuperclass(), obj, map);
+ }
+ }
+
+
+ public static Map getParameterMap(HttpServletRequest request) {
+ Map properties = request.getParameterMap();
+ Map returnMap = new HashMap();
+ Iterator entries = properties.entrySet().iterator();
+ Map.Entry entry;
+ String name = "";
+ String value = "";
+ while (entries.hasNext()) {
+ entry = (Map.Entry) entries.next();
+ name = (String) entry.getKey();
+ Object valueObj = entry.getValue();
+ if(null == valueObj){
+ value = "";
+ }else if(valueObj instanceof String[]){
+ String[] values = (String[])valueObj;
+ for(int i=0;iNo type.
"
+ },
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "varname2",
+ "description": "With type.
"
+ }
+ ]
+ }
+ },
+ "type": "",
+ "url": "",
+ "version": "0.0.0",
+ "filename": "./doc/main.js",
+ "group": "D__workspace_shop_api_gateway_src_main_resources_static_api_doc_main_js",
+ "groupTitle": "D__workspace_shop_api_gateway_src_main_resources_static_api_doc_main_js",
+ "name": ""
+ },
+ {
+ "type": "post",
+ "url": "oauth/token",
+ "title": "获取accessToken",
+ "version": "1.0.0",
+ "name": "getAccessToken",
+ "group": "OAuth2",
+ "header": {
+ "fields": {
+ "Header": [
+ {
+ "group": "Header",
+ "type": "String",
+ "optional": false,
+ "field": "Authorization",
+ "description": "认证头信息: 使用Basic认证,平台方会提供给调用方用户名,密码(client_id和client_secret),比如: 用户名为demoApp,密码为123456,使用Base64加密伪代码为 base64("aaa:123"),结果为 ZGVtb0FwcDoxMjM0NTY=
"
+ }
+ ]
+ },
+ "examples": [
+ {
+ "title": "Head Example:",
+ "content": "Authorization: Basic ZGVtb0FwcDoxMjM0NTY=",
+ "type": "String"
+ }
+ ]
+ },
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "allowedValues": [
+ "\"password\""
+ ],
+ "optional": false,
+ "field": "grant_type",
+ "description": "授权类型: password
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "username",
+ "description": "对应手机号
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "password",
+ "description": "密码
"
+ }
+ ]
+ },
+ "examples": [
+ {
+ "title": "Example: ",
+ "content": "grant_type=password\nusername=手机号\npassword=*****",
+ "type": "String"
+ }
+ ]
+ },
+ "sampleRequest": [
+ {
+ "url": "http://127.0.0.1:9999/oauth/token"
+ }
+ ],
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "Access Token
"
+ },
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "token_type",
+ "description": "目前为bearer
"
+ },
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "expires_in",
+ "description": "过期剩余时间:单位为秒
"
+ },
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "scope",
+ "description": "调用方被授权的域
"
+ }
+ ]
+ },
+ "examples": [
+ {
+ "title": "Success Example:",
+ "content": "{\n \"access_token\": \"1d44bad5-2b9e-46e5-bfbe-80a8988b99b7\",\n \"token_type\": \"bearer\",\n \"expires_in\": 793,\n \"scope\": \"write read\"\n}",
+ "type": "json"
+ }
+ ]
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "Unauthorized",
+ "description": "认证失败,返回http状态码401
"
+ }
+ ]
+ }
+ },
+ "filename": "./oauth2-api.js",
+ "groupTitle": "OAuth2"
+ },
+ {
+ "type": "get",
+ "url": "v1/user/currentUser",
+ "title": "用户信息",
+ "version": "0.1.0",
+ "name": "register",
+ "group": "User",
+ "header": {
+ "fields": {
+ "Header": [
+ {
+ "group": "Header",
+ "type": "String",
+ "optional": false,
+ "field": "Authorization",
+ "description": "认证头信息: Bearer {access_token}
"
+ }
+ ]
+ },
+ "examples": [
+ {
+ "title": "Head Example:",
+ "content": "Authorization: Bearer 252fb402-286e-4d89-925b-158d15314183",
+ "type": "String"
+ }
+ ]
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "success",
+ "description": "正确错误
"
+ },
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "message",
+ "description": "消息
"
+ },
+ {
+ "group": "Success 200",
+ "type": "Boolean",
+ "optional": false,
+ "field": "data",
+ "description": "true 成功 false 失败
"
+ }
+ ]
+ },
+ "examples": [
+ {
+ "title": "Success Example:",
+ "content": "{\n \"success\": true,\n \"message\": \"\",\n \"data\": {\"data\":true,\"message\":\"成功\",\"success\":true}\n}",
+ "type": "json"
+ }
+ ]
+ },
+ "sampleRequest": [
+ {
+ "url": "http://127.0.0.1:9999/v1/user/currentUser"
+ }
+ ],
+ "filename": "./main.js",
+ "groupTitle": "User"
+ }
+] });
diff --git a/api-gateway/src/main/resources/static/api/doc/api_data.json b/api-gateway/src/main/resources/static/api/doc/api_data.json
new file mode 100644
index 0000000..f4c9291
--- /dev/null
+++ b/api-gateway/src/main/resources/static/api/doc/api_data.json
@@ -0,0 +1,224 @@
+[
+ {
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "optional": false,
+ "field": "varname1",
+ "description": "No type.
"
+ },
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "varname2",
+ "description": "With type.
"
+ }
+ ]
+ }
+ },
+ "type": "",
+ "url": "",
+ "version": "0.0.0",
+ "filename": "./doc/main.js",
+ "group": "D__workspace_shop_api_gateway_src_main_resources_static_api_doc_main_js",
+ "groupTitle": "D__workspace_shop_api_gateway_src_main_resources_static_api_doc_main_js",
+ "name": ""
+ },
+ {
+ "type": "post",
+ "url": "oauth/token",
+ "title": "获取accessToken",
+ "version": "1.0.0",
+ "name": "getAccessToken",
+ "group": "OAuth2",
+ "header": {
+ "fields": {
+ "Header": [
+ {
+ "group": "Header",
+ "type": "String",
+ "optional": false,
+ "field": "Authorization",
+ "description": "认证头信息: 使用Basic认证,平台方会提供给调用方用户名,密码(client_id和client_secret),比如: 用户名为demoApp,密码为123456,使用Base64加密伪代码为 base64("aaa:123"),结果为 ZGVtb0FwcDoxMjM0NTY=
"
+ }
+ ]
+ },
+ "examples": [
+ {
+ "title": "Head Example:",
+ "content": "Authorization: Basic ZGVtb0FwcDoxMjM0NTY=",
+ "type": "String"
+ }
+ ]
+ },
+ "parameter": {
+ "fields": {
+ "Parameter": [
+ {
+ "group": "Parameter",
+ "type": "String",
+ "allowedValues": [
+ "\"password\""
+ ],
+ "optional": false,
+ "field": "grant_type",
+ "description": "授权类型: password
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "username",
+ "description": "对应手机号
"
+ },
+ {
+ "group": "Parameter",
+ "type": "String",
+ "optional": false,
+ "field": "password",
+ "description": "密码
"
+ }
+ ]
+ },
+ "examples": [
+ {
+ "title": "Example: ",
+ "content": "grant_type=password\nusername=手机号\npassword=*****",
+ "type": "String"
+ }
+ ]
+ },
+ "sampleRequest": [
+ {
+ "url": "http://127.0.0.1:9999/oauth/token"
+ }
+ ],
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "access_token",
+ "description": "Access Token
"
+ },
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "token_type",
+ "description": "目前为bearer
"
+ },
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "expires_in",
+ "description": "过期剩余时间:单位为秒
"
+ },
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "scope",
+ "description": "调用方被授权的域
"
+ }
+ ]
+ },
+ "examples": [
+ {
+ "title": "Success Example:",
+ "content": "{\n \"access_token\": \"1d44bad5-2b9e-46e5-bfbe-80a8988b99b7\",\n \"token_type\": \"bearer\",\n \"expires_in\": 793,\n \"scope\": \"write read\"\n}",
+ "type": "json"
+ }
+ ]
+ },
+ "error": {
+ "fields": {
+ "Error 4xx": [
+ {
+ "group": "Error 4xx",
+ "optional": false,
+ "field": "Unauthorized",
+ "description": "认证失败,返回http状态码401
"
+ }
+ ]
+ }
+ },
+ "filename": "./oauth2-api.js",
+ "groupTitle": "OAuth2"
+ },
+ {
+ "type": "get",
+ "url": "v1/user/currentUser",
+ "title": "用户信息",
+ "version": "0.1.0",
+ "name": "register",
+ "group": "User",
+ "header": {
+ "fields": {
+ "Header": [
+ {
+ "group": "Header",
+ "type": "String",
+ "optional": false,
+ "field": "Authorization",
+ "description": "认证头信息: Bearer {access_token}
"
+ }
+ ]
+ },
+ "examples": [
+ {
+ "title": "Head Example:",
+ "content": "Authorization: Bearer 252fb402-286e-4d89-925b-158d15314183",
+ "type": "String"
+ }
+ ]
+ },
+ "success": {
+ "fields": {
+ "Success 200": [
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "success",
+ "description": "正确错误
"
+ },
+ {
+ "group": "Success 200",
+ "type": "String",
+ "optional": false,
+ "field": "message",
+ "description": "消息
"
+ },
+ {
+ "group": "Success 200",
+ "type": "Boolean",
+ "optional": false,
+ "field": "data",
+ "description": "true 成功 false 失败
"
+ }
+ ]
+ },
+ "examples": [
+ {
+ "title": "Success Example:",
+ "content": "{\n \"success\": true,\n \"message\": \"\",\n \"data\": {\"data\":true,\"message\":\"成功\",\"success\":true}\n}",
+ "type": "json"
+ }
+ ]
+ },
+ "sampleRequest": [
+ {
+ "url": "http://127.0.0.1:9999/v1/user/currentUser"
+ }
+ ],
+ "filename": "./main.js",
+ "groupTitle": "User"
+ }
+]
diff --git a/api-gateway/src/main/resources/static/api/doc/api_project.js b/api-gateway/src/main/resources/static/api/doc/api_project.js
new file mode 100644
index 0000000..183787c
--- /dev/null
+++ b/api-gateway/src/main/resources/static/api/doc/api_project.js
@@ -0,0 +1,33 @@
+define({
+ "name": "api-server",
+ "version": "1.0.0",
+ "description": "mall api server",
+ "title": "叮咚到账",
+ "url": "http://127.0.0.1:9999/",
+ "header": {
+ "title": "概述",
+ "content": "\n- 在使用 API 之前,你需要了解OAuth2.0。根据分配的client_id和client_secret,并使用标准的 OAuth 2 实现登录,获得 access_token 信息。
\n
\n\n- OAuth 认证路径 - /oauth/token
\n- Response 说明 - 所有 Response 采用 JSON 格式返回,请求状态通过 HTTP Status 返回。
\n
\n\n- HTTP Status
\n
\n\n- 200, 201 - 请求成功,或执行成功。
\n- 400 - 参数不符合 API 的要求、或者数据格式验证没有通过,请配合 Response Body 里面的 error 信息确定问题。
\n- 401 - 用户认证失败,或缺少认证信息,比如 access_token 过期,或没传,可以尝试用 refresh_token 方式获得新的 access_token。
\n- 403 - 当前用户对资源没有操作权限。
\n- 404 - 资源不存在。
\n- 500 - 服务器异常。
\n
\n\n- 对于服务接口,正常响应信息格式为:\n
\n
\n\n{\n success: true,\n message: \"\",\n data: {}\n}\n
\n
\n异常响应信息格式为:\n
\n\n{\n success : false,\n message: \"错误消息\",\n data: null\n}\n
\n\n- 接口认证:
\n服务接口使用OAuth2认证,调用接口必须加上 Http头\nAuthorization: Bearer [access_token]\naccess_token通过 /oauth/token 接口获取, access_token具有生命周期,默认7天,过期后需要重新获取 \n
\n"
+ },
+ "footer": {
+ "title": "代号定义",
+ "content": ""
+ },
+ "order": [
+ "OAuth2",
+ "getAccessToken"
+ ],
+ "template": {
+ "forceLanguage": "zh_cn",
+ "withCompare": true,
+ "withGenerator": true
+ },
+ "sampleUrl": false,
+ "defaultVersion": "0.0.0",
+ "apidoc": "0.3.0",
+ "generator": {
+ "name": "apidoc",
+ "time": "2018-09-01T02:23:01.477Z",
+ "url": "http://apidocjs.com",
+ "version": "0.17.6"
+ }
+});
diff --git a/api-gateway/src/main/resources/static/api/doc/api_project.json b/api-gateway/src/main/resources/static/api/doc/api_project.json
new file mode 100644
index 0000000..9f27e56
--- /dev/null
+++ b/api-gateway/src/main/resources/static/api/doc/api_project.json
@@ -0,0 +1,33 @@
+{
+ "name": "api-server",
+ "version": "1.0.0",
+ "description": "mall api server",
+ "title": "叮咚到账",
+ "url": "http://127.0.0.1:9999/",
+ "header": {
+ "title": "概述",
+ "content": "\n- 在使用 API 之前,你需要了解OAuth2.0。根据分配的client_id和client_secret,并使用标准的 OAuth 2 实现登录,获得 access_token 信息。
\n
\n\n- OAuth 认证路径 - /oauth/token
\n- Response 说明 - 所有 Response 采用 JSON 格式返回,请求状态通过 HTTP Status 返回。
\n
\n\n- HTTP Status
\n
\n\n- 200, 201 - 请求成功,或执行成功。
\n- 400 - 参数不符合 API 的要求、或者数据格式验证没有通过,请配合 Response Body 里面的 error 信息确定问题。
\n- 401 - 用户认证失败,或缺少认证信息,比如 access_token 过期,或没传,可以尝试用 refresh_token 方式获得新的 access_token。
\n- 403 - 当前用户对资源没有操作权限。
\n- 404 - 资源不存在。
\n- 500 - 服务器异常。
\n
\n\n- 对于服务接口,正常响应信息格式为:\n
\n
\n\n{\n success: true,\n message: \"\",\n data: {}\n}\n
\n
\n异常响应信息格式为:\n
\n\n{\n success : false,\n message: \"错误消息\",\n data: null\n}\n
\n\n- 接口认证:
\n服务接口使用OAuth2认证,调用接口必须加上 Http头\nAuthorization: Bearer [access_token]\naccess_token通过 /oauth/token 接口获取, access_token具有生命周期,默认7天,过期后需要重新获取 \n
\n"
+ },
+ "footer": {
+ "title": "代号定义",
+ "content": ""
+ },
+ "order": [
+ "OAuth2",
+ "getAccessToken"
+ ],
+ "template": {
+ "forceLanguage": "zh_cn",
+ "withCompare": true,
+ "withGenerator": true
+ },
+ "sampleUrl": false,
+ "defaultVersion": "0.0.0",
+ "apidoc": "0.3.0",
+ "generator": {
+ "name": "apidoc",
+ "time": "2018-09-01T02:23:01.477Z",
+ "url": "http://apidocjs.com",
+ "version": "0.17.6"
+ }
+}
diff --git a/api-gateway/src/main/resources/static/api/doc/css/style.css b/api-gateway/src/main/resources/static/api/doc/css/style.css
new file mode 100644
index 0000000..6468b2b
--- /dev/null
+++ b/api-gateway/src/main/resources/static/api/doc/css/style.css
@@ -0,0 +1,569 @@
+/* ------------------------------------------------------------------------------------------
+ * Content
+ * ------------------------------------------------------------------------------------------ */
+body {
+ min-width: 980px;
+ max-width: 1280px;
+}
+
+body, p, a, div, th, td {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 400;
+ font-size: 16px;
+}
+
+td.code {
+ font-size: 14px;
+ font-family: "Source Code Pro", monospace;
+ font-style: normal;
+ font-weight: 400;
+}
+
+#content {
+ padding-top: 16px;
+ z-Index: -1;
+ margin-left: 270px;
+}
+
+p {
+ color: #808080;
+}
+
+h1 {
+ font-family: "Source Sans Pro Semibold", sans-serif;
+ font-weight: normal;
+ font-size: 44px;
+ line-height: 50px;
+ margin: 0 0 10px 0;
+ padding: 0;
+}
+
+h2 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: normal;
+ font-size: 24px;
+ line-height: 40px;
+ margin: 0 0 20px 0;
+ padding: 0;
+}
+
+section {
+ border-top: 1px solid #ebebeb;
+ padding: 30px 0;
+}
+
+section h1 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 700;
+ font-size: 32px;
+ line-height: 40px;
+ padding-bottom: 14px;
+ margin: 0 0 20px 0;
+ padding: 0;
+}
+
+article {
+ padding: 14px 0 30px 0;
+}
+
+article h1 {
+ font-family: "Source Sans Pro Bold", sans-serif;
+ font-weight: 600;
+ font-size: 24px;
+ line-height: 26px;
+}
+
+article h2 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 600;
+ font-size: 18px;
+ line-height: 24px;
+ margin: 0 0 10px 0;
+}
+
+article h3 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 600;
+ font-size: 16px;
+ line-height: 18px;
+ margin: 0 0 10px 0;
+}
+
+article h4 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 600;
+ font-size: 14px;
+ line-height: 16px;
+ margin: 0 0 8px 0;
+}
+
+table {
+ border-collapse: collapse;
+ width: 100%;
+ margin: 0 0 20px 0;
+}
+
+th {
+ background-color: #f5f5f5;
+ text-align: left;
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 700;
+ padding: 4px 8px;
+ border: #e0e0e0 1px solid;
+}
+
+td {
+ vertical-align: top;
+ padding: 10px 8px 0 8px;
+ border: #e0e0e0 1px solid;
+}
+
+#generator .content {
+ color: #b0b0b0;
+ border-top: 1px solid #ebebeb;
+ padding: 10px 0;
+}
+
+.label-optional {
+ float: right;
+ background-color: grey;
+ margin-top: 4px;
+}
+
+.open-left {
+ right: 0;
+ left: auto;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * apidoc - intro
+ * ------------------------------------------------------------------------------------------ */
+
+#apidoc .apidoc {
+ border-top: 1px solid #ebebeb;
+ padding: 30px 0;
+}
+
+#apidoc h1 {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 700;
+ font-size: 32px;
+ line-height: 40px;
+ padding-bottom: 14px;
+ margin: 0 0 20px 0;
+ padding: 0;
+}
+
+#apidoc h2 {
+ font-family: "Source Sans Pro Bold", sans-serif;
+ font-weight: 600;
+ font-size: 22px;
+ line-height: 26px;
+ padding-top: 14px;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * pre / code
+ * ------------------------------------------------------------------------------------------ */
+pre {
+ background-color: #292b36;
+ color: #ffffff;
+ padding: 10px;
+ border-radius: 6px;
+ position: relative;
+ margin: 10px 0 20px 0;
+ overflow-x: auto;
+}
+
+pre.prettyprint {
+ width: 100%;
+}
+
+code.language-text {
+ word-wrap: break-word;
+}
+
+pre.language-json {
+ overflow: auto;
+}
+
+pre.language-html {
+ margin: 0 0 20px 0;
+}
+
+.type {
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 600;
+ font-size: 15px;
+ display: inline-block;
+ margin: 0 0 5px 0;
+ padding: 4px 5px;
+ border-radius: 6px;
+ text-transform: uppercase;
+ background-color: #3387CC;
+ color: #ffffff;
+}
+
+.type__get {
+ background-color: green;
+}
+
+.type__put {
+ background-color: #e5c500;
+}
+
+.type__post {
+ background-color: #4070ec;
+}
+
+.type__delete {
+ background-color: #ed0039;
+}
+
+pre.language-api .str {
+ color: #ffffff;
+}
+
+pre.language-api .pln,
+pre.language-api .pun {
+ color: #65B042;
+}
+
+pre code {
+ display: block;
+ font-size: 14px;
+ font-family: "Source Code Pro", monospace;
+ font-style: normal;
+ font-weight: 400;
+ word-wrap: normal;
+ white-space: pre;
+}
+
+pre code.sample-request-response-json {
+ white-space: pre-wrap;
+ max-height: 500px;
+ overflow: auto;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Sidenav
+ * ------------------------------------------------------------------------------------------ */
+.sidenav {
+ width: 228px;
+ margin: 0;
+ padding: 0 20px 20px 20px;
+ position: fixed;
+ top: 50px;
+ left: 0;
+ bottom: 0;
+ overflow-x: hidden;
+ overflow-y: auto;
+ background-color: #f5f5f5;
+ z-index: 10;
+}
+
+.sidenav > li > a {
+ display: block;
+ width: 192px;
+ margin: 0;
+ padding: 2px 11px;
+ border: 0;
+ border-left: transparent 4px solid;
+ border-right: transparent 4px solid;
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 400;
+ font-size: 14px;
+}
+
+.sidenav > li.nav-header {
+ margin-top: 8px;
+ margin-bottom: 8px;
+}
+
+.sidenav > li.nav-header > a {
+ padding: 5px 15px;
+ border: 1px solid #e5e5e5;
+ width: 190px;
+ font-family: "Source Sans Pro", sans-serif;
+ font-weight: 700;
+ font-size: 16px;
+ background-color: #ffffff;
+}
+
+.sidenav > li.active > a {
+ position: relative;
+ z-index: 2;
+ background-color: #0088cc;
+ color: #ffffff;
+}
+
+.sidenav > li.has-modifications a {
+ border-right: #60d060 4px solid;
+}
+
+.sidenav > li.is-new a {
+ border-left: #e5e5e5 4px solid;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Side nav search
+ * ------------------------------------------------------------------------------------------ */
+.sidenav-search {
+ width: 228px;
+ left: 0px;
+ position: fixed;
+ padding: 16px 20px 10px 20px;
+ background-color: #F5F5F5;
+ z-index: 11;
+}
+
+.sidenav-search .search {
+ height: 26px;
+}
+
+.search-reset {
+ position: absolute;
+ display: block;
+ cursor: pointer;
+ width: 20px;
+ height: 20px;
+ text-align: center;
+ right: 28px;
+ top: 17px;
+ background-color: #fff;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Compare
+ * ------------------------------------------------------------------------------------------ */
+
+ins {
+ background: #60d060;
+ text-decoration: none;
+ color: #000000;
+}
+
+del {
+ background: #f05050;
+ color: #000000;
+}
+
+.label-ins {
+ background-color: #60d060;
+}
+
+.label-del {
+ background-color: #f05050;
+ text-decoration: line-through;
+}
+
+pre.ins {
+ background-color: #60d060;
+}
+
+pre.del {
+ background-color: #f05050;
+ text-decoration: line-through;
+}
+
+table.ins th,
+table.ins td {
+ background-color: #60d060;
+}
+
+table.del th,
+table.del td {
+ background-color: #f05050;
+ text-decoration: line-through;
+}
+
+tr.ins td {
+ background-color: #60d060;
+}
+
+tr.del td {
+ background-color: #f05050;
+ text-decoration: line-through;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Spinner
+ * ------------------------------------------------------------------------------------------ */
+
+#loader {
+ position: absolute;
+ width: 100%;
+}
+
+#loader p {
+ padding-top: 80px;
+ margin-left: -4px;
+}
+
+.spinner {
+ margin: 200px auto;
+ width: 60px;
+ height: 60px;
+ position: relative;
+}
+
+.container1 > div, .container2 > div, .container3 > div {
+ width: 14px;
+ height: 14px;
+ background-color: #0088cc;
+
+ border-radius: 100%;
+ position: absolute;
+ -webkit-animation: bouncedelay 1.2s infinite ease-in-out;
+ animation: bouncedelay 1.2s infinite ease-in-out;
+ /* Prevent first frame from flickering when animation starts */
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+
+.spinner .spinner-container {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+}
+
+.container2 {
+ -webkit-transform: rotateZ(45deg);
+ transform: rotateZ(45deg);
+}
+
+.container3 {
+ -webkit-transform: rotateZ(90deg);
+ transform: rotateZ(90deg);
+}
+
+.circle1 { top: 0; left: 0; }
+.circle2 { top: 0; right: 0; }
+.circle3 { right: 0; bottom: 0; }
+.circle4 { left: 0; bottom: 0; }
+
+.container2 .circle1 {
+ -webkit-animation-delay: -1.1s;
+ animation-delay: -1.1s;
+}
+
+.container3 .circle1 {
+ -webkit-animation-delay: -1.0s;
+ animation-delay: -1.0s;
+}
+
+.container1 .circle2 {
+ -webkit-animation-delay: -0.9s;
+ animation-delay: -0.9s;
+}
+
+.container2 .circle2 {
+ -webkit-animation-delay: -0.8s;
+ animation-delay: -0.8s;
+}
+
+.container3 .circle2 {
+ -webkit-animation-delay: -0.7s;
+ animation-delay: -0.7s;
+}
+
+.container1 .circle3 {
+ -webkit-animation-delay: -0.6s;
+ animation-delay: -0.6s;
+}
+
+.container2 .circle3 {
+ -webkit-animation-delay: -0.5s;
+ animation-delay: -0.5s;
+}
+
+.container3 .circle3 {
+ -webkit-animation-delay: -0.4s;
+ animation-delay: -0.4s;
+}
+
+.container1 .circle4 {
+ -webkit-animation-delay: -0.3s;
+ animation-delay: -0.3s;
+}
+
+.container2 .circle4 {
+ -webkit-animation-delay: -0.2s;
+ animation-delay: -0.2s;
+}
+
+.container3 .circle4 {
+ -webkit-animation-delay: -0.1s;
+ animation-delay: -0.1s;
+}
+
+@-webkit-keyframes bouncedelay {
+ 0%, 80%, 100% { -webkit-transform: scale(0.0) }
+ 40% { -webkit-transform: scale(1.0) }
+}
+
+@keyframes bouncedelay {
+ 0%, 80%, 100% {
+ transform: scale(0.0);
+ -webkit-transform: scale(0.0);
+ } 40% {
+ transform: scale(1.0);
+ -webkit-transform: scale(1.0);
+ }
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Tabs
+ * ------------------------------------------------------------------------------------------ */
+ul.nav-tabs {
+ margin: 0;
+}
+
+p.deprecated span{
+ color: #ff0000;
+ font-weight: bold;
+ text-decoration: underline;
+}
+
+/* ------------------------------------------------------------------------------------------
+ * Print
+ * ------------------------------------------------------------------------------------------ */
+
+@media print {
+
+ #sidenav,
+ #version,
+ #versions,
+ section .version,
+ section .versions {
+ display: none;
+ }
+
+ #content {
+ margin-left: 0;
+ }
+
+ a {
+ text-decoration: none;
+ color: inherit;
+ }
+
+ a:after {
+ content: " [" attr(href) "] ";
+ }
+
+ p {
+ color: #000000
+ }
+
+ pre {
+ background-color: #ffffff;
+ color: #000000;
+ padding: 10px;
+ border: #808080 1px solid;
+ border-radius: 6px;
+ position: relative;
+ margin: 10px 0 20px 0;
+ }
+
+} /* /@media print */
diff --git a/api-gateway/src/main/resources/static/api/doc/fonts/glyphicons-halflings-regular.eot b/api-gateway/src/main/resources/static/api/doc/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64
GIT binary patch
literal 20127
zcma%hV{j!vx9y2-`@~L8?1^pLwlPU2wr$&<*tR|KBoo`2;LUg6eW-eW-tKDb)vH%`
z^`A!Vd<6hNSRMcX|Cb;E|1qflDggj6Kmr)xA10^t-vIc3*Z+F{r%|K(GyE^?|I{=9
zNq`(c8=wS`0!RZy0g3{M(8^tv41d}oRU?8#IBFtJy*9zAN5dcxqGlMZGL>GG%R#)4J
zDJ2;)4*E1pyHia%>lMv3X7Q`UoFyoB@|xvh^)kOE3)IL&0(G&i;g08s>c%~pHkN&6
z($7!kyv|A2DsV2mq-5Ku)D#$Kn$CzqD-wm5Q*OtEOEZe^&T$xIb0NUL}$)W)Ck`6oter6KcQG9Zcy>lXip)%e&!lQgtQ*N`#abOlytt!&i3fo)cKV
zP0BWmLxS1gQv(r_r|?9>rR0ZeEJPx;Vi|h1!Eo*dohr&^lJgqJZns>&vexP@fs
zkPv93Nyw$-kM5Mw^{@wPU47Y1dSkiHyl3dtHLwV&6Tm1iv{ve;sYA}Z&kmH802s9Z
zyJEn+cfl7yFu#1^#DbtP7k&aR06|n{LnYFYEphKd@dJEq@)s#S)UA&8VJY@S2+{~>
z(4?M();zvayyd^j`@4>xCqH|Au>Sfzb$mEOcD7e4z8pPVRTiMUWiw;|gXHw7LS#U<
zsT(}Z5SJ)CRMXloh$qPnK77w_)ctHmgh}QAe<2S{DU^`!uwptCoq!Owz$u6bF)vnb
zL`bM$%>baN7l#)vtS3y6h*2?xCk
z>w+s)@`O4(4_I{L-!+b%)NZcQ&ND=2lyP+xI#9OzsiY8$c)ys-MI?TG6
zEP6f=vuLo!G>J7F4v|s#lJ+7A`^nEQScH3e?B_jC&{sj>m
zYD?!1z4nDG_Afi$!J(<{>z{~Q)$SaXWjj~%ZvF152Hd^VoG14rFykR=_TO)mCn&K$
z-TfZ!vMBvnToyBoKRkD{3=&=qD|L!vb#jf1f}2338z)e)g>7#NPe!FoaY*jY{f)Bf>ohk-K
z4{>fVS}ZCicCqgLuYR_fYx2;*-4k>kffuywghn?15s1dIOOYfl+XLf5w?wtU2Og*f
z%X5x`H55F6g1>m~%F`655-W1wFJtY>>qNSdVT`M`1Mlh!5Q6#3j={n5#za;!X&^OJ
zgq;d4UJV-F>gg?c3Y?d=kvn3eV)Jb^
zO5vg0G0yN0%}xy#(6oTDSVw8l=_*2k;zTP?+N=*18H5wp`s90K-C67q{W3d8vQGmr
zhpW^>1HEQV2TG#8_P_0q91h8QgHT~8=-Ij5snJ3cj?Jn5_66uV=*pq(j}yHnf$Ft;5VVC?bz%9X31asJeQF2jEa47H#j`
zk&uxf3t?g!tltVP|B#G_UfDD}`<#B#iY^i>oDd-LGF}A@Fno~dR72c&hs6bR
z2F}9(i8+PR%R|~FV$;Ke^Q_E_Bc;$)xN4Ti>Lgg4vaip!%M
z06oxAF_*)LH57w|gCW3SwoEHwjO{}}U=pKhjKSZ{u!K?1zm1q?
zXyA6y@)}_sONiJopF}_}(~}d4FDyp|(@w}Vb;Fl5bZL%{1`}gdw#i{KMjp2@Fb9pg
ziO|u7qP{$kxH$qh8%L+)AvwZNgUT6^zsZq-MRyZid{D?t`f|KzSAD~C?WT3d0rO`0
z=qQ6{)&UXXuHY{9g|P7l_nd-%eh}4%VVaK#Nik*tOu9lBM$<%FS@`NwGEbP0&;Xbo
zObCq=y%a`jSJmx_uTLa{@2@}^&F4c%z6oe-TN&idjv+8E|$FHOvBqg5hT
zMB=7SHq`_-E?5g=()*!V>rIa&LcX(RU}aLm*38U_V$C_g4)7GrW5$GnvTwJZdBmy6
z*X)wi3=R8L=esOhY0a&eH`^fSpUHV8h$J1|o^3fKO|9QzaiKu>yZ9wmRkW?HTkc<*v7i*ylJ#u#j
zD1-n&{B`04oG>0Jn{5PKP*4Qsz{~`VVA3578gA+JUkiPc$Iq!^K|}*p_z3(-c&5z@
zKxmdNpp2&wg&%xL3xZNzG-5Xt7jnI@{?c
z25=M>-VF|;an2Os$Nn%HgQz7m(ujC}Ii0Oesa(y#8>D+P*_m^X##E|h$M6tJr%#=P
zWP*)Px>7z`E~U^2LNCNiy%Z7!!6RI%6fF@#ZY3z`CK91}^J$F!EB0YF1je9hJKU7!S5MnXV{+#K;y
zF~s*H%p@vj&-ru7#(F2L+_;IH46X(z{~HTfcThqD%b{>~u@lSc<+f5#xgt9L7$gSK
ziDJ6D*R%4&YeUB@yu@4+&70MBNTnjRyqMRd+@&lU#rV%0t3OmouhC`mkN}pL>tXin
zY*p)mt=}$EGT2E<4Q>E2`6)gZ`QJhGDNpI}bZL9}m+R>q?l`OzFjW?)Y)P`fUH(_4
zCb?sm1=DD0+Q5v}BW#0n5;Nm(@RTEa3(Y17H2H67La+>ptQHJ@WMy2xRQT$|7l`8c
zYHCxYw2o-rI?(fR2-%}pbs$I%w_&LPYE{4bo}vRoAW>3!SY_zH3`ofx3F1PsQ?&iq
z*BRG>?<6%z=x#`NhlEq{K~&rU7Kc7Y-90aRnoj~rVoKae)L$3^z*Utppk?I`)CX&&
zZ^@Go9fm&fN`b`XY
zt0xE5aw4t@qTg_k=!-5LXU+_~DlW?53!afv6W(k@FPPX-`nA!FBMp7b!ODbL1zh58
z*69I}P_-?qSLKj}JW7gP!la}K@M}L>v?rDD!DY-tu+onu9kLoJz20M4urX_xf2dfZ
zORd9Zp&28_ff=wdMpXi%IiTTNegC}~RLkdYjA39kWqlA?jO~o1`*B&85Hd%VPkYZT
z48MPe62;TOq#c%H(`wX5(Bu>nlh4Fbd*Npasdhh?oRy8a;NB2(eb}6DgwXtx=n}fE
zx67rYw=(s0r?EsPjaya}^Qc-_UT5|*@|$Q}*|>V3O~USkIe6a0_>vd~6kHuP8=m}_
zo2IGKbv;yA+TBtlCpnw)8hDn&eq?26gN$Bh;SdxaS04Fsaih_Cfb98s39xbv)=mS0
z6M<@pM2#pe32w*lYSWG>DYqB95XhgAA)*9dOxHr{t)er0Xugoy)!Vz#2C3FaUMzYl
zCxy{igFB901*R2*F4>grPF}+G`;Yh
zGi@nRjWyG3mR(BVOeBPOF=_&}2IWT%)pqdNAcL{eP`L*^FDv#Rzql5U&Suq_X%JfR_lC!S|y|xd5mQ0{0!G#9hV46S~A`
z0B!{yI-4FZEtol5)mNWXcX(`x&Pc*&gh4k{w%0S#EI>rqqlH2xv7mR=9XNCI$V#NG
z4wb-@u{PfQP;tTbzK>(DF(~bKp3;L1-A*HS!VB)Ae>Acnvde15Anb`h;I&0)aZBS6
z55ZS7mL5Wp!LCt45^{2_70YiI_Py=X{I3>$Px5Ez0ahLQ+
z9EWUWSyzA|+g-Axp*Lx-M{!ReQO07EG7r4^)K(xbj@%ZU=0tBC5shl)1a!ifM5OkF
z0w2xQ-<+r-h1fi7B6waX15|*GGqfva)S)dVcgea`lQ~SQ$KXPR+(3Tn2I2R<0
z9tK`L*pa^+*n%>tZPiqt{_`%v?Bb7CR-!GhMON_Fbs0$#|H}G?rW|{q5fQhvw!FxI
zs-5ZK>hAbnCS#ZQVi5K0X3PjL1JRdQO+&)*!oRCqB{wen60P6!7bGiWn@vD|+E@Xq
zb!!_WiU^I|@1M}Hz6fN-m04x=>Exm{b@>UCW|c8vC`aNbtA@KCHujh^2RWZC}iYhL^<*Z93chIBJYU&w>$CGZDRcHuIgF&oyesDZ#&mA;?wxx4Cm#c0V$xYG?9OL(Smh}#fFuX(K;otJmvRP{h
ze^f-qv;)HKC7geB92_@3a9@MGijS(hNNVd%-rZ;%@F_f7?Fjinbe1(
zn#jQ*jKZTqE+AUTEd3y6t>*=;AO##cmdwU4gc2&rT8l`rtKW2JF<`_M#p>cj+)yCG
zgKF)y8jrfxTjGO&ccm8RU>qn|HxQ7Z#sUo$q)P5H%8iBF$({0Ya51-rA@!It#NHN8MxqK
zrYyl_&=}WVfQ?+ykV4*@F6)=u_~3BebR2G2>>mKaEBPmSW3(qYGGXj??m3L
zHec{@jWCsSD8`xUy0pqT?Sw0oD?AUK*WxZn#D>-$`eI+IT)6ki>ic}W)t$V32^ITD
zR497@LO}S|re%A+#vdv-?fXsQGVnP?QB_d0cGE+U84Q=aM=XrOwGFN3`Lpl@P0fL$
zKN1PqOwojH*($uaQFh8_)H#>Acl&UBSZ>!2W1Dinei`R4dJGX$;~60X=|SG6#jci}
z&t4*dVDR*;+6Y(G{KGj1B2!qjvDYOyPC}%hnPbJ@g(4yBJrViG1#$$X75y+Ul1{%x
zBAuD}Q@w?MFNqF-m39FGpq7RGI?%Bvyyig&oGv)lR>d<`Bqh=p>urib5DE;u$c|$J
zwim~nPb19t?LJZsm{<(Iyyt@~H!a4yywmHKW&=1r5+oj*Fx6c89heW@(2R`i!Uiy*
zp)=`Vr8sR!)KChE-6SEIyi(dvG3<1KoVt>kGV=zZiG7LGonH1+~yOK-`g0)r#+O|Q>)a`I2FVW%wr3lhO(P{ksNQuR!G_d
zeTx(M!%brW_vS9?IF>bzZ2A3mWX-MEaOk^V|4d38{1D|KOlZSjBKrj7Fgf^>JyL0k
zLoI$adZJ0T+8i_Idsuj}C;6jgx9LY#Ukh;!8eJ^B1N}q=Gn4onF*a2vY7~`x$r@rJ
z`*hi&Z2lazgu{&nz>gjd>#eq*IFlXed(%$s5!HRXKNm
zDZld+DwDI`O6hyn2uJ)F^{^;ESf9sjJ)wMSKD~R=DqPBHyP!?cGAvL<1|7K-(=?VO
zGcKcF1spUa+ki<`6K#@QxOTsd847N8WSWztG~?~
z!gUJn>z0O=_)VCE|56hkT~n5xXTp}Ucx$Ii%bQ{5;-a4~I2e|{l9ur#*ghd*hSqO=
z)GD@ev^w&5%k}YYB~!A%3*XbPPU-N6&3Lp1LxyP@|C<{qcn&?l54+zyMk&I3YDT|E
z{lXH-e?C{huu<@~li+73lMOk&k)3s7Asn$t6!PtXJV!RkA`qdo4|OC_a?vR!kE_}k
zK5R9KB%V@R7gt@9=TGL{=#r2gl!@3G;k-6sXp&E4u20DgvbY$iE**Xqj3TyxK>3AU
z!b9}NXuINqt>Htt6fXIy5mj7oZ{A&$XJ&thR5ySE{mkxq_YooME#VCHm2+3D!f`{)
zvR^WSjy_h4v^|!RJV-RaIT2Ctv=)UMMn@fAgjQV$2G+4?&dGA8vK35c-8r)z9Qqa=%k(FU)?iec14<^olkOU3p
zF-6`zHiDKPafKK^USUU+D01>C&Wh{{q?>5m
zGQp|z*+#>IIo=|ae8CtrN@@t~uLFOeT{}vX(IY*;>wAU=u1Qo4c+a&R);$^VCr>;!
zv4L{`lHgc9$BeM)pQ#XA_(Q#=_iSZL4>L~8Hx}NmOC$&*Q*bq|9Aq}rWgFnMDl~d*;7c44GipcpH9PWaBy-G$*MI^F0
z?Tdxir1D<2ui+Q#^c4?uKvq=p>)lq56=Eb|N^qz~w7rsZu)@E4$;~snz+wIxi+980O6M#RmtgLYh@|2}9BiHSpTs
zacjGKvwkUwR3lwTSsCHlwb&*(onU;)$yvdhikonn|B44JMgs*&Lo!jn`6AE>XvBiO
z*LKNX3FVz9yLcsnmL!cRVO_qv=yIM#X|u&}#f%_?Tj0>8)8P_0r0!AjWNw;S44tst
zv+NXY1{zRLf9OYMr6H-z?4CF$Y%MdbpFIN@a-LEnmkcOF>h16cH_;A|e)pJTuCJ4O
zY7!4FxT4>4aFT8a92}84>q0&?46h>&0Vv0p>u~k&qd5$C1A6Q$I4V(5X~6{15;PD@
ze6!s9xh#^QI`J+%8*=^(-!P!@9%~buBmN2VSAp@TOo6}C?az+ALP8~&a0FWZk*F5N
z^8P8IREnN`N0i@>O0?{i-FoFShYbUB`D7O4HB`Im2{yzXmyrg$k>cY6A@>bf7i3n0
z5y&cf2#`zctT>dz+hNF&+d3g;2)U!#vsb-%LC+pqKRTiiSn#FH#e!bVwR1nAf*TG^
z!RKcCy$P>?Sfq6n<%M{T0I8?p@HlgwC!HoWO>~mT+X<{Ylm+$Vtj9};H3$EB}P2wR$3y!TO#$iY8eO-!}+F&jMu4%E6S>m
zB(N4w9O@2=<`WNJay5PwP8javDp~o~xkSbd4t4t8)9jqu@bHmJHq=MV~Pt|(TghCA}fhMS?s-{klV>~=VrT$nsp7mf{?cze~KKOD4
z_1Y!F)*7^W+BBTt1R2h4f1X4Oy2%?=IMhZU8c{qk3xI1=!na*Sg<=A$?K=Y=GUR9@
zQ(ylIm4Lgm>pt#%p`zHxok%vx_=8Fap1|?OM02|N%X-g5_#S~sT@A!x&8k#wVI2lo
z1Uyj{tDQRpb*>c}mjU^gYA9{7mNhFAlM=wZkXcA#MHXWMEs^3>p9X)Oa?dx7b%N*y
zLz@K^%1JaArjgri;8ptNHwz1<0y8tcURSbHsm=26^@CYJ3hwMaEvC7
z3Wi-@AaXIQ)%F6#i@%M>?Mw7$6(kW@?et@wbk-APcvMCC{>iew#vkZej8%9h0JSc?
zCb~K|!9cBU+))^q*co(E^9jRl7gR4Jihyqa(Z(P&ID#TPyysVNL7(^;?Gan!OU>au
zN}miBc&XX-M$mSv%3xs)bh>Jq9#aD_l|zO?I+p4_5qI0Ms*OZyyxA`sXcyiy>-{YN
zA70%HmibZYcHW&YOHk6S&PQ+$rJ3(utuUra3V0~@=_~QZy&nc~)AS>v&<6$gErZC3
zcbC=eVkV4Vu0#}E*r=&{X)Kgq|8MGCh(wsH4geLj@#8EGYa})K2;n
z{1~=ghoz=9TSCxgzr5x3@sQZZ0FZ+t{?klSI_IZa16pSx6*;=O%n!uXVZ@1IL;JEV
zfOS&yyfE9dtS*^jmgt6>jQDOIJM5Gx#Y2eAcC3l^lmoJ{o0T>IHpECTbfYgPI4#LZq0PKqnPCD}_
zyKxz;(`fE0z~nA1s?d{X2!#ZP8wUHzFSOoTWQrk%;wCnBV_3D%3@EC|u$Ao)tO|AO
z$4&aa!wbf}rbNcP{6=ajgg(`p5kTeu$ji20`zw)X1SH*x
zN?T36{d9TY*S896Ijc^!35LLUByY4QO=ARCQ#MMCjudFc7s!z%P$6DESz%zZ#>H|i
zw3Mc@v4~{Eke;FWs`5i@ifeYPh-Sb#vCa#qJPL|&quSKF%sp8*n#t?vIE7kFWjNFh
zJC@u^bRQ^?ra|%39Ux^Dn4I}QICyDKF0mpe+Bk}!lFlqS^WpYm&xwIYxUoS-rJ)N9
z1Tz*6Rl9;x`4lwS1cgW^H_M*)Dt*DX*W?ArBf?-t|1~ge&S}xM0K;U9Ibf{okZHf~
z#4v4qc6s6Zgm8iKch5VMbQc~_V-ZviirnKCi*ouN^c_2lo&-M;YSA>W>>^5tlXObg
zacX$k0=9Tf$Eg+#9k6yV(R5-&F{=DHP8!yvSQ`Y~XRnUx@{O$-bGCksk~3&qH^dqX
zkf+ZZ?Nv5u>LBM@2?k%k&_aUb5Xjqf#!&7%zN#VZwmv65ezo^Y4S#(ed0yUn4tFOB
zh1f1SJ6_s?a{)u6VdwUC!Hv=8`%T9(^c`2hc9nt$(q{Dm2X)dK49ba+KEheQ;7^0)
ziFKw$%EHy_B1)M>=yK^=Z$U-LT36yX>EKT
zvD8IAom2&2?bTmX@_PBR4W|p?6?LQ+&UMzXxqHC5VHzf@Eb1u)kwyfy+NOM8Wa2y@
zNNDL0PE$F;yFyf^jy&RGwDXQwYw6yz>OMWvJt98X@;yr!*RQDBE-
zE*l*u=($Zi1}0-Y4lGaK?J$yQjgb+*ljUvNQ!;QYAoCq@>70=sJ{o{^21^?zT@r~hhf&O;Qiq+
ziGQQLG*D@5;LZ%09mwMiE4Q{IPUx-emo*;a6#DrmWr(zY27d@ezre)Z1BGZdo&pXn
z+);gOFelKDmnjq#8dL7CTiVH)dHOqWi~uE|NM^QI3EqxE6+_n>IW67~UB#J==QOGF
zp_S)c8TJ}uiaEiaER}MyB(grNn=2m&0yztA=!%3xUREyuG_jmadN*D&1nxvjZ6^+2
zORi7iX1iPi$tKasppaR9$a3IUmrrX)m*)fg1>H+$KpqeB*G>AQV((-G{}h=qItj|d
zz~{5@{?&Dab6;0c7!!%Se>w($RmlG7Jlv_zV3Ru8b2rugY0MVPOOYGlokI7%nhIy&
z-B&wE=lh2dtD!F?noD{z^O1~Tq4MhxvchzuT_oF3-t4YyA*MJ*n&+1X3~6quEN
z@m~aEp=b2~mP+}TUP^FmkRS_PDMA{B
zaSy(P=$T~R!yc^Ye0*pl5xcpm_JWI;@-di+nruhqZ4gy7cq-)I&s&Bt3BkgT(Zdjf
zTvvv0)8xzntEtp4iXm}~cT+pi5k{w{(Z@l2XU9lHr4Vy~3ycA_T?V(QS{qwt?v|}k
z_ST!s;C4!jyV5)^6xC#v!o*uS%a-jQ6<
z)>o?z7=+zNNtIz1*F_HJ(w@=`E+T|9TqhC(g7kKDc8z~?RbKQ)LRMn7A1p*PcX2YR
zUAr{);~c7I#3Ssv<0i-Woj0&Z4a!u|@Xt2J1>N-|ED<3$o2V?OwL4oQ%$@!zLamVz
zB)K&Ik^~GOmDAa143{I4?XUk1<3-k{<%?&OID&>Ud%z*Rkt*)mko0RwC2=qFf-^OV
z=d@47?tY=A;=2VAh0mF(3x;!#X!%{|vn;U2XW{(nu5b&8kOr)Kop3-5_xnK5oO_3y
z!EaIb{r%D{7zwtGgFVri4_!yUIGwR(xEV3YWSI_+E}Gdl>TINWsIrfj+7DE?xp+5^
zlr3pM-Cbse*WGKOd3+*Qen^*uHk)+EpH-{u@i%y}Z!YSid<}~kA*IRSk|nf+I1N=2
zIKi+&ej%Al-M5`cP^XU>9A(m7G>58>o|}j0ZWbMg&x`*$B9j#Rnyo0#=BMLdo%=ks
zLa3(2EinQLXQ(3zDe7Bce%Oszu%?8PO648TNst4SMFvj=+{b%)ELyB!0`B?9R6aO{i-63|s@|raSQGL~s)9R#J#duFaTSZ2M{X
z1?YuM*a!!|jP^QJ(hAisJuPOM`8Y-Hzl~%d@latwj}t&0{DNNC+zJARnuQfiN`HQ#
z?boY_2?*q;Qk)LUB)s8(Lz5elaW56p&fDH*AWAq7Zrbeq1!?FBGYHCnFgRu5y1jwD
zc|yBz+UW|X`zDsc{W~8m$sh@VVnZD$lLnKlq@Hg^;ky!}ZuPdKNi2BI70;hrpvaA4+Q_+K)I@|)q1N-H
zrycZU`*YUW``Qi^`bDX-j7j^&bO+-Xg$cz2#i##($uyW{Nl&{DK{=lLWV3|=<&si||2)l=8^8_z+Vho-#5LB0EqQ3v5U#*DF7
zxT)1j^`m+lW}p$>WSIG1eZ>L|YR-@Feu!YNWiw*IZYh03mq+2QVtQ}1ezRJM?0PA<
z;mK(J5@N8>u@<6Y$QAHWNE};rR|)U_&bv8dsnsza7{=zD1VBcxrALqnOf-qW(zzTn
zTAp|pEo#FsQ$~*$j|~Q;$Zy&Liu9OM;VF@#_&*nL!N2hH!Q6l*OeTxq!l>dEc{;Hw
zCQni{iN%jHU*C;?M-VUaXxf0FEJ_G=C8)C-wD!DvhY+qQ#FT3}Th8;GgV&AV94F`D
ztT6=w_Xm8)*)dBnDkZd~UWL|W=Glu!$hc|1w7_7l!3MAt95oIp4Xp{M%clu&TXehO
z+L-1#{mjkpTF@?|w1P98OCky~S%@OR&o75P&ZHvC}Y=(2_{ib(-Al_7aZ^U?s34#H}=
zGfFi5%KnFVCKtdO^>Htpb07#BeCXMDO8U}crpe1Gm`>Q=6qB4i=nLoLZ%p$TY=OcP
z)r}Et-Ed??u~f09d3Nx3bS@ja!fV(Dfa5lXxRs#;8?Y8G+Qvz+iv7fiRkL3liip})
z&G0u8RdEC9c$$rdU53=MH`p!Jn|DHjhOxHK$tW_pw9wCTf0Eo<){HoN=zG!!Gq4z4
z7PwGh)VNPXW-cE#MtofE`-$9~nmmj}m
zlzZscQ2+Jq%gaB9rMgVJkbhup0Ggpb)&L01T=%>n7-?v@I8!Q(p&+!fd+Y^Pu9l+u
zek(_$^HYFVRRIFt@0Fp52g5Q#I`tC3li`;UtDLP*rA{-#Yoa5qp{cD)QYhldihWe+
zG~zuaqLY~$-1sjh2lkbXCX;lq+p~!2Z=76cvuQe*Fl>IFwpUBP+d^&E4BGc{m#l%Kuo6#{XGoRyFc%Hqhf|%nYd<;yiC>tyEyk
z4I+a`(%%Ie=-*n
z-{mg=j&t12)LH3R?@-B1tEb7FLMePI1HK0`Ae@#)KcS%!Qt9p4_fmBl5zhO10n401
zBSfnfJ;?_r{%R)hh}BBNSl=$BiAKbuWrNGQUZ)+0=Mt&5!X*D@yGCSaMNY&@`;^a4
z;v=%D_!K!WXV1!3%4P-M*s%V2b#2jF2bk!)#2GLVuGKd#vNpRMyg`kstw0GQ8@^k^
zuqK5uR<>FeRZ#3{%!|4X!hh7hgirQ@Mwg%%ez8pF!N$xhMNQN((yS(F2-OfduxxKE
zxY#7O(VGfNuLv-ImAw5+h@gwn%!ER;*Q+001;W7W^waWT%@(T+5k!c3A-j)a8y11t
zx4~rSN0s$M8HEOzkcWW4YbKK9GQez2XJ|Nq?TFy;jmGbg;`m&%U4hIiarKmdTHt#l
zL=H;ZHE?fYxKQQXKnC+K!TAU}r086{4m}r()-QaFmU(qWhJlc$eas&y?=H9EYQy8N$8^bni9TpDp
zkA^WRs?KgYgjxX4T6?`SMs$`s3vlut(YU~f2F+id(Rf_)$BIMibk9lACI~LA+i7xn
z%-+=DHV*0TCTJp~-|$VZ@g2vmd*|2QXV;HeTzt530KyK>v&253N1l}bP_J#UjLy4)
zBJili9#-ey8Kj(dxmW^ctorxd;te|xo)%46l%5qE-YhAjP`Cc03vT)vV&GAV%#Cgb
zX~2}uWNvh`2<*AuxuJpq>SyNtZwzuU)r@@dqC@v=Ocd(HnnzytN+M&|Qi#f4Q8D=h
ziE<3ziFW%+!yy(q{il8H44g^5{_+pH60Mx5Z*FgC_3hKxmeJ+wVuX?T#ZfOOD3E4C
zRJsj#wA@3uvwZwHKKGN{{Ag+8^cs?S4N@6(Wkd$CkoCst(Z&hp+l=ffZ?2m%%ffI3
zdV7coR`R+*dPbNx=*ivWeNJK=Iy_vKd`-_Hng{l?hmp=|T3U&epbmgXXWs9ySE|=G
zeQ|^ioL}tveN{s72_&h+F+W;G}?;?_s@h5>DX(rp#eaZ!E=NivgLI
zWykLKev+}sHH41NCRm7W>K+_qdoJ8x9o5Cf!)|qLtF7Izxk*p|fX8UqEY)_sI_45O
zL2u>x=r5xLE%s|d%MO>zU%KV6QKFiEeo12g#bhei4!Hm+`~Fo~4h|BJ)%ENxy9)Up
zOxupSf1QZWun=)gF{L0YWJ<(r0?$bPFANrmphJ>kG`&7E+RgrWQi}ZS#-CQJ*i#8j
zM_A0?w@4Mq@xvk^>QSvEU|VYQoVI=TaOrsLTa`RZfe8{9F~mM{L+C`9YP9?OknLw|
zmkvz>cS6`pF0FYeLdY%>u&XpPj5$*iYkj=m7wMzHqzZ5SG~$i_^f@QEPEC+<2nf-{
zE7W+n%)q$!5@2pBuXMxhUSi*%F>e_g!$T-_`ovjBh(3jK9Q^~OR{)}!0}vdTE^M+m
z9QWsA?xG>EW;U~5gEuKR)Ubfi&YWnXV;3H6Zt^NE725*`;lpSK4HS1sN?{~9a4JkD
z%}23oAovytUKfRN87XTH2c=kq1)O5(fH_M3M-o{{@&~KD`~TRot-gqg7Q2U2o-iiF}K>m?CokhmODaLB
z1p6(6JYGntNOg(s!(>ZU&lzDf+Ur)^Lirm%*}Z>T)9)fAZ9>k(kvnM;ab$ptA=hoh
zVgsVaveXbMpm{|4*d<0>?l_JUFOO8A3xNLQOh%nVXjYI6X8h?a@6kDe5-m&;M0xqx
z+1U$s>(P9P)f0!{z%M@E7|9nn#IWgEx6A6JNJ(7dk`%6$3@!C!l;JK-p2?gg+W|d-
ziEzgk$w7k48NMqg$CM*4O~Abj3+_yUKTyK1p6GDsGEs;}=E_q>^LI-~pym$qhXPJf
z2`!PJDp4l(TTm#|n@bN!j;-FFOM__eLl!6{*}z=)UAcGYloj?bv!-XY1TA6Xz;82J
zLRaF{8ayzGa|}c--}|^xh)xgX>6R(sZD|Z|qX50gu=d`gEwHqC@WYU7{%<5VOnf9+
zB@FX?|UL%`8EIAe!*UdYl|6wRz6Y>(#8x92$#y}wMeE|ZM2X*c}dKJ^4NIf;Fm
zNwzq%QcO?$NR-7`su!*$dlIKo2y(N;qgH@1|8QNo$0wbyyJ2^}$iZ>M{BhBjTdMjK
z>gPEzgX4;g3$rU?jvDeOq`X=>)zdt|jk1Lv3u~bjHI=EGLfIR&+K3ldcc4D&Um&04
z3^F*}WaxR(ZyaB>DlmF_UP@+Q*h$&nsOB#gwLt{1#F4i-{A5J@`>B9@{^i?g_Ce&O
z<<}_We-RUFU&&MHa1#t56u_oM(Ljn7djja!T|gcxSoR=)@?owC*NkDarpBj=W4}=i1@)@L|C)
zQKA+o<(pMVp*Su(`zBC0l1yTa$MRfQ#uby|$mlOMs=G`4J|?apMzKei%jZql#gP@IkOaOjB7MJM=@1j(&!jNnyVkn5;4lvro1!vq
ztXiV8HYj5%)r1PPpIOj)f!>pc^3#LvfZ(hz}C@-3R(Cx7R427*Fwd!XO
z4~j&IkPHcBm0h_|iG;ZNrYdJ4HI!$rSyo&sibmwIgm1|J#g6%>=ML1r!kcEhm(XY&
zD@mIJt;!O%WP7CE&wwE3?1-dt;RTHdm~LvP7K`ccWXkZ0kfFa2S;wGtx_a}S2lslw
z$<4^Jg-n#Ypc(3t2N67Juasu=h)j&UNTPNDil4MQMTlnI81kY46uMH5B^U{~nmc6+
z9>(lGhhvRK9ITfpAD!XQ&BPphL3p8B4PVBN0NF6U49;ZA0Tr75AgGw7(S=Yio+xg_
zepZ*?V#KD;sHH+15ix&yCs0eSB-Z%D%uujlXvT#V$Rz@$+w!u#3GIo*AwMI#Bm^oO
zLr1e}k5W~G0xaO!C%Mb{sarxWZ4%Dn9vG`KHmPC9GWZwOOm11XJp#o0-P-${3m4g(
z6~)X9FXw%Xm~&99tj>a-ri})ZcnsfJtc10F@t9xF5vq6E)X!iUXHq-ohlO`gQdS&k
zZl})3k||u)!_=nNlvMbz%AuIr89l#I$;rG}qvDGiK?xTd5HzMQkw*p$YvFLGyQM!J
zNC^gD!kP{A84nGosi~@MLKqWQNacfs7O$dkZtm4-BZ~iA8xWZPkTK!HpA5zr!9Z&+icfAJ1)NWkTd!-9`NWU>9uXXUr;`Js#NbKFgrNhTcY4GNv*71}}T
zFJh?>=EcbUd2<|fiL+H=wMw8hbX6?+_cl4XnCB#ddwdG>bki*
zt*&6Dy&EIPluL@A3_;R%)shA-tDQA1!Tw4ffBRyy;2n)vm_JV06(4Or&QAOKNZB5f(MVC}&_!B>098R{Simr!UG}?CW1Ah+X+0#~0`X)od
zLYablwmFxN21L))!_zc`IfzWi`5>MxPe(DmjjO1}HHt7TJtAW+VXHt!aKZk>y6PoMsbDXRJnov;D~Ur~2R_7(Xr)aa%wJwZhS3gr7IGgt%@;`jpL@gyc6bGCVx!9CE7NgIbUNZ!Ur1RHror0~
zr(j$^yM4j`#c2KxSP61;(Tk^pe7b~}LWj~SZC=MEpdKf;B@on9=?_n|R|0q;Y*1_@
z>nGq>)&q!;u-8H)WCwtL&7F4vbnnfSAlK1mwnRq2&gZrEr!b1MA
z(3%vAbh3aU-IX`d7b@q`-WiT6eitu}ZH9x#d&qx}?CtDuAXak%5<-P!{a`V=$|XmJ
zUn@4lX6#ulB@a=&-9HG)a>KkH=jE7>&S&N~0X0zD=Q=t|7w;kuh#cU=NN7gBGbQTT
z;?bdSt8V&IIi}sDTzA0dkU}Z-Qvg;RDe8v>468p3*&hbGT1I3hi9hh~Z(!H}{+>eUyF)H&gdrX=k$aB%J6I;6+^^kn1mL+E+?A!A}@xV(Qa@M%HD5C@+-4Mb4lI=Xp=@9+^x+jhtOc
zYgF2aVa(uSR*n(O)e6tf3JEg2xs#dJfhEmi1iOmDYWk|wXNHU?g23^IGKB&yHnsm7
zm_+;p?YpA#N*7vXCkeN2LTNG`{QDa#U3fcFz7SB)83=<8rF)|udrEbrZL$o6W?oDR
zQx!178Ih9B#D9Ko$H(jD{4MME&<|6%MPu|TfOc#E0B}!j^MMpV69D#h2`vsEQ{(?c
zJ3Lh!3&=yS5fWL~;1wCZ?)%nmK`Eqgcu)O6rD^3%ijcxL50^z?OI(LaVDvfL0#zjZ
z2?cPvC$QCzpxpt5jMFp05OxhK0F!Q`rPhDi5)y=-0C}
zIM~ku&S@pl1&0=jl+rlS<4`riV~LC-#pqNde@44MB(j%)On$0Ko(@q?4`1?4149Z_
zZi!5aU@2vM$dHR6WSZpj+VboK+>u-CbNi7*lw4K^ZxxM#24_Yc`jvb9NPVi75L+MlM^U~`;a7`4H0L|TYK>%hfEfXLsu1JGM
zbh|8{wuc7ucV+`Ys1kqxsj`dajwyM;^X^`)#<+a~$WFy8b2t_RS{8yNYKKlnv+>vB
zX(QTf$kqrJ;%I@EwEs{cIcH@Z3|#^S@M+5jsP<^`@8^I4_8MlBb`~cE^n+{{;qW2q
z=p1=&+fUo%T{GhVX@;56kH8K_%?X=;$OTYqW1L*)hzelm^$*?_K;9JyIWhsn4SK(|
zSmXLTUE8VQX{se#8#Rj*lz`xHtT<61V~fb;WZUpu(M)f#;I+2_zR+)y5Jv?l`CxAinx|EY!`IJ*x9_gf_k&Gx2alL!hK
zUWj1T_pk|?iv}4EP#PZvYD_-LpzU!NfcLL%fK&r$W8O1KH9c2&GV~N#T$kaXGvAOl)|T
zuF9%6(i=Y3q?X%VK-D2YIYFPH3f|g$TrXW->&^Ab`WT
z7>Oo!u1u40?jAJ8Hy`bv}qbgs8)cF0&qeVjD?e+3Ggn1Im>K77ZSpbU*08
zfZkIFcv?y)!*B{|>nx@cE{KoutP+seQU?bCGE`tS0GKUO3PN~t=2u7q_6$l;uw^4c
zVu^f{uaqsZ{*a-N?2B8ngrLS8E&s6}Xtv9rR9C^b`@q8*iH)pFzf1|kCfiLw6u{Z%aC
z!X^5CzF6qofFJgklJV3oc|Qc2XdFl+y5M9*P8}A>Kh{
zWRgRwMSZ(?Jw;m%0etU5BsWT-Dj-5F;Q$OQJrQd+lv`i6>MhVo^p*^w6{~=fhe|bN
z*37oV0kji)4an^%3ABbg5RC;CS50@PV5_hKfXjYx+(DqQdKC^JIEMo6X66$qDdLRc
z!YJPSKnbY`#Ht6`g@xGzJmKzzn|abYbP+_Q(v?~~
z96%cd{E0BCsH^0HaWt{y(Cuto4VE7jhB1Z??#UaU(*R&Eo+J`UN+8mcb51F|I|n*J
zJCZ3R*OdyeS9hWkc_mA7-br>3Tw=CX2bl(=TpVt#WP8Bg^vE_9bP&6ccAf3lFMgr`
z{3=h@?Ftb$RTe&@IQtiJfV;O&4fzh)e1>7seG;
z=%mA4@c7{aXeJnhEg2J@Bm;=)j=O=cl#^NNkQ<{r;Bm|8Hg}bJ-S^g4`|itx)~!LN
zXtL}?f1Hs6UQ+f0-X6&TBCW=A4>bU0{rv8C4T!(wD-h>VCK4YJk`6C9$by!fxOYw-
zV#n+0{E(0ttq_#16B}
ze8$E#X9o{B!0vbq#WUwmv5Xz6{(!^~+}sBW{xctdNHL4^vDk!0E}(g|W_q;jR|ZK<
z8w>H-8G{%R#%f!E7cO_^B?yFRKLOH)RT9GJsb+kAKq~}WIF)NRLwKZ^Q;>!2MNa|}
z-mh?=B;*&D{Nd-mQRcfVnHkChI=DRHU4ga%xJ%+QkBd|-d9uRI76@BT(bjsjwS+r)
zvx=lGNLv1?SzZ;P)Gnn>04fO7Culg*?LmbEF0fATG8S@)oJ>NT3pYAXa*vX!eUTDF
ziBrp(QyDqr0ZMTr?4uG_Nqs6f%S0g?h`1vO5fo=5S&u#wI2d4+3hWiolEU!=3_oFo
zfie?+4W#`;1dd#X@g9Yj<53S<6OB!TM8w8})7k-$&q5(smc%;r
z(BlXkTp`C47+%4JA{2X}MIaPbVF!35P#p;u7+fR*46{T+LR8+j25oduCfDzDv6R-hU{TVVo9fz?^N3ShMt!t0NsH)pB
zRK8-S{Dn*y3b|k^*?_B70<2gHt==l7c&cT>r`C#{S}J2;s#d{M)ncW(#Y$C*lByLQ
z&?+{dR7*gpdT~(1;M(FfF==3z`^eW)=5a9RqvF-)2?S-(G
zhS;p(u~_qBum*q}On@$#08}ynd0+spzyVco0%G6;<-i5&016cV5UKzhQ~)fX03|>L
z8ej+HzzgVr6_5ZUpa4HW0Ca!=r1%*}Oo;2no&Zz8DfR)L!@r<5
z2viSZpmvo5XqXyAz{Ms7`7kX>fnr1gi4X~7KpznRT0{Xc5Cfz@43PjBMBoH@z_{~(
z(Wd}IPJ9hH+%)Fc)0!hrV+(A;76rhtI|YHbEDeERV~Ya>SQg^IvlazFkSK(KG9&{q
zkPIR~EeQaaBmwA<20}mBO?)N$(z1@p)5?%}rM|
zGF()~Z&Kx@OIDRI$d0T8;JX@vj3^2%pd_+@l9~a4lntZ;AvUIjqIZbuNTR6@hNJoV
zk4F;ut)LN4ARuyn2M6F~eg-e#UH%2P;8uPGFW^vq1vj8mdIayFOZo(tphk8C7hpT~
z1Fv8?b_LNR3QD9J+!v=p%}#
+
+
\ No newline at end of file
diff --git a/api-gateway/src/main/resources/static/api/doc/fonts/glyphicons-halflings-regular.ttf b/api-gateway/src/main/resources/static/api/doc/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b
GIT binary patch
literal 45404
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