├── .gitignore ├── LICENSE ├── README.md ├── cloud-doc-front ├── bs-webpc │ ├── .gitignore │ ├── README.md │ ├── babel.config.js │ ├── deploy.sh │ ├── package-lock.json │ ├── package.json │ ├── public │ │ ├── doc │ │ │ └── README.md │ │ ├── favicon.ico │ │ ├── imgs │ │ │ ├── ads │ │ │ │ ├── bs2020-1.png │ │ │ │ ├── bs2020-2.png │ │ │ │ └── bs2020-3.png │ │ │ ├── banner-1.png │ │ │ ├── loading-svg │ │ │ │ └── loading-bars.svg │ │ │ └── slider │ │ │ │ ├── slide-1.jpg │ │ │ │ ├── slide-2.jpg │ │ │ │ ├── slide-3.jpg │ │ │ │ ├── slide-4.jpg │ │ │ │ └── slide-5.jpg │ │ └── index.html │ ├── src │ │ ├── App.vue │ │ ├── assets │ │ │ ├── doc │ │ │ │ └── README.md │ │ │ ├── iconfont │ │ │ │ ├── iconfont.css │ │ │ │ ├── iconfont.eot │ │ │ │ ├── iconfont.svg │ │ │ │ ├── iconfont.ttf │ │ │ │ ├── iconfont.woff │ │ │ │ └── iconfont.woff2 │ │ │ ├── image │ │ │ │ ├── bs2020_placeholder.png │ │ │ │ ├── cart-empty.png │ │ │ │ ├── error.png │ │ │ │ ├── github.png │ │ │ │ ├── logo-footer.png │ │ │ │ ├── logo.png │ │ │ │ └── us-icon.png │ │ │ ├── scss │ │ │ │ ├── base.scss │ │ │ │ ├── btn.scss │ │ │ │ ├── config.scss │ │ │ │ ├── mixin.scss │ │ │ │ ├── model.scss │ │ │ │ └── reset.scss │ │ │ └── style │ │ │ │ ├── github-markdown.css │ │ │ │ └── index.css │ │ ├── common │ │ │ ├── NavBar.vue │ │ │ └── NavFooter.vue │ │ ├── components │ │ │ ├── Error.vue │ │ │ ├── EsList.vue │ │ │ ├── Model.vue │ │ │ ├── MyList.vue │ │ │ ├── MyList2.vue │ │ │ ├── MyLogin.vue │ │ │ ├── MyMarkdown.vue │ │ │ ├── MyRegister.vue │ │ │ └── ServiceBar.vue │ │ ├── main.js │ │ ├── pages │ │ │ ├── About.vue │ │ │ ├── Alipay.vue │ │ │ ├── Detail.vue │ │ │ ├── Goods.vue │ │ │ ├── Home.vue │ │ │ ├── Order.vue │ │ │ ├── ShoppingCart.vue │ │ │ └── confirmOrder.vue │ │ ├── router │ │ │ └── index.js │ │ ├── store │ │ │ ├── index.js │ │ │ └── modules │ │ │ │ ├── shoppingCort.js │ │ │ │ └── user.js │ │ └── tools │ │ │ ├── common.js │ │ │ ├── http.js │ │ │ └── toast.js │ └── vue.config.js ├── mysql │ └── bs-wxw.sql ├── shell │ └── cloud-web-server │ │ ├── start-bs2020.sh │ │ ├── stop-bs2020.sh │ │ └── update-bs2020.sh └── wxw-manage-web │ ├── .babelrc │ ├── .editorconfig │ ├── .gitignore │ ├── .postcssrc.js │ ├── LICENSE │ ├── README.md │ ├── build │ ├── build.js │ ├── check-versions.js │ ├── logo.png │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js │ ├── config │ ├── dev.env.js │ ├── index.js │ └── prod.env.js │ ├── deploy.sh │ ├── favicon.ico │ ├── index.html │ ├── package-lock.json │ ├── package.json │ └── src │ ├── .gitrepo │ ├── App.vue │ ├── assets │ ├── 1.jpeg │ ├── 2.jpeg │ ├── 4.jpg │ ├── KFOlCnqEu92Fr1MmEU9fBBc4.woff2 │ ├── baby.png │ ├── flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 │ ├── img │ │ └── mbg.gif │ ├── logo.png │ └── material.css │ ├── components │ ├── MyComponent.js │ ├── cascader │ │ └── Cascader.vue │ ├── form │ │ ├── Editor.vue │ │ └── Upload.vue │ ├── messages │ │ └── index.js │ └── tree │ │ ├── Tree.vue │ │ └── TreeItem.vue │ ├── config.js │ ├── http.js │ ├── main.js │ ├── menu.js │ ├── mockDB.js │ ├── pages │ ├── Dashboard.vue │ ├── Layout.vue │ ├── Login.vue │ ├── item │ │ ├── Brand.vue │ │ ├── BrandForm.vue │ │ ├── Category.vue │ │ ├── Goods.vue │ │ ├── GoodsForm.vue │ │ └── specification │ │ │ ├── SpecGroup.vue │ │ │ ├── SpecParam.vue │ │ │ └── Specification.vue │ ├── system │ │ ├── Admin.vue │ │ └── LoginOut.vue │ ├── trade │ │ ├── Logistics.vue │ │ ├── Order.vue │ │ ├── Promotion.vue │ │ └── Stock.vue │ └── user │ │ ├── User.vue │ │ └── UserList.vue │ └── router │ └── index.js ├── cloud-gateway-server ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── wxw │ │ └── cloud │ │ ├── GatewayMain10010.java │ │ ├── config │ │ ├── CorsConfig.java │ │ ├── FilterProperties.java │ │ ├── JwtProperties.java │ │ └── SwaggerProvider.java │ │ ├── filter │ │ └── LoginFilter.java │ │ └── handle │ │ └── SwaggerHandler.java │ └── resources │ └── application.yml ├── cloud-registry-server ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── wxw │ │ └── cloud │ │ └── RegistryMain10086.java │ └── resources │ └── application.yml ├── cloud-server-auth ├── cloud-auth-common │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── wxw │ │ └── cloud │ │ ├── domain │ │ └── UserInfo.java │ │ └── tools │ │ ├── JwtConstans.java │ │ ├── JwtUtils.java │ │ ├── ObjectUtils.java │ │ └── RsaUtils.java ├── cloud-auth-service │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── wxw │ │ │ │ └── cloud │ │ │ │ ├── AuthMain8087.java │ │ │ │ ├── config │ │ │ │ ├── EmbeddedTomcatConfig.java │ │ │ │ ├── JwtProperties.java │ │ │ │ └── Swagger2Config.java │ │ │ │ ├── controller │ │ │ │ └── AuthController.java │ │ │ │ ├── rpc │ │ │ │ └── UserRpc.java │ │ │ │ └── service │ │ │ │ └── AuthService.java │ │ └── resources │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── com │ │ └── wxw │ │ └── cloud │ │ └── JWTTest.java └── pom.xml ├── cloud-server-cart ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── wxw │ │ └── cloud │ │ ├── CartMain8088.java │ │ ├── config │ │ ├── JwtProperties.java │ │ ├── RedisConfig.java │ │ ├── Swagger2Config.java │ │ └── WebConfiguration.java │ │ ├── controller │ │ └── CartController.java │ │ ├── domain │ │ └── Cart.java │ │ ├── interceptor │ │ └── LoginInterceptor.java │ │ ├── rpc │ │ └── GoodsRpc.java │ │ └── service │ │ └── CartService.java │ └── resources │ └── application.yml ├── cloud-server-common ├── pom.xml ├── src │ └── main │ │ └── java │ │ └── com │ │ └── wxw │ │ └── cloud │ │ ├── result │ │ ├── PageResult.java │ │ └── Result.java │ │ └── tools │ │ ├── CookieUtils.java │ │ ├── DateUtils.java │ │ ├── IdWorker.java │ │ ├── JsonUtils.java │ │ ├── ListPageUtil.java │ │ └── NumberUtils.java └── target │ ├── maven-archiver │ └── pom.properties │ └── maven-status │ └── maven-compiler-plugin │ ├── compile │ └── default-compile │ │ ├── createdFiles.lst │ │ └── inputFiles.lst │ └── testCompile │ └── default-testCompile │ └── inputFiles.lst ├── cloud-server-fileload ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── wxw │ │ │ └── cloud │ │ │ ├── FileLoadMiain8082.java │ │ │ ├── config │ │ │ ├── CorsConfig.java │ │ │ ├── FastDfsClientConfig.java │ │ │ └── Swagger2Config.java │ │ │ ├── controller │ │ │ └── UploadController.java │ │ │ └── service │ │ │ ├── UploadService.java │ │ │ └── impl │ │ │ └── UploadServiceImpl.java │ └── resources │ │ └── application.yml │ └── test │ └── java │ └── com │ └── wxw │ └── cloud │ └── test │ └── TestFastDFS.java ├── cloud-server-order ├── cloud-order-interface │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── wxw │ │ └── cloud │ │ └── domain │ │ ├── Address.java │ │ ├── Order.java │ │ ├── OrderDetail.java │ │ ├── OrderStatus.java │ │ ├── PayLog.java │ │ ├── SeckillOrder.java │ │ └── Stock.java ├── cloud-order-service │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── wxw │ │ │ │ └── cloud │ │ │ │ ├── OrderMian8089.java │ │ │ │ ├── config │ │ │ │ ├── AliPayProperties.java │ │ │ │ ├── JwtProperties.java │ │ │ │ ├── MyBatisConfig.java │ │ │ │ ├── Swagger2Config.java │ │ │ │ └── WebConfiguration.java │ │ │ │ ├── controller │ │ │ │ ├── AddressController.java │ │ │ │ ├── OrderController.java │ │ │ │ └── StackAndSeckillController.java │ │ │ │ ├── dao │ │ │ │ ├── AddressMapper.java │ │ │ │ ├── OrderDetailMapper.java │ │ │ │ ├── OrderMapper.java │ │ │ │ ├── OrderStatusMapper.java │ │ │ │ ├── PayLogMapper.java │ │ │ │ ├── SeckillOrderMapper.java │ │ │ │ ├── StockMapper.java │ │ │ │ └── mapper │ │ │ │ │ ├── AddressMapper.xml │ │ │ │ │ ├── OrderDetailMapper.xml │ │ │ │ │ ├── OrderMapper.xml │ │ │ │ │ ├── OrderStatusMapper.xml │ │ │ │ │ ├── PayLogMapper.xml │ │ │ │ │ ├── SeckillOrderMapper.xml │ │ │ │ │ └── StockMapper.xml │ │ │ │ ├── interceptor │ │ │ │ └── LoginOrderInterceptor.java │ │ │ │ ├── service │ │ │ │ ├── AlipayService.java │ │ │ │ ├── IAddressService.java │ │ │ │ ├── IOrderDetailService.java │ │ │ │ ├── IOrderService.java │ │ │ │ ├── IOrderStatusService.java │ │ │ │ ├── IPayLogService.java │ │ │ │ ├── ISeckillOrderService.java │ │ │ │ ├── IStockService.java │ │ │ │ └── impl │ │ │ │ │ ├── AddressServiceImpl.java │ │ │ │ │ ├── AlipayServiceImpl.java │ │ │ │ │ ├── OrderDetailServiceImpl.java │ │ │ │ │ ├── OrderServiceImpl.java │ │ │ │ │ ├── OrderStatusServiceImpl.java │ │ │ │ │ ├── PayLogServiceImpl.java │ │ │ │ │ ├── SeckillOrderServiceImpl.java │ │ │ │ │ └── StockServiceImpl.java │ │ │ │ └── tools │ │ │ │ ├── PayReq.java │ │ │ │ ├── PayStatus.java │ │ │ │ ├── RefundReq.java │ │ │ │ └── TradeStatus.java │ │ └── resources │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── com │ │ └── wxw │ │ └── cloud │ │ ├── TestDao.java │ │ ├── TestId.java │ │ └── TestProperties.java └── pom.xml ├── cloud-server-search ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── wxw │ │ │ └── cloud │ │ │ ├── SearchMain8003.java │ │ │ ├── config │ │ │ └── Swagger2Config.java │ │ │ ├── controller │ │ │ └── SearchController.java │ │ │ ├── domain │ │ │ ├── Goods.java │ │ │ ├── SearchRequest.java │ │ │ └── SearchResult.java │ │ │ ├── listener │ │ │ └── GoodsListener.java │ │ │ ├── repository │ │ │ └── GoodsRepository.java │ │ │ ├── rpc │ │ │ ├── BrandClient.java │ │ │ ├── CategoryClient.java │ │ │ ├── GoodsClient.java │ │ │ └── SpecParamClient.java │ │ │ └── service │ │ │ └── SearchService.java │ └── resources │ │ └── application.yml │ └── test │ └── java │ └── com │ └── wxw │ └── cloud │ └── ImportESDataTest.java ├── cloud-server-user ├── cloud-user-interface │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── wxw │ │ └── cloud │ │ ├── client │ │ └── UserClient.java │ │ └── domain │ │ └── User.java ├── cloud-user-service │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── wxw │ │ │ │ └── cloud │ │ │ │ ├── UserMain8085.java │ │ │ │ ├── config │ │ │ │ ├── MyBatisConfig.java │ │ │ │ └── Swagger2Config.java │ │ │ │ ├── controller │ │ │ │ └── UserController.java │ │ │ │ ├── dao │ │ │ │ └── UserMapper.java │ │ │ │ ├── listener │ │ │ │ └── MsgListener.java │ │ │ │ ├── service │ │ │ │ ├── IUserService.java │ │ │ │ └── impl │ │ │ │ │ └── UserServiceImpl.java │ │ │ │ └── tools │ │ │ │ └── CodecUtils.java │ │ └── resources │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── com │ │ └── wxw │ │ └── cloud │ │ ├── TestDao.java │ │ └── TestRedis.java └── pom.xml ├── cloud-web-server ├── cloud-bs-interface │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── wxw │ │ └── cloud │ │ ├── api │ │ ├── BrandAPI.java │ │ ├── CategoryAPI.java │ │ ├── GoodsAPI.java │ │ └── SpecParamAPI.java │ │ ├── bo │ │ ├── SkuBO.java │ │ └── SpuBO.java │ │ ├── domain │ │ ├── Brand.java │ │ ├── Category.java │ │ ├── Sku.java │ │ ├── SpecGroup.java │ │ ├── SpecParam.java │ │ ├── Spu.java │ │ ├── SpuDetail.java │ │ └── Stock.java │ │ └── vo │ │ └── SkuVO.java ├── cloud-bs-service │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── wxw │ │ │ │ └── cloud │ │ │ │ ├── BS2020Main.java │ │ │ │ ├── config │ │ │ │ ├── MyBatisConfig.java │ │ │ │ └── Swagger2Config.java │ │ │ │ ├── controller │ │ │ │ ├── BrandController.java │ │ │ │ ├── CategoryController.java │ │ │ │ ├── GoodsController.java │ │ │ │ ├── SpecGroupController.java │ │ │ │ ├── SpecParamController.java │ │ │ │ └── StockController.java │ │ │ │ ├── dao │ │ │ │ ├── BrandMapper.java │ │ │ │ ├── CategoryMapper.java │ │ │ │ ├── SkuMapper.java │ │ │ │ ├── SpecGroupMapper.java │ │ │ │ ├── SpecParamMapper.java │ │ │ │ ├── SpuDetailMapper.java │ │ │ │ ├── SpuMapper.java │ │ │ │ ├── StockMapper.java │ │ │ │ └── mapper │ │ │ │ │ ├── BrandMapper.xml │ │ │ │ │ ├── CategoryMapper.xml │ │ │ │ │ ├── SkuMapper.xml │ │ │ │ │ ├── SpecGroupMapper.xml │ │ │ │ │ ├── SpecParamMapper.xml │ │ │ │ │ └── StockMapper.xml │ │ │ │ ├── service │ │ │ │ ├── IBrandService.java │ │ │ │ ├── ICategoryService.java │ │ │ │ ├── IGoodsService.java │ │ │ │ ├── ISpecGroupService.java │ │ │ │ ├── ISpecParamService.java │ │ │ │ ├── IStockService.java │ │ │ │ └── impl │ │ │ │ │ ├── BrandServiceImpl.java │ │ │ │ │ ├── CategoryServiceImpl.java │ │ │ │ │ ├── GoodsServiceImpl.java │ │ │ │ │ ├── SpecGroupServiceImpl.java │ │ │ │ │ ├── SpecParamServiceImpl.java │ │ │ │ │ └── StockServiceImpl.java │ │ │ │ └── tools │ │ │ │ ├── CodeGenerator.java │ │ │ │ └── TestPath.java │ │ └── resources │ │ │ └── application.yml │ │ └── test │ │ └── java │ │ └── com │ │ └── wxw │ │ └── cloud │ │ ├── TestBrand.java │ │ ├── TestCategory.java │ │ └── TestMapper.java └── pom.xml ├── help.txt └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | .idea 4 | target/ 5 | logs/ 6 | *.iml 7 | .settings/ 8 | # Log file 9 | *.log 10 | 11 | # BlueJ files 12 | *.ctxt 13 | 14 | # Mobile Tools for Java (J2ME) 15 | .mtj.tmp/ 16 | 17 | # Package Files # 18 | *.jar 19 | *.war 20 | *.nar 21 | *.ear 22 | *.zip 23 | *.tar.gz 24 | *.rar 25 | *.txt 26 | 27 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 28 | hs_err_pid* 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 GitHubWxw 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 购物商城 2 | 3 | *** 4 | 5 | ### 前言 6 | 7 | bs-cloud,一个基于微服务架构的前后端分离的购物商城 8 | 9 | ### 项目介绍 10 | 11 | 购物商城(bs-cloud)一个基于微服务架构的前后端分离的购物商城。**Web** 端使用 **Vue** + **ElementUi** ,后端使用 **SpringCloud** + **SpringBoot** + **Mybatis-plus**进行开发, JWT 技术及 RSA 非对称加密实现真正无状态的单点登录,图片等文件上传至FastDFS 分布式文件存储服务器。 12 | 13 | ### 演示 14 | 15 | - 视频演示地址:https://www.bilibili.com/video/BV1aa411F7ic 16 | - 企鹅技术交流群:1102814874 17 | 18 | ### 项目特点 19 | 20 | - 友好的代码结构及注释,便于阅读及二次开发 21 | - 实现前后端分离,通过 **Json** 进行数据交互,前端再也不用关注后端技术 22 | - 页面交互使用 **Vue2.x**,极大的提高了开发效率。 23 | - 引入**Swagger** 多服务文档支持,方便编写 **API** 接口文档。 24 | - 引入**RabbitMQ** 消息队列,用于同步ES索引库和后台管理新上架商品后的信息 25 | - 引入**ElasticSearch** 实现商品过滤和搜索 26 | - 基于 JWT 技术及 RSA 非对称加密实现真正无状态的单点登录 27 | - FastDFS 进行处理大量的分布式文件存储 28 | - 基于 Nginx 实现初步的请求负载均衡和请求限流 29 | 30 | ### 项目目录 31 | 32 | - bs-cloud 是一款基于当下热门技术开发的购物商城。 33 | - cloud-doc-front 是前端文档部分 34 | - bs-webpc 是基于Vue实现的前台门户网站 35 | - wxw-manage-web 是基于Vue实现的管理商城后台 36 | - mysql 数据库脚本 37 | - shell 服务部署脚本 38 | - cloud-gateway-server 服务网关 39 | - cloud-registry-server 注册中心 40 | - cloud-server-auth 鉴权中心 41 | - cloud-server-cart 购物车 42 | - cloud-server-fileload 文件服务模块 43 | - cloud-server-order 订单支付模块,接入了支付宝沙箱支付 44 | - cloud-server-search 搜素服务,ElasticSearch和Solr作为全文检索工具,结合MQ维护索引库数据同步 45 | - cloud-server-user 用户中心,提供用户信息维护和管理 46 | - cloud-web-server 基础数据服务,提供管理后台和Web端API服务接口 47 | 48 | ### 关注&交流 49 | 50 | 感兴趣的小伙伴可以搜索或扫描下方二维码关注公众号【技术能量站】,一起交流学习。 51 | 52 | ![](https://gitee.com/iswxw/image/raw/master/wechat/FDekBM1FXHpH.jpg) 53 | 54 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/README.md: -------------------------------------------------------------------------------- 1 | # bs-webpc 2 | 3 | vueelement-uidonate 4 | 5 | 基于 Vue + Element UI 的农货交易前台门户。[线上地址](https://blog.wxw.plus/bs-webpc/#/) 6 | 7 | 8 | 9 | ### 项目构建 10 | 11 | ``` 12 | npm install 13 | ``` 14 | 15 | ### Compiles and hot-reloads for development 16 | ``` 17 | npm run serve 18 | ``` 19 | 20 | ### Compiles and minifies for production 21 | ``` 22 | npm run build 23 | ``` 24 | 25 | ### Lints and fixes files 26 | ``` 27 | npm run lint 28 | ``` 29 | 30 | ### Customize configuration 31 | See [Configuration Reference](https://cli.vuejs.org/config/). 32 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ["@vue/cli-plugin-babel/preset"] 3 | }; 4 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/deploy.sh: -------------------------------------------------------------------------------- 1 | ### 2 | # @Descripttion: 3 | # @version: V 1.0 4 | # @Author: wxw 5 | # @Date: 2020-08-23 18:12:31 6 | ### 7 | #!/usr/bin/env sh 8 | 9 | # 当发生错误时中止脚本 10 | set -e 11 | 12 | # 构建 13 | npm run build 14 | 15 | # cd 到构建输出的目录下 16 | cd dist 17 | 18 | # 部署到自定义域域名 19 | #echo 'blog.wxw.plus' > CNAME 20 | 21 | git init 22 | git add -A 23 | git commit -m 'deploy' 24 | 25 | # 部署到 https://.github.io 26 | # git push -f git@github.com:/.github.io.git master 27 | 28 | # 部署到 https://.github.io/ 29 | git push -f git@github.com:GitHubWxw/bs-webpc.git master:gh-pages 30 | 31 | cd - -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bs-webpc", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "axios": "^0.19.2", 12 | "core-js": "^3.6.4", 13 | "element-ui": "^2.13.1", 14 | "markdown-loader": "^5.1.0", 15 | "swiper": "^5.3.7", 16 | "vue": "^2.6.11", 17 | "vue-awesome-swiper": "^4.1.0", 18 | "vue-cookie": "^1.1.4", 19 | "vue-lazyload": "^1.3.3", 20 | "vue-markdown": "^2.2.4", 21 | "vue-router": "^3.1.6", 22 | "vuex": "^3.1.3" 23 | }, 24 | "devDependencies": { 25 | "@vue/cli-plugin-babel": "~4.3.0", 26 | "@vue/cli-plugin-eslint": "~4.3.0", 27 | "@vue/cli-plugin-router": "~4.3.0", 28 | "@vue/cli-plugin-vuex": "~4.3.0", 29 | "@vue/cli-service": "~4.3.0", 30 | "@vue/eslint-config-prettier": "^6.0.0", 31 | "babel-eslint": "^10.1.0", 32 | "eslint": "^6.7.2", 33 | "eslint-plugin-prettier": "^3.1.1", 34 | "eslint-plugin-vue": "^6.2.2", 35 | "node-sass": "^4.12.0", 36 | "prettier": "^1.19.1", 37 | "sass-loader": "^8.0.2", 38 | "vue-template-compiler": "^2.6.11" 39 | }, 40 | "eslintConfig": { 41 | "root": true, 42 | "env": { 43 | "node": true 44 | }, 45 | "extends": [ 46 | "plugin:vue/essential", 47 | "eslint:recommended", 48 | "@vue/prettier" 49 | ], 50 | "parserOptions": { 51 | "parser": "babel-eslint" 52 | }, 53 | "rules": { 54 | "prettier/prettier": "off" 55 | } 56 | }, 57 | "browserslist": [ 58 | "> 1%", 59 | "last 2 versions", 60 | "not dead" 61 | ] 62 | } 63 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/doc/README.md: -------------------------------------------------------------------------------- 1 | 7 | ​ 8 | 9 |   互联网技术的发展,在2020年又是一个新的起点。疫情之下的滞销难题,让农民也知道了电商的真正价值,农货也因此借道上行,而随着用户量与日俱增,传统的单体应用架构往往面临很多新的挑战。因此基于微服务架构的农货交易平台的设计应运而生。 10 | 11 |   本文通过对各大电商平台的深入分析和研究,权衡利弊后,设计并实现系统整体的架构,并经过需求分析、概要设计、详细设计和系统测试等科学化的开发步骤进行项目开发。结合B2C的运营模式,农货交易平台提供后台管理系统和前台门户系统,打破时间和空间层面的局限性,也实现了贫困地区的农货与外界精准有效的对接。让农货产品实现价值最大化,让之前难以实现外需成为现实,从而进一步放大了贫困地区的投资价值和现实效应,实现了撬动外需拉动经济实质性增长的追求。 12 | 13 | 本项目是基于微服务架构的农货交易平台、涉及的技术栈有: 14 | 15 | - Spring Cloud、Spring Boot、MyBatis Plus、Vue框架 16 | - 基于 FastDFS 解决大数据量的分布式文件存储问题 17 | - 基于 Elasticsearch 高级聚合功能,实现商品的智能过滤搜索 18 | - 基于 Elasticsearch 高级聚合功能,实现销售业务的复杂统计及报表输出 19 | - 基于 LocalStorage 实现离线客户端购物车,减轻服务端压力。 20 | - 基于 JWT 技术及 RSA 非对称加密实现真正无状态的单点登录。 21 | - 结合 JWT 和 RSA 非对称加密,自定义 Feign 过滤器实现自动化服务间鉴权,解决服务对外暴露的安全问题 22 | - 基于 RabbitMQ 实现可靠消息服务,解决服务间通信问题 23 | - 基于 RabbitMQ 实现可靠消息服务,解决分布式事务问题 24 | - 使用微信 SDK 实现微信扫码支付,符合主流付款方式 25 | - 基于 Redis 搭建高可用集群,实现可靠缓存服务即热点数据保存。 26 | - redis 持久化,集群,哨兵,主从,缓存击穿,热点 key。 27 | - 基于 Redis 和 Mq 来应对高可用高并发的秒杀场景 28 | - 基于 MyCat 实现数据库的读写分离和分库分表 29 | - 基于 Nginx 实现初步的请求负载均衡和请求限流 -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/public/favicon.ico -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/imgs/ads/bs2020-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/public/imgs/ads/bs2020-1.png -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/imgs/ads/bs2020-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/public/imgs/ads/bs2020-2.png -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/imgs/ads/bs2020-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/public/imgs/ads/bs2020-3.png -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/imgs/banner-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/public/imgs/banner-1.png -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/imgs/loading-svg/loading-bars.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/imgs/slider/slide-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/public/imgs/slider/slide-1.jpg -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/imgs/slider/slide-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/public/imgs/slider/slide-2.jpg -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/imgs/slider/slide-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/public/imgs/slider/slide-3.jpg -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/imgs/slider/slide-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/public/imgs/slider/slide-4.jpg -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/imgs/slider/slide-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/public/imgs/slider/slide-5.jpg -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BS2020商城 6 | 7 | 8 | 9 | 10 | 11 | 12 | 32 | 33 |
34 | 35 | 36 | 37 | 42 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/doc/README.md: -------------------------------------------------------------------------------- 1 | 7 | 本项目是基于微服务架构的农货交易平台、涉及的技术栈有: 8 | 9 | - Spring Cloud、Spring Boot、MyBatis Plus、Vue框架 10 | - 基于 FastDFS 解决大数据量的分布式文件存储问题 11 | - 基于 Elasticsearch 高级聚合功能,实现商品的智能过滤搜索 12 | - 基于 Elasticsearch 高级聚合功能,实现销售业务的复杂统计及报表输出 13 | - 基于 LocalStorage 实现离线客户端购物车,减轻服务端压力。 14 | - 基于 JWT 技术及 RSA 非对称加密实现真正无状态的单点登录。 15 | - 结合 JWT 和 RSA 非对称加密,自定义 Feign 过滤器实现自动化服务间鉴权,解决服务对外暴露的安全问题 16 | - 基于 RabbitMQ 实现可靠消息服务,解决服务间通信问题 17 | - 基于 RabbitMQ 实现可靠消息服务,解决分布式事务问题 18 | - 使用微信 SDK 实现微信扫码支付,符合主流付款方式 19 | - 基于 Redis 搭建高可用集群,实现可靠缓存服务即热点数据保存。 20 | - redis 持久化,集群,哨兵,主从,缓存击穿,热点 key。 21 | - 基于 Redis 和 Mq 来应对高可用高并发的秒杀场景 22 | - 基于 MyCat 实现数据库的读写分离和分库分表 23 | - 基于 Nginx 实现初步的请求负载均衡和请求限流 -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/iconfont/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/src/assets/iconfont/iconfont.eot -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/src/assets/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/src/assets/iconfont/iconfont.woff -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/iconfont/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/src/assets/iconfont/iconfont.woff2 -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/image/bs2020_placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/src/assets/image/bs2020_placeholder.png -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/image/cart-empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/src/assets/image/cart-empty.png -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/image/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/src/assets/image/error.png -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/image/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/src/assets/image/github.png -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/image/logo-footer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/src/assets/image/logo-footer.png -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/image/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/src/assets/image/logo.png -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/image/us-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/bs-webpc/src/assets/image/us-icon.png -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/scss/base.scss: -------------------------------------------------------------------------------- 1 | .container { 2 | width: 1226px; 3 | margin: 0 auto; 4 | } 5 | 6 | a{ 7 | img{ 8 | width: 100%; 9 | height: 100%; 10 | } 11 | } 12 | .clearfix:before,.clearfix:after{ 13 | content:' '; 14 | display:table; 15 | } 16 | .clearfix:after{ 17 | clear: both; 18 | } 19 | .fl{ 20 | float: left; 21 | } 22 | .fr{ 23 | float: right; 24 | } 25 | .header-logo { 26 | display: inline-block; 27 | width: 55px; 28 | height: 55px; 29 | background-color: #ff6600; 30 | 31 | a { 32 | display: inline-block; 33 | width: 110px; 34 | height: 55px; 35 | 36 | &:before { 37 | content: " "; 38 | display: inline-block; 39 | width: 55px; 40 | height: 55px; 41 | background: url("/imgs/mi-logo.png") no-repeat center; 42 | background-size: contain; 43 | transition: margin 0.2s; 44 | } 45 | 46 | &:after { 47 | content: " "; 48 | display: inline-block; 49 | width: 55px; 50 | height: 55px; 51 | background: url("/imgs/mi-home.png") no-repeat center; 52 | background-size: contain; 53 | } 54 | 55 | &:hover:before { 56 | margin-left: -55px; 57 | transition: margin 0.2s; 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/scss/btn.scss: -------------------------------------------------------------------------------- 1 | @import "./config"; 2 | .btn{ 3 | display: inline-block; 4 | width: 110px; 5 | height: 30px; 6 | text-align: center; 7 | background-color: $colorA; 8 | color: #ffffff; 9 | border: none; 10 | line-height: 30px; 11 | margin-right: 20px; 12 | cursor: pointer; 13 | } 14 | .btn-default{ 15 | background-color: #b0b0b0; 16 | color: $colorG; 17 | } 18 | .btn-large{ 19 | width: 200px; 20 | height: 50px; 21 | line-height: 50px; 22 | font-size: 18px; 23 | } 24 | .btn-huge{ 25 | width: 300px; 26 | height: 55px; 27 | line-height: 55px; 28 | font-size: 16px; 29 | } 30 | .btn-group{ 31 | .btn{ 32 | margin-right: 20px; 33 | &:last-child{ 34 | margin: 0; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/scss/config.scss: -------------------------------------------------------------------------------- 1 | /* 2 | 样式规范表 3 | */ 4 | $min-width:1226px; //容器安全区域宽度 5 | 6 | // 常规字体大小设置 7 | $fontA: 80px; //产品站大标题 8 | $fontB: 38px; //产品站标题 9 | $fontC: 28px; //导航标题 10 | $fontD: 26px; //产品站副标题 11 | $fontE: 24px; 12 | $fontF: 22px; 13 | $fontG: 20px; //用在较为重要的文字、操作按钮 14 | $fontH: 18px; //用于大多数文字 15 | $fontI: 16px; //用于辅助性文字 16 | $fontJ: 14px; //用于一般文字 17 | $fontK: 12px; //系统默认大小 18 | 19 | // 常规配色设置 20 | $colorA: #FF6600 !default; //用于需要突出和强调的文字、按钮和icon 21 | $colorB: #333333 !default; //用于较为重要的文字信息、内页标题等 22 | $colorC: #666666 !default; //用于普通段落信息 引导词 23 | $colorD: #999999 !default; //用于辅助、次要的文字信息、普通按钮的描边 24 | $colorE: #cccccc !default; //用于特别弱的文字 25 | $colorF: #d7d7d7 !default; //用于列表分割线、标签秒变 26 | $colorG: #ffffff !default; //用于导航栏文字、按钮文字、白色背景 27 | $colorH: #e5e5e5 !default; //用于上下模块分割线 28 | $colorI: #000000 !default; //纯黑色背景,用于遮罩层 29 | $colorJ: #F5F5F5 !default; //弹框标题背景色 30 | $colorK: #FFFAF7 !default; //订单标题背景色 -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/scss/mixin.scss: -------------------------------------------------------------------------------- 1 | //flex布局复用 2 | @mixin flex($hov:space-between, $col:center) { 3 | display: flex; 4 | justify-content: $hov; 5 | align-items: $col; 6 | }; 7 | @mixin position($pos:absolute,$top:0,$left:0,$width:100%,$height:100%){ 8 | position: $pos; 9 | top: $top; 10 | left: $left; 11 | width: $width; 12 | height: $height; 13 | }; 14 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/scss/model.scss: -------------------------------------------------------------------------------- 1 | .cancel { 2 | float: right; 3 | &:hover{ 4 | color: red; 5 | cursor: pointer; 6 | } 7 | } 8 | .model{ 9 | @include position(fixed); 10 | z-index: 100; 11 | transition: all .3s; 12 | .mask{ 13 | @include position(fixed); 14 | background-color: $colorI; 15 | opacity: 0.5; 16 | } 17 | &.slider-leave-active{ 18 | top: -100%; 19 | } 20 | &.slider-enter-active{ 21 | top: 0; 22 | } 23 | &.slider-enter{ 24 | top: -100%; 25 | } 26 | &.slider-leave{ 27 | top: 0; 28 | } 29 | .model-dialog{ 30 | @include position(absolute,40%, 50%, 660px, auto); 31 | background-color: $colorG; 32 | transform: translate(-50%,-50%); 33 | .model-header{ 34 | height: 60px; 35 | background-color: $colorJ; 36 | padding: 0 26px; 37 | line-height: 60px; 38 | font-size: 16px; 39 | font-weight: bold; 40 | } 41 | .model-body { 42 | padding: 40px 40px 54px; 43 | } 44 | .model-footer{ 45 | height: 82px; 46 | line-height: 82px; 47 | text-align: center; 48 | background-color: $colorJ; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/assets/scss/reset.scss: -------------------------------------------------------------------------------- 1 | body,div,p,h1,h2,h3,h4,h5,h6,ul,li,dl,dt,a,input,button,textarea,select{ 2 | margin: 0; 3 | padding: 0; 4 | outline: none; 5 | } 6 | html,body{ 7 | font-family:Helvetica Neue,Helvetica,Arial,Microsoft Yahei,Hiragino Sans GB,Heiti SC,WenQuanYi Micro Hei,sans-serif; 8 | color: #333333; 9 | background-color: #ffffff; 10 | min-width: 1226px; 11 | font-size: 12px; 12 | } 13 | a{ 14 | text-decoration: none; 15 | } 16 | ul,li{ 17 | list-style: none; 18 | } 19 | input{ 20 | font: normal; 21 | } 22 | input:focus,a:focus{ 23 | outline: none; 24 | } -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/common/NavFooter.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 29 | 30 | 61 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/components/Error.vue: -------------------------------------------------------------------------------- 1 | 7 | 12 | 24 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/components/MyMarkdown.vue: -------------------------------------------------------------------------------- 1 | 7 | 12 | 36 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/components/ServiceBar.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 39 | 40 | 67 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/pages/About.vue: -------------------------------------------------------------------------------- 1 | 7 | 20 | 34 | 65 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/pages/Alipay.vue: -------------------------------------------------------------------------------- 1 | 7 | 12 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/store/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: Vuex入口 3 | * @version: V 1.0 4 | * @Author: wxw 5 | * @Date: 2020-04-13 16:29:18 6 | */ 7 | import Vue from "vue"; 8 | import Vuex from "vuex"; 9 | import user from "./modules/user"; 10 | 11 | Vue.use(Vuex); 12 | 13 | const store = new Vuex.Store({ 14 | strict: true, 15 | modules: { 16 | user 17 | } 18 | }); 19 | export default store; 20 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/store/modules/user.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 用户登录状态模块 3 | * @version: V 1.0 4 | * @Author: wxw 5 | * @Date: 2020-04-13 23:17:40 6 | */ 7 | 8 | export default { 9 | state: { 10 | user: "", // 登录的用户 11 | showLogin: false // 用于控制是否显示登录组件 12 | }, 13 | getters: { 14 | getUser(state) { 15 | return state.user; 16 | }, 17 | getShowLogin(state) { 18 | return state.showLogin; 19 | } 20 | }, 21 | mutations: { 22 | setUser(state, data) { 23 | state.user = data; 24 | }, 25 | setShowLogin(state, data) { 26 | state.showLogin = data; 27 | } 28 | }, 29 | actions: { 30 | setUser({ commit }, data) { 31 | commit("setUser", data); 32 | }, 33 | setShowLogin({ commit }, data) { 34 | commit("setShowLogin", data); 35 | } 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/tools/http.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import axios from "axios"; 3 | 4 | axios.defaults.baseURL = "http://api.wxw.com/api"; // 设置axios的基础请求路径 5 | axios.defaults.timeout = 20000; // 设置axios的请求时间 6 | 7 | // get请求 8 | axios.loadData = async function(url) { 9 | const resp = await axios.get(url); 10 | return resp.data; 11 | }; 12 | 13 | // post请求 不用 14 | Vue.prototype.$http = axios; // 将axios添加到 Vue的原型,这样一切vue实例都可以使用该对象 15 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/src/tools/toast.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 全局变量 3 | * @version: V 1.0 4 | * @Author: wxw 5 | * @Date: 2020-04-13 22:56:29 6 | */ 7 | 8 | exports.install = function(Vue) { 9 | Vue.prototype.$target = "http://www.wxw.com/"; // 线上后端地址 10 | //Vue.prototype.$target = "http://localhost/"; // 本地后端地址 11 | // 封装提示成功的弹出框 12 | Vue.prototype.notifySucceed = function(msg) { 13 | this.$notify({ 14 | title: "成功", 15 | message: msg, 16 | type: "success", 17 | offset: 100 18 | }); 19 | }; 20 | // 封装提示失败的弹出框 21 | Vue.prototype.notifyError = function(msg) { 22 | this.$notify.error({ 23 | title: "错误", 24 | message: msg, 25 | offset: 100 26 | }); 27 | }; 28 | }; 29 | -------------------------------------------------------------------------------- /cloud-doc-front/bs-webpc/vue.config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 3 | * @version: V 1.0 4 | * @Author: wxw 5 | * @Date: 2020-04-13 16:35:05 6 | */ 7 | module.exports = { 8 | // 部署应用时的基本 URL 9 | //publicPath: './', 10 | publicPath: process.env.NODE_ENV === "production" ? "/bs-webpc/" : "/", 11 | // build时构建文件的目录 构建时传入 --no-clean 可关闭该行为 12 | // outputDir: "bs-webpc", 13 | // build时放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录 14 | assetsDir: "static", 15 | // 指定生成的 index.html 的输出路径 (相对于 outputDir)。也可以是一个绝对路径。 16 | indexPath: "index.html", 17 | // 默认在生成的静态资源文件名中包含hash以控制缓存 18 | filenameHashing: true, 19 | // devServer:{type:Object} 3个属性host,port,https 20 | devServer: { 21 | disableHostCheck: true, 22 | // 让浏览器 overlay 同时显示警告和错误 23 | overlay: { 24 | warnings: false, 25 | errors: true 26 | }, 27 | port: 9002, // 端口 28 | open: false // 配置自动启动浏览器 29 | // proxy: { 30 | // "/api": { 31 | // target: "http://api.wxw.com", 32 | // ws: true, 33 | // changeOrigin: true, 34 | // pathRewrite: { 35 | // //"/api": "" 36 | // } 37 | // } 38 | // } 39 | }, 40 | // 配置md文件解析 41 | configureWebpack: config => { 42 | config.module.rules.push({ 43 | // 处理markdown文件 44 | test: /\.md$/, 45 | loader: 'vue-loader' 46 | }, 47 | ); 48 | } 49 | 50 | }; 51 | -------------------------------------------------------------------------------- /cloud-doc-front/shell/cloud-web-server/start-bs2020.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #project=bs-cloud 3 | module=cloud-web-server 4 | version=3.0.0 5 | moduleJar="$module"-"$version".jar 6 | 7 | nohup java -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF-8 -Xmx1g -Xms1g -jar "$moduleJar" --server.port=8081 --system.node.name=node-8081 1>node-8081.log 2>&1 & 8 | -------------------------------------------------------------------------------- /cloud-doc-front/shell/cloud-web-server/stop-bs2020.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #project=bs-cloud 3 | module=cloud-web-server 4 | version=3.0.0 5 | moduleJar="$module"-"$version".jar 6 | 7 | for i in `ps ux | grep "$moduleJar" | grep -v grep | awk '{print $2}'` 8 | do 9 | echo "安全退出进程$i" 10 | kill -15 $i 11 | done 12 | 13 | sleep 5 14 | 15 | for i in `ps ux | grep "$moduleJar" | grep -v grep | awk '{print $2}'` 16 | do 17 | echo "强制停止进程$i" 18 | kill -9 $i 19 | done 20 | -------------------------------------------------------------------------------- /cloud-doc-front/shell/cloud-web-server/update-bs2020.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | workHome=$(pwd) 3 | sourceHome="$workHome"/source 4 | if [ -f $workHome/update.pid ]; then 5 | echo "正在更新中,请稍候再试!" 6 | exit 1 7 | fi 8 | echo "当前发布程序进程ID:$$" 9 | echo $$ > $workHome/update.pid 10 | 11 | project=bs-cloud 12 | version=3.0.0 13 | 14 | # compile 15 | cd $sourceHome/$project 16 | git reset --hard 17 | git checkout master 18 | git pull 19 | #git log -3 20 | mvn clean package -Dmaven.test.skip=true 21 | 22 | cd $workHome 23 | 24 | module=cloud-web-server 25 | moduleJar="$module"-"$version".jar 26 | #stop bs-cloud 27 | ./stop-bs2020.sh 28 | 29 | # deploy bs-cloud 30 | rm -rf "$workHome"/"$moduleJar" 31 | cp "$sourceHome"/"$project"/"$module"/target/"$moduleJar" "$workHome"/"$moduleJar" 32 | 33 | # start bs-cloud 34 | ./start-bs2020.sh 35 | 36 | rm -rf $workHome/update.pid 37 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["es2015", { "modules": false }], 4 | ["env", { 5 | "modules": false, 6 | "targets": { 7 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 8 | } 9 | }], 10 | "stage-2" 11 | ], 12 | "plugins": ["transform-vue-jsx", "transform-runtime", 13 | ["import", { 14 | "libraryName": "iview", 15 | "libraryDirectory": "src/components" 16 | } 17 | ], 18 | [ 19 | "component", 20 | { 21 | "libraryName": "element-ui", 22 | "styleLibraryName": "theme-chalk" 23 | } 24 | ] 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Editor directories and files 9 | .idea 10 | .vscode 11 | *.suo 12 | *.ntvs* 13 | *.njsproj 14 | *.sln 15 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/README.md: -------------------------------------------------------------------------------- 1 | ### wxw-manage-web 2 | 3 | --- 4 | 5 | vueelement-uidonate 6 | 7 | 基于 Vue + Element UI 的农货交易管理后台。[线上地址](https://blog.wxw.plus/wxw-manage-web/#/) 8 | 9 | 10 | # 项目构建 11 | 12 | > A Vue.js project 13 | 14 | ## Build Setup 15 | 16 | ``` bash 17 | # install dependencies 18 | npm install 19 | 20 | # serve with hot reload at localhost:8080 21 | npm run dev 22 | 23 | # build for production with minification 24 | npm run build 25 | 26 | # build for production and view the bundle analyzer report 27 | npm run build --report 28 | ``` 29 | 30 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). 31 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.prod.conf') 13 | 14 | const spinner = ora('building for production...') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, (err, stats) => { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/build/check-versions.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const chalk = require('chalk') 3 | const semver = require('semver') 4 | const packageConfig = require('../package.json') 5 | const shell = require('shelljs') 6 | 7 | function exec (cmd) { 8 | return require('child_process').execSync(cmd).toString().trim() 9 | } 10 | 11 | const versionRequirements = [ 12 | { 13 | name: 'node', 14 | currentVersion: semver.clean(process.version), 15 | versionRequirement: packageConfig.engines.node 16 | } 17 | ] 18 | 19 | if (shell.which('npm')) { 20 | versionRequirements.push({ 21 | name: 'npm', 22 | currentVersion: exec('npm --version'), 23 | versionRequirement: packageConfig.engines.npm 24 | }) 25 | } 26 | 27 | module.exports = function () { 28 | const warnings = [] 29 | 30 | for (let i = 0; i < versionRequirements.length; i++) { 31 | const mod = versionRequirements[i] 32 | 33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 34 | warnings.push(mod.name + ': ' + 35 | chalk.red(mod.currentVersion) + ' should be ' + 36 | chalk.green(mod.versionRequirement) 37 | ) 38 | } 39 | } 40 | 41 | if (warnings.length) { 42 | console.log('') 43 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 44 | console.log() 45 | 46 | for (let i = 0; i < warnings.length; i++) { 47 | const warning = warnings[i] 48 | console.log(' ' + warning) 49 | } 50 | 51 | console.log() 52 | process.exit(1) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/wxw-manage-web/build/logo.png -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | module.exports = { 10 | loaders: utils.cssLoaders({ 11 | sourceMap: sourceMapEnabled, 12 | extract: isProduction 13 | }), 14 | cssSourceMap: sourceMapEnabled, 15 | cacheBusting: config.dev.cacheBusting, 16 | transformToRequire: { 17 | video: ['src', 'poster'], 18 | source: 'src', 19 | img: 'src', 20 | image: 'xlink:href' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/deploy.sh: -------------------------------------------------------------------------------- 1 | ### 2 | # @Descripttion: 3 | # @version: V 1.0 4 | # @Author: wxw 5 | # @Date: 2020-08-23 18:12:31 6 | ### 7 | #!/usr/bin/env sh 8 | 9 | # 当发生错误时中止脚本 10 | set -e 11 | 12 | # 构建 13 | npm run build 14 | 15 | # cd 到构建输出的目录下 16 | cd dist 17 | 18 | # 部署到自定义域域名 19 | #echo 'blog.wxw.plus' > CNAME 20 | 21 | git init 22 | git add -A 23 | git commit -m 'deploy' 24 | 25 | # 部署到 https://.github.io 26 | # git push -f git@github.com:/.github.io.git master 27 | 28 | # 部署到 https://.github.io/ 29 | git push -f git@github.com:GitHubWxw/wxw-manage-web.git master:gh-pages 30 | 31 | cd - 32 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/wxw-manage-web/favicon.ico -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | manage.wxw.com 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/.gitrepo: -------------------------------------------------------------------------------- 1 | ; DO NOT EDIT (unless you know what you are doing) 2 | ; 3 | ; This subdirectory is a git "subrepo", and this file is maintained by the 4 | ; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme 5 | ; 6 | [subrepo] 7 | remote = https://github.com/vuetifyjs/templates-common.git 8 | branch = subrepo/webpack-src 9 | commit = 090741fa8ba4da0c6f85db64eff64550704123e1 10 | parent = e05204fc0583a8c99f1963ce873eba1266838215 11 | method = merge 12 | cmdver = 0.4.0 13 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/assets/1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/wxw-manage-web/src/assets/1.jpeg -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/assets/2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/wxw-manage-web/src/assets/2.jpeg -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/assets/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/wxw-manage-web/src/assets/4.jpg -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/assets/KFOlCnqEu92Fr1MmEU9fBBc4.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/wxw-manage-web/src/assets/KFOlCnqEu92Fr1MmEU9fBBc4.woff2 -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/assets/baby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/wxw-manage-web/src/assets/baby.png -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/wxw-manage-web/src/assets/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/assets/img/mbg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/wxw-manage-web/src/assets/img/mbg.gif -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-doc-front/wxw-manage-web/src/assets/logo.png -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/components/messages/index.js: -------------------------------------------------------------------------------- 1 | import {Message, MessageBox} from 'element-ui'; 2 | 3 | const m = { 4 | info(msg) { 5 | Message({ 6 | showClose: true, 7 | message: msg, 8 | type: 'info' 9 | }); 10 | }, 11 | error(msg) { 12 | Message({ 13 | showClose: true, 14 | message: msg, 15 | type: 'error' 16 | }); 17 | }, 18 | success(msg) { 19 | Message({ 20 | showClose: true, 21 | message: msg, 22 | type: 'success' 23 | }); 24 | }, 25 | warning(msg) { 26 | Message({ 27 | showClose: true, 28 | message: msg, 29 | type: 'warning' 30 | }); 31 | }, 32 | confirm(msg) { 33 | return new Promise((resolve, reject) => { 34 | MessageBox.confirm(msg, '提示', { 35 | confirmButtonText: '确定', 36 | cancelButtonText: '取消', 37 | type: 'warning' 38 | }).then(() => { 39 | resolve() 40 | }) 41 | .catch(() => { 42 | reject() 43 | }); 44 | }) 45 | }, 46 | prompt(msg) { 47 | return new Promise((resolve, reject) => { 48 | MessageBox.prompt(msg, '提示', { 49 | confirmButtonText: '确定', 50 | cancelButtonText: '取消' 51 | }).then(({value}) => { 52 | resolve(value) 53 | }).catch(() => { 54 | reject() 55 | }); 56 | }) 57 | } 58 | } 59 | 60 | export default m; 61 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/http.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 3 | * @version: V 1.0 4 | * @Author: wxw 5 | * @Date: 2020-03-27 19:30:32 6 | */ 7 | import Vue from 'vue' 8 | import axios from 'axios' 9 | import config from './config' 10 | 11 | axios.defaults.withCredentials=true;//让ajax携带cookie 12 | axios.defaults.baseURL = config.api; // 设置axios的基础请求路径 13 | axios.defaults.timeout = 20000; // 设置axios的请求时间 14 | 15 | axios.interceptors.request.use(function (config) { 16 | let BS_TOKEN = window.localStorage.getItem("BS_TOKEN") 17 | if(BS_TOKEN){ 18 | config.headers.BS_TOKEN=BS_TOKEN; 19 | } 20 | return config; 21 | }) 22 | 23 | // get请求 24 | axios.loadData = async function (url) { 25 | const resp = await axios.get(url); 26 | return resp.data; 27 | } 28 | 29 | // post请求 不用 30 | Vue.prototype.$http = axios;// 将axios添加到 Vue的原型,这样一切vue实例都可以使用该对象 31 | 32 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 3 | * @version: V 1.0 4 | * @Author: wxw 5 | * @Date: 2020-03-27 19:30:32 6 | */ 7 | // The Vue build version to load with the `import` command 8 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 9 | import Vue from 'vue' 10 | import App from './App' 11 | import router from './router' 12 | import Vuetify from 'vuetify' 13 | import config from './config' 14 | import MyComponent from './components/MyComponent' 15 | import './http'; 16 | import 'vuetify/dist/vuetify.min.css' 17 | import qs from 'qs' 18 | import 'element-ui/lib/theme-chalk/index.css'; 19 | import './assets/material.css' 20 | // 引入部分工具 21 | import { Button, Tabs,TabPane,TableColumn,Table } from 'element-ui'; 22 | Vue.use(Button); 23 | Vue.use(Tabs); 24 | Vue.use(TabPane); 25 | Vue.use(TableColumn); 26 | Vue.use(Table); 27 | // 使用Vuetify 28 | Vue.use(Vuetify, { theme: config.theme}) 29 | Vue.use(MyComponent) 30 | Vue.prototype.$qs = qs; 31 | 32 | Vue.config.productionTip = false 33 | 34 | /* eslint-disable no-new */ 35 | new Vue({ 36 | el: '#app', 37 | router, 38 | components: { App }, 39 | template: '' 40 | }) 41 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/menu.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 3 | * @version: V 1.0 4 | * @Author: wxw 5 | * @Date: 2020-03-27 19:30:32 6 | */ 7 | var menus = [ 8 | { 9 | action: "home", 10 | title: "首页", 11 | path:"/index", 12 | items: [{ title: "最近消息", path: "/dashboard" }] 13 | }, 14 | { 15 | action: "apps", 16 | title: "商品管理", 17 | path:"/item", 18 | items: [ 19 | { title: "分类管理", path: "/category" }, 20 | { title: "品牌管理", path: "/brand" }, 21 | { title: "商品列表", path: "/list" }, 22 | { title: "规格参数", path: "/specification" } 23 | ] 24 | }, 25 | { 26 | action: "people", 27 | title: "用户管理", 28 | path:"/user", 29 | items: [ 30 | { title: "用户统计", path: "/userlist" }, 31 | { title: "用户数据", path: "/user" } 32 | ] 33 | }, 34 | { 35 | action: "attach_money", 36 | title: "销售管理", 37 | path:"/trade", 38 | items: [ 39 | { title: "仓库管理", path: "/stock" }, 40 | { title: "订单管理", path: "/order" }, 41 | { title: "物流管理", path: "/logistics" } 42 | // { title: "促销管理", path: "/promotion" } 43 | ] 44 | }, 45 | { 46 | action: "settings", 47 | title: "系统管理", 48 | path:"/system", 49 | items: [ 50 | { title: "退出系统", path: "/loginOut" }, 51 | { title: "管理员", path: "/admin" } 52 | ] 53 | } 54 | ] 55 | 56 | export default menus; 57 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/pages/system/Admin.vue: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/pages/system/LoginOut.vue: -------------------------------------------------------------------------------- 1 | 7 | 27 | 28 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/pages/trade/Promotion.vue: -------------------------------------------------------------------------------- 1 | 7 | 13 | 14 | 19 | 20 | 23 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/pages/trade/Stock.vue: -------------------------------------------------------------------------------- 1 | 7 | 21 | 56 | 59 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/pages/user/User.vue: -------------------------------------------------------------------------------- 1 | 7 | 22 | 23 | 60 | 61 | 64 | -------------------------------------------------------------------------------- /cloud-doc-front/wxw-manage-web/src/router/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Descripttion: 3 | * @version: V 1.0 4 | * @Author: wxw 5 | * @Date: 2020-03-27 19:30:33 6 | */ 7 | import Vue from 'vue'; 8 | import Router from 'vue-router'; 9 | 10 | Vue.use(Router); 11 | 12 | function route(path, file, name, children) { 13 | return { 14 | exact: true, 15 | path, 16 | name, 17 | children, 18 | component: () => import('../pages' + file) 19 | }; 20 | } 21 | 22 | export default new Router({ 23 | routes: [ 24 | route('/', '/Login', 'Login'), // /login路径,路由到登录组件 25 | { 26 | path: '/success', // 根路径,路由到 Layout组件 27 | component: () => import('../pages/Layout'), 28 | redirect: '/index/dashboard', 29 | 30 | children: [ 31 | // 其它所有组件都是 Layout的子组件 32 | //相当于route("path","component",Name,[可以有子路由]) 33 | route('/index/dashboard', '/Dashboard', 'Dashboard'), 34 | route('/item/category', '/item/Category', 'Category'), 35 | route('/item/brand', '/item/Brand', 'Brand'), 36 | route('/item/list', '/item/Goods', 'Goods'), 37 | route( 38 | '/item/specification', 39 | '/item/specification/Specification', 40 | 'Specification' 41 | ), 42 | // 用户管理 43 | route('/user/user', '/user/User', 'User'), 44 | route('/user/userlist', '/user/UserList', 'UserList'), 45 | // 销售管理 46 | route('/trade/promotion', '/trade/Promotion', 'Promotion'), 47 | route('/trade/order', '/trade/Order', 'Order'), 48 | route('/trade/logistics', '/trade/Logistics', 'Logistics'), 49 | route('/trade/stock', '/trade/Stock', 'Stock'), 50 | //系统管理 51 | route('/system/loginOut', '/system/LoginOut', 'LoginOut'), 52 | route('/system/admin', '/system/Admin', 'Admin'), 53 | ] 54 | } 55 | ] 56 | }); 57 | -------------------------------------------------------------------------------- /cloud-gateway-server/src/main/java/com/wxw/cloud/GatewayMain10010.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 6 | 7 | /** 8 | * @Author: wxw 9 | * @create: 2020-03-26-22:26 10 | */ 11 | @EnableEurekaClient 12 | @SpringBootApplication 13 | public class GatewayMain10010 { 14 | public static void main(String[] args) { 15 | SpringApplication.run(GatewayMain10010.class, args); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /cloud-gateway-server/src/main/java/com/wxw/cloud/config/CorsConfig.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.stereotype.Component; 6 | import org.springframework.web.cors.CorsConfiguration; 7 | import org.springframework.web.cors.reactive.CorsWebFilter; 8 | import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; 9 | 10 | 11 | /** 12 | * @Author: wxw 13 | * @create: 2020-03-28-1:55 14 | * gateway跨域配置 15 | */ 16 | @Component 17 | @Configuration 18 | public class CorsConfig { 19 | 20 | @Bean 21 | public CorsWebFilter corsFilter() { 22 | //1.添加CORS配置信息 23 | CorsConfiguration config = new CorsConfiguration(); 24 | //1) 允许的域,不要写*,否则cookie就无法使用了 25 | config.addAllowedOrigin("http://manage.wxw.com"); 26 | config.addAllowedOrigin("http://www.wxw.com"); 27 | config.addAllowedOrigin("http://wxw.com"); 28 | //2) 是否发送Cookie信息 29 | config.setAllowCredentials(true); 30 | //3) 允许的请求方式 OPTIONS/HEAD/GET/PUT/POST/DELETE/PATCH 31 | config.addAllowedMethod("*"); 32 | // 4)允许的头信息 33 | config.addAllowedHeader("*"); 34 | 35 | //2.添加映射路径,我们拦截一切请求 36 | UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); 37 | configSource.registerCorsConfiguration("/**", config); 38 | 39 | //3.返回新的CorsWebFilter 40 | return new CorsWebFilter(configSource); 41 | } 42 | } -------------------------------------------------------------------------------- /cloud-gateway-server/src/main/java/com/wxw/cloud/config/FilterProperties.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @Author: wxw 11 | * @create: 2020-04-20-18:43 12 | */ 13 | @Getter 14 | @Setter 15 | @ConfigurationProperties(prefix = "wxw.filter") 16 | public class FilterProperties { 17 | 18 | private List allowPaths; 19 | } 20 | -------------------------------------------------------------------------------- /cloud-gateway-server/src/main/java/com/wxw/cloud/config/JwtProperties.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import com.wxw.cloud.tools.RsaUtils; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | import org.springframework.boot.context.properties.ConfigurationProperties; 9 | 10 | import javax.annotation.PostConstruct; 11 | import java.io.File; 12 | import java.security.PrivateKey; 13 | import java.security.PublicKey; 14 | 15 | /** 16 | * @Author: wxw 17 | * @create: 2020-04-19-0:02 18 | */ 19 | @ConfigurationProperties(prefix = "wxw.jwt") 20 | @Getter 21 | @Setter 22 | public class JwtProperties { 23 | private String pubKeyPath;// 公钥 24 | 25 | private PublicKey publicKey; // 公钥 26 | 27 | private String cookieName; 28 | 29 | private static final Logger logger = LoggerFactory.getLogger(JwtProperties.class); 30 | 31 | /** 32 | * @PostContruct:在构造方法执行之后执行该方法 33 | */ 34 | @PostConstruct 35 | public void init() { 36 | try { 37 | // 获取公钥和私钥 38 | this.publicKey = RsaUtils.getPublicKey(pubKeyPath); 39 | } catch (Exception e) { 40 | logger.error("初始化公钥和私钥失败!", e); 41 | throw new RuntimeException(); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /cloud-registry-server/src/main/java/com/wxw/cloud/RegistryMain10086.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; 6 | 7 | /** 8 | * @Author: wxw 9 | * @create: 2020-03-26-22:06 10 | */ 11 | @EnableEurekaServer 12 | @SpringBootApplication 13 | public class RegistryMain10086 { 14 | public static void main(String[] args) { 15 | SpringApplication.run(RegistryMain10086.class, args); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /cloud-registry-server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | #端口号 2 | server: 3 | port: 10086 4 | #服务名称 5 | spring: 6 | application: 7 | name: cloud-registry-server 8 | #单个eureka的情况 9 | eureka: 10 | client: 11 | fetch-registry: false #需要拉取服务 12 | register-with-eureka: false #需要在eureka中注册自己 13 | service-url: 14 | defaultZone: http://bs.wxw.com:10086/eureka 15 | registry-fetch-interval-seconds: 5 # 拉取服务的间隔时间 -------------------------------------------------------------------------------- /cloud-server-auth/cloud-auth-common/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | cloud-server-auth 7 | com.wxw.auth 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | com.wxw.auth 13 | cloud-auth-common 14 | 1.0-SNAPSHOT 15 | 16 | 17 | org.apache.commons 18 | commons-lang3 19 | 20 | 21 | io.jsonwebtoken 22 | jjwt 23 | 0.9.1 24 | 25 | 26 | joda-time 27 | joda-time 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /cloud-server-auth/cloud-auth-common/src/main/java/com/wxw/cloud/domain/UserInfo.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | public class UserInfo { 4 | 5 | private Long id; 6 | 7 | private String username; 8 | 9 | public UserInfo() { 10 | } 11 | 12 | public UserInfo(Long id, String username) { 13 | this.id = id; 14 | this.username = username; 15 | } 16 | 17 | public Long getId() { 18 | return this.id; 19 | } 20 | 21 | public void setId(Long id) { 22 | this.id = id; 23 | } 24 | 25 | public String getUsername() { 26 | return username; 27 | } 28 | 29 | public void setUsername(String username) { 30 | this.username = username; 31 | } 32 | } -------------------------------------------------------------------------------- /cloud-server-auth/cloud-auth-common/src/main/java/com/wxw/cloud/tools/JwtConstans.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.tools; 2 | 3 | public abstract class JwtConstans { 4 | public static final String JWT_KEY_ID = "id"; 5 | public static final String JWT_KEY_USER_NAME = "username"; 6 | } -------------------------------------------------------------------------------- /cloud-server-auth/cloud-auth-common/src/main/java/com/wxw/cloud/tools/ObjectUtils.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.tools; 2 | 3 | import org.apache.commons.lang3.StringUtils; 4 | 5 | public class ObjectUtils { 6 | 7 | public static String toString(Object obj) { 8 | if (obj == null) { 9 | return null; 10 | } 11 | return obj.toString(); 12 | } 13 | 14 | public static Long toLong(Object obj) { 15 | if (obj == null) { 16 | return 0L; 17 | } 18 | if (obj instanceof Double || obj instanceof Float) { 19 | return Long.valueOf(StringUtils.substringBefore(obj.toString(), ".")); 20 | } 21 | if (obj instanceof Number) { 22 | return Long.valueOf(obj.toString()); 23 | } 24 | if (obj instanceof String) { 25 | return Long.valueOf(obj.toString()); 26 | } else { 27 | return 0L; 28 | } 29 | } 30 | 31 | public static Integer toInt(Object obj) { 32 | return toLong(obj).intValue(); 33 | } 34 | } -------------------------------------------------------------------------------- /cloud-server-auth/cloud-auth-service/src/main/java/com/wxw/cloud/AuthMain8087.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import org.apache.tomcat.util.http.LegacyCookieProcessor; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 7 | import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; 8 | import org.springframework.boot.web.server.WebServerFactoryCustomizer; 9 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 10 | import org.springframework.cloud.openfeign.EnableFeignClients; 11 | import org.springframework.context.annotation.Bean; 12 | 13 | /** 14 | * @Author: wxw 15 | * @create: 2020-04-18-23:15 16 | */ 17 | @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}) // 排除启动默认数据源 18 | @EnableDiscoveryClient 19 | @EnableFeignClients 20 | public class AuthMain8087 { 21 | public static void main(String[] args) { 22 | SpringApplication.run(AuthMain8087.class, args); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /cloud-server-auth/cloud-auth-service/src/main/java/com/wxw/cloud/config/EmbeddedTomcatConfig.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import org.apache.catalina.Context; 4 | import org.apache.tomcat.util.http.LegacyCookieProcessor; 5 | import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer; 6 | import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; 7 | import org.springframework.boot.web.server.WebServerFactory; 8 | import org.springframework.boot.web.server.WebServerFactoryCustomizer; 9 | import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; 10 | import org.springframework.stereotype.Component; 11 | 12 | /** 13 | * 解决切入式tomcat限制cookie的问题 14 | * @Author: wxw 15 | * @create: 2020-04-19-13:47 16 | */ 17 | @Component 18 | public class EmbeddedTomcatConfig implements WebServerFactoryCustomizer { 19 | @Override 20 | public void customize(WebServerFactory factory) { 21 | ((TomcatServletWebServerFactory)factory).addContextCustomizers(new TomcatContextCustomizer() { 22 | @Override 23 | public void customize(Context context) { 24 | context.setCookieProcessor(new LegacyCookieProcessor()); 25 | } 26 | }); 27 | } 28 | } -------------------------------------------------------------------------------- /cloud-server-auth/cloud-auth-service/src/main/java/com/wxw/cloud/rpc/UserRpc.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.rpc; 2 | 3 | import com.wxw.cloud.client.UserClient; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | 6 | /** 7 | * @Author: wxw 8 | * @create: 2020-04-19-12:46 9 | */ 10 | @FeignClient("cloud-user-service") 11 | public interface UserRpc extends UserClient { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cloud-server-auth/cloud-auth-service/src/main/java/com/wxw/cloud/service/AuthService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.wxw.cloud.config.JwtProperties; 4 | import com.wxw.cloud.domain.User; 5 | import com.wxw.cloud.domain.UserInfo; 6 | import com.wxw.cloud.rpc.UserRpc; 7 | import com.wxw.cloud.tools.JwtUtils; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.springframework.stereotype.Service; 10 | 11 | import javax.annotation.Resource; 12 | 13 | /** 14 | * @Author: wxw 15 | * @create: 2020-04-19-0:18 16 | */ 17 | @Slf4j 18 | @Service 19 | public class AuthService { 20 | 21 | @Resource 22 | private UserRpc userRpc; 23 | 24 | @Resource 25 | private JwtProperties jwtProperties; 26 | 27 | public String accredit(String username, String passward) { 28 | // 1.根据用户名和密码查询 29 | User user = this.userRpc.volidCode(username, passward); 30 | // 2.判断user 31 | if (user == null){ 32 | return null; 33 | } 34 | try { 35 | // 3. JwtUtils生成Jwt类型的token 36 | UserInfo userInfo = new UserInfo(); 37 | userInfo.setId(user.getId()); 38 | userInfo.setUsername(user.getUsername()); 39 | return JwtUtils.generateToken(userInfo,this.jwtProperties.getPrivateKey(),this.jwtProperties.getExpire()*60); 40 | } catch (Exception e) { 41 | log.info("鉴权中心生成token时发生异常:{}", e); 42 | } 43 | return null; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /cloud-server-auth/cloud-auth-service/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8087 3 | servlet: 4 | session: 5 | cookie: 6 | secure: false 7 | http-only: false 8 | spring: 9 | application: 10 | name: cloud-auth-service 11 | # 允许 feginclient重复 12 | main: 13 | allow-bean-definition-overriding: true 14 | eureka: 15 | client: 16 | service-url: 17 | defaultZone: http://bs.wxw.com:10086/eureka 18 | registry-fetch-interval-seconds: 30 19 | instance: 20 | #避免显示主机名 21 | instance-id: cloud-auth-service 22 | #显示IP地址 23 | prefer-ip-address: true 24 | #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30秒) 25 | lease-renewal-interval-in-seconds: 30 26 | #Eureka服务端在收到最后一次心跳后等待时间上线,单位为秒(默认为90秒),超时将剔除服务 27 | lease-expiration-duration-in-seconds: 90 28 | 29 | wxw: 30 | jwt: 31 | secret: wxw@Login(Auth}*^31)&BS2020% # 登录校验的密钥 32 | pubKeyPath: F:\Study_GO\BS2020\rsa\rsa.pub # 公钥地址 33 | priKeyPath: F:\Study_GO\BS2020\rsa\rsa.pri # 私钥地址 34 | expire: 50 # 过期时间,单位分钟 35 | cookieName: BS_TOKEN -------------------------------------------------------------------------------- /cloud-server-auth/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | bs-cloud 7 | com.wxw 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | com.wxw.auth 13 | cloud-server-auth 14 | 1.0-SNAPSHOT 15 | 16 | cloud-auth-common 17 | cloud-auth-service 18 | 19 | pom 20 | -------------------------------------------------------------------------------- /cloud-server-cart/src/main/java/com/wxw/cloud/CartMain8088.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 6 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 7 | import org.springframework.cloud.openfeign.EnableFeignClients; 8 | 9 | /** 10 | * @Author: wxw 11 | * @create: 2020-04-23-0:20 12 | */ 13 | @EnableFeignClients 14 | @EnableDiscoveryClient 15 | @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}) // 排除启动默认数据源 16 | public class CartMain8088 { 17 | public static void main(String[] args) { 18 | SpringApplication.run(CartMain8088.class, args); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /cloud-server-cart/src/main/java/com/wxw/cloud/config/JwtProperties.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import com.wxw.cloud.tools.RsaUtils; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | import org.springframework.boot.context.properties.ConfigurationProperties; 9 | 10 | import javax.annotation.PostConstruct; 11 | import java.security.PublicKey; 12 | 13 | /** 14 | * @Author: wxw 15 | * @create: 2020-04-19-0:02 16 | */ 17 | @ConfigurationProperties(prefix = "wxw.jwt") 18 | @Getter 19 | @Setter 20 | public class JwtProperties { 21 | private String pubKeyPath;// 公钥 22 | 23 | private PublicKey publicKey; // 公钥 24 | 25 | private String cookieName; 26 | 27 | private static final Logger logger = LoggerFactory.getLogger(JwtProperties.class); 28 | 29 | /** 30 | * @PostContruct:在构造方法执行之后执行该方法 31 | */ 32 | @PostConstruct 33 | public void init() { 34 | try { 35 | // 获取公钥和私钥 36 | this.publicKey = RsaUtils.getPublicKey(pubKeyPath); 37 | } catch (Exception e) { 38 | logger.error("初始化公钥和私钥失败!", e); 39 | throw new RuntimeException(); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /cloud-server-cart/src/main/java/com/wxw/cloud/config/Swagger2Config.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import springfox.documentation.builders.ApiInfoBuilder; 6 | import springfox.documentation.builders.PathSelectors; 7 | import springfox.documentation.builders.RequestHandlerSelectors; 8 | import springfox.documentation.service.ApiInfo; 9 | import springfox.documentation.spi.DocumentationType; 10 | import springfox.documentation.spring.web.plugins.Docket; 11 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 12 | 13 | /* 14 | * @Author: wxw 15 | * @create: 2020-03-15-0:24 16 | * Swagger2API文档的配置 17 | * bs.wxw.com:8082/swagger-ui.html 18 | */ 19 | 20 | @Configuration 21 | @EnableSwagger2 22 | public class Swagger2Config { 23 | 24 | private static final String somePath = "com.wxw.cloud.controller"; 25 | /** 26 | * 创建API应用 27 | * api() 增加API相关信息 28 | * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现, 29 | * 本例采用指定扫描的包路径来定义指定要建立API的目录。 30 | * @return 31 | */ 32 | @Bean 33 | public Docket createRstApi(){ 34 | return new Docket(DocumentationType.SWAGGER_2) 35 | .apiInfo(apiInfo()) 36 | .select() 37 | .apis(RequestHandlerSelectors.basePackage(somePath)) 38 | .paths(PathSelectors.any()) 39 | .build(); 40 | } 41 | 42 | // 构建 api文档的详细信息函数 43 | private ApiInfo apiInfo() { 44 | return new ApiInfoBuilder() 45 | .title("微服务接口API在线文档") 46 | .description("Welcome in http://bs.wxw.com:8088/swagger-ui.html") 47 | .contact("购物车微服务") 48 | .version("2.0") 49 | .build(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /cloud-server-cart/src/main/java/com/wxw/cloud/config/WebConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import com.wxw.cloud.interceptor.LoginInterceptor; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 6 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 7 | 8 | import javax.annotation.Resource; 9 | 10 | /** 11 | * @Author: wxw 12 | * @create: 2020-04-23-1:14 13 | * Spring MVC 注解配置 14 | */ 15 | @Configuration 16 | public class WebConfiguration implements WebMvcConfigurer { 17 | 18 | @Resource 19 | private LoginInterceptor loginInterceptor; 20 | 21 | /** 22 | * 定义拦截器 23 | * @param registry 24 | */ 25 | @Override 26 | public void addInterceptors(InterceptorRegistry registry) { 27 | registry.addInterceptor(loginInterceptor).addPathPatterns("/**"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /cloud-server-cart/src/main/java/com/wxw/cloud/domain/Cart.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import lombok.Data; 4 | 5 | /* 6 | * @ClassName Cart 7 | * @Author 魏小伟 8 | * @Description 9 | * @Date 2020/4/23 14:52 10 | **/ 11 | @Data 12 | public class Cart { 13 | private Long userId;// 用户id 14 | private Long skuId;// 商品id 15 | private String title;// 标题 16 | private String image;// 图片 17 | private Long price;// 加入购物车时的价格 18 | private Integer num;// 购买数量 19 | private String ownSpec;// 商品规格参数 20 | } 21 | -------------------------------------------------------------------------------- /cloud-server-cart/src/main/java/com/wxw/cloud/rpc/GoodsRpc.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.rpc; 2 | 3 | import com.wxw.cloud.api.GoodsAPI; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | 6 | @FeignClient("cloud-bs-service") 7 | public interface GoodsRpc extends GoodsAPI { 8 | } 9 | -------------------------------------------------------------------------------- /cloud-server-cart/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8088 3 | spring: 4 | application: 5 | name: cloud-server-cart 6 | redis: 7 | host: wxw.plus 8 | eureka: 9 | client: 10 | service-url: 11 | defaultZone: http://bs.wxw.com:10086/eureka 12 | registry-fetch-interval-seconds: 30 13 | instance: 14 | #避免显示主机名 15 | instance-id: cloud-server-cart 16 | #显示IP地址 17 | prefer-ip-address: true 18 | #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30秒) 19 | lease-renewal-interval-in-seconds: 30 20 | #Eureka服务端在收到最后一次心跳后等待时间上线,单位为秒(默认为90秒),超时将剔除服务 21 | lease-expiration-duration-in-seconds: 90 22 | wxw: 23 | jwt: 24 | pubKeyPath: F:\Study_GO\BS2020\rsa\rsa.pub # 公钥地址 25 | cookieName: BS_TOKEN -------------------------------------------------------------------------------- /cloud-server-common/src/main/java/com/wxw/cloud/result/PageResult.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.result; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | import java.util.List; 7 | 8 | /** 9 | * @Author: wxw 10 | * @create: 2020-03-29-22:44 11 | * 添加分页结果集 12 | */ 13 | @Data 14 | public class PageResult implements Serializable { 15 | 16 | private static final long serialVersionUID = 4304677954417910784L; 17 | // 总条数 18 | private Long total; 19 | // 总页数 20 | private Long totalPage; 21 | // 当前页数据 22 | private List items; 23 | 24 | public PageResult(Long total, List items) { 25 | this.total = total; 26 | this.items = items; 27 | } 28 | 29 | public PageResult(Long total, Long totalPage, List items) { 30 | this.total = total; 31 | this.totalPage = totalPage; 32 | this.items = items; 33 | } 34 | 35 | public PageResult() { 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /cloud-server-common/src/main/java/com/wxw/cloud/result/Result.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.result; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * @Author: wxw 11 | * @create: 2020-03-19-17:47 12 | * 封装返回数据 13 | */ 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class Result implements Serializable { 18 | 19 | private static final long serialVersionUID = -5699534038153137080L; 20 | private boolean success = false; 21 | private Integer code = -1; 22 | private String message; 23 | private T data; 24 | 25 | /** 26 | * 判断是否成功 27 | */ 28 | public boolean isSuccess(){ 29 | return this.success; 30 | } 31 | 32 | /** 33 | * 返回两个参数的构造方法 34 | */ 35 | public Result(Integer code,String message){ 36 | this(false,code,message,null); 37 | } 38 | 39 | // 成功的时候调用 40 | public Result success(T data, String message){ 41 | return new Result(true,0,message,data); 42 | } 43 | // 成功不需要传入参时 44 | public Result success(){ 45 | return new Result(true,0,"成功",null); 46 | } 47 | 48 | // 失败的时候调用 49 | public Result fail(T data, String message){ 50 | return new Result(false,-1,message,data); 51 | } 52 | 53 | public Result fail(String message){ 54 | return new Result(false,-1,message,null); 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /cloud-server-common/src/main/java/com/wxw/cloud/tools/DateUtils.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.tools; 2 | 3 | import java.time.Instant; 4 | import java.time.LocalDate; 5 | import java.time.LocalDateTime; 6 | import java.time.ZoneId; 7 | import java.util.Date; 8 | 9 | /** 10 | * @Author: wxw 11 | * @create: 2020-04-15-19:35 12 | */ 13 | public class DateUtils { 14 | 15 | /** 16 | * localDate 2 Date 17 | * @param localDate 18 | * @return 19 | */ 20 | public static Date localDate2Date(LocalDate localDate) { 21 | return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); 22 | } 23 | 24 | /** 25 | * localDateTime 26 | * @param localDateTime 27 | * @return 28 | */ 29 | public static Date localDateTime2Date(LocalDateTime localDateTime) { 30 | return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); 31 | } 32 | 33 | /** 34 | * date2LocalDate 35 | * @param date 36 | * @return 37 | */ 38 | public static LocalDate date2LocalDate(Date date) { 39 | return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); 40 | } 41 | 42 | /** 43 | * date2LocalDateTime 44 | * @param date 45 | * @return 46 | */ 47 | public static LocalDateTime date2LocalDateTime(Date date) { 48 | return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /cloud-server-common/target/maven-archiver/pom.properties: -------------------------------------------------------------------------------- 1 | #Generated by Maven 2 | #Sat Mar 21 00:21:38 CST 2020 3 | version=1.0-SNAPSHOT 4 | groupId=com.wxw 5 | artifactId=cloud-server-common 6 | -------------------------------------------------------------------------------- /cloud-server-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-server-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst -------------------------------------------------------------------------------- /cloud-server-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst: -------------------------------------------------------------------------------- 1 | F:\idea_doc\springcloud2020\cloud-server-common\src\main\java\com\wxw\cloud\result\Result.java 2 | -------------------------------------------------------------------------------- /cloud-server-common/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iswxw/bs-cloud/ea6fd8f318871a3dc89474569d5180f1b8c76a62/cloud-server-common/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst -------------------------------------------------------------------------------- /cloud-server-fileload/src/main/java/com/wxw/cloud/FileLoadMiain8082.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 6 | 7 | /** 8 | * @Author: wxw 9 | * @create: 2020-03-31-16:26 10 | */ 11 | @EnableEurekaClient 12 | @SpringBootApplication 13 | public class FileLoadMiain8082 { 14 | public static void main(String[] args) { 15 | SpringApplication.run(FileLoadMiain8082.class, args); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /cloud-server-fileload/src/main/java/com/wxw/cloud/config/CorsConfig.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.stereotype.Component; 6 | import org.springframework.web.cors.CorsConfiguration; 7 | import org.springframework.web.cors.UrlBasedCorsConfigurationSource; 8 | import org.springframework.web.filter.CorsFilter; 9 | 10 | 11 | /** 12 | * @Author: wxw 13 | * @create: 2020-03-28-1:55 14 | * SpringMVC 跨域配置 15 | */ 16 | @Component 17 | @Configuration 18 | public class CorsConfig { 19 | 20 | @Bean 21 | public CorsFilter corsFilter() { 22 | //1.添加CORS配置信息 23 | CorsConfiguration config = new CorsConfiguration(); 24 | //1) 允许的域,不要写*,否则cookie就无法使用了 25 | config.addAllowedOrigin("http://manage.wxw.com"); 26 | config.addAllowedOrigin("http://www.wxw.com"); 27 | config.addAllowedOrigin("http://wxw.com"); 28 | //2) 是否发送Cookie信息 29 | config.setAllowCredentials(true); 30 | //3) 允许的请求方式 OPTIONS/HEAD/GET/PUT/POST/DELETE/PATCH 31 | config.addAllowedMethod("*"); 32 | // 4)允许的头信息 33 | config.addAllowedHeader("*"); 34 | 35 | //2.添加映射路径,我们拦截一切请求 36 | UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); 37 | configSource.registerCorsConfiguration("/**", config); 38 | 39 | //3.返回新的CorsFilter 40 | return new CorsFilter(configSource); 41 | } 42 | } -------------------------------------------------------------------------------- /cloud-server-fileload/src/main/java/com/wxw/cloud/config/FastDfsClientConfig.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import com.github.tobato.fastdfs.FdfsClientConfig; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.context.annotation.EnableMBeanExport; 6 | import org.springframework.context.annotation.Import; 7 | import org.springframework.jmx.support.RegistrationPolicy; 8 | 9 | /** 10 | * @Author: wxw 11 | * @create: 2020-04-01-0:00 12 | * FastDFS 客户端 13 | */ 14 | @Configuration 15 | @Import(FdfsClientConfig.class) 16 | // 解决jmx重复注册bean的问题 17 | @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) 18 | public class FastDfsClientConfig { 19 | } 20 | -------------------------------------------------------------------------------- /cloud-server-fileload/src/main/java/com/wxw/cloud/config/Swagger2Config.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import springfox.documentation.builders.ApiInfoBuilder; 6 | import springfox.documentation.builders.PathSelectors; 7 | import springfox.documentation.builders.RequestHandlerSelectors; 8 | import springfox.documentation.service.ApiInfo; 9 | import springfox.documentation.spi.DocumentationType; 10 | import springfox.documentation.spring.web.plugins.Docket; 11 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 12 | 13 | /* 14 | * @Author: wxw 15 | * @create: 2020-03-15-0:24 16 | * Swagger2API文档的配置 17 | * bs.wxw.com:8082/swagger-ui.html 18 | */ 19 | 20 | @Configuration 21 | @EnableSwagger2 22 | public class Swagger2Config { 23 | 24 | private static final String somePath = "com.wxw.cloud.controller"; 25 | /** 26 | * 创建API应用 27 | * api() 增加API相关信息 28 | * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现, 29 | * 本例采用指定扫描的包路径来定义指定要建立API的目录。 30 | * @return 31 | */ 32 | @Bean 33 | public Docket createRstApi(){ 34 | return new Docket(DocumentationType.SWAGGER_2) 35 | .apiInfo(apiInfo()) 36 | .select() 37 | .apis(RequestHandlerSelectors.basePackage(somePath)) 38 | .paths(PathSelectors.any()) 39 | .build(); 40 | } 41 | 42 | // 构建 api文档的详细信息函数 43 | private ApiInfo apiInfo() { 44 | return new ApiInfoBuilder() 45 | .title("微服务接口API在线文档") 46 | .description("Welcome in http://bs.wxw.com:8082/swagger-ui.html") 47 | .contact("文件微服务") 48 | .version("1.0") 49 | .build(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /cloud-server-fileload/src/main/java/com/wxw/cloud/controller/UploadController.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.controller; 2 | 3 | import com.wxw.cloud.service.UploadService; 4 | import io.swagger.annotations.Api; 5 | import io.swagger.annotations.ApiOperation; 6 | import org.apache.commons.lang.StringUtils; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.http.HttpStatus; 9 | import org.springframework.http.ResponseEntity; 10 | import org.springframework.stereotype.Controller; 11 | import org.springframework.web.bind.annotation.PostMapping; 12 | import org.springframework.web.bind.annotation.RequestMapping; 13 | import org.springframework.web.bind.annotation.RequestParam; 14 | import org.springframework.web.multipart.MultipartFile; 15 | 16 | /** 17 | * 文件上传 18 | * @Author: wxw 19 | * @create: 2020-03-31-13:45 20 | */ 21 | @Api(tags = "UploadController",description = "文件上传接口管理") 22 | @Controller 23 | @RequestMapping("upload") 24 | public class UploadController { 25 | 26 | @Autowired 27 | private UploadService uploadService; 28 | 29 | @ApiOperation("商品图片上传") 30 | @PostMapping("image") 31 | public ResponseEntity uploadImage(@RequestParam("file")MultipartFile file){ 32 | String url = this.uploadService.uploadImage(file); 33 | if (StringUtils.isBlank(url)){ 34 | return ResponseEntity.badRequest().build(); 35 | } 36 | return ResponseEntity.status(HttpStatus.CREATED).body(url); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /cloud-server-fileload/src/main/java/com/wxw/cloud/service/UploadService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import org.springframework.web.multipart.MultipartFile; 4 | 5 | /** 6 | * @Author: wxw 7 | * @create: 2020-03-31-13:54 8 | */ 9 | public interface UploadService { 10 | 11 | String uploadImage(MultipartFile file); 12 | } 13 | -------------------------------------------------------------------------------- /cloud-server-fileload/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8082 3 | 4 | spring: 5 | application: 6 | name: cloud-server-fileload 7 | servlet: 8 | multipart: 9 | enabled: true 10 | max-file-size: 5MB 11 | 12 | eureka: 13 | client: 14 | service-url: 15 | defaultZone: http://bs.wxw.com:10086/eureka 16 | instance: 17 | #避免显示主机名 18 | instance-id: cloud-server-fileload 19 | #显示IP地址 20 | prefer-ip-address: true 21 | #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30秒) 22 | lease-renewal-interval-in-seconds: 30 23 | #Eureka服务端在收到最后一次心跳后等待时间上线,单位为秒(默认为90秒),超时将剔除服务 24 | lease-expiration-duration-in-seconds: 90 25 | 26 | # fastDFS 客户端 27 | fdfs: 28 | so-timeout: 1501 # 超时时间 29 | connect-timeout: 601 # 连接超时时间 30 | thumb-image: # 缩略图 31 | width: 60 32 | height: 60 33 | tracker-list: # tracker地址:你的虚拟机服务器地址+端口(默认是22122) 34 | - wxw.plus:22122 # 踪迹服务器地址 -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-interface/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | cloud-server-order 7 | com.wxw.order 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | com.wxw.order 13 | cloud-order-interface 14 | 1.0-SNAPSHOT 15 | 16 | 17 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-interface/src/main/java/com/wxw/cloud/domain/Address.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.Data; 8 | import lombok.EqualsAndHashCode; 9 | import lombok.experimental.Accessors; 10 | 11 | import java.io.Serializable; 12 | 13 | /** 14 | *

15 | * 16 | *

17 | * 18 | * @author WXW 19 | * @since 2020-04-27 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = false) 23 | @Accessors(chain = true) 24 | @TableName("tb_address") 25 | public class Address implements Serializable { 26 | 27 | private static final long serialVersionUID=1L; 28 | 29 | /** 30 | * 编号 31 | */ 32 | @TableId(value = "id", type = IdType.AUTO) 33 | private Long id; 34 | 35 | /** 36 | * 用户ID 37 | */ 38 | @TableField("userId") 39 | private Long userId; 40 | 41 | /** 42 | * 收货人 43 | */ 44 | private String name; 45 | 46 | /** 47 | * 收货电话 48 | */ 49 | private String phone; 50 | 51 | /** 52 | * 邮编 53 | */ 54 | private String zipcode; 55 | 56 | /** 57 | * 省 58 | */ 59 | private String province; 60 | 61 | /** 62 | * 市 63 | */ 64 | private String city; 65 | 66 | /** 67 | * 区/县 68 | */ 69 | private String district; 70 | 71 | /** 72 | * 详细地址 73 | */ 74 | private String address; 75 | 76 | /** 77 | * 是否是默认地址 78 | */ 79 | @TableField("defaultAddress") 80 | private Boolean defaultAddress; 81 | 82 | 83 | } 84 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-interface/src/main/java/com/wxw/cloud/domain/OrderDetail.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | 12 | /** 13 | *

14 | * 订单详情表 15 | *

16 | * 17 | * @author WXW 18 | * @since 2020-04-27 19 | */ 20 | @Data 21 | @EqualsAndHashCode(callSuper = false) 22 | @Accessors(chain = true) 23 | @TableName("tb_order_detail") 24 | public class OrderDetail implements Serializable { 25 | 26 | private static final long serialVersionUID=1L; 27 | 28 | /** 29 | * 订单详情id 30 | */ 31 | @TableId(value = "id", type = IdType.AUTO) 32 | private Long id; 33 | 34 | /** 35 | * 订单id 36 | */ 37 | private Long orderId; 38 | 39 | /** 40 | * sku商品id 41 | */ 42 | private Long skuId; 43 | 44 | /** 45 | * 购买数量 46 | */ 47 | private Integer num; 48 | 49 | /** 50 | * 商品标题 51 | */ 52 | private String title; 53 | 54 | /** 55 | * 商品动态属性键值集 56 | */ 57 | private String ownSpec; 58 | 59 | /** 60 | * 价格,单位:分 61 | */ 62 | private Long price; 63 | 64 | /** 65 | * 商品图片 66 | */ 67 | private String image; 68 | 69 | 70 | } 71 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-interface/src/main/java/com/wxw/cloud/domain/OrderStatus.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.time.LocalDateTime; 12 | 13 | /** 14 | *

15 | * 订单状态表 16 | *

17 | * 18 | * @author WXW 19 | * @since 2020-04-27 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = false) 23 | @Accessors(chain = true) 24 | @TableName("tb_order_status") 25 | public class OrderStatus implements Serializable { 26 | 27 | private static final long serialVersionUID=1L; 28 | 29 | /** 30 | * 初始阶段:1、未付款、未发货;初始化所有数据 31 | * 付款阶段:2、已付款、未发货;更改付款时间 32 | * 发货阶段:3、已发货,未确认;更改发货时间、物流名称、物流单号 33 | * 成功阶段:4、已确认,未评价;更改交易结束时间 34 | * 关闭阶段:5、关闭; 更改更新时间,交易关闭时间。 35 | * 评价阶段:6、已评价 36 | */ 37 | 38 | /** 39 | * 订单id 40 | */ 41 | @TableId(value = "order_id") 42 | private Long orderId; 43 | 44 | /** 45 | * 状态:1、未付款 2、已付款,未发货 3、已发货,未确认 4、交易成功 5、交易关闭 6、已评价 46 | */ 47 | private Integer status; 48 | 49 | /** 50 | * 订单创建时间 51 | */ 52 | private LocalDateTime createTime; 53 | 54 | /** 55 | * 付款时间 56 | */ 57 | private LocalDateTime paymentTime; 58 | 59 | /** 60 | * 发货时间 61 | */ 62 | private LocalDateTime consignTime; 63 | 64 | /** 65 | * 交易完成时间 66 | */ 67 | private LocalDateTime endTime; 68 | 69 | /** 70 | * 交易关闭时间 71 | */ 72 | private LocalDateTime closeTime; 73 | 74 | /** 75 | * 评价时间 76 | */ 77 | private LocalDateTime commentTime; 78 | 79 | 80 | } 81 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-interface/src/main/java/com/wxw/cloud/domain/PayLog.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | import java.time.LocalDateTime; 12 | 13 | /** 14 | *

15 | * 16 | *

17 | * 18 | * @author WXW 19 | * @since 2020-04-27 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = false) 23 | @Accessors(chain = true) 24 | @TableName("tb_pay_log") 25 | public class PayLog implements Serializable { 26 | 27 | private static final long serialVersionUID=1L; 28 | 29 | /** 30 | * 订单号 31 | */ 32 | @TableId(value = "order_id") 33 | private Long orderId; 34 | 35 | /** 36 | * 支付金额(分) 37 | */ 38 | private Long totalFee; 39 | 40 | /** 41 | * 用户ID 42 | */ 43 | private Long userId; 44 | 45 | /** 46 | * 支付交易号码 47 | */ 48 | private String transactionId; 49 | 50 | /** 51 | * 交易状态,1 未支付, 2已支付, 3 已退款, 4 支付错误, 5 已关闭 52 | */ 53 | private Integer status; 54 | 55 | /** 56 | * 支付方式,1 支付宝支付, 2 货到付款 57 | */ 58 | private Integer payType; 59 | 60 | /** 61 | * 银行类型 62 | */ 63 | private String bankType; 64 | 65 | /** 66 | * 创建时间 67 | */ 68 | private LocalDateTime createTime; 69 | 70 | /** 71 | * 支付时间 72 | */ 73 | private LocalDateTime payTime; 74 | 75 | /** 76 | * 关闭时间 77 | */ 78 | private LocalDateTime closedTime; 79 | 80 | /** 81 | * 退款时间 82 | */ 83 | private LocalDateTime refundTime; 84 | 85 | 86 | } 87 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-interface/src/main/java/com/wxw/cloud/domain/SeckillOrder.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableField; 7 | import java.io.Serializable; 8 | import lombok.Data; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.experimental.Accessors; 11 | 12 | /** 13 | *

14 | * 15 | *

16 | * 17 | * @author WXW 18 | * @since 2020-04-27 19 | */ 20 | @Data 21 | @EqualsAndHashCode(callSuper = false) 22 | @Accessors(chain = true) 23 | @TableName("tb_seckill_order") 24 | public class SeckillOrder implements Serializable { 25 | 26 | private static final long serialVersionUID=1L; 27 | 28 | /** 29 | * 秒杀编号 30 | */ 31 | @TableId(value = "id", type = IdType.AUTO) 32 | private Long id; 33 | 34 | /** 35 | * 秒杀用户 36 | */ 37 | @TableField("userId") 38 | private Long userId; 39 | 40 | /** 41 | * 商品ID 42 | */ 43 | @TableField("skuId") 44 | private Long skuId; 45 | 46 | /** 47 | * 订单ID 48 | */ 49 | @TableField("orderId") 50 | private Long orderId; 51 | 52 | 53 | } 54 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-interface/src/main/java/com/wxw/cloud/domain/Stock.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | import lombok.experimental.Accessors; 9 | 10 | import java.io.Serializable; 11 | 12 | /** 13 | *

14 | * 库存表,代表库存,秒杀库存等信息 15 | *

16 | * 17 | * @author WXW 18 | * @since 2020-04-05 19 | */ 20 | @Data 21 | @EqualsAndHashCode(callSuper = false) 22 | @Accessors(chain = true) 23 | @TableName("tb_stock") 24 | public class Stock implements Serializable { 25 | 26 | private static final long serialVersionUID=1L; 27 | 28 | /** 29 | * 库存对应的商品sku id 30 | */ 31 | @TableId(value = "sku_id", type = IdType.NONE) 32 | private Long skuId; 33 | 34 | /** 35 | * 可秒杀库存 36 | */ 37 | private Integer seckillStock; 38 | 39 | /** 40 | * 秒杀总数量 41 | */ 42 | private Integer seckillTotal; 43 | 44 | /** 45 | * 库存数量 46 | */ 47 | private Integer stock; 48 | 49 | 50 | } 51 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/OrderMian8089.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 6 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 7 | 8 | /** 9 | * @Author: wxw 10 | * @create: 2020-04-24-16:56 11 | */ 12 | @EnableDiscoveryClient 13 | @SpringBootApplication 14 | public class OrderMian8089 { 15 | public static void main(String[] args) { 16 | SpringApplication.run(OrderMian8089.class,args); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/config/AliPayProperties.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import com.alipay.api.AlipayClient; 4 | import com.alipay.api.DefaultAlipayClient; 5 | import lombok.Data; 6 | import lombok.Getter; 7 | import lombok.Setter; 8 | import lombok.ToString; 9 | import org.springframework.boot.context.properties.ConfigurationProperties; 10 | 11 | /** 12 | * @Author: wxw 13 | * @create: 2020-04-27-15:36 14 | */ 15 | @Getter 16 | @Setter 17 | @ToString 18 | @ConfigurationProperties(prefix = "wxw.pay") 19 | public class AliPayProperties { 20 | 21 | // appID 22 | private String appId; 23 | 24 | //商户公钥 25 | private String privateKey; 26 | 27 | // 支付宝公钥 28 | private String publicKey; 29 | 30 | // 支付宝异步通知结果 31 | private String notifyUrl; 32 | 33 | // 返回结果集 34 | private String returnUrl; 35 | 36 | // 签名类型 37 | private String signType; 38 | 39 | // 字符编码 40 | private String charset; 41 | 42 | // 字符类型 43 | private String format; 44 | 45 | // 网关地址 46 | private String gatewayUrl; 47 | 48 | private AlipayClient alipayClient; 49 | 50 | public AlipayClient build(){ 51 | this.alipayClient = new DefaultAlipayClient( 52 | getGatewayUrl(), 53 | getAppId(), 54 | getPrivateKey(), 55 | getFormat(), 56 | getCharset(), 57 | getPublicKey(), 58 | getSignType()); 59 | return alipayClient; 60 | } 61 | 62 | } -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/config/JwtProperties.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import com.wxw.cloud.tools.RsaUtils; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | import org.springframework.boot.context.properties.ConfigurationProperties; 9 | 10 | import javax.annotation.PostConstruct; 11 | import java.security.PublicKey; 12 | 13 | /** 14 | * @Author: wxw 15 | * @create: 2020-04-19-0:02 16 | */ 17 | @ConfigurationProperties(prefix = "wxw.jwt") 18 | @Getter 19 | @Setter 20 | public class JwtProperties { 21 | private String pubKeyPath;// 公钥 22 | 23 | private PublicKey publicKey; // 公钥 24 | 25 | private String cookieName; 26 | 27 | private static final Logger logger = LoggerFactory.getLogger(JwtProperties.class); 28 | 29 | /** 30 | * @PostContruct:在构造方法执行之后执行该方法 31 | */ 32 | @PostConstruct 33 | public void init() { 34 | try { 35 | // 获取公钥和私钥 36 | this.publicKey = RsaUtils.getPublicKey(pubKeyPath); 37 | } catch (Exception e) { 38 | logger.error("初始化公钥和私钥失败!", e); 39 | throw new RuntimeException(); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/config/MyBatisConfig.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; 4 | import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; 5 | import org.mybatis.spring.annotation.MapperScan; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.transaction.annotation.EnableTransactionManagement; 9 | 10 | /** 11 | * @Author: wxw 12 | * @create: 2020-03-15-1:37 13 | * MyBatis配置类 14 | */ 15 | @EnableTransactionManagement 16 | @Configuration 17 | @MapperScan("com.wxw.cloud.dao") 18 | public class MyBatisConfig { 19 | 20 | /** 21 | * 分页插件 22 | */ 23 | @Bean 24 | public PaginationInterceptor paginationInterceptor() { 25 | 26 | PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); 27 | // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false 28 | // paginationInterceptor.setOverflow(false); 29 | // 设置最大单页限制数量,默认 500 条,-1 不受限制 30 | // paginationInterceptor.setLimit(500); 31 | // 开启 count 的 join 优化,只针对部分 left join 32 | paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); 33 | return paginationInterceptor; 34 | } 35 | } 36 | 37 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/config/WebConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import com.wxw.cloud.interceptor.LoginOrderInterceptor; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 6 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 7 | 8 | import javax.annotation.Resource; 9 | 10 | /** 11 | * @Author: wxw 12 | * @create: 2020-04-23-1:14 13 | * Spring MVC 注解配置 14 | */ 15 | @Configuration 16 | public class WebConfiguration implements WebMvcConfigurer { 17 | 18 | @Resource 19 | private LoginOrderInterceptor loginInterceptor; 20 | 21 | /** 22 | * 定义拦截器 23 | * @param registry 24 | */ 25 | @Override 26 | public void addInterceptors(InterceptorRegistry registry) { 27 | registry.addInterceptor(loginInterceptor).addPathPatterns("/**"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/controller/StackAndSeckillController.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.controller; 2 | 3 | 4 | import com.wxw.cloud.domain.Stock; 5 | import com.wxw.cloud.service.IStockService; 6 | import io.swagger.annotations.Api; 7 | import io.swagger.annotations.ApiOperation; 8 | import org.springframework.http.ResponseEntity; 9 | import org.springframework.util.CollectionUtils; 10 | import org.springframework.web.bind.annotation.GetMapping; 11 | 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import javax.annotation.Resource; 15 | import java.util.List; 16 | 17 | /** 18 | *

19 | * 前端控制器 20 | *

21 | * 22 | * @author WXW 23 | * @since 2020-04-27 24 | */ 25 | @RestController 26 | @Api(tags = "StackAndSeckillController",description = "秒杀及仓库微服务") 27 | public class StackAndSeckillController { 28 | 29 | @Resource 30 | private IStockService stockService; 31 | 32 | @ApiOperation("获取库存列表") 33 | @GetMapping("/stock/list") 34 | public ResponseEntity> getStockList(){ 35 | List stockList = this.stockService.list(); 36 | if (CollectionUtils.isEmpty(stockList)){ 37 | return ResponseEntity.badRequest().build(); 38 | } 39 | return ResponseEntity.ok(stockList); 40 | } 41 | } 42 | 43 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/AddressMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.wxw.cloud.domain.Address; 5 | 6 | /** 7 | *

8 | * Mapper 接口 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-27 13 | */ 14 | public interface AddressMapper extends BaseMapper
{ 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/OrderDetailMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.wxw.cloud.domain.Order; 5 | import com.wxw.cloud.domain.OrderDetail; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * 订单详情表 Mapper 接口 13 | *

14 | * 15 | * @author WXW 16 | * @since 2020-04-27 17 | */ 18 | public interface OrderDetailMapper extends BaseMapper { 19 | 20 | /** 21 | * 分页查询订单 22 | * @param userId 23 | * @param status 24 | * @return 25 | */ 26 | List queryOrderList(@Param("userId") Long userId, @Param("status") Integer status); 27 | } 28 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/OrderMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.baomidou.mybatisplus.core.metadata.IPage; 5 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 6 | import com.wxw.cloud.domain.Order; 7 | import org.apache.ibatis.annotations.Param; 8 | 9 | import java.util.List; 10 | 11 | 12 | /** 13 | * @author WXW 14 | * @since 2020-04-27 15 | */ 16 | public interface OrderMapper extends BaseMapper { 17 | 18 | /** 19 | * 分页查询订单 20 | * @param userId 21 | * @param status 22 | * @return 23 | */ 24 | IPage queryOrderPage(Page page, @Param("userId") Long userId, @Param("status") Integer status); 25 | } 26 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/OrderStatusMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.wxw.cloud.domain.OrderStatus; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * 订单状态表 Mapper 接口 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-27 13 | */ 14 | public interface OrderStatusMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/PayLogMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.wxw.cloud.domain.PayLog; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * Mapper 接口 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-27 13 | */ 14 | public interface PayLogMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/SeckillOrderMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.wxw.cloud.domain.SeckillOrder; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * Mapper 接口 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-27 13 | */ 14 | public interface SeckillOrderMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/StockMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.wxw.cloud.domain.Stock; 5 | import org.apache.ibatis.annotations.Param; 6 | import org.apache.ibatis.annotations.Update; 7 | 8 | /** 9 | *

10 | * 库存表,代表库存,秒杀库存等信息 Mapper 接口 11 | *

12 | * 13 | * @author WXW 14 | * @since 2020-04-05 15 | */ 16 | public interface StockMapper extends BaseMapper { 17 | 18 | /** 19 | * 更新对应商品的库存,且库存必须大于0,否则回滚。 20 | * @param skuId 21 | * @param num 22 | */ 23 | @Update("update tb_stock set stock = stock - #{num} where sku_id = #{skuId} and stock > 0") 24 | void reduceStock(@Param("skuId") Long skuId, @Param("num") Integer num); 25 | 26 | } 27 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/mapper/AddressMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | id, userId, name, phone, zipcode, province, city, district, address, defaultAddress 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/mapper/OrderDetailMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | id, order_id, sku_id, num, title, own_spec, price, image 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/mapper/OrderStatusMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | order_id, status, create_time, payment_time, consign_time, end_time, close_time, comment_time 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/mapper/PayLogMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | order_id, total_fee, user_id, transaction_id, status, pay_type, bank_type, create_time, pay_time, closed_time, refund_time 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/mapper/SeckillOrderMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | id, userId, skuId, orderId 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/dao/mapper/StockMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | sku_id, seckill_stock, seckill_total, stock 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/AlipayService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.alipay.api.AlipayApiException; 4 | import com.wxw.cloud.domain.Order; 5 | import com.wxw.cloud.domain.OrderDetail; 6 | 7 | import javax.servlet.http.HttpServletRequest; 8 | import java.util.Map; 9 | 10 | /** 11 | * 支付接口 12 | */ 13 | public interface AlipayService { 14 | 15 | 16 | /** 17 | * 18 | * @param orderId 订单编号 19 | * @param refundReason 退款原因 20 | * @param refundAmount 退款金额 21 | * @param reqNo 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传 22 | * @return 23 | * @throws AlipayApiException 24 | */ 25 | String refund(String orderId,String refundReason,String refundAmount,String reqNo) throws AlipayApiException; 26 | 27 | /** 28 | * 根据订单编号查询交易号 29 | * @param orderId 订单编号(唯一) 30 | */ 31 | String query(String orderId) throws AlipayApiException; 32 | 33 | /** 34 | * 交易关闭 35 | * orderId 订单编号(唯一) 36 | */ 37 | String close(String orderId) throws AlipayApiException; 38 | 39 | /** 40 | * 退款查询 41 | * @param orderId 订单编号(唯一) 42 | * @param reqNo 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传 43 | */ 44 | String refundQuery(String orderId,String reqNo) throws AlipayApiException; 45 | 46 | /** 47 | * web端订单支付 48 | * @param order 49 | * @param orderDetail 50 | * @return 51 | */ 52 | String getAliPayClient(Order order, OrderDetail orderDetail) throws Exception; 53 | 54 | // 支付宝同步通知页面 55 | Boolean getReturnUrl(HttpServletRequest request, Map params, Map requestParams); 56 | // 支付宝 异步通知页面 57 | Boolean getNotifyUrl(HttpServletRequest request,Map params, Map requestParams) throws Exception; 58 | } 59 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/IAddressService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.wxw.cloud.domain.Address; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | *

10 | * 服务类 11 | *

12 | * 13 | * @author WXW 14 | * @since 2020-04-27 15 | */ 16 | public interface IAddressService extends IService
{ 17 | 18 | void addAddressByUserId(Address address); 19 | 20 | List
queryAddressByUserId(); 21 | 22 | void updateAddressByUserId(Address address); 23 | 24 | void deleteAddress(Long addressId); 25 | 26 | Address queryAddressById(Long addressId); 27 | 28 | List
getAddressList(); 29 | } 30 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/IOrderDetailService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.wxw.cloud.domain.OrderDetail; 5 | 6 | /** 7 | *

8 | * 订单详情表 服务类 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-27 13 | */ 14 | public interface IOrderDetailService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/IOrderService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.wxw.cloud.domain.Order; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.wxw.cloud.domain.OrderStatus; 6 | import com.wxw.cloud.result.PageResult; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @author WXW 12 | * @since 2020-04-27 13 | */ 14 | public interface IOrderService extends IService { 15 | 16 | // 创建订单 17 | Long createOrder(String seck, Order order); 18 | 19 | // 查询库存 20 | List queryStock(String seck, Order order); 21 | 22 | // 根据订单编号查询订单 23 | Order queryOrderById(Long id); 24 | 25 | //分页查询当前用户订单 26 | PageResult queryUserOrderList(Integer page, Integer rows, Integer status); 27 | 28 | // 更新订单状态 29 | Boolean updateOrderStatus(Long id, Integer status); 30 | 31 | // 根据订单id查询其包含的skuId 32 | List querySkuIdByOrderId(Long id); 33 | 34 | // 根据订单id查询订单状态 35 | OrderStatus queryOrderStatusById(Long id); 36 | } 37 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/IOrderStatusService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.wxw.cloud.domain.OrderStatus; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 订单状态表 服务类 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-27 13 | */ 14 | public interface IOrderStatusService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/IPayLogService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.wxw.cloud.domain.PayLog; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import io.swagger.models.auth.In; 6 | 7 | /** 8 | *

9 | * 服务类 10 | *

11 | * 12 | * @author WXW 13 | * @since 2020-04-27 14 | */ 15 | public interface IPayLogService extends IService { 16 | 17 | // 更新订单状态和流水日志 18 | Boolean updatePayLog(String out_trade_no,Integer trade_status, String trade_no, String total_amount); 19 | } 20 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/ISeckillOrderService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.wxw.cloud.domain.SeckillOrder; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 服务类 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-27 13 | */ 14 | public interface ISeckillOrderService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/IStockService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.wxw.cloud.domain.Stock; 5 | 6 | public interface IStockService extends IService { 7 | } 8 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/impl/OrderDetailServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.wxw.cloud.dao.OrderDetailMapper; 5 | import com.wxw.cloud.domain.OrderDetail; 6 | import com.wxw.cloud.service.IOrderDetailService; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 订单详情表 服务实现类 12 | *

13 | * 14 | * @author WXW 15 | * @since 2020-04-27 16 | */ 17 | @Service 18 | public class OrderDetailServiceImpl extends ServiceImpl implements IOrderDetailService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/impl/OrderStatusServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service.impl; 2 | 3 | import com.wxw.cloud.domain.OrderStatus; 4 | import com.wxw.cloud.dao.OrderStatusMapper; 5 | import com.wxw.cloud.service.IOrderStatusService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 订单状态表 服务实现类 12 | *

13 | * 14 | * @author WXW 15 | * @since 2020-04-27 16 | */ 17 | @Service 18 | public class OrderStatusServiceImpl extends ServiceImpl implements IOrderStatusService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/impl/SeckillOrderServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service.impl; 2 | 3 | import com.wxw.cloud.domain.SeckillOrder; 4 | import com.wxw.cloud.dao.SeckillOrderMapper; 5 | import com.wxw.cloud.service.ISeckillOrderService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 服务实现类 12 | *

13 | * 14 | * @author WXW 15 | * @since 2020-04-27 16 | */ 17 | @Service 18 | public class SeckillOrderServiceImpl extends ServiceImpl implements ISeckillOrderService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/service/impl/StockServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.wxw.cloud.dao.StockMapper; 5 | import com.wxw.cloud.domain.Stock; 6 | import com.wxw.cloud.service.IStockService; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | * @Author: wxw 11 | * @create: 2020-05-08-23:50 12 | */ 13 | @Service 14 | public class StockServiceImpl extends ServiceImpl implements IStockService { 15 | } 16 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/tools/PayReq.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.tools; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 支付请求入参 7 | * @Author: wxw 8 | * @create: 2020-05-03-10:25 9 | */ 10 | @Data 11 | public class PayReq { 12 | 13 | /** 14 | * 商品的标题/交易标题/订单标题/订单关键字等 15 | */ 16 | private String subject; 17 | 18 | /** 19 | * 商户网站唯一订单号 20 | */ 21 | private String out_trade_no; 22 | 23 | // 总金额 24 | private String total_amount; 25 | 26 | //用户付款中途退出返回商户网站的地址 27 | private String quit_url; 28 | 29 | //销售产品码,商家和支付宝签约的产品码 30 | private String product_code; 31 | 32 | //商品的编号 33 | private String goods_id; 34 | 35 | // 商品名称 36 | private String goods_name; 37 | 38 | //商品数量 39 | private String quantity; 40 | 41 | // 商品单价,单位为元 42 | private String price; 43 | 44 | // 商品描述 45 | private String body; 46 | 47 | // 最晚付款时间 48 | private String timeout_express; 49 | } 50 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/tools/PayStatus.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.tools; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @Author: wxw 7 | * @create: 2020-04-27-15:49 8 | */ 9 | public enum PayStatus { 10 | WAIT_PAY(1, "待付款"), 11 | PAID(2, "已付款,未发货"), 12 | CONFIRMED(3, "已发货,未确认"), 13 | SUCCESS(4, "交易成功"), 14 | CLOSED(5, "交易关闭"), 15 | EVALUATED(6, "已评价"); 16 | 17 | Integer key; 18 | String value; 19 | 20 | public static String getName(String key) { 21 | for (PayStatus status : PayStatus.values()) { 22 | if (status.getKey().equals(key)) { 23 | return status.value; 24 | } 25 | } 26 | return null; 27 | } 28 | 29 | PayStatus() { 30 | } 31 | 32 | PayStatus(Integer key, String value) { 33 | this.key = key; 34 | this.value = value; 35 | } 36 | 37 | public Integer getKey() { 38 | return key; 39 | } 40 | 41 | public String getValue() { 42 | return value; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/tools/RefundReq.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.tools; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @Author: wxw 7 | * @create: 2020-05-03-17:51 8 | */ 9 | @Data 10 | public class RefundReq { 11 | 12 | //订单编号 13 | private String out_trade_no; 14 | //支付宝交易号 || 订单编号 二选一设置 15 | private String trade_no; 16 | //退款原因 17 | private String refund_reason; 18 | //退款金额 19 | private String refund_amount; 20 | //标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传 21 | private String out_request_no; 22 | } 23 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/main/java/com/wxw/cloud/tools/TradeStatus.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.tools; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 7 | * @Author: wxw 8 | * @create: 2020-05-05-11:19 9 | */ 10 | public enum TradeStatus { 11 | 12 | /** 13 | * 1、WAIT_BUYER_PAY(交易创建,等待买家付款); 14 | * 2、TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款); 15 | * 3、TRADE_SUCCESS(交易支付成功); 16 | * 4、TRADE_FINISHED(交易结束,不可退款) 17 | */ 18 | WAIT_BUYER_PAY(1, "WAIT_BUYER_PAY"), 19 | TRADE_CLOSED(2, "TRADE_CLOSED"), 20 | TRADE_SUCCESS(3, "TRADE_SUCCESS"), 21 | TRADE_FINISHED(4, "TRADE_FINISHED"); 22 | 23 | 24 | // 通过value 得到key 25 | public static Integer getkey(String value){ 26 | TradeStatus tradeStatus = TradeStatus.valueOf(value); 27 | return tradeStatus.key; 28 | } 29 | 30 | Integer key; 31 | String value; 32 | 33 | TradeStatus() { 34 | } 35 | 36 | TradeStatus(Integer key, String value) { 37 | this.key = key; 38 | this.value = value; 39 | } 40 | 41 | public Integer getKey() { 42 | return key; 43 | } 44 | 45 | public void setKey(Integer key) { 46 | this.key = key; 47 | } 48 | 49 | public String getValue() { 50 | return value; 51 | } 52 | 53 | public void setValue(String value) { 54 | this.value = value; 55 | } 56 | 57 | /* public static void main(String[] args) { 58 | Integer getkey = getkey("TRADE_SUCCESS"); 59 | System.out.println("getkey = " + getkey); 60 | }*/ 61 | } 62 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/test/java/com/wxw/cloud/TestDao.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import com.wxw.cloud.dao.AddressMapper; 4 | import com.wxw.cloud.dao.OrderStatusMapper; 5 | import com.wxw.cloud.domain.Address; 6 | import com.wxw.cloud.domain.OrderStatus; 7 | import com.wxw.cloud.service.IAddressService; 8 | import org.junit.jupiter.api.Test; 9 | import org.springframework.boot.test.context.SpringBootTest; 10 | 11 | import javax.annotation.Resource; 12 | import java.util.List; 13 | 14 | /** 15 | * @Author: wxw 16 | * @create: 2020-04-27-11:51 17 | */ 18 | @SpringBootTest 19 | public class TestDao { 20 | 21 | @Resource 22 | private AddressMapper addressMapper; 23 | 24 | @Resource 25 | private IAddressService addressService; 26 | 27 | @Resource 28 | private OrderStatusMapper orderStatusMapper; 29 | 30 | @Test 31 | public void TestSucces(){ 32 | Address add = new Address(); 33 | add.setId(1L); 34 | add.setAddress("北京市 大兴区"); 35 | addressMapper.updateById(add); 36 | } 37 | 38 | // 测试订单状态 39 | @Test 40 | public void testStatus(){ 41 | OrderStatus orderStatus = this.orderStatusMapper.selectById(1257642387350622208l); 42 | System.out.println(orderStatus); 43 | } 44 | 45 | @Test 46 | public void TestAddress(){ 47 | List
addresses = addressService.getAddressList(); 48 | System.out.println("addresses = " + addresses); 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /cloud-server-order/cloud-order-service/src/test/java/com/wxw/cloud/TestId.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import cn.hutool.core.lang.Snowflake; 4 | import cn.hutool.core.util.IdUtil; 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | 8 | /** 9 | * @Author: wxw 10 | * @create: 2020-05-05-9:51 11 | */ 12 | @SpringBootTest 13 | public class TestId { 14 | 15 | @Test 16 | public void testId(){ 17 | String idStr = IdUtil.objectId().toUpperCase(); 18 | System.out.println("id = " + idStr); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/SearchMain8003.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 6 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 7 | import org.springframework.cloud.openfeign.EnableFeignClients; 8 | 9 | /** 10 | * @Author: wxw 11 | * @create: 2020-04-11-18:06 12 | */ 13 | @EnableFeignClients 14 | @EnableDiscoveryClient 15 | @SpringBootApplication(exclude= {DataSourceAutoConfiguration.class}) // 排除启动默认数据源 16 | public class SearchMain8003 { 17 | public static void main(String[] args) { 18 | SpringApplication.run(SearchMain8003.class, args); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/config/Swagger2Config.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import springfox.documentation.builders.ApiInfoBuilder; 6 | import springfox.documentation.builders.PathSelectors; 7 | import springfox.documentation.builders.RequestHandlerSelectors; 8 | import springfox.documentation.service.ApiInfo; 9 | import springfox.documentation.spi.DocumentationType; 10 | import springfox.documentation.spring.web.plugins.Docket; 11 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 12 | 13 | /* 14 | * @Author: wxw 15 | * @create: 2020-03-15-0:24 16 | * Swagger2API文档的配置 17 | * bs.wxw.com:8083/swagger-ui.html 18 | */ 19 | 20 | @Configuration 21 | @EnableSwagger2 22 | public class Swagger2Config { 23 | 24 | private static final String somePath = "com.wxw.cloud.controller"; 25 | /** 26 | * 创建API应用 27 | * api() 增加API相关信息 28 | * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现, 29 | * 本例采用指定扫描的包路径来定义指定要建立API的目录。 30 | * @return 31 | */ 32 | @Bean 33 | public Docket createRstApi(){ 34 | return new Docket(DocumentationType.SWAGGER_2) 35 | .apiInfo(apiInfo()) 36 | .select() 37 | .apis(RequestHandlerSelectors.basePackage(somePath)) 38 | .paths(PathSelectors.any()) 39 | .build(); 40 | } 41 | 42 | // 构建 api文档的详细信息函数 43 | private ApiInfo apiInfo() { 44 | return new ApiInfoBuilder() 45 | .title("微服务接口API在线文档") 46 | .description("Welcome in http://bs.wxw.com:8083/swagger-ui.html") 47 | .contact("搜索微服务") 48 | .version("2.0") 49 | .build(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/controller/SearchController.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.controller; 2 | 3 | import com.wxw.cloud.domain.Goods; 4 | import com.wxw.cloud.domain.SearchRequest; 5 | import com.wxw.cloud.domain.SearchResult; 6 | import com.wxw.cloud.result.PageResult; 7 | import com.wxw.cloud.service.SearchService; 8 | import io.swagger.annotations.Api; 9 | import io.swagger.annotations.ApiOperation; 10 | import org.springframework.http.ResponseEntity; 11 | import org.springframework.stereotype.Controller; 12 | import org.springframework.util.CollectionUtils; 13 | import org.springframework.web.bind.annotation.PostMapping; 14 | import org.springframework.web.bind.annotation.RequestBody; 15 | 16 | import javax.annotation.Resource; 17 | 18 | /** 19 | * @Author: wxw 20 | * @create: 2020-04-12-21:38 21 | */ 22 | @Api(tags = "SearchController",description = "搜索微服务") 23 | @Controller 24 | public class SearchController { 25 | 26 | @Resource 27 | private SearchService searchService; 28 | 29 | @ApiOperation("基本搜索入口") 30 | @PostMapping("page") 31 | public ResponseEntity search(@RequestBody SearchRequest searchRequest){ 32 | SearchResult result=this.searchService.search(searchRequest); 33 | if (result==null|| CollectionUtils.isEmpty(result.getItems())){ 34 | return ResponseEntity.notFound().build(); 35 | } 36 | return ResponseEntity.ok(result); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/domain/Goods.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import lombok.Data; 4 | import org.springframework.data.annotation.Id; 5 | import org.springframework.data.elasticsearch.annotations.Document; 6 | import org.springframework.data.elasticsearch.annotations.Field; 7 | import org.springframework.data.elasticsearch.annotations.FieldType; 8 | 9 | import java.time.LocalDateTime; 10 | import java.util.List; 11 | import java.util.Map; 12 | 13 | /** 14 | * 设置映射属性 15 | */ 16 | @Data 17 | @Document(indexName = "goods", type = "docs", shards = 1, replicas = 0) 18 | public class Goods { 19 | @Id 20 | private Long id; // spuId 21 | @Field(type = FieldType.Text, analyzer = "ik_max_word") 22 | private String all; // 所有需要被搜索的信息,包含标题,分类,甚至品牌 23 | @Field(type = FieldType.Keyword, index = false) 24 | private String subTitle;// 卖点 25 | private Long brandId;// 品牌id 26 | private Long cid1;// 1级分类id 27 | private Long cid2;// 2级分类id 28 | private Long cid3;// 3级分类id 29 | private LocalDateTime createTime;// 创建时间 30 | private List price;// 价格 31 | @Field(type = FieldType.Keyword, index = false) 32 | private String skus;// List信息的json结构 33 | private Map specs;// 可搜索的规格参数,key是参数名,值是参数值 34 | } -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/domain/SearchRequest.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | /** 4 | * @Author: wxw 5 | * @create: 2020-04-12-21:36 6 | */ 7 | public class SearchRequest { 8 | 9 | private String key;// 搜索条件 10 | 11 | private Integer page;// 当前页 12 | 13 | private static final Integer DEFAULT_SIZE = 20;// 每页大小,不从页面接收,而是固定大小 14 | private static final Integer DEFAULT_PAGE = 1;// 默认页 15 | 16 | public String getKey() { 17 | return key; 18 | } 19 | 20 | public void setKey(String key) { 21 | this.key = key; 22 | } 23 | 24 | public Integer getPage() { 25 | if(page == null){ 26 | return DEFAULT_PAGE; 27 | } 28 | // 获取页码时做一些校验,不能小于1 29 | return Math.max(DEFAULT_PAGE, page); 30 | } 31 | 32 | public void setPage(Integer page) { 33 | this.page = page; 34 | } 35 | 36 | public Integer getSize() { 37 | return DEFAULT_SIZE; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/domain/SearchResult.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.wxw.cloud.result.PageResult; 4 | import lombok.*; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | /** 10 | * @Author: wxw 11 | * @create: 2020-04-14-23:11 12 | */ 13 | 14 | @Data 15 | public class SearchResult extends PageResult { 16 | 17 | private List> categories; 18 | 19 | private List brands; 20 | 21 | // 聚合规格参数 发序列化localdatatime 问题 暂放 22 | // private List> specs; 23 | 24 | 25 | public SearchResult(Long total, List items, List> categories, List brands) { 26 | super(total, items); 27 | this.categories = categories; 28 | this.brands = brands; 29 | } 30 | 31 | public SearchResult(Long total, Long totalPage, List items, List> categories, List brands) { 32 | super(total, totalPage, items); 33 | this.categories = categories; 34 | this.brands = brands; 35 | } 36 | 37 | public SearchResult(List> categories, List brands) { 38 | this.categories = categories; 39 | this.brands = brands; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/listener/GoodsListener.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.listener; 2 | 3 | import com.wxw.cloud.service.SearchService; 4 | import org.springframework.amqp.core.ExchangeTypes; 5 | import org.springframework.amqp.rabbit.annotation.Exchange; 6 | import org.springframework.amqp.rabbit.annotation.Queue; 7 | import org.springframework.amqp.rabbit.annotation.QueueBinding; 8 | import org.springframework.amqp.rabbit.annotation.RabbitListener; 9 | import org.springframework.stereotype.Component; 10 | 11 | import javax.annotation.Resource; 12 | import java.io.IOException; 13 | 14 | /** 15 | * @Author: wxw 16 | * @create: 2020-04-16-23:24 17 | */ 18 | @Component 19 | public class GoodsListener { 20 | 21 | @Resource 22 | private SearchService searchService; 23 | 24 | @RabbitListener(bindings = @QueueBinding( 25 | value = @Queue(value = "WXW.SEARCH.SAVE.QUEUE",durable = "true"), 26 | exchange = @Exchange(value = "WXW.ITEM.EXCHANGE",ignoreDeclarationExceptions = "true",type = ExchangeTypes.TOPIC), 27 | key = {"item.insert","item.update"} 28 | )) 29 | public void save(Long id) throws IOException { 30 | if (id== null){ 31 | return; 32 | } 33 | this.searchService.saveMQ(id); 34 | } 35 | 36 | 37 | @RabbitListener(bindings = @QueueBinding( 38 | value = @Queue(value = "WXW.SEARCH.DELETE.QUEUE",durable = "true"), 39 | exchange = @Exchange(value = "WXW.ITEM.EXCHANGE",ignoreDeclarationExceptions = "true",type = ExchangeTypes.TOPIC), 40 | key = {"item.delete"} 41 | )) 42 | public void delete(Long id) throws IOException { 43 | if (id== null){ 44 | return; 45 | } 46 | this.searchService.deleteMQ(id); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/repository/GoodsRepository.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.repository; 2 | 3 | import com.wxw.cloud.domain.Goods; 4 | import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; 5 | 6 | public interface GoodsRepository extends ElasticsearchRepository { 7 | 8 | 9 | } 10 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/rpc/BrandClient.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.rpc; 2 | 3 | import com.wxw.cloud.api.BrandAPI; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | 6 | @FeignClient("cloud-bs-service") 7 | public interface BrandClient extends BrandAPI { 8 | } 9 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/rpc/CategoryClient.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.rpc; 2 | 3 | import com.wxw.cloud.api.CategoryAPI; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | 6 | @FeignClient("cloud-bs-service") 7 | public interface CategoryClient extends CategoryAPI { 8 | } 9 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/rpc/GoodsClient.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.rpc; 2 | 3 | import com.wxw.cloud.api.GoodsAPI; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | 6 | /** 7 | * @Author: wxw 8 | * @create: 2020-04-11-18:43 9 | */ 10 | @FeignClient("cloud-bs-service") 11 | public interface GoodsClient extends GoodsAPI { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/java/com/wxw/cloud/rpc/SpecParamClient.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.rpc; 2 | 3 | 4 | import com.wxw.cloud.api.SpecParamAPI; 5 | import com.wxw.cloud.domain.SpecParam; 6 | import org.springframework.cloud.openfeign.FeignClient; 7 | import org.springframework.http.ResponseEntity; 8 | import org.springframework.web.bind.annotation.GetMapping; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RequestParam; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | * @author WXW 16 | * @since 2020-04-03 17 | */ 18 | @FeignClient("cloud-bs-service") 19 | public interface SpecParamClient extends SpecParamAPI { 20 | 21 | } 22 | 23 | -------------------------------------------------------------------------------- /cloud-server-search/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8083 3 | spring: 4 | application: 5 | name: cloud-bs-search 6 | data: 7 | elasticsearch: 8 | cluster-name: elasticsearch 9 | cluster-nodes: wxw.plus:9300 10 | 11 | # 多个接口上的@FeignClient(“相同服务名”)会报错,overriding is disabled。 12 | # 设置 为true ,即 允许 同名 13 | main: 14 | allow-bean-definition-overriding: true 15 | datasource: 16 | url: jdbc:mysql://localhost:3306/bs-wxw?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai 17 | username: root 18 | password: 123456 19 | jackson: 20 | default-property-inclusion: non_null # 序列化的时候过滤调为空的字段 21 | rabbitmq: 22 | host: wxw.plus 23 | virtual-host: /wxw 24 | username: wxw 25 | password: wxw 26 | eureka: 27 | client: 28 | service-url: 29 | defaultZone: http://bs.wxw.com:10086/eureka 30 | # 拉取服务时间 31 | registry-fetch-interval-seconds: 10 32 | instance: 33 | #避免显示主机名 34 | instance-id: cloud-bs-search 35 | #显示IP地址 36 | prefer-ip-address: true 37 | #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30秒) 38 | lease-renewal-interval-in-seconds: 30 39 | #Eureka服务端在收到最后一次心跳后等待时间上线,单位为秒(默认为90秒),超时将剔除服务 40 | lease-expiration-duration-in-seconds: 90 41 | #开启eureka负载均衡策略 42 | ribbon: 43 | eureka: 44 | enabled: true 45 | -------------------------------------------------------------------------------- /cloud-server-user/cloud-user-interface/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | cloud-server-user 7 | com.wxw 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | com.wxw.user 13 | cloud-user-interface 14 | 1.0-SNAPSHOT 15 | 16 | 17 | 18 | com.fasterxml.jackson.core 19 | jackson-databind 20 | 2.10.2 21 | 22 | 23 | 24 | org.hibernate 25 | hibernate-validator 26 | 6.0.8.Final 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /cloud-server-user/cloud-user-interface/src/main/java/com/wxw/cloud/client/UserClient.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.client; 2 | 3 | import com.wxw.cloud.domain.User; 4 | import org.springframework.http.ResponseEntity; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RequestParam; 8 | 9 | /** 10 | * @Author: wxw 11 | * @create: 2020-04-19-12:44 12 | */ 13 | @RequestMapping() 14 | public interface UserClient { 15 | 16 | //@ApiOperation("根据用户名和密码查询指定用户") 17 | @GetMapping("/user/query") 18 | public User volidCode(@RequestParam("username") String username, @RequestParam("passward") String password); 19 | } 20 | -------------------------------------------------------------------------------- /cloud-server-user/cloud-user-service/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | cloud-server-user 7 | com.wxw 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | com.wxw.user 13 | cloud-user-service 14 | 1.0-SNAPSHOT 15 | 16 | 17 | com.wxw.user 18 | cloud-user-interface 19 | 1.0-SNAPSHOT 20 | 21 | 22 | org.springframework.boot 23 | spring-boot-starter-amqp 24 | 25 | 26 | -------------------------------------------------------------------------------- /cloud-server-user/cloud-user-service/src/main/java/com/wxw/cloud/UserMain8085.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 7 | 8 | /** 9 | * @Author: wxw 10 | * @create: 2020-04-17-15:58 11 | */ 12 | @EnableDiscoveryClient 13 | @SpringBootApplication 14 | public class UserMain8085 { 15 | public static void main(String[] args) { 16 | SpringApplication.run(UserMain8085.class, args); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /cloud-server-user/cloud-user-service/src/main/java/com/wxw/cloud/config/MyBatisConfig.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; 4 | import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; 5 | import org.mybatis.spring.annotation.MapperScan; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.transaction.annotation.EnableTransactionManagement; 9 | 10 | /** 11 | * @Author: wxw 12 | * @create: 2020-03-15-1:37 13 | * MyBatis配置类 14 | */ 15 | @EnableTransactionManagement 16 | @Configuration 17 | @MapperScan("com.wxw.cloud.dao") 18 | public class MyBatisConfig { 19 | 20 | /** 21 | * 分页插件 22 | */ 23 | @Bean 24 | public PaginationInterceptor paginationInterceptor() { 25 | 26 | PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); 27 | // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false 28 | // paginationInterceptor.setOverflow(false); 29 | // 设置最大单页限制数量,默认 500 条,-1 不受限制 30 | // paginationInterceptor.setLimit(500); 31 | // 开启 count 的 join 优化,只针对部分 left join 32 | paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); 33 | return paginationInterceptor; 34 | } 35 | } 36 | 37 | -------------------------------------------------------------------------------- /cloud-server-user/cloud-user-service/src/main/java/com/wxw/cloud/dao/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.wxw.cloud.domain.User; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | /** 8 | *

9 | * 用户表 Mapper 接口 10 | *

11 | * 12 | * @author WXW 13 | * @since 2020-04-17 14 | */ 15 | public interface UserMapper extends BaseMapper { 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cloud-server-user/cloud-user-service/src/main/java/com/wxw/cloud/listener/MsgListener.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.listener; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.apache.commons.lang3.StringUtils; 5 | import org.springframework.amqp.rabbit.annotation.Exchange; 6 | import org.springframework.amqp.rabbit.annotation.Queue; 7 | import org.springframework.amqp.rabbit.annotation.QueueBinding; 8 | import org.springframework.amqp.rabbit.annotation.RabbitListener; 9 | import org.springframework.stereotype.Component; 10 | 11 | import java.util.Map; 12 | 13 | /** 14 | * @Author: wxw 15 | * @create: 2020-04-18-0:16 16 | */ 17 | @Slf4j 18 | @Component 19 | public class MsgListener { 20 | 21 | @RabbitListener(bindings = @QueueBinding( 22 | value = @Queue(value = "WXW.SMS.QUEUE", durable = "true"), 23 | exchange = @Exchange(value = "WXW.SMS.EXCHANGE", 24 | ignoreDeclarationExceptions = "true"), 25 | key = {"verifycode.mq"})) 26 | public void listenSms(Map msg) throws Exception { 27 | if (msg == null || msg.size() <= 0) { 28 | // 放弃处理 29 | return; 30 | } 31 | // 消费消息 32 | String code = msg.get("code"); 33 | if (StringUtils.isBlank(code)) { 34 | // 放弃处理 35 | return; 36 | } 37 | // 发送消息 给用户 38 | log.info("消费MQ消息:{}", code); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /cloud-server-user/cloud-user-service/src/main/java/com/wxw/cloud/service/IUserService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import cn.hutool.captcha.LineCaptcha; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.wxw.cloud.domain.User; 6 | 7 | import java.io.OutputStream; 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * 用户表 服务类 13 | *

14 | * 15 | * @author WXW 16 | * @since 2020-04-17 17 | */ 18 | public interface IUserService extends IService { 19 | 20 | Boolean checkUser(String data, Integer type); 21 | 22 | LineCaptcha saveVerifyCode(); 23 | 24 | void register(User user, String code); 25 | 26 | User queryUser(String username, String password); 27 | 28 | List getUserList(); 29 | } 30 | -------------------------------------------------------------------------------- /cloud-server-user/cloud-user-service/src/main/java/com/wxw/cloud/tools/CodecUtils.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.tools; 2 | 3 | import org.apache.commons.codec.digest.DigestUtils; 4 | import org.apache.commons.lang3.StringUtils; 5 | 6 | import java.util.UUID; 7 | 8 | /* 9 | * @ClassName CodecUtils 10 | * @Author 魏小伟 11 | * @Description 12 | * @Date 2020/4/18 11:56 13 | **/ 14 | public class CodecUtils { 15 | 16 | 17 | 18 | public static String md5Hex(String data,String salt) { 19 | if (StringUtils.isBlank(salt)) { 20 | salt = data.hashCode() + ""; 21 | } 22 | return DigestUtils.md5Hex(salt + DigestUtils.md5Hex(data)); 23 | } 24 | 25 | public static String shaHex(String data, String salt) { 26 | if (StringUtils.isBlank(salt)) { 27 | salt = data.hashCode() + ""; 28 | } 29 | return DigestUtils.sha512Hex(salt + DigestUtils.sha512Hex(data)); 30 | } 31 | 32 | public static String generateSalt(){ 33 | return StringUtils.replace(UUID.randomUUID().toString(), "-", ""); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /cloud-server-user/cloud-user-service/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8085 3 | 4 | spring: 5 | profiles: 6 | active: dev 7 | application: 8 | name: cloud-user-service 9 | datasource: 10 | url: jdbc:mysql://localhost:3306/bs-wxw?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai 11 | username: root 12 | password: 123456 13 | type: com.alibaba.druid.pool.DruidDataSource 14 | redis: 15 | host: wxw.plus 16 | port: 6379 17 | rabbitmq: 18 | host: wxw.plus 19 | virtual-host: /wxw 20 | username: wxw 21 | password: wxw 22 | eureka: 23 | client: 24 | service-url: 25 | defaultZone: http://bs.wxw.com:10086/eureka 26 | instance: 27 | #避免显示主机名 28 | instance-id: cloud-user-service 29 | #显示IP地址 30 | prefer-ip-address: true 31 | #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30秒) 32 | lease-renewal-interval-in-seconds: 30 33 | #Eureka服务端在收到最后一次心跳后等待时间上线,单位为秒(默认为90秒),超时将剔除服务 34 | lease-expiration-duration-in-seconds: 90 35 | 36 | -------------------------------------------------------------------------------- /cloud-server-user/cloud-user-service/src/test/java/com/wxw/cloud/TestDao.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import com.wxw.cloud.dao.UserMapper; 4 | import com.wxw.cloud.domain.User; 5 | import com.wxw.cloud.service.IUserService; 6 | import org.junit.jupiter.api.Test; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | 9 | import javax.annotation.Resource; 10 | import java.util.List; 11 | 12 | /** 13 | * @Author: wxw 14 | * @create: 2020-04-17-16:20 15 | */ 16 | @SpringBootTest 17 | public class TestDao { 18 | 19 | @Resource 20 | private UserMapper userMapper; 21 | 22 | @Resource 23 | private IUserService userService; 24 | 25 | @Test 26 | public void testUser(){ 27 | User user = userMapper.selectById(1); 28 | System.out.println("user = " + user); 29 | } 30 | 31 | @Test 32 | public void testList(){ 33 | List userList = this.userService.getUserList(); 34 | System.out.println("user = " + userList); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | cloud-web-server 7 | com.wxw 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | com.wxw.cloud 13 | cloud-bs-interface 14 | 1.0-SNAPSHOT 15 | 16 | 17 | 18 | org.projectlombok 19 | lombok 20 | true 21 | 22 | 23 | org.springframework.boot 24 | spring-boot-starter-web 25 | 26 | 27 | 28 | com.wxw 29 | cloud-server-common 30 | ${project.version} 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/api/BrandAPI.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.api; 2 | 3 | 4 | import com.wxw.cloud.domain.Brand; 5 | import org.springframework.web.bind.annotation.*; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author WXW 11 | * @since 2020-03-28 12 | */ 13 | @RequestMapping("brand") 14 | public interface BrandAPI { 15 | 16 | /** 17 | * 搜索微服务使用 18 | */ 19 | @GetMapping("{id}") 20 | public Brand queryBrandById(@PathVariable("id")Long id); 21 | 22 | 23 | 24 | 25 | 26 | 27 | } 28 | 29 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/api/CategoryAPI.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.api; 2 | 3 | 4 | import com.wxw.cloud.domain.Category; 5 | import org.springframework.http.HttpStatus; 6 | import org.springframework.http.ResponseEntity; 7 | import org.springframework.util.CollectionUtils; 8 | import org.springframework.web.bind.annotation.*; 9 | 10 | import javax.annotation.Resource; 11 | import java.util.List; 12 | 13 | /** 14 | * @author WXW 15 | * @since 2020-03-27 16 | */ 17 | @RequestMapping("/category") 18 | public interface CategoryAPI { 19 | 20 | /** 21 | * 搜索微服务使用 22 | * 根据多个分类ID查询 分类名称 23 | */ 24 | @GetMapping 25 | public List queryNamesByIds(@RequestParam("ids")List ids); 26 | 27 | 28 | 29 | } 30 | 31 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/api/GoodsAPI.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.api; 2 | 3 | import com.wxw.cloud.bo.SpuBO; 4 | import com.wxw.cloud.domain.Sku; 5 | import com.wxw.cloud.domain.Spu; 6 | import com.wxw.cloud.domain.SpuDetail; 7 | import com.wxw.cloud.result.PageResult; 8 | 9 | import org.springframework.web.bind.annotation.GetMapping; 10 | import org.springframework.web.bind.annotation.PathVariable; 11 | import org.springframework.web.bind.annotation.RequestParam; 12 | 13 | import java.util.List; 14 | 15 | public interface GoodsAPI { 16 | 17 | /** 18 | * 根据 spuId查询SKU集合 19 | */ 20 | @GetMapping("sku/list") 21 | public List querySkusBySpuId(@RequestParam("id")Long spuId); 22 | 23 | /** 24 | * 根据条件分页查询SPU 25 | */ 26 | @GetMapping("spu/page") 27 | public PageResult querySpuByPage( 28 | @RequestParam(value = "key",required = false)String key, 29 | @RequestParam(value = "saleable",required = false)Boolean saleable, 30 | @RequestParam(value = "page",defaultValue = "1")Integer page, 31 | @RequestParam(value = "rows",defaultValue = "5")Integer rows 32 | ); 33 | 34 | /** 35 | * 根据spuId查询SpuDetail信息 36 | */ 37 | @GetMapping("spu/detail/{spuId}") 38 | public SpuDetail querySpuDetailBySpuId(@PathVariable("spuId")Long spuId); 39 | 40 | @GetMapping("{id}") 41 | public Spu querySpuById(@PathVariable("id")Long id); 42 | 43 | @GetMapping("sku/{skuId}") 44 | //@ApiOperation("根据skuId查询SKU商品信息") 45 | public Sku querySkuBySkuId(@PathVariable("skuId")Long skuId); 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/api/SpecParamAPI.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.api; 2 | 3 | 4 | import com.wxw.cloud.domain.SpecGroup; 5 | import com.wxw.cloud.domain.SpecParam; 6 | import org.springframework.web.bind.annotation.*; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @author WXW 12 | * @since 2020-04-03 13 | */ 14 | @RequestMapping("/spec") 15 | public interface SpecParamAPI { 16 | 17 | //@ApiOperation("根据条件查询规格参数") 18 | @GetMapping("params") 19 | public List queryParams( 20 | @RequestParam(value = "gid",required = false)Long gid, 21 | @RequestParam(value = "cid",required = false)Long cid, 22 | @RequestParam(value = "generic",required = false)Boolean generic, 23 | @RequestParam(value = "searching",required = false)Boolean searching 24 | ); 25 | 26 | //@ApiOperation("根据分类Id查询组下规格参数") 27 | @GetMapping("group/param/{cid}") 28 | public List queryGroupswithParam(@PathVariable("cid")Long cid); 29 | 30 | 31 | } 32 | 33 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/bo/SkuBO.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.bo; 2 | 3 | import com.wxw.cloud.domain.Sku; 4 | import com.wxw.cloud.domain.Spu; 5 | import com.wxw.cloud.result.PageResult; 6 | import com.wxw.cloud.vo.SkuVO; 7 | import lombok.Data; 8 | 9 | import java.util.List; 10 | import java.util.Set; 11 | 12 | /** 13 | * @Author: wxw 14 | * @create: 2020-05-10-11:30 15 | */ 16 | @Data 17 | public class SkuBO { 18 | 19 | // 三级类目ID 20 | private Set cid3s; 21 | // 三级类目名称 22 | private Set cname; 23 | // sku集合 24 | private PageResult skus; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/bo/SpuBO.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.bo; 2 | 3 | import com.wxw.cloud.domain.Sku; 4 | import com.wxw.cloud.domain.Spu; 5 | import com.wxw.cloud.domain.SpuDetail; 6 | import lombok.Data; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @Author: wxw 12 | * @create: 2020-04-04-16:53 13 | * 扩展spu对象 14 | */ 15 | @Data 16 | public class SpuBO extends Spu { 17 | 18 | private String cname; 19 | 20 | private String bname; 21 | 22 | private SpuDetail spuDetail; 23 | 24 | private List skus; 25 | 26 | 27 | } -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/domain/Brand.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.*; 7 | import lombok.experimental.Accessors; 8 | 9 | import java.io.Serializable; 10 | 11 | /** 12 | *

13 | * 品牌表,一个品牌下有多个商品(spu),一对多关系 14 | *

15 | * 16 | * @author WXW 17 | * @since 2020-03-28 18 | */ 19 | @Getter 20 | @Setter 21 | @ToString 22 | @NoArgsConstructor 23 | @AllArgsConstructor 24 | @EqualsAndHashCode(callSuper = false) 25 | @Accessors(chain = true) 26 | @TableName("tb_brand") 27 | public class Brand implements Serializable { 28 | 29 | private static final long serialVersionUID=1L; 30 | 31 | /** 32 | * 品牌id 33 | */ 34 | @TableId(value = "id", type = IdType.AUTO) 35 | private Long id; 36 | 37 | /** 38 | * 品牌名称 39 | */ 40 | private String name; 41 | 42 | /** 43 | * 品牌图片地址 44 | */ 45 | private String image; 46 | 47 | /** 48 | * 品牌的首字母 49 | */ 50 | private String letter; 51 | 52 | 53 | } 54 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/domain/Category.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.*; 7 | import lombok.experimental.Accessors; 8 | 9 | import java.io.Serializable; 10 | 11 | /** 12 | *

13 | * 商品类目表,类目和商品(spu)是一对多关系,类目与品牌是多对多关系 14 | *

15 | * 16 | * @author WXW 17 | * @since 2020-03-27 18 | */ 19 | @Getter 20 | @Setter 21 | @ToString 22 | @NoArgsConstructor 23 | @AllArgsConstructor 24 | @TableName("tb_category") 25 | public class Category implements Serializable { 26 | 27 | private static final long serialVersionUID=1L; 28 | 29 | /** 30 | * 类目id 31 | */ 32 | @TableId(value = "id", type = IdType.AUTO) 33 | private Long id; 34 | 35 | /** 36 | * 类目名称 37 | */ 38 | private String name; 39 | 40 | /** 41 | * 父类目id,顶级类目填0 42 | */ 43 | private Long parentId; 44 | 45 | /** 46 | * 是否为父节点,0为否,1为是 47 | */ 48 | private Boolean isParent; 49 | 50 | /** 51 | * 排序指数,越小越靠前 52 | */ 53 | private Integer sort; 54 | 55 | 56 | } 57 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/domain/SpecGroup.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.baomidou.mybatisplus.annotation.IdType; 6 | import com.baomidou.mybatisplus.annotation.TableId; 7 | 8 | import java.beans.Transient; 9 | import java.io.Serializable; 10 | import java.util.List; 11 | 12 | import lombok.Data; 13 | import lombok.EqualsAndHashCode; 14 | import lombok.experimental.Accessors; 15 | 16 | /** 17 | *

18 | * 规格参数的分组表,每个商品分类下有多个规格参数组 19 | *

20 | * 21 | * @author WXW 22 | * @since 2020-04-03 23 | */ 24 | @Data 25 | @EqualsAndHashCode(callSuper = false) 26 | @Accessors(chain = true) 27 | @TableName("tb_spec_group") 28 | public class SpecGroup implements Serializable { 29 | 30 | private static final long serialVersionUID=1L; 31 | 32 | /** 33 | * 主键 34 | */ 35 | @TableId(value = "id", type = IdType.AUTO) 36 | private Long id; 37 | 38 | /** 39 | * 商品分类id,一个分类下有多个规格组 40 | */ 41 | private Long cid; 42 | 43 | /** 44 | * 规格组的名称 45 | */ 46 | private String name; 47 | 48 | @TableField(exist = false) 49 | private List params; 50 | 51 | 52 | } 53 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/domain/SpecParam.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.baomidou.mybatisplus.annotation.IdType; 6 | import com.baomidou.mybatisplus.annotation.TableId; 7 | import java.io.Serializable; 8 | import lombok.Data; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.experimental.Accessors; 11 | 12 | /** 13 | *

14 | * 规格参数组下的参数名 15 | *

16 | * 17 | * @author WXW 18 | * @since 2020-04-03 19 | */ 20 | @Data 21 | @EqualsAndHashCode(callSuper = false) 22 | @Accessors(chain = true) 23 | @TableName("tb_spec_param") 24 | public class SpecParam implements Serializable { 25 | 26 | private static final long serialVersionUID=1L; 27 | 28 | /** 29 | * 主键 30 | */ 31 | @TableId(value = "id", type = IdType.AUTO) 32 | private Long id; 33 | 34 | /** 35 | * 商品分类id 36 | */ 37 | private Long cid; 38 | 39 | private Long groupId; 40 | 41 | /** 42 | * 参数名 43 | */ 44 | private String name; 45 | 46 | /** 47 | * 是否是数字类型参数,true或false 48 | * 关键字处理办法如下 49 | */ 50 | @TableField(value = "`numeric`") 51 | private Boolean numeric; 52 | 53 | /** 54 | * 数字类型参数的单位,非数字类型可以为空 55 | */ 56 | private String unit; 57 | 58 | /** 59 | * 是否是sku通用属性,true或false 60 | */ 61 | private Boolean generic; 62 | 63 | /** 64 | * 是否用于搜索过滤,true或false 65 | */ 66 | private Boolean searching; 67 | 68 | /** 69 | * 数值类型参数,如果需要搜索,则添加分段间隔值,如CPU频率间隔:0.5-1.0 70 | */ 71 | private String segments; 72 | 73 | 74 | } 75 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/domain/Spu.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import java.time.LocalDateTime; 7 | import java.io.Serializable; 8 | 9 | import com.fasterxml.jackson.annotation.JsonFormat; 10 | import lombok.Data; 11 | import lombok.EqualsAndHashCode; 12 | import lombok.experimental.Accessors; 13 | 14 | /** 15 | *

16 | * spu表,该表描述的是一个抽象性的商品,比如 iphone8 17 | *

18 | * 19 | * @author WXW 20 | * @since 2020-04-04 21 | */ 22 | @Data 23 | @EqualsAndHashCode(callSuper = false) 24 | @Accessors(chain = true) 25 | @TableName("tb_spu") 26 | public class Spu implements Serializable { 27 | 28 | private static final long serialVersionUID=1L; 29 | 30 | /** 31 | * spu id 32 | */ 33 | @TableId(value = "id", type = IdType.AUTO) 34 | private Long id; 35 | 36 | /** 37 | * 标题 38 | */ 39 | private String title; 40 | 41 | /** 42 | * 子标题 43 | */ 44 | private String subTitle; 45 | 46 | /** 47 | * 1级类目id 48 | */ 49 | private Long cid1; 50 | 51 | /** 52 | * 2级类目id 53 | */ 54 | private Long cid2; 55 | 56 | /** 57 | * 3级类目id 58 | */ 59 | private Long cid3; 60 | 61 | /** 62 | * 商品所属品牌id 63 | */ 64 | private Long brandId; 65 | 66 | /** 67 | * 是否上架,0下架,1上架 68 | */ 69 | private Boolean saleable; 70 | 71 | /** 72 | * 是否有效,0已删除,1有效 73 | */ 74 | private Boolean valid; 75 | 76 | /** 77 | * 添加时间 78 | */ 79 | private LocalDateTime createTime; 80 | 81 | /** 82 | * 最后修改时间 83 | */ 84 | private LocalDateTime lastUpdateTime; 85 | 86 | 87 | } 88 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/domain/SpuDetail.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import java.io.Serializable; 7 | import lombok.Data; 8 | import lombok.EqualsAndHashCode; 9 | import lombok.experimental.Accessors; 10 | 11 | /** 12 | *

13 | * 14 | *

15 | * 16 | * @author WXW 17 | * @since 2020-04-04 18 | */ 19 | @Data 20 | @EqualsAndHashCode(callSuper = false) 21 | @Accessors(chain = true) 22 | @TableName("tb_spu_detail") 23 | public class SpuDetail implements Serializable { 24 | 25 | private static final long serialVersionUID=1L; 26 | 27 | @TableId(value = "spu_id",type = IdType.NONE) 28 | private Long spuId; 29 | 30 | /** 31 | * 商品描述信息 32 | */ 33 | private String description; 34 | 35 | /** 36 | * 通用规格参数数据 37 | */ 38 | private String genericSpec; 39 | 40 | /** 41 | * 特有规格参数及可选值信息,json格式 42 | */ 43 | private String specialSpec; 44 | 45 | /** 46 | * 包装清单 47 | */ 48 | private String packingList; 49 | 50 | /** 51 | * 售后服务 52 | */ 53 | private String afterService; 54 | 55 | 56 | } 57 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/domain/Stock.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.domain; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import java.io.Serializable; 7 | import lombok.Data; 8 | import lombok.EqualsAndHashCode; 9 | import lombok.experimental.Accessors; 10 | 11 | /** 12 | *

13 | * 库存表,代表库存,秒杀库存等信息 14 | *

15 | * 16 | * @author WXW 17 | * @since 2020-04-05 18 | */ 19 | @Data 20 | @EqualsAndHashCode(callSuper = false) 21 | @Accessors(chain = true) 22 | @TableName("tb_stock") 23 | public class Stock implements Serializable { 24 | 25 | private static final long serialVersionUID=1L; 26 | 27 | /** 28 | * 库存对应的商品sku id 29 | */ 30 | @TableId(value = "sku_id", type = IdType.NONE) 31 | private Long skuId; 32 | 33 | /** 34 | * 可秒杀库存 35 | */ 36 | private Integer seckillStock; 37 | 38 | /** 39 | * 秒杀总数量 40 | */ 41 | private Integer seckillTotal; 42 | 43 | /** 44 | * 库存数量 45 | */ 46 | private Integer stock; 47 | 48 | 49 | } 50 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-interface/src/main/java/com/wxw/cloud/vo/SkuVO.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.vo; 2 | 3 | import com.wxw.cloud.domain.Sku; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Author: wxw 8 | * @create: 2020-05-10-19:14 9 | */ 10 | @Data 11 | public class SkuVO extends Sku { 12 | 13 | // 副标题 14 | private String subtitle; 15 | } 16 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/BS2020Main.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 7 | import org.springframework.cloud.netflix.eureka.EnableEurekaClient; 8 | 9 | /** 10 | * @Author: wxw 11 | * @create: 2020-03-26-23:35 12 | */ 13 | @EnableEurekaClient 14 | @SpringBootApplication 15 | public class BS2020Main { 16 | public static void main(String[] args) { 17 | SpringApplication.run(BS2020Main.class, args); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/config/MyBatisConfig.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.config; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; 4 | import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; 5 | import org.mybatis.spring.annotation.MapperScan; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.transaction.annotation.EnableTransactionManagement; 9 | 10 | /** 11 | * @Author: wxw 12 | * @create: 2020-03-15-1:37 13 | * MyBatis配置类 14 | */ 15 | @EnableTransactionManagement 16 | @Configuration 17 | @MapperScan("com.wxw.cloud.dao") 18 | public class MyBatisConfig { 19 | 20 | /** 21 | * 分页插件 22 | */ 23 | @Bean 24 | public PaginationInterceptor paginationInterceptor() { 25 | 26 | PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); 27 | // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false 28 | // paginationInterceptor.setOverflow(false); 29 | // 设置最大单页限制数量,默认 500 条,-1 不受限制 30 | // paginationInterceptor.setLimit(500); 31 | // 开启 count 的 join 优化,只针对部分 left join 32 | paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); 33 | return paginationInterceptor; 34 | } 35 | } 36 | 37 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/controller/StockController.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.controller; 2 | 3 | 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | /** 9 | *

10 | * 库存表,代表库存,秒杀库存等信息 前端控制器 11 | *

12 | * 13 | * @author WXW 14 | * @since 2020-04-05 15 | */ 16 | @RestController 17 | @RequestMapping("/stock") 18 | public class StockController { 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/BrandMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.wxw.cloud.domain.Brand; 5 | import org.apache.ibatis.annotations.Delete; 6 | import org.apache.ibatis.annotations.Insert; 7 | import org.apache.ibatis.annotations.Param; 8 | import org.apache.ibatis.annotations.Select; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | *

14 | * 品牌表,一个品牌下有多个商品(spu),一对多关系 Mapper 接口 15 | *

16 | * 17 | * @author WXW 18 | * @since 2020-03-28 19 | */ 20 | public interface BrandMapper extends BaseMapper { 21 | 22 | @Insert("INSERT INTO tb_category_brand (category_id,brand_id) VALUES (#{cid},#{bid})") 23 | void insertCategoryAndBrand(@Param("cid") Long cid,@Param("bid") Long bid); 24 | 25 | @Delete("DELETE FROM tb_category_brand where brand_id=#{bid}") 26 | void deleteCategoryBrandId(Long id); 27 | 28 | @Select("SELECT b.* from tb_brand b INNER JOIN tb_category_brand cb on b.id=cb.brand_id where cb.category_id=#{cid}") 29 | List queryBrandsByCid(Long cid); 30 | } 31 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/CategoryMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.wxw.cloud.domain.Category; 5 | import org.apache.ibatis.annotations.Select; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | *

11 | * 商品类目表,类目和商品(spu)是一对多关系,类目与品牌是多对多关系 Mapper 接口 12 | *

13 | * 14 | * @author WXW 15 | * @since 2020-03-27 16 | */ 17 | public interface CategoryMapper extends BaseMapper { 18 | 19 | 20 | /** 21 | * 根据品牌id查询商品分类集 22 | * @param bid 23 | * @return 24 | */ 25 | @Select("SELECT * FROM tb_category WHERE id IN (SELECT category_id FROM tb_category_brand WHERE brand_id=#{bid})") 26 | List queryByBrandId(Long bid); 27 | } 28 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/SkuMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.wxw.cloud.domain.Sku; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * sku表,该表表示具体的商品实体,如黑色的 64g的iphone 8 Mapper 接口 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-05 13 | */ 14 | public interface SkuMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/SpecGroupMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.wxw.cloud.domain.SpecGroup; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * 规格参数的分组表,每个商品分类下有多个规格参数组 Mapper 接口 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-03 13 | */ 14 | public interface SpecGroupMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/SpecParamMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.wxw.cloud.domain.SpecParam; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * 规格参数组下的参数名 Mapper 接口 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-03 13 | */ 14 | public interface SpecParamMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/SpuDetailMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.wxw.cloud.domain.SpuDetail; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * Mapper 接口 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-04 13 | */ 14 | public interface SpuDetailMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/SpuMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.wxw.cloud.domain.Spu; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * spu表,该表描述的是一个抽象性的商品,比如 iphone8 Mapper 接口 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-04 13 | */ 14 | public interface SpuMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/StockMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.dao; 2 | 3 | import com.wxw.cloud.domain.Stock; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * 库存表,代表库存,秒杀库存等信息 Mapper 接口 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-05 13 | */ 14 | public interface StockMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/mapper/BrandMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | id, name, image, letter 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/mapper/CategoryMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | id, name, parent_id, is_parent, sort 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/mapper/SkuMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | id, spu_id, title, images, price, indexes, own_spec, enable, create_time, last_update_time 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/mapper/SpecGroupMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | id, cid, name 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/mapper/SpecParamMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | id, cid, group_id, name, numeric, unit, generic, searching, segments 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/dao/mapper/StockMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | sku_id, seckill_stock, seckill_total, stock 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/service/IBrandService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.wxw.cloud.domain.Brand; 5 | import com.wxw.cloud.result.PageResult; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | *

11 | * 品牌表,一个品牌下有多个商品(spu),一对多关系 服务类 12 | *

13 | * 14 | * @author WXW 15 | * @since 2020-03-28 16 | */ 17 | public interface IBrandService extends IService { 18 | 19 | PageResult queryBrandsByPage(String key, Integer page, Integer rows, String sortBy, Boolean desc); 20 | 21 | void saveBrand(Brand brand, List cids); 22 | 23 | void updateBrand(Brand brand, List cids); 24 | 25 | void deleteBrand(Long brandId); 26 | 27 | List queryBrandsByCid(Long cid); 28 | 29 | Brand queryBrandById(Long id); 30 | } 31 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/service/ICategoryService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.wxw.cloud.domain.Category; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | *

10 | * 商品类目表,类目和商品(spu)是一对多关系,类目与品牌是多对多关系 服务类 11 | *

12 | * 13 | * @author WXW 14 | * @since 2020-03-27 15 | */ 16 | public interface ICategoryService extends IService { 17 | 18 | /** 19 | * 根据parentId查询子类目 20 | * @param pid 21 | * @return 22 | */ 23 | List queryCategoriesById(Long pid); 24 | 25 | /** 26 | * 根据品牌ID 查询商品分类列表 27 | * @param bid 28 | * @return 29 | */ 30 | List queryByBrandId(Long bid); 31 | 32 | /** 33 | * 根据多个分类ID查询 分类名称 34 | * @param ids 35 | * @return 36 | */ 37 | public List queryNamesByIds(List ids); 38 | 39 | } 40 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/service/IGoodsService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.wxw.cloud.bo.SkuBO; 4 | import com.wxw.cloud.bo.SpuBO; 5 | import com.wxw.cloud.domain.Sku; 6 | import com.wxw.cloud.domain.Spu; 7 | import com.wxw.cloud.domain.SpuDetail; 8 | import com.baomidou.mybatisplus.extension.service.IService; 9 | import com.wxw.cloud.result.PageResult; 10 | 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | /** 15 | *

16 | * 商品管理接口 17 | *

18 | * 19 | * @author WXW 20 | * @since 2020-04-04 21 | */ 22 | public interface IGoodsService { 23 | 24 | /** 25 | * 根据条件分页查询SPU 26 | */ 27 | PageResult querySpuByPage(String key, Boolean saleable, Integer page, Integer rows); 28 | 29 | /** 30 | * 新增商品 31 | * @param spuBO 32 | */ 33 | void saveGoods(SpuBO spuBO); 34 | 35 | /** 36 | * 根据spuId查询SpuDetail信息 37 | * @param spuId 38 | * @return 39 | */ 40 | SpuDetail querySpuDetailBySpuId(Long spuId); 41 | 42 | /** 43 | * 根据 spuId查询SKU集合 44 | * @param spuId 45 | * @return 46 | */ 47 | List querySkusBySpuId(Long spuId); 48 | 49 | /** 50 | * 修改商品信息 51 | * @param spuBO 52 | */ 53 | void updateGoods(SpuBO spuBO); 54 | 55 | /** 56 | * 根据spuId查询spu 57 | * @param id 58 | * @return 59 | */ 60 | Spu querySpuById(Long id); 61 | 62 | /** 63 | * 根据skuId查询SKU商品信息 64 | * @param skuId 65 | * @return 66 | */ 67 | Sku querySkuBySkuId(Long skuId); 68 | 69 | // 分页查询SKU集合信息 包括三级类目 - 全部商品展示 70 | SkuBO getSkusAndCid3(Integer page,Integer rows); 71 | 72 | // 商品详情页数据加载 73 | Map loadData(Long spuId); 74 | } 75 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/service/ISpecGroupService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.wxw.cloud.domain.SpecGroup; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | *

10 | * 规格参数的分组表,每个商品分类下有多个规格参数组 服务类 11 | *

12 | * 13 | * @author WXW 14 | * @since 2020-04-03 15 | */ 16 | public interface ISpecGroupService extends IService { 17 | 18 | List queryGroupsByCid(Long cid); 19 | 20 | void saveGroup(SpecGroup specGroup); 21 | 22 | void updateGroup(SpecGroup specGroup); 23 | 24 | List queryGroupswithParam(Long cid); 25 | } 26 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/service/ISpecParamService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.wxw.cloud.domain.SpecGroup; 4 | import com.wxw.cloud.domain.SpecParam; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | *

11 | * 规格参数组下的参数名 服务类 12 | *

13 | * 14 | * @author WXW 15 | * @since 2020-04-03 16 | */ 17 | public interface ISpecParamService extends IService { 18 | 19 | /** 20 | * 根据条件查询规格参数 21 | * @param gid 22 | * @return 23 | */ 24 | List queryParams(Long gid, Long cid, Boolean generic, Boolean searching); 25 | } 26 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/service/IStockService.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service; 2 | 3 | import com.wxw.cloud.domain.Stock; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 库存表,代表库存,秒杀库存等信息 服务类 9 | *

10 | * 11 | * @author WXW 12 | * @since 2020-04-05 13 | */ 14 | public interface IStockService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/service/impl/SpecParamServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.wxw.cloud.domain.SpecGroup; 5 | import com.wxw.cloud.domain.SpecParam; 6 | import com.wxw.cloud.dao.SpecParamMapper; 7 | import com.wxw.cloud.service.ISpecParamService; 8 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Service; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | *

16 | * 规格参数组下的参数名 服务实现类 17 | *

18 | * 19 | * @author WXW 20 | * @since 2020-04-03 21 | */ 22 | @Service 23 | public class SpecParamServiceImpl extends ServiceImpl implements ISpecParamService { 24 | 25 | @Autowired 26 | private SpecParamMapper specParamMapper; 27 | 28 | @Override 29 | public List queryParams(Long gid, Long cid, Boolean generic, Boolean searching) { 30 | 31 | QueryWrapper wrapper = new QueryWrapper<>(); 32 | wrapper.eq(false,"group_id",gid); 33 | wrapper.eq(false,"cid", cid); 34 | wrapper.eq(false,"generic", generic); 35 | wrapper.eq(false,"searching", searching); 36 | return this.specParamMapper.selectList(wrapper); 37 | } 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | } 47 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/service/impl/StockServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.service.impl; 2 | 3 | import com.wxw.cloud.domain.Stock; 4 | import com.wxw.cloud.dao.StockMapper; 5 | import com.wxw.cloud.service.IStockService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 库存表,代表库存,秒杀库存等信息 服务实现类 12 | *

13 | * 14 | * @author WXW 15 | * @since 2020-04-05 16 | */ 17 | @Service 18 | public class StockServiceImpl extends ServiceImpl implements IStockService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/java/com/wxw/cloud/tools/TestPath.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud.tools; 2 | 3 | import cn.hutool.core.io.FileUtil; 4 | import cn.hutool.core.util.PageUtil; 5 | 6 | import java.io.File; 7 | import java.io.FileInputStream; 8 | 9 | /** 10 | * @Author: wxw 11 | * @create: 2020-03-27-0:14 12 | */ 13 | public class TestPath { 14 | public static void main(String[] args) { 15 | //获取程序当前路径 F:\Study_GO\Study_Project\bs-cloud 16 | System.out.println(System.getProperty("user.dir")); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8081 3 | 4 | spring: 5 | profiles: 6 | active: dev 7 | application: 8 | name: cloud-bs-service 9 | datasource: 10 | url: jdbc:mysql://localhost:3306/bs-wxw?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai 11 | username: root 12 | password: 123456 13 | type: com.alibaba.druid.pool.DruidDataSource 14 | rabbitmq: 15 | host: wxw.plus 16 | virtual-host: /wxw 17 | username: wxw 18 | password: wxw 19 | template: 20 | exchange: WXW.ITEM.EXCHANGE 21 | eureka: 22 | client: 23 | service-url: 24 | defaultZone: http://bs.wxw.com:10086/eureka 25 | instance: 26 | #避免显示主机名 27 | instance-id: cloud-bs-service 28 | #显示IP地址 29 | prefer-ip-address: true 30 | #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30秒) 31 | lease-renewal-interval-in-seconds: 30 32 | #Eureka服务端在收到最后一次心跳后等待时间上线,单位为秒(默认为90秒),超时将剔除服务 33 | lease-expiration-duration-in-seconds: 90 34 | 35 | ## mybatis-plus相关配置 36 | #mybatis-plus: 37 | # # xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置) 38 | # mapper-locations: com.wxw.cloud.dao.mapper/*.xml 39 | # # 以下配置均有默认值,可以不设置 40 | # global-config: 41 | # db-config: 42 | # #主键类型 AUTO:"数据库ID自增" INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID"; 43 | # id-type: auto 44 | # table-prefix: tb_ 45 | # configuration: 46 | # # 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射 47 | # map-underscore-to-camel-case: true 48 | # # 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段 49 | # call-setters-on-nulls: true 50 | # # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 51 | # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 52 | 53 | 54 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/test/java/com/wxw/cloud/TestBrand.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import com.wxw.cloud.domain.Brand; 4 | import com.wxw.cloud.result.PageResult; 5 | import com.wxw.cloud.service.IBrandService; 6 | import org.junit.jupiter.api.Test; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | 10 | /** 11 | * @Author: wxw 12 | * @create: 2020-03-30-0:26 13 | */ 14 | @SpringBootTest 15 | public class TestBrand { 16 | 17 | @Autowired 18 | private IBrandService brandService; 19 | 20 | @Test 21 | public void testBrandPage(){ 22 | PageResult result = brandService.queryBrandsByPage("苹", 1, 5,"id", true); 23 | System.out.println("result.getItems() = " + result.getItems()); 24 | System.out.println("result.getTotal() = " + result.getTotal()); 25 | System.out.println("result.getTotalPage() = " + result.getTotalPage()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/test/java/com/wxw/cloud/TestCategory.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import com.wxw.cloud.domain.Category; 4 | import com.wxw.cloud.service.ICategoryService; 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | import org.springframework.http.HttpStatus; 8 | import org.springframework.http.ResponseEntity; 9 | 10 | import javax.annotation.Resource; 11 | 12 | /** 13 | * @Author: wxw 14 | * @create: 2020-03-30-14:33 15 | */ 16 | @SpringBootTest 17 | public class TestCategory { 18 | 19 | @Resource 20 | private ICategoryService categoryService; 21 | 22 | 23 | // 根据ID判断,已经存在就更新节点负责新增节点 24 | @Test 25 | public void TestsoavOrUpdate(){ 26 | 27 | Category category = new Category(0L,"农机",0L,true,3); 28 | boolean flag = categoryService.saveOrUpdate(category); 29 | System.out.println("flag = " + flag); 30 | } 31 | 32 | // 测试根据ID删除节点 33 | @Test 34 | public void testDeleteById(){ 35 | boolean b = categoryService.removeById(2); 36 | System.out.println(b); 37 | } 38 | 39 | @Test 40 | public void TestResponstity(){ 41 | ResponseEntity entity = new ResponseEntity<>("result[]",HttpStatus.CREATED); 42 | System.out.println("entity = " + entity); 43 | System.out.println("ResponseEntity.ok(\"code\") = " + ResponseEntity.ok("code")); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /cloud-web-server/cloud-bs-service/src/test/java/com/wxw/cloud/TestMapper.java: -------------------------------------------------------------------------------- 1 | package com.wxw.cloud; 2 | 3 | import cn.hutool.json.JSONUtil; 4 | import com.wxw.cloud.dao.CategoryMapper; 5 | import com.wxw.cloud.dao.StockMapper; 6 | import com.wxw.cloud.domain.Category; 7 | import com.wxw.cloud.domain.Stock; 8 | import org.junit.jupiter.api.Test; 9 | import org.slf4j.Logger; 10 | import org.slf4j.LoggerFactory; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.boot.test.context.SpringBootTest; 13 | 14 | import javax.annotation.Resource; 15 | import java.util.List; 16 | 17 | /** 18 | * @Author: wxw 19 | * @create: 2020-03-27-15:59 20 | */ 21 | @SpringBootTest 22 | public class TestMapper { 23 | 24 | Logger LOGGER = LoggerFactory.getLogger(TestMapper.class); 25 | 26 | @Autowired 27 | private CategoryMapper categoryMapper; 28 | 29 | @Resource 30 | private StockMapper stockMapper; 31 | @Test 32 | public void findBrand(){ 33 | Category category = categoryMapper.selectById(1); 34 | LOGGER.info("商品信息=>", JSONUtil.toJsonStr(category)); 35 | } 36 | 37 | @Test 38 | public void testStock(){ 39 | Stock stock = this.stockMapper.selectById(50); 40 | System.out.println(stock.getStock()); 41 | } 42 | 43 | 44 | } 45 | -------------------------------------------------------------------------------- /cloud-web-server/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | bs-cloud 7 | com.wxw 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | cloud-web-server 13 | pom 14 | 15 | cloud-bs-interface 16 | cloud-bs-service 17 | 18 | 19 | 20 | com.baomidou 21 | mybatis-plus-boot-starter 22 | 3.3.1.tmp 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /help.txt: -------------------------------------------------------------------------------- 1 | 启动依赖项(前端和后台项目) 2 | 3 | (1) 依赖本人阿里云服务器配置 4 | - FastDFS 文件系统 5 | - Nginx 6 | - RabbitMQ 7 | - ElasticSearch /home/wxw/elasticsearch/bin/ 8 | - Redis 9 | 10 | (2) 本地依赖 11 | - 本地nginx配置 12 | - SwitchHost 域名绑定配置 13 | - 先启动es,在启动kibana 可以可视化 14 | 15 | (3) 展示辅助项 16 | - API微服务系统所有接口:http://bs.wxw.com:10010/swagger-ui.html 17 | --------------------------------------------------------------------------------