首页 > 经验记录 > 项目相关

Spring Cloud 是在 Spring Boot 基础上构建的,用于快速构建分布式系统的通用模式的工具集

 

别的理论、使用场景、历史之类的也不说了,直接切入主题。

这里,我就来架构一个简单 Spring Cloud 的应用。

 

既然要用,都9102年了,当然要与时俱进,我这里选择的是基于Spring Boot 2.0.x 的Spring Cloud Finchley。

开发工具: IDEA

JDK version: 1.8

具体的框架版本号: Spring Boot 2.0.5 RELEASE、Spring Cloud Finchley.SR3

项目管理工具: gradle  ( 9102年了,maven这xml配置实在是够恶心的了

 

目前只是最原始的初版,使用RestTemplate简单的调用一下别的服务接口。 至于服务注册、发现、跟踪、容错、微服务网关、负载均衡之类的。之后也会慢慢写出文章的。

先把项目给搭起来。之后再要添加新的依赖增加新的功能就就简单许多了。

 

OK,进入正题。

先打开 IDEA 创建一个 Gradle 的Module。我创建的模块名字叫做 sc-demo-microservice

这个是根/父模块, 用于管理一个个的微服务。他可以在 ‘subprojects’ 这个代码块中配置所有子模块通用的配置。

我的build.gradle文件:

 

可以看到我给所有的子模块添加了web、mysql、mybatis、Actuator的依赖。

Actuator这个东西是用于服务监控和管理的,这里不表,具体的可以看这个文章

 

gradle加载完毕后这个父模块就创建好了。gradle会自动给你生成一个src文件夹,删掉就行,也可以不删。反正父模块里边是不会放代码的。

 

然后就是建立子 module 了,子module 的创建是直接在父 module 上边右键 –> new Module 来进行创建的。当然,也是Gradle项目。

建好后将子 module  的 build.gradle文件里的东西全删掉,只留这个:

这个是用来添加该模块独有的依赖的。我这暂时为空。

 

我创建了一个用户微服务、一个电影微服务。里边都有具体的Dao、Service、Entity,这里就不贴了,太占位置。

我这里实现的RPC是通过Spring提供的RestTemplate,链接都是写死的,之后当然会优化。这里只是把项目运转起来。

两边的Controller层:

用户:

 

电影:

 

这样子配好,启动服务时先启动 User 服务,然后启动 Movie 服务,然后通过浏览器输入 Movie 服务的接口获得数据。

最后结果是如愿以偿的得到了数据。而这份数据是 Movie 服务通过 rest 请求 User 服务所得来的。

 

他们的yml文件,因为长得差不多,所以就只贴这一个了

 

 

我的项目地址: github

里边sql语句、配置文件啥的都有。是个完整的项目。

结构如下:

 

下一篇文章是Eureka

阅读全文

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。

 

用上 Gradle 就像在新年换上了一条新的内裤一样,舒适。

优点无敌巨大,比 tm 煞笔 xml 好了一万倍。xml导入的一多,动不动几百上千行,从上看到下一堆标签观感极差。

Gradle  看着太舒服了。

 

下面是我写的配置,用的是IDEA,不用配环境,用就对了。

直接在 new module 的时候选择Gradle项目就行了,之后在 build.gradle 文件下使用这段配置。

baseName = ‘projectName’是指定项目名称.

dependencies 下是需要导入的模块,可以用配置XML的方式来理解,想用啥就用啥即对了。一个导入的包只需要1行代码,代码体验upup~

其他都无需更改了,我这是基于 SpringBoot 1.5.6 release 来构建的,打的是jar包不是war包。

下jar包的地址用的是阿里云maven镜像库,速度还是挺不错的。

配置的框架是 ss+spring data jpa,还加了个 thymeleaf 写前端舒服点,后台用了个google gson解析JSON。然后导入了redis操作库。已经是一个很标准的项目架构了,有需要的可自行替换成ssh、ssm等等。

配置完之后run一下,运行一下,控制台打印出: BUILD SUCCESSFUL in 多少s  就是成功了。直接可以开始愉快地使用了。

 

项目架构是和maven一样的哦,src下main + test。 main下熟悉的 java 和 resources 。用起来毫无压力

 

 

阅读全文

 

首先得有个MDC概念:

 

MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。某些应用程序采用多线程的方式来处理多个用户的请求。在一个用户的使用过程中,可能有多个不同的线程来进行处理。典型的例子是 Web 应用服务器。当用户访问某个页面时,应用服务器可能会创建一个新的线程来处理该请求,也可能从线程池中复用已有的线程。在一个用户的会话存续期间,可能有多个线程处理过该用户的请求。这使得比较难以区分不同用户所对应的日志。当需要追踪某个用户在系统中的相关日志记录时,就会变得很麻烦。

一种解决的办法是采用自定义的日志格式,把用户的信息采用某种方式编码在日志记录中。这种方式的问题在于要求在每个使用日志记录器的类中,都可以访问到用户相关的信息。这样才可能在记录日志时使用。这样的条件通常是比较难以满足的。MDC 的作用是解决这个问题。

MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据。

 

在xml按照如下代码进行配置:

discriminator该标签则代表是一个动态的值,默认设置为admin

也是通过指定log文件保存路径时来加入该动态参数,如果有的话则保存在该参数对应的文件夹下按照日期进行保存。

如果没有则会保存在admin目录下

 

然后比较重要的,值从哪儿来??

就是通过MDC这个类。(slf4j包)

在进行日志记录之前,比如logger.info或者logger.error等操作之前

调用MDC.put (key,value)。key则是你在discriminator标签中指定好的参数名,而值就是传过去的参数。

因为每个请求都是一个线程,所以建议在Controller层中请求到的方法第一行就给他加上,这时该线程之后所有进行的日志操作都会保存在你指定好的目录下

 

关于logback配置文件各标签定义可以参考:https://www.jianshu.com/p/f67c721eea1b

阅读全文

老子画得要死了!!!

毫不吹比的说,现在的我对这个项目已经熟悉到了可怕的地步,哪个功能是怎么实现的,甚至调用过程和关联的类我都能背出来

(发布看了一遍真是醉了,这特么的都被压瘦了,字都看不清楚,推荐要在网页看图的朋友右键图片在新标签打开查看,或者干脆别看了,下ppt看吧,原生图片清楚多了)

ppt我传到度盘了:/s/1djWr4IcxDZIxL7bFAu2NbQ 密码: nrww

 

系统实现目标:

1.用户的登陆注册以及退出

2.首页展示二级菜单、商品分类列表、查看商品详情

3.实现购物车和订单功能,用户选择所需商品后,放到购物车

4.购物车实现:商品加入,内部增删改查,数据持久化

5.订单实现:购物车数据指向订单、订单提交、确认订单、结算、支付、我的订单、确认收货、收货成功

模块分析

用户模块具有以下功能:

(1)登录模块负责验证会员的登录,这种操作都是从数据库查询。

(2)用户注册模块负责新会员注册,并将其持久化,也就是将新注册的会员的信息写入数据库

(4)购物车模块就是收集和记录用户所购买的商品,用户离开时购物车若还有数据则需要将其持久化

(5)订单模块能将购物车中的数据指向订单,并能够使用户能查看自己所下的订单,以及对订单的操作。

(6)商品展示模块应当是从数据库中将商品拿出来, 然后再以某种方式显示在网页上(前端数据交互)

首页

商品详情页

登陆页

注册页

购物车查看页

订单提交页

确认支付页

支付成功页

订单查看页

数据库的操作始终贯穿在整个系统里面,几乎所有的地方都涉及到了数据库的操作。

 

下面是表关联图和用户购物流程图

分隔符—

 

 

系统具体实现

首页实现

1、轮播图实现

2、用户加载页面的时候在jquery的准备函数中使用Ajax请求

3、请求到servlet中会判断session中是否已拥有了菜单和分类查询的数据

4、若没有则将数据封装为bean之后,将其处理成json数据,保存在session中

5、若有则直接从session中获取,无论怎样都将数据返回到首页

6、在Ajax的回调函数中接收json对象并取得json对象中的值,将其动态的显示到页面上

分隔符—

 

 

商品详情页面实现

商品详情页实现了商品信息的显示与其商品图片的显示,并且动态显示了用户选择的规格库存

1、用户选中商品点击后首先会跳到servlet将其选中的商品和商品对应的图片信息放入session域中

2、从servlet跳转到商品显示页面,在页面中使用JSTL和EL表达式显示servlet储存到session中的数据

3、为商品的规格绑定了一个click事件,判定用户同时选中颜色和尺码后调用ajax进行局部刷新库存

4、ajax把用户选择的规格和商品id传到servlet,通过这些数据从数据库中找到该条数据的库存,并返回显示

 

 

 

登陆注册实现

用户在商品详情页面选择加入购物车或者立即购买时,若未登陆则会进入登录界面

1、用户在登陆界面需要输入正确的账号以及密码才能够进行登陆

2、若没有账号则可以在注册界面实现注册

3、注册界面实现了对用户输入信息的效验,只能输入匹配格式的信息

4、登陆注册界面均实现了验证码功能,用户必须输入正确的验证码才能进行下一步

 

购物车实现

用户在商品详情页面选择加入购物车时,可将该商品和其对应的规格组合成一个订单项记录到购物车中

并对购物车进行增删改查

4、购物车页面使用JQuery技术实现了动态的获取用户增删改后的总金额并显示

3、购物车页面实现了对每个购物项的增删改查操作,查通过JSTL+EL表达式进行查询

-无论如何最后都将购物车放入到session域中覆盖掉原有的购物车,并跳转到购物车jsp页面

-若购物车中没有该条数据,则将该条数据塞入购物车中

-若购物车中已有该条数据,则在其基础上进行数量的增加

2、servlet获取session中已存在的的购物车bean对象,进行判断

1、用户点击加入购物车时会将商品id、规格id、数量传入到servlet

分隔符—

在用户退出时、或者session自动销毁时

监听器将会调用方法将session中的订单项数据

和数据库中的订单项数据进行交叉修改

交叉修改逻辑为:

遍历tableList,在其循环体中遍历sessionList。通过规格id判断,如果tableList有的数据sessionList没有,则执行删除操作,在数据库中删除该数据

遍历sessionList ,在其循环体中遍历tableList ,通过规格id判断如果sessionList有的数据tableList没有,则执行增加操作,在数据库中增加该数据。

在遍历同时,遇到tableList中对象拥有相同的规格id则进行判断,如果双方数量一致则continue跳过当前循环,如有不一致的项则执行修改操作,修改数据库中已有的数据

 

 

 

订单实现

用户在商品详情页面选择立即购买时、在购物车提交订单时,跳到提交订单页面提交订单

用户可到我的订单页查看订单,并进行订单类型转换操作

1、实现从立即购买到提交订单页、从购物车到提交订单页

2、提交订单页的订单项数据显示、用户填写信息的表单效验、用户确认提交订单时进行订单持久化

3、我的订单页实现用户à多个订单  ,  每个订单à多个订单项的查询显示

4、我的订单页实现对每个订单总价的动态计算、对每个不同类型订单操作动态显示

5、我的订单页使用jquery实现了点击顶部标签切换显示其标签所对应的数据

6、我的订单页实现用户对每个不同状态的订单能够执行各种不同操作(付款、催卖家发货、收货、退款、催退款…)

7、支付页和支付成功页实现、和其订单数据显示

 

从购物车或立即购买跳转到提交订单页:

 

提交订单页实现逻辑:

 

查看订单页遍历的数据类型(这玩意是最吉尔麻烦的)

查看订单页实现逻辑:

订单状态变换:

阅读全文

爱信息图床突然用不了还行,临时换了阿里云oss对象储存

所以有一部分图片有水印有一部分没水印

(想看图片但是看不清的话可以右键新标签打开看)

 

项目使用纯J2EE做成,无任何框架

前端使用了layer插件和bootstrap的轮播图功能

其实都能自己写出来的,因为都只用了其中一个功能。

弹窗显示一个定位在浏览器中心的div然后在后面加一层半透明遮罩就行了,轮播图我用纯js实现过。这里还是用了插件偷懒

 

 

部分工程展示:

 

 

这是首页

实现了滚动头图还有动态显示菜单及其下的所有二级菜单(分别对应数据库中的大类型以及其下的小类型)

这里图片没有截好图,这个二级菜单还是很炫酷的,懒得截了

还有分页查询所有大类型。这里是取得每个大类型前五个商品在首页动态显示

整个页面的动态显示使用纯ajax做成,速度有一点慢,其实显示数据这一块应该使用JSTL+EL表达式的

(左上的图片商标是我ps做的)

写完后感觉前端功力有所长进,后台业务又更熟练了

 

 

 

点击商品可以进入商品信息界面查看商品相关信息

这里使用ajax实现了每个型号和颜色对应每个不同的库存,用户点击之后就会和数据库进行交互

点击加入购物车或者立即购买则会调到购物车和订单块

此时如果没有登录则会被过滤器拦截跳转到登陆界面

登陆页面实现了验证码功能,验证码储存在session域中每次刷新都会变幻,需要输入一致才能够成功登录

 

购物车页面实现了对每条购物项的增删改查操作,涉及到四张数据表

使用Jquery实现对商品总金额的动态加载

对购物车的增删改查操作以及在商品详情页面的购物操作全部在session域中进行。

监听器监听到用户登录时就会从数据库取得改用户的历史购物数据,之后的操作全部与数据库隔开

监听到用户退出和session自动销毁时才会自动的保存到数据库

点击提交订单则会将选中的数据提交。如果用户在商品详细页面点击立即购买则不经过购物车直接将数据提交到订单提交页面

在订单提交的页面实现了将获取到的数据动态的查询并且显示出来,使用js和jquery进行了用户提交的信息效验

仍然使用了jquery动态获取商品的总金额

在用户点击提交订单的时候才会正式生成订单,并修改这些购物项的外键使其指向创建的订单

 

此时点击提交订单会跳转到支付界面(当然是假的啦)

此时咱不点这个,先跳到订单页面看看。

订单界面会获取当前用户的主键值来查询旗下所有订单。并且通过订单找到该订单的所有信息。

包括该订单中有哪一些购物项,以及该订单中每一个购物项对应的每一组数据(图片、商品、规格等)。

显示订单信息通过JSTL+EL表达式完成

订单页面的查询涉及到6张表(除评价表和大类型表)封装bean真是把我恶心到了。但我还是完美的实现了功能好吧。

订单页面实现了对订单的不同状态显示不同操作的功能,刚刚点的现在是待付款状态。

 

 

还有使用jquery实现了上边标签的点击切换事件。可以让用户分类查看自己的所有订单

通过订单的status来判断

 

 

点击各操作的触发事件,对数据库中的信息进行修改

点击支付事件就是之前的支付效果

真的确认支付之后,会出现确认支付的界面,此界面获取了订单的信息并显示

再回到查看订单页,此时的状态已经被改变,变为已支付但是未发货

此时可以点击催卖家发货按钮,使用layer弹窗插件进行弹窗确认

确认后会出现提示信息,这个就不截图了。持续1500毫秒后页面刷新,后边的操作都是这样,确认后会弹出信息,然后等待1500毫秒后刷新

订单状态改变,显示不同的操作

 

确认收货

还能够使用退款操作进行退款(当然是假的)

 

催卖家退款

 

 

后台功能没写,因为也就一些对用户和商品以及商品规格的增删改查

这种简单业务写了也没什么意义

阅读全文
EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00