ioi
02.商品分类选择-分析-前端js_
03.商品分类选择-分析-数据库_
(JJTree渲染过程解析(parent_id为0就是父节点,is_parent为1说明下面有子节点,state1正常2删除。tree组件有ztree,异步控件树每个节点都有id,展开节点向服务端发送请求,请求检索子节点列表,参数当前节点的id,服务端响应json数据,)&)
04.商品分类选择-Service_
05.商品分类选型实现_
(使用@RequestParam获取参数(@RequestParam(name=”id”,defaultValue=”0” )第一次请求不带参数,给一个默认值确保肯定有值)&)
06.图片上传分析及图片服务器配置_
(Socket选项 HTTP服务器(开启虚拟机,选择已移动该虚拟机保留原来网路配置不发生变化,复制重新生成网卡原来配置不生效,如果要使用虚拟机通过设置为NAT模式,并设置子网网段)&高可用的分布式文件系统构建(只有一个工程把图片放在工程目录下,在1000并发的时候到达tomcat集群,通过Nginx转发每一个tomcat部署一个应用程序,通过轮询把请求平均分给不同服务器,为了能够保证在不同服务器都能找到目标图片需要专门有一个分布式文件服务器FastDFS(软件分布式文件系统,允许横向扩容与负载均衡保证高性能与高可用)负责图片存放与http图片访问(http服务器可以使tomcat或者是nginx(用于访问静态资源性能较好)))&Nginx 安装及负载均衡配置&)
07.FastDFS上传图片测试_
(跟踪服务器配置(fastDFS没法从中央仓库获取,通过maven工程导入,)&存储节点配置(创建一个资源文件client.conf 配置fastDFS中央仓库服务器地址,后缀与源数据详情)&上传文件测试&)
08.FastDFSClient的使用_
(加载资源文件中的图片(this.getClass.getResource(“/”).getPath()取完还是绝对路径,使用全路径复制会有隐藏字符需要去除格式即可。不以’/'开头时,默认是从此类所在的包下取资源,以’/'开头时,则是从ClassPath根下获取。)&)
package testpackage;
public class TestMain {
public static void main(String[] args) {
System.out.println(TestMain.class.getResource(""));
System.out.println(TestMain.class.getResource("/"));
}
}
file:/E:/workspace/Test/bin/testpackage/
file:/E:/workspace/Test/bin/
上面说到的【path以’/'开头时,则是从ClassPath根下获取;】在这里就是相当于bin目录(Eclipse环境下)。
如果我们想在TestMain.java中分别取到1~3.properties文件,该怎么写路径呢?代码如下:
package testpackage;
public class TestMain {
public static void main(String[] args) {
// 当前类(class)所在的包目录
System.out.println(TestMain.class.getResource(""));
// class path根目录
System.out.println(TestMain.class.getResource("/"));
// TestMain.class在/testpackage包中
// 2.properties 在/testpackage包中
System.out.println(TestMain.class.getResource("2.properties"));
// TestMain.class在/testpackage包中
// 3.properties 在/testpackage.subpackage包中
System.out.println(TestMain.class.getResource("subpackage/3.properties"));
// TestMain.class在/testpackage包中
// 1.properties 在bin目录(class根目录)
System.out.println(TestMain.class.getResource("/1.properties"));
}
}
※Class.getResource和Class.getResourceAsStream在使用时,路径选择上是一样的。
Class.getClassLoader().getResource(String path)
path不能以’/'开头时;
path是从ClassPath根下获取;
还是先看一下下面这段代码的输出:
package testpackage;
public class TestMain {
public static void main(String[] args) {
TestMain t = new TestMain();
System.out.println(t.getClass());
System.out.println(t.getClass().getClassLoader());
System.out.println(t.getClass().getClassLoader().getResource(""));
System.out.println(t.getClass().getClassLoader().getResource("/"));//null
}
}
输出结果:
class testpackage.TestMain
sun.misc.Launcher$AppClassLoader@1fb8ee3
file:/E:/workspace/Test/bin/
null
从结果来看【TestMain.class.getResource("/") == t.getClass().getClassLoader().getResource("")】
如果有同样的Project结构
使用Class.getClassLoader().getResource(String path)可以这么写:
package testpackage;
public class TestMain {
public static void main(String[] args) {
TestMain t = new TestMain();
System.out.println(t.getClass().getClassLoader().getResource(""));
System.out.println(t.getClass().getClassLoader().getResource("1.properties"));
System.out.println(t.getClass().getClassLoader().getResource("testpackage/2.properties"));
System.out.println(t.getClass().getClassLoader().getResource("testpackage/subpackage/3.properties"));
}
}
※Class.getClassLoader().getResource和Class.getClassLoader().getResourceAsStream在使用时,路径选择上也是一样的。
09.图片上传功能分析_
10.图片上传功能实现_
(多文件上传1:使用MultipartHttpServletRequest(springMVC需要把commonsi-fileupload两个jar包加到项目中,前端控制器需要配置多媒体解析器MultipartResolver设置默认编码与最大文件大小,通过MultipartFile接收参数,通过@Value加载配置文件的资源,通过Map返回json数据)&单文件上传3:使用MultipartFile结合实体类&通过IOC容器注入Properties类型&placeholder属性&)
11.上传图片功能测试_
12.解决上传图片浏览器兼容性问题_
(使用jackson在服务端将JSON字符串转换成各种Java数据类型(SpringMvc会把对象转为字符串响应浏览器,直接把Map转为json返回String即可)&)
13.富文本编辑器的使用_
(富文本UEditor(富文本编辑器有UEditor、KindEditor、CKEditor都是纯js开发的)&)
14.商品添加功能分析_
15.商品添加-service_
16.商品添加-完成_
02.工程搭建分析_
03.前台系统工程搭建_
(使用URL Rewrite实现网站伪静态(在web.xml中 url-pattern拦截所有*.html 请求网页伪静态,所有url后缀全部改为html,@RequestMapping(“/index”) 通过index.html进行访问。只访问localhost:8080会默认找welcome-file欢迎页index.html 带html后缀去controller匹配)&)
04.首页展示_
05.首页内容管理-数据库分析_
06.内容服务工程搭建_
07.内容分类查询-service_
08.内容分类列表展示_
(@RequestParam注解(与参数名对不上号,使用@RequestParam(“id” ,defaultValue=””)Integer parentId。使用脚本启动服务Maven build clean tomcat7:run )&)
09.内容分类添加-js分析_
10.内容分类添加-mapper_
11.内容分类添加-service_
12.内容分类添加-完成_
13.内容分类修改、删除-作业_
14.内容添加-功能分析_
15.内容添加-service_
16.内容添加-完成_
17.内容编辑、删除_
01.课程计划
(Redis缓存穿透和雪崩(首页并发量最高,每次都查询数据库压力比较大,通过缓存读取内存数据减轻数据库压力,Reids可以把内容持久化到磁盘数据不会丢,内容不会丢失否则瞬时请求会造成数据库雪崩,Redis缓存同步问题)&)
02.首页大广告位实现分析_
04.首页大广告位实现-表现层_
05.首页大广告-测试_
06.redis的安装及启动_
(gcc的简易用法(编译、参数与连接)(编译环境对c语言编译后为可二进制可执行文件,需要按照gcc编译环境,yum install gcc-c++)&用make进行宏编译&makefile的基本语法与变量&RPM安装(install)&Redis安装和配置(rm -rf * 删除所有安装包 ,rm -rf /user/local/redis* )&Redis客户端命令(tar zxf redis-3.0.0.tar.gz 进行解压缩,C语言编译必须有Makefile文件夹,直接使用make命令编译,编译后进行通过make install进行安装 make install PREFIX=/usr/local/redis到指定目录,进入安装目录的bin文件夹,通过./redis-server启动前端启动模式占用一个终端,通过配置文件cp ~/redis-3.0.0/redis.conf 复制到当前文件夹下,进行后端启动不占端口号,修改daemonize yes即可,通过./redis-server redis.conf 后端启动,通过ps aux|grep redis查看进程判断是否启动。 ./redis-cli默认连接6379端口,客户端通过ping pang检测服务器健康状态,连接其他redis服务 ./redis-cli -h 192.168 -p 6379)&Redis基础配置文件&)
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。它类似于ftp, 但是它提供一种更为安全的网络的加密方法。
如何进行远程连接,进行文件的上传和下载。
在命令行模式下,输入:
sftp 用户名@ip地址 eg: sftp lzy@202.206.64.33
sftp>
如果登陆远程机器不是为了上传下载文件,而是要修改远程主机上的某些文件。可以
ssh lzy@202.206.64.33 (其实sftp就是ssh 的一个程式。)
sftp> get /var/index.php /home/libai/
这条语句将从远程主机的 /var目录下将 index.php 下载到本地 /home/libai/目录下。 sftp> put /home/libai/downloads/linuxgl.pdf /var/ 这条语句将把本地 /home/libai/downloads/目录下的 linuxgl.pdf文件上传至远程主机/var 目录下。
要查看远端机器的一些信息,可以直接使用平时的linux命令
比如:pwd 远端机器的当前路径 cd 改变远端机器的路径 ,ls, rm, mkdir,rmdir 都可以用
要查看本机的一些信息,要在平时的linux命令上,加上l
比如:lpwd 本机当前工作目录 lcd 改变本机的路径, lls ,lrm,lmkdir,lrmdir
要离开sftp,用exit 或quit、 bye 均可。详细情况可以查阅 man sftp.
如果觉得在命令行模式下不太方便,可以 sudo apt-get install gftp。在图形界面下操作就简便多了。
07.redis常用命令复_
(Redis数据结构常用命令(Redis一共提供5种数据类型,String普通key-value Hash一个key对应一个hash集,LIST集合 set集合 zset有序集合。String数据类型 set添加一个值 set str1 12345 get str1 incr str1自增,decr减1,Hash命令hset添加一个key hset hash1 field1 abc hget hash1 field1,ttl str1查看key的有效期-1永久保存,ttl str2 -2key不存在,正数正在倒计时,expire str1 100设置过期时间为100秒,key *查看数据库有多少key)&Redis数据结构——哈希&Redis数据结构——链表(linked-list)&Redis数据结构——集合&Redis数据结构——有序集合&INCRBY、DECRBY:对整数值执行加法操作和减法操作& HSET:为字段设置值&)
08.Jedis的使用方法_
(使用Jedis客户端操作Redis(Java客户端通过Jedis,每次创建都有一个连接耗费资源,通过redis连接池JedisPool 节约资源,jedis.getResource()获取jedis来操作数据库)&)
09.redis的使用方法_
(单线程与多线程客户端(持久化RDB和AOF默认开启RDB快照(当前时刻数据)定期操作磁盘,AOF保存对数据库操作的命令频繁操作磁盘性能下降,数据完整性高一点,可以同时开启。Redis有可能丢数据,Mysql或者Oracle关系型数据库不会丢数据,Redis不适合保存大数据适合存储小数据(单线程的顺次处理单个命令尽快完成,通过集群横向扩容),基于Hadoop的Hbase还有MongoDB支持存储海量数据)&)
10.redis集群架构讲解_
(使用Redis集群实现数据水平化存储(Redis集群没有统一的入口,可以连接任何客户端进入集群,集群内部客户端可以相互通讯,检测检点的监控状态通过投票容错实现,redis集群有0-16383个slot为了均匀分布key到不同服务器,每个节点分配一定数量的槽,一般集群分布在3个节点上,每个集群主从同步槽挂了包装高可用,需要6台服务器(一台服务器运行在不同端口6个实例,搭建集群要把dump.rdb快照文件删除,修改redis.conf改变端口号,/cluster-enabled yes集群节点。通过批处理批量执行启动命令 vim start-all.sh cd redis01 ./redis-server redis.conf) cd.. 通过chmod +x start-all.sh增加可执行权限,TCC最大权限 ,./start-all.sh执行)&对文章进行投票&Redis集群容错&Redis集群中的主从复制&Redis主从复制模式&)
11.redis集群搭建01_
(Redis主从架构的缺点&Redis哨兵模式& Redis集群架构& Redis集群环境搭建&mongodump 和mongorestore&批处理和任务&权限设置&)
12.redis集群搭建02_
(RPM、SRPM与YUM&)
13.使用redis-cli连接集群_
14.使用JedisCluster连接集群_
(使用Jedis客户端操作Redis(Java通过JedisCluster连接到集群,自带连接池,构造参数是set类型集合每个元素是HostAndPort类型)&)
15.JedisClient连接单机版_
(使用Annotation注解法创建对象(注解既包括了开启注解也包括了扫描包)&组件扫描注解&)
16.jedisClient连接集群_
17.向业务逻辑中添加缓存_
18.添加缓存测试_
19.缓存同步处理_
(消息发送和同步接收&HDEL:删除字段&)
day06
01.课程计划_
02.solr服务搭建_
(catalina.sh脚本&Redis基础配置文件&Tomcat启动&复制、删除与移动:cp、rm、mv &配置web.xml文件&)
03.业务域的定义_
(中文分词安装&IK分词器安装&内部类——InnerClasses属性 &基于XML Schema的简化配置方式&使用th:field属性&语言区域&使用服务提供业务逻辑&)
04.业务数据sql语句编写_
05.搜索工程搭建_
(覆盖起步依赖引入的传递依赖&)
06.导入商品数据到索引库-dao_
07.solrj实现索引库维护_
(在Sping Boot中集成Solr,实现数据的增、删、改和查&)
08.导入商品数据-Service_
( constructor方法&)
09.导入商品数据-jsp_
10.商品数据导入成功_
11.首页跳转到搜索页面_
12.商品实现分析_
13.使用solrJ查询索引库_
(Solr——搜索应用服务器&)
14.搜索服务-dao实现_
day07
01.课程计划_
02.商品搜索功能-Service_
03.商品搜索功能-Controller_
04.搜索功能测试_
05.什么是SolrCloud_
06.solr集群架构讲解_
(并发&分片简介&)
07.zookeeper集群讲解_
08.zookeeper集群搭建_
(配置ZooKeeper集群&Data Server简介&修改文件时间或创建新文件:touch&变量的使用与设置:echo、变量设置规则、unset &vim的额外功能&)
09.solr集群的配置_
10.SolrCloud中管理Collection_
11.闲扯_
12.使用SolrJ管理SolrCloud_
13.搜索功能切换到集群_
14.全局异常处理器的应用_
day08
01.课程计划_
02.同步索引库功能分析_
03.什么是ActiveMQ_
04.activemq的安装_
(vim的额外功能&)
05.Activemq发送queue消息_
(Topic 和 Queue&)
06.接收queue消息_
07.发送topic消息_
08.接收topic消息_
09.spring整合Activemq_
(使用JmsTemplate 发送&)
10.使用JMSTemplate发送消息_
11.Activemq整合Spring接收消息_
12.添加商品同步索引库-发送消息_
13.添加商品同步索引库-mapper_
14.添加商品同步索引库-MessageListener_
15.添加商品同步索引库-测试_
16.小结_
day09
01.课程计划_
02.商品详情页面工程搭建_
03.商品详情页面展示分析_
04.商品详情页面展示-代码实现_
05.商品详情页面展示-测试_
06.商品详情页面添加缓存分析_
07.redis添加缓存的使用方法_
08.向业务逻辑中添加缓存_
09.添加缓存测试_
10.freemarker的使用方法_
11.freemarker语法-取pojo的属性_
12.freemarker语法-list_
13.freemarker语法-if_
14.freemarker语法-日期类型处理_
15freemarker语法-null值的处理_
16.freemarker语法-include_
17.freemarker整合Spring_
18.网页静态化方案分析_
19.网页静态化-freemarker模板改造_
20.网页静态化-业务逻辑_
21.网页静态化-测试_
day10
01.课程计划_
(构建HTTP服务器&)
02.什么是nginx_
03.nginx的应用场景_
04.nginx的安装及启动_
( v-pre&)
05.nginx的配置文件介绍_
06.通过端口区分虚拟主机_
(shift&使用fetchType属性设置局部加载策略&ngx_http_upstream_t结构体&)
07.什么是域名及hosts文件的作用_
08.通过域名区分虚拟主机_
09.使用nginx配置反向代理_
(proxy_pass请求代理规则&)
10.使用nginx实现负载均衡_
11.nginx小结_
12.keepalived+nginx实现高可用_
13.lvs实现高并发处理_
14.sso系统分析_
15.sso工程搭建_
16.sso系统接口分析_
day11_单点登录&js跨域
01.课程计划_
02.检查数据是否可用-接口分析_
03.检查数据是否可用-Service_
04.检查数据是否可用-Controller_
05.用户注册-Service_
06.用户注册-表现层_
07.用户登录流程分析_
08.用户登录-Service_
(使用Redis保存token令牌&全局唯一标识符UUID&)
09.用户登录表现层_
10.用户登录测试_
11.根据token查询用户信息-Service_
(使用Redis保存token令牌&)
12.根据token查询用户信息-表现层层_
13.安全退出-作业_
14.登录、注册页面展示_
15.用户注册页面实现_
16.用户登页面实现_
17.js跨域分析_
(跨域AJAX&)
- jsonp的原理_
(活用模板方法模式及Callback&callback调用&JSONP&media query语法&)
19.jsonp服务端处理_
20.jsonp处理第二种方法_
day12
01.课程计划_
02.购物车实现分析_
03.购物车工程搭建_
04.商品详情页面加入购物车改造_
05.添加购物车功能分析_
06.添加购物车实现_
07.添加购物车测试_
08.展示购物车列表_
09.修改购物车商品数量_
10.修改购物车商品数量测试_
11.删除购物车商品_
12.购物车小结_
13.订单系统工程搭建_
14.订单确认页面展示_
15.登录拦截器实现分析_
(HandlerInterceptor接口&Handler实例&)
16.拦截器业务逻辑实现_
17.拦截器测试及登录成功回调_
(Interceptor&)
18.拦截器测试取用户信息_
19.订单生成-数据库分析_
20.订单生成-页面分析_
day13
01.课程计划_
02.订单提交-分析回顾_
03.生成订单业务逻辑_
04.订单生成表现层_
05.订单生成-测试_
06.系统架构讲解_
07.系统部署规划_
(安装RPM包&)
08.tomcat热部署_
09.系统部署演示_
10.项目总结01_
11.项目总结02_
12.面试中的问题_
部分代码
taotao-order-web
pom.xml
4.0.0
com.taotao
taotao-parent
0.0.1-SNAPSHOT
com.taotao
taotao-order-web
0.0.1-SNAPSHOT
war
com.taotao
taotao-common
0.0.1-SNAPSHOT
com.taotao
taotao-order-interface
0.0.1-SNAPSHOT
com.taotao
taotao-sso-interface
0.0.1-SNAPSHOT
org.springframework
spring-context
org.springframework
spring-beans
org.springframework
spring-webmvc
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-jms
org.springframework
spring-context-support
jstl
jstl
javax.servlet
servlet-api
provided
javax.servlet
jsp-api
provided
com.alibaba
dubbo
spring
org.springframework
netty
org.jboss.netty
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
junit
junit
org.apache.tomcat.maven
tomcat7-maven-plugin
/
8091
web.xml
taotao-order-web
index.html
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
taotao-order-web
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/springmvc.xml
1
taotao-order-web
*.html
success.jsp
订单成功页面 - 淘淘商城
- 1.我的购物车
- 2.填写核对订单信息
- 3.成功提交订单
感谢您,订单提交成功!
-
订单号:${orderId }
货到付款:${payment}元
淘淘快递 送货时间: 预计 ${date} 送达
您的订单已经在处理中,发货后订单内容会显示承运人联系方式,如有必要您可以联系对方
order-cart.jsp
订单结算页 -淘淘商城
填写并核对订单信息
收货人信息
新增收货地址
-
入云龙 收
158****8888
北京 昌平区 五环外六环里
西三旗 xxxxxxxxx
设为默认地址 编辑
删除
支付方式
-
货到付款
-
在线支付 [支持打白条]
-
公司转账
-
邮局汇款
$('.online-payment').hover(function() {
$(this).addClass('payment-item-hover');
}, function() {
$(this).removeClass('payment-item-hover');
});
送货清单
返回修改购物车
商家:淘淘商城
${cart.title }
¥
x${cart.num}
有货
7天无理由退货
配送方式:(对应商品)
- 淘淘快递
免运费
发票信息
普通发票(电子)
个人 明细 修改
总商品金额:
¥
运费:
¥0.00
应付总额:
¥
提交订单
应付总额:¥
由于价格可能发生变化,请核对后再提交订单
部分商品货到付款方式:先由淘淘配送“提货单”并收款,然后厂商发货。
exception.jsp
出错了 -淘淘商城
#refresh {
text-align: left;
margin: 30px auto;
width: 750px;
height: 220px;
background:
url(/images/errordog.jpg)
0 0;
position: relative
}
#refresh .txt {
position: absolute;
left: 236px;
top: 16px;
color: #fff;
font-size: 14px;
font-family: "microsoft yahei"
}
#refresh .m {
position: absolute;
left: 336px;
top: 80px;
line-height: 18px;
font-size: 14px
}
#refresh .m li {
padding-bottom: 8px
}
#refresh .m a {
color: #005eab
}
#refresh .m .fore1, #refresh .m .fore2 {
font-family: "microsoft yahei"
}
#refresh .m .fore1 a {
color: #e4393c
}
#refresh .m .fore2 a {
color: #e4393c;
font-weight: bold;
font-size: 18px;
padding: 0 3px
}
#refresh .m .fore3 {
font-weight: bold;
font-size: 12px
}
#refresh .m .fore4 a {
margin-right: 15px;
font-size: 12px
}
糟了...系统出错了...
- 您可以:稍后再试或联系客服400-8888-9999。
- 返回淘淘首页
- 错误消息
- ${message }
shortcut.jsp
- 收藏淘淘
- 您好!欢迎来到淘淘![登录] [免费注册]
-
我的订单
-
会员俱乐部
-
手机淘淘
-
客户服务
帮助中心
售后服务
在线客服
投诉中心
客服邮箱
-
网站导航
特色栏目
淘淘通信
校园之星
为我推荐
视频购物
淘淘社区
在线读书
装机大师
淘淘E卡
家装城
搭配购
我喜欢
企业服务
企业客户
办公直通车
旗下网站
English Site
header.jsp
我的淘淘
加载中,请稍候...
去购物车结算
全部商品分类
图书、音像、电子书刊
家用电器
电脑、办公
个护化妆
钟表
母婴
食品饮料、保健食品
汽车用品
玩具乐器
手机
数码
家居家装
厨具
服饰内衣
全部商品分类
- 首页
- 服装城
- 食品
- 团购
- 夺宝岛
- 闪购
- 金融
(function(){if(pageConfig.navId){var object=document.getElementById("nav-"+pageConfig.navId);if(object)object.className+=" curr";}})();
footer-links.jsp
关于我们|联系我们|人才招聘|商家入驻|营销中心|手机淘淘|友情链接|销售联盟|淘淘社区|淘淘公益|English Site
footer.jsp
购物指南
购物流程
会员介绍
团购/机票
常见问题
大家电
联系客服
配送方式
上门自提
211限时达
配送服务查询
配送费收取标准
如何送礼
海外配送
支付方式
货到付款
在线支付
分期付款
邮局汇款
公司转账
售后服务
售后政策
价格保护
退款说明
返修/退换货
取消订单
特色服务
夺宝岛
DIY装机
延保服务
淘淘E卡
节能补贴
淘淘通信
淘淘自营覆盖区县
淘淘已向全国1859个区县提供自营配送服务,支持货到付款、POS机刷卡和售后上门服务。
查看详情 >
(function(){
var A="热门搜索:校园之星办公打印美菱冰箱无肉不欢万件好货iPhone6哈利波特美模接驾";
var B=["java","apple","LG G3","天梭","保温杯","三个爸爸"];
B=pageConfig.FN_GetRandomData(B);
$("#hotwords").html(A);
var _searchValue = "${query}";
if(_searchValue.length == 0){
_searchValue = B;
}
$("#key").val(_searchValue).bind("focus",function(){if (this.value==B){this.value="";this.style.color="#333"}}).bind("blur",function(){if (!this.value){this.value=B;this.style.color="#999"}});
})();
springmvc.xml
resource.properties
#\u8d2d\u7269\u8f66\u5728cookie\u4e2d\u4fdd\u5b58\u7684key
CART_KEY=TT_CART
#token\u5728cookie\u4e2d\u4fdd\u5b58\u7684key
TOKEN_KEY=TT_TOKEN
#SSO\u7cfb\u7edf\u7684url
SSO_URL=http://localhost:8088
package com.taotao.order.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.CookieUtils;
import com.taotao.common.utils.JsonUtils;
import com.taotao.pojo.TbUser;
import com.taotao.sso.service.UserService;
/**
* 判断用户是否登录拦截器
* Title: LoginInterceptor
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
public class LoginInterceptor implements HandlerInterceptor {
@Value("${TOKEN_KEY}")
private String TOKEN_KEY;
@Value("${SSO_URL}")
private String SSO_URL;
@Autowired
private UserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//执行handler之前先执行此方法
//1.从cookie中取token信息
String token = CookieUtils.getCookieValue(request, TOKEN_KEY);
//2.如果取不到token,跳转到sso的登录页面,需要把当前请求的url做为参数传递给sso,sso登录成功之后跳转回请求的页面。
if (StringUtils.isBlank(token)) {
//取当前请求的url
String requestURL = request.getRequestURL().toString();
//跳转到登录页面
response.sendRedirect(SSO_URL + "/page/login?url=" + requestURL);
//拦截
return false;
}
//3.取到token,调用sso系统的服务判断用户是否登录
TaotaoResult taotaoResult = userService.getUserByToken(token);
//4.如果用户未登录,即没取到用户信息。跳转到sso的登录页面
if (taotaoResult.getStatus() != 200) {
//取当前请求的url
String requestURL = request.getRequestURL().toString();
//跳转到登录页面
response.sendRedirect(SSO_URL + "/page/login?url=" + requestURL);
//拦截
return false;
}
//5.如果取到用户信息。放行。
// 把用户信息放到request中
TbUser user = (TbUser) taotaoResult.getData();
request.setAttribute("user", user);
//返回值true:放行 返回false:拦截
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
//handler执行之后,modelAndView返回之前
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 在ModelAndView返回之后,异常处理
}
}
package com.taotao.order.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.CookieUtils;
import com.taotao.common.utils.JsonUtils;
import com.taotao.order.pojo.OrderInfo;
import com.taotao.order.service.OrderService;
import com.taotao.pojo.TbItem;
import com.taotao.pojo.TbUser;
/**
* 订单确认页面处理Controller
* Title: OrderCartController
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
@Controller
public class OrderCartController {
@Value("${CART_KEY}")
private String CART_KEY;
@Autowired
private OrderService orderService;
/**
* 展示订单确认页面
* Title: showOrderCart
* Description:
* @param request
* @return
*/
@RequestMapping("/order/order-cart")
public String showOrderCart(HttpServletRequest request) {
//用户必须是登录状态
//取用户id
TbUser user = (TbUser) request.getAttribute("user");
System.out.println(user.getUsername());
//根据用户信息取收货地址列表,使用静态数据。
//把收货地址列表取出传递给页面
//从cookie中取购物车商品列表展示到页面
List cartList = getCartItemList(request);
request.setAttribute("cartList", cartList);
//返回逻辑视图
return "order-cart";
}
private List getCartItemList(HttpServletRequest request) {
//从cookie中取购物车商品列表
String json = CookieUtils.getCookieValue(request, CART_KEY, true);
if (StringUtils.isBlank(json)) {
//如果没有内容,返回一个空的列表
return new ArrayList();
}
List list = JsonUtils.jsonToList(json, TbItem.class);
return list;
}
/**
* 生成订单处理
*/
@RequestMapping(value="/order/create", method=RequestMethod.POST)
public String createOrder(OrderInfo orderInfo, Model model) {
//生成订单
TaotaoResult result = orderService.createOrder(orderInfo);
//返回逻辑视图
model.addAttribute("orderId", result.getData().toString());
model.addAttribute("payment", orderInfo.getPayment());
//预计送达时间,预计三天后送达
DateTime dateTime = new DateTime();
dateTime = dateTime.plusDays(3);
model.addAttribute("date", dateTime.toString("yyyy-MM-dd"));
return "success";
}
}
Taotao-order
pom.xml
4.0.0
com.taotao
taotao-parent
0.0.1-SNAPSHOT
com.taotao
taotao-order
0.0.1-SNAPSHOT
pom
taotao-order-interface
taotao-order-service
com.taotao
taotao-common
0.0.1-SNAPSHOT
org.apache.tomcat.maven
tomcat7-maven-plugin
/
8090
taotao-order-service
pom.xml
4.0.0
com.taotao
taotao-order
0.0.1-SNAPSHOT
taotao-order-service
war
com.taotao
taotao-manager-dao
0.0.1-SNAPSHOT
com.taotao
taotao-order-interface
0.0.1-SNAPSHOT
org.springframework
spring-context
org.springframework
spring-beans
org.springframework
spring-webmvc
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-jms
org.springframework
spring-context-support
com.alibaba
dubbo
spring
org.springframework
netty
org.jboss.netty
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
redis.clients
jedis
web.xml
taotao-order
index.jsp
contextConfigLocation
classpath:spring/applicationContext-*.xml
org.springframework.web.context.ContextLoaderListener
applicationContext-trans.xml
applicationContext-service.xml
applicationContext-redis.xml
applicationContext-dao.xml
resource.properties
#\u8ba2\u5355\u53f7\u751f\u6210key
ORDER_ID_GEN_KEY=ORDER_ID_GEN
#\u8ba2\u5355\u53f7\u521d\u59cb\u503c
ORDER_ID_BEGIN_VALUE=100544
#\u8ba2\u5355\u660e\u7ec6\u8868\u4e3b\u952e\u751f\u6210key
ORDER_ITEM_ID_GEN_KEY=ORDER_ITEM_ID_GEN
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/taotao?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
SqlMapConfig.xml
package com.taotao.order.service.impl;
import java.awt.datatransfer.FlavorEvent;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.jedis.JedisClient;
import com.taotao.mapper.TbOrderItemMapper;
import com.taotao.mapper.TbOrderMapper;
import com.taotao.mapper.TbOrderShippingMapper;
import com.taotao.order.pojo.OrderInfo;
import com.taotao.order.service.OrderService;
import com.taotao.pojo.TbOrderItem;
import com.taotao.pojo.TbOrderShipping;
/**
* 订单处理Server
* Title: OrderServiceImpl
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private TbOrderMapper orderMapper;
@Autowired
private TbOrderItemMapper orderItemMapper;
@Autowired
private TbOrderShippingMapper orderShippingMapper;
@Autowired
private JedisClient jedisClient;
@Value("${ORDER_ID_GEN_KEY}")
private String ORDER_ID_GEN_KEY;
@Value("${ORDER_ID_BEGIN_VALUE}")
private String ORDER_ID_BEGIN_VALUE;
@Value("${ORDER_ITEM_ID_GEN_KEY}")
private String ORDER_ITEM_ID_GEN_KEY;
@Override
public TaotaoResult createOrder(OrderInfo orderInfo) {
//生成订单号,可以使用redis的incr生成
if (!jedisClient.exists(ORDER_ID_GEN_KEY)) {
//设置初始值
jedisClient.set(ORDER_ID_GEN_KEY, ORDER_ID_BEGIN_VALUE);
}
String orderId = jedisClient.incr(ORDER_ID_GEN_KEY).toString();
//向订单表插入数据,需要补全pojo的属性
orderInfo.setOrderId(orderId);
//免邮费
orderInfo.setPostFee("0");
//1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭
orderInfo.setStatus(1);
//订单创建时间
orderInfo.setCreateTime(new Date());
orderInfo.setUpdateTime(new Date());
//向订单 表插入数据
orderMapper.insert(orderInfo);
//向订单明细表插入数据。
List orderItems = orderInfo.getOrderItems();
for (TbOrderItem tbOrderItem : orderItems) {
//获得明细主键
String oid = jedisClient.incr(ORDER_ITEM_ID_GEN_KEY).toString();
tbOrderItem.setId(oid);
tbOrderItem.setOrderId(orderId);
//插入明细数据
orderItemMapper.insert(tbOrderItem);
}
//向订单物流表插入数据
TbOrderShipping orderShipping = orderInfo.getOrderShipping();
orderShipping.setOrderId(orderId);
orderShipping.setCreated(new Date());
orderShipping.setUpdated(new Date());
orderShippingMapper.insert(orderShipping);
//返回订单号
return TaotaoResult.ok(orderId);
}
}
package com.taotao.jedis;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class JedisClientPool implements JedisClient {
@Autowired
private JedisPool jedisPool;
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String result = jedis.set(key, value);
jedis.close();
return result;
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String result = jedis.get(key);
jedis.close();
return result;
}
@Override
public Boolean exists(String key) {
Jedis jedis = jedisPool.getResource();
Boolean result = jedis.exists(key);
jedis.close();
return result;
}
@Override
public Long expire(String key, int seconds) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key, seconds);
jedis.close();
return result;
}
@Override
public Long ttl(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.ttl(key);
jedis.close();
return result;
}
@Override
public Long incr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.incr(key);
jedis.close();
return result;
}
@Override
public Long hset(String key, String field, String value) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hset(key, field, value);
jedis.close();
return result;
}
@Override
public String hget(String key, String field) {
Jedis jedis = jedisPool.getResource();
String result = jedis.hget(key, field);
jedis.close();
return result;
}
@Override
public Long hdel(String key, String... field) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hdel(key, field);
jedis.close();
return result;
}
}
package com.taotao.jedis;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.JedisCluster;
public class JedisClientCluster implements JedisClient {
@Autowired
private JedisCluster jedisCluster;
@Override
public String set(String key, String value) {
return jedisCluster.set(key, value);
}
@Override
public String get(String key) {
return jedisCluster.get(key);
}
@Override
public Boolean exists(String key) {
return jedisCluster.exists(key);
}
@Override
public Long expire(String key, int seconds) {
return jedisCluster.expire(key, seconds);
}
@Override
public Long ttl(String key) {
return jedisCluster.ttl(key);
}
@Override
public Long incr(String key) {
return jedisCluster.incr(key);
}
@Override
public Long hset(String key, String field, String value) {
return jedisCluster.hset(key, field, value);
}
@Override
public String hget(String key, String field) {
return jedisCluster.hget(key, field);
}
@Override
public Long hdel(String key, String... field) {
return jedisCluster.hdel(key, field);
}
}
package com.taotao.jedis;
public interface JedisClient {
String set(String key, String value);
String get(String key);
Boolean exists(String key);
Long expire(String key, int seconds);
Long ttl(String key);
Long incr(String key);
Long hset(String key, String field, String value);
String hget(String key, String field);
Long hdel(String key, String... field);
}
taotao-order-interface
pom.xml
4.0.0
com.taotao
taotao-order
0.0.1-SNAPSHOT
taotao-order-interface
com.taotao
taotao-manager-pojo
0.0.1-SNAPSHOT
package com.taotao.order.service;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.order.pojo.OrderInfo;
public interface OrderService {
TaotaoResult createOrder(OrderInfo orderInfo);
}
package com.taotao.order.pojo;
import java.io.Serializable;
import java.util.List;
import com.taotao.pojo.TbOrder;
import com.taotao.pojo.TbOrderItem;
import com.taotao.pojo.TbOrderShipping;
public class OrderInfo extends TbOrder implements Serializable{
private List orderItems;
private TbOrderShipping orderShipping;
public List getOrderItems() {
return orderItems;
}
public void setOrderItems(List orderItems) {
this.orderItems = orderItems;
}
public TbOrderShipping getOrderShipping() {
return orderShipping;
}
public void setOrderShipping(TbOrderShipping orderShipping) {
this.orderShipping = orderShipping;
}
}