![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
分布式电商项目
分布式
小杨与bug的斗争
这个作者很懒,什么都没留下…
展开
-
秒杀模块的实现
需求分析所谓“秒杀”,就是网络卖家发布一些超低价格的商品,所有买家在同一时间网上抢购的一种销售方式。秒杀商品通常有两种限制:库存限制、时间限制。(1)商品详细页显示秒杀商品信息,点击立即抢购实现秒杀下单,下单时扣减库存。当库存为0或不在活动期范围内时无法秒杀。(2)秒杀下单成功,直接跳转到支付页面(支付宝扫码),支付成功,跳转到成功页,填写收货地址、电话、收件人等信息,完成订单。(3)当用户秒杀下单5分钟内未支付,取消预订单,调用支付宝支付的关闭订单接口,恢复库存。秒杀技术实现核心思想是运用缓存原创 2020-06-13 20:37:39 · 389 阅读 · 0 评论 -
支付宝支付的实现
创建youxin_pay_interface的jar工程,依赖pojo创建youxin_pay_service的war工程,除了项目依赖,需要加入支付的依赖<!-- 支付宝支付所需类库包 --><dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.4.27.ALL<原创 2020-06-12 13:28:37 · 1061 阅读 · 0 评论 -
购物车列表的存储实现
需求分析当我们点击加入购物车的时候,将商品加入到我们的购物车,页面传递到后台的信息是商品的id和数量,我们根据id和数量将商品放进购物车,购物车数据存储到cookie或者是服务器端购物车列表在cookie的存储指的是我们在不登录的情况下也能将商品添加到购物车,这时购物车中的商品信息存储在浏览器端的cookie,用户清除浏览器缓存或者cookie过期后,购物车中就不存在商品信息创建购物车的单个商家对象Cart,List Cart构成了购物车,Cart对象存储的是像京东自营、xx专卖店所包含商品的数据原创 2020-06-10 00:15:42 · 400 阅读 · 0 评论 -
短信微服务
文章目录发送短信测试微服务搭建发送短信测试创建aldy_demo的jar工程导入依赖信息<dependencies> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>3.7.1</version> </dependency> &l原创 2020-06-08 11:19:28 · 184 阅读 · 0 评论 -
ActiveMQ在分布式项目中的解耦应用
1213原创 2020-06-07 17:00:21 · 276 阅读 · 0 评论 -
网页静态化技术Freemarker在分布式项目中的应用
文章目录Freemarker的概述工程搭建需求分析及实现Freemarker的概述网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道。对于电商网站的商品详细页来说,至少几百万个商品,每个商品又有大量的信息,这样的情况同样也适用于使用网页静态化来解决。网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO。另外我们如果将网原创 2020-06-06 21:57:47 · 314 阅读 · 1 评论 -
solr的应用(五)多关键字搜索、搜索结果排序、同步索引库
文章目录多关键字搜索处理搜索结果排序多关键字搜索处理在添加条件查询时先对搜索关键字进行替换处理String keywords = (String) searchMap.get("keywords");if (keywords!=null && !"".equals(keywords)){ searchMap.put("keywords",keywords.replace(" ",""));}搜索结果排序导入Sort的包如图所示Sort s = new Sort(原创 2020-06-05 10:01:30 · 543 阅读 · 0 评论 -
solr的应用(四)商品搜索的过滤查询以及分页显示
前端请求查询的参数{ "keywords": "手机", "category": "", "brand": "三星", "spec": { "网络": "移动3G", "机身内存": "16G" }, "price": "", "pageNo": 1, "pageSize": 20}后端使用 Map进行接收fq 值是一个查询,用于过滤查询结果,在负责查询时,可以很好的提高查询效率判断字符串是否为空用空串和equals方法判断,判断对象是否为空使用n原创 2020-06-04 17:13:58 · 268 阅读 · 1 评论 -
redis的应用(三)与solr的联合查询
文章目录需求分析缓存实现前端接口查询缓存的实现测试需求分析根据搜索关键字,页面显示相关的商品分类,根据相关的商品分类借助分类模板从后台查询出品牌、规格以及规格选项进行显示为了应对高并发,将根据相关的商品分类借助分类模板从后台查询出品牌、规格以及规格选项保存到redis数据库中,查询的时候不再从关系数据库中查询,直接从更快的redis数据库中查询涉及到的数据库表有三个:缓存实现缓存这些数据要在运营商后台管理中进行(因为运营商后台管理对这些数据进行增删改查的操作),查询这些数据是在搜索服务中调原创 2020-06-04 13:54:31 · 584 阅读 · 0 评论 -
solr的应用(三)solr在分布式项目中的查询
solr在分布式项目中的查询创建jar工程youlexuan_search_interface和war工程youlexuan_search_serviceyoulexuan_search_interface需要依赖youlexuan_pojo<dependencies> <dependency> <groupId>com.youxin</groupId> <artifactId>youlexuan_p原创 2020-06-03 21:39:03 · 251 阅读 · 0 评论 -
solr的应用(二)在分布式电商项目中批量导入数据
文章目录项目搭建导入数据到solr项目搭建在父工程中添加依赖<spring-data-solr.version>1.5.5.RELEASE</spring-data-solr.version><dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-solr</artifactId> <原创 2020-06-03 16:13:41 · 195 阅读 · 0 评论 -
solr的应用(一)
基本概述Solr是一个开源搜索平台,用于构建搜索应用程序。 它建立在Lucene(全文搜索引擎)之上。Solr是企业级的,快速的,高度可扩展的。为了在CNET网络的公司网站上添加搜索功能,Yonik Seely于2004年创建了Solr。并在2006年1月,它成为Apache软件基金会下的一个开源项目。并于2016年发布最新版本Solr 6.0,支持并行SQL查询的执行。Solr可以和Hadoop一起使用。由于Hadoop处理大量数据,Solr帮助我们从这么大的源中找到所需的信息。不仅限于搜索,Sol原创 2020-06-03 12:02:00 · 258 阅读 · 0 评论 -
redis缓存应用(二)增删改查的redis
在service层注入redisTemplate对象,在业务代码中通过操作redisTemplate对象的方法实现对redis数据库的增删改查操作redisTemplate的bean是在spring-redis.xml中创建的,交给spring容器管理。@Autowiredprivate RedisTemplate redisTemplate;先在数据库中查询数据,如果查询结果为空,再从数据库中查询,数据库中查询到结果后存入缓存中,这样下次再进行查询的时候就能从缓存中查询到public Li..原创 2020-06-02 15:22:08 · 548 阅读 · 1 评论 -
redis缓存应用(一)
文章目录基本概述安装Spring Data Redis入门Demo基本概述对于网站首页每天有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪。那如何解决呢?我们通常的做法有两种:一种是数据缓存、一种是网页静态化redisredis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写。企业开发通常采用Redis来实现缓存。同类的产品还有memcache 、memcached 、MongoDB等。jedisJedis是Redis官方推出的一款面向Java的客户端,提供了很多接口原创 2020-06-02 14:40:36 · 225 阅读 · 0 评论 -
dubbo多个生产者启动报错
报错信息ERROR org.springframework.web.context.ContextLoader - Context initialization failedcom.alibaba.dubbo.rpc.RpcException: Fail to start server具体表现是两个服务相继启动的时候,第二个启动的服务会报错,调换启动顺序后,第一个服务正常启动,第二个服务启动失败原因在于我配置了两个service(生产者),但是这两个生产者的port是相同的,(配置文件是直接粘的第原创 2020-06-02 09:43:33 · 424 阅读 · 0 评论 -
后端验证用户修改的商品是否属于当前登录用户
后端验证用户修改的商品是否属于当前登录用户分两个验证一个是根据用户修改的商品数据中的商家信息和当前登录的商家信息进行对比另一个是根据用户修改的商品信息中的id,在数据库中进行查询,将查询出来数据中的商家信息和当前登录信息进行对比@RequestMapping("/update")public Result update(@RequestBody Goods goods){ //验证商品是否是当前商家的id Goods goods2 = goodsService.findOne(goods.get原创 2020-06-01 11:24:13 · 236 阅读 · 1 评论 -
接近实际的电商平台添加商品——spu与sku
基本概述什么是spu?SPU = Standard Product Unit (标准产品单位)SPU是商品信息聚合的最小单位,是一组可复用、易检索的标准化信息的集合,该集合描述了一个产品的特性。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。什么是sku?SKU=stock keeping unit(库存量单位)SKU即库存进出计量的单位, 可以是以件、盒、托盘等为单位。SKU是物理上不可分割的最小存货单元。在使用时要根据不同业态,不同管理模式来处理。在服装、鞋类商品中使用最多最普遍。原创 2020-05-31 21:18:16 · 690 阅读 · 0 评论 -
数据库转map类型的list集合以及组合查询
在数据库中brand_ids存储的是字符串类型,我们在后端查询出来的结果也是字符串类型,也就是说我们在后端编辑器里无法对这些map类型的list集合字符串进行list或map操作但这并不影响前端展示这些数据,我们只需要把这些数据以字符串的形式或者整个表返回给前端前端页面将json格式的字符串数组转化成json对象,之后就可以就进行遍历$scope.list = JSON.parse(resp.brandIds);那后端如何将map集合类型的字符串转化成List<Map ?List<.原创 2020-05-31 13:41:37 · 407 阅读 · 0 评论 -
spring-security密码加密解析
spring security中的BCryptPasswordEncoder方法采用SHA-256 +随机盐+密钥对密码进行加密。SHA系列是Hash算法,不是加密算法,使用加密算法意味着可以解密(这个与编码/解码一样),但是采用Hash处理,其过程是不可逆的。(1)加密(encode):注册用户时,使用SHA-256+随机盐+密钥把用户输入的密码进行hash处理,得到密码的hash值,然后将其存入数据库中。(2)密码匹配(matches):用户登录时,密码匹配阶段并没有进行密码解密(因为密码经过Has原创 2020-05-30 15:17:05 · 811 阅读 · 0 评论 -
spring-security之生产环境的用户登录(查询数据库)
spring-security通过认证类查询数据库中的表:spring-security把用户在前端页面提交的用户名传参给认证类认证类通过用户名在数据库中查询数据认证类将查询结果返回给spring-security,spring-security将认证类返回的数据和页面提交的数据进行比对,如果用户名和密码匹配就登录成功,不匹配则登录失败导入依赖信息<!-- 身份验证 --><dependency> <groupId>org.springframewo原创 2020-05-30 11:56:11 · 337 阅读 · 0 评论 -
spring-security之生产环境的用户登录(身份验证)以及用户名回显和用户退出
文章目录超级管理员的用户登录(内置,不连接数据库)用户名回显用户退出超级管理员的用户登录(内置,不连接数据库)导入依赖 <!-- 身份验证 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${spri原创 2020-05-29 22:59:16 · 514 阅读 · 0 评论 -
spring_security的demo演示
文章目录spring security简介使用spring_security生成的登陆页面使用自己创建的登陆页面spring security简介Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统原创 2020-05-29 21:13:32 · 320 阅读 · 0 评论 -
后端返回自定义数组类型数据
返回数据形式:[{“id”:1,“text”:“联想”},{“id”:3,“text”:“三星”},{“id”:2,“text”:“华为”},{“id”:5,“text”:“OPPO”},{“id”:4,“text”:“小米”},{“id”:9,“text”:“苹果”},{“id”:8,“text”:“魅族”},{“id”:6,“text”:“360”},{“id”:10,“text”:“VIVO”},{“id”:11,“text”:“诺基亚”},{“id”:12,“text”:“锤子”}]对应数据表形式原创 2020-05-29 16:01:54 · 468 阅读 · 0 评论 -
后端接收复杂数据类型——json对象包含类对象和类对象数组
定义一个接收数据的实体类public class Specification implements Serializable { private String specName; private List<TbSpecificationOption> specificationOptionList; public Specification() { } public Specification(String specName, List<Tb原创 2020-05-29 11:36:32 · 660 阅读 · 0 评论 -
分页返回类PageResult
1、实现序列化接口2、返回数据的rows属性,为了确保传递不同类型的数据,要设置为泛型(其他实体类也都要实现序列化接口)3、无参和有参构造方法public class PageResult implements Serializable { private Long total; private List<?> rows; public PageResult() { } public PageResult(Long total, List<原创 2020-05-26 21:15:26 · 1474 阅读 · 1 评论 -
使用dubbo搭建分布式项目
dubbo概述idea搭建项目流程创建如上图所示的项目结构目录,其中record_manager_web和record_service为web项目,父工程为pom工程,其他项目默认为jar工程在父工程的pom文件中添加依赖信息和版本号数据访问模块(record_dao)的依赖对于自己创建的项目只依赖pojo通用实体类模块(pojo)不需要依赖信息服务接口模块仅需要依赖pojo服务模块需要依赖自己的有common、dao和interface其中pojo已经被dao依赖,所以不需要重复依赖m原创 2020-05-26 13:43:21 · 337 阅读 · 0 评论 -
duubo分布式项目得依赖信息
父工程的依赖信息<properties> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <mysql.version>5.1.41</mysql.version> <druid.version>1.1.5</druid.version> <servle原创 2020-05-24 16:28:52 · 166 阅读 · 0 评论 -
三级下拉选择框——三级联动
ng-options属性可以在表达式中使用数组或对象来自动生成一个select中的option列表。as前面为真实值,后面为显示值。ng-options与ng-repeat很相似,很多时候可以用ng-repeat来代替ng-options。但是ng-options提供了一些好处,例如减少内存提高速度,以及提供选择框的选项来让用户选择。ng-options="item.id as item.name for item in selectItemCat1List"item in selectIte..原创 2020-05-18 16:35:17 · 456 阅读 · 0 评论 -
spring加载dubbo的两种方式
方式一:在web.xml中加载springmvc和dubbo<!-- 避免spring查找WEB-INF/applicationContext.xml --><context-param> <param-name>contextConfigLocation</param-name><!-- <param-value>classpath:spring-mvc.xml</param-value>--> <par原创 2020-05-15 17:08:28 · 378 阅读 · 0 评论 -
图片上传——fastDFS
文章目录后端实现前端实现后端实现加入jar包的依赖<dependencies> <!-- fastDFS --> <dependency> <groupId>cn.bestwu</groupId> <artifactId>fastdfs-client-java</artifactId> <fastdfs.version>1.27</fast原创 2020-05-14 16:57:22 · 179 阅读 · 0 评论 -
分布式文件服务器——图片服务器FastDFS
分布式图片服务器——FastDFS原创 2020-05-11 11:41:16 · 275 阅读 · 0 评论 -
商品三级分类和和面包屑导航
文章目录商品的三级分类面包屑导航商品的三级分类商品的三级分类是根据商品的父id和分类自己的id,如果分类的父id对应其他分类的id,这就形成了两级分类,三级分类在此基础上再嵌套一级就形成了三级分类。id为0表示是顶级分类面包屑导航...原创 2020-05-02 17:23:16 · 419 阅读 · 0 评论 -
echarts使用
文章目录基本概述Echarts和后端的交互(柱状图、折线图、扇形图)基本概述Echarts:是一种图表展示技术,信息汇总,数据统计的时候,类似的图表展示技术:JFreeChart、HighChart等Echarts官网:https://www.echartsjs.com/zh/index.htmlEcharts的使用:引入echarts.js提供一个容器显示图表初始化Echart,...原创 2020-04-29 22:44:25 · 164 阅读 · 0 评论 -
新增商品规格
规格和规格选项分为两个表存储,向后台传递的json形式如下:a、b分别是对应数据表的两个实体类a、b为key,a所对应的value是一个json对象(a类型),b所对应的value值是一个json数组(多个b类型的对象列表)为了能接收上述形式的json,我们需要定义一个包含a、b两个实体类的pojopublic class Specification implements Seria...原创 2020-04-26 16:34:34 · 203 阅读 · 0 评论 -
带分页的post请求——angularJs
前端请求头注意变量之间是用逗号隔开的$http.post("../brand/search.do?page="+$scope.paginationConf.currentPage+"&size="+$scope.paginationConf.itemsPerPage,$scope.searchEntity)后端分页信息直接接收,实体信息用requsetBody注解接收public...原创 2020-04-25 21:47:41 · 311 阅读 · 0 评论 -
anglurjs操作单选框传递id以及全选、全不选
<td><input type="checkbox" class="eachbox" ng-click="updateSelection($event,entity.id)"></td>$event:获取当前触发事件的元素,这里获取的是input元素$event的target属性是给当前元素赋予的类型的属性,即给input赋予checkbox的属性chec...原创 2020-04-24 23:28:56 · 271 阅读 · 0 评论 -
AngularJs的基本使用
基本概述AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、依赖注入等等。mvc设计模式Angular遵循软件工程的MVC模式,并鼓励展现,数据,和逻辑组件之间的松耦合.通过依赖注入(dependenc...原创 2020-04-23 16:20:46 · 187 阅读 · 0 评论 -
PageHelper插件的使用解析
1、在pom文件中引入pagehelper的依赖信息<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>${pagehelper.version}</...原创 2020-04-23 09:29:54 · 330 阅读 · 0 评论