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-sso-web
pom.xml
4.0.0
com.taotao
taotao-parent
0.0.1-SNAPSHOT
com.taotao
taotao-sso-web
0.0.1-SNAPSHOT
war
com.taotao
taotao-common
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
/
8088
web.xml
taotao-sso-web
index.html
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
taotao-sso-web
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/springmvc*.xml
1
taotao-sso-web
/
register.jsp
注册-个人用户
- 个人用户
我已经注册,现在就
登录
*用户名:
*请设置密码:
*请确认密码:
*验证手机:
我已阅读并同意《淘淘用户注册协议》
请接受服务条款
var REGISTER={
param:{
//单点登录系统的url
surl:""
},
inputcheck:function(){
//不能为空检查
if ($("#regName").val() == "") {
alert("用户名不能为空");
$("#regName").focus();
return false;
}
if ($("#pwd").val() == "") {
alert("密码不能为空");
$("#pwd").focus();
return false;
}
if ($("#phone").val() == "") {
alert("手机号不能为空");
$("#phone").focus();
return false;
}
//密码检查
if ($("#pwd").val() != $("#pwdRepeat").val()) {
alert("确认密码和密码不一致,请重新输入!");
$("#pwdRepeat").select();
$("#pwdRepeat").focus();
return false;
}
return true;
},
beforeSubmit:function() {
//检查用户是否已经被占用
$.ajax({
url : REGISTER.param.surl + "/user/check/"+escape($("#regName").val())+"/1?r=" + Math.random(),
success : function(data) {
if (data.data) {
//检查手机号是否存在
$.ajax({
url : REGISTER.param.surl + "/user/check/"+$("#phone").val()+"/2?r=" + Math.random(),
success : function(data) {
if (data.data) {
REGISTER.doSubmit();
} else {
alert("此手机号已经被注册!");
$("#phone").select();
}
}
});
} else {
alert("此用户名已经被占用,请选择其他用户名");
$("#regName").select();
}
}
});
},
doSubmit:function() {
$.post("/user/register",$("#personRegForm").serialize(), function(data){
if(data.status == 200){
alert('用户注册成功,请登录!');
REGISTER.login();
} else {
alert("注册失败!");
}
});
},
login:function() {
location.href = "/page/login";
return false;
},
reg:function() {
if (this.inputcheck()) {
this.beforeSubmit();
}
}
};
login.jsp
登录淘淘
用户名
setTimeout(function () {
if (!$("#loginname").val()) {
$("#loginname").get(0).focus();
}
}, 0);
键盘大写锁定已打开,请注意大小写
密码
免费注册>>
var redirectUrl = "${redirect}";
var LOGIN = {
checkInput:function() {
if ($("#loginname").val() == "") {
alert("用户名不能为空");
$("#loginname").focus();
return false;
}
if ($("#nloginpwd").val() == "") {
alert("密码不能为空");
$("#nloginpwd").focus();
return false;
}
return true;
},
doLogin:function() {
$.post("/user/login", $("#formlogin").serialize(),function(data){
if (data.status == 200) {
alert("登录成功!");
if (redirectUrl == "") {
location.href = "http://localhost:8082";
} else {
location.href = redirectUrl;
}
} else {
alert("登录失败,原因是:" + data.msg);
$("#loginname").select();
}
});
},
login:function() {
if (this.checkInput()) {
this.doLogin();
}
}
};
$(function(){
$("#loginsubmit").click(function(){
LOGIN.login();
});
});
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"}});
})();
taotao.js
var TT = TAOTAO = {
checkLogin : function(){
var _ticket = $.cookie("TT_TOKEN");
if(!_ticket){
return ;
}
$.ajax({
url : "http://localhost:8084/user/token/" + _ticket,
dataType : "jsonp",
type : "GET",
success : function(data){
if(data.status == 200){
var username = data.data.username;
var html = username + ",欢迎来到淘淘![退出]";
$("#loginbar").html(html);
}
}
});
}
}
$(function(){
// 查看是否已经登录,如果已经登录查询登录信息
TT.checkLogin();
});
springmvc.xml
resource.properties
#cookie\u4e2d\u4fdd\u5b58token\u7684\u53ef\u4ee5
TOKEN_KEY=TT_TOKEN
package com.taotao.sso.controller;
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.http.MediaType;
import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
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;
/**
* 用户处理Controller
* Title: UserController
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
@Controller
public class UserController {
@Value("${TOKEN_KEY}")
private String TOKEN_KEY;
@Autowired
private UserService userService;
@RequestMapping("/user/check/{param}/{type}")
@ResponseBody
public TaotaoResult checkUserData(@PathVariable String param, @PathVariable Integer type) {
TaotaoResult result = userService.checkData(param, type);
return result;
}
@RequestMapping(value="/user/register", method=RequestMethod.POST)
@ResponseBody
public TaotaoResult regitster(TbUser user) {
TaotaoResult result = userService.register(user);
return result;
}
@RequestMapping(value="/user/login", method=RequestMethod.POST)
@ResponseBody
public TaotaoResult login(String username, String password,
HttpServletResponse response, HttpServletRequest request) {
TaotaoResult result = userService.login(username, password);
//登录成功后写cookie
if (result.getStatus() == 200) {
//把token写入cookie
CookieUtils.setCookie(request, response, TOKEN_KEY, result.getData().toString());
}
return result;
}
/*@RequestMapping(value="/user/token/{token}", method=RequestMethod.GET,
//指定返回响应数据的content-type
produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public String getUserByToken(@PathVariable String token, String callback) {
TaotaoResult result = userService.getUserByToken(token);
//判断是否为jsonp请求
if (StringUtils.isNotBlank(callback)) {
return callback + "(" + JsonUtils.objectToJson(result) + ");";
}
return JsonUtils.objectToJson(result);
}*/
//jsonp的第二种方法,spring4.1以上版本使用
@RequestMapping(value="/user/token/{token}", method=RequestMethod.GET)
@ResponseBody
public Object getUserByToken(@PathVariable String token, String callback) {
TaotaoResult result = userService.getUserByToken(token);
//判断是否为jsonp请求
if (StringUtils.isNotBlank(callback)) {
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
//设置回调方法
mappingJacksonValue.setJsonpFunction(callback);
return mappingJacksonValue;
}
return result;
}
}
package com.taotao.sso.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 展示登录和注册页面的Controller
* Title: PageController
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
@Controller
public class PageController {
@RequestMapping("/page/register")
public String showRegister() {
return "register";
}
@RequestMapping("/page/login")
public String showLogin(String url, Model model) {
model.addAttribute("redirect", url);
return "login";
}
}
taotao-sso
pom.xml
taotao-sso-service
pom.xml
4.0.0
com.taotao
taotao-sso
0.0.1-SNAPSHOT
taotao-sso-service
war
com.taotao
taotao-manager-dao
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
com.alibaba
dubbo
spring
org.springframework
netty
org.jboss.netty
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
redis.clients
jedis
web.xml
taotao-sso
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
#redis\u4e2d\u7528\u6237Session\u7684\u524d\u7f00
USER_SESSION=USER_SESSION
#session\u7684\u8fc7\u671f\u65f6\u95f4
SESSION_EXPIRE=1800
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.sso.service.impl;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.JsonUtils;
import com.taotao.jedis.JedisClient;
import com.taotao.mapper.TbUserMapper;
import com.taotao.pojo.TbUser;
import com.taotao.pojo.TbUserExample;
import com.taotao.pojo.TbUserExample.Criteria;
import com.taotao.sso.service.UserService;
/**
* 用户处理Service
* Title: UserServiceImpl
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private TbUserMapper userMapper;
@Autowired
private JedisClient jedisClient;
@Value("${USER_SESSION}")
private String USER_SESSION;
@Value("${SESSION_EXPIRE}")
private Integer SESSION_EXPIRE;
@Override
public TaotaoResult checkData(String data, int type) {
TbUserExample example = new TbUserExample();
Criteria criteria = example.createCriteria();
//设置查询条件
//1.判断用户名是否可用
if (type == 1) {
criteria.andUsernameEqualTo(data);
//2判断手机号是否可以使用
} else if (type == 2) {
criteria.andPhoneEqualTo(data);
//3判断邮箱是否可以使用
} else if (type == 3) {
criteria.andEmailEqualTo(data);
} else {
return TaotaoResult.build(400, "参数中包含非法数据");
}
//执行查询
List list = userMapper.selectByExample(example);
if (list !=null && list.size() > 0) {
//查询到数据,返回false
return TaotaoResult.ok(false);
}
//数据可以使用
return TaotaoResult.ok(true);
}
@Override
public TaotaoResult register(TbUser user) {
//检查数据的有效性
if (StringUtils.isBlank(user.getUsername())) {
return TaotaoResult.build(400, "用户名不能为空");
}
//判断用户名是否重复
TaotaoResult taotaoResult = checkData(user.getUsername(), 1);
if (!(boolean) taotaoResult.getData()) {
return TaotaoResult.build(400, "用户名重复");
}
//判断密码是否为空
if (StringUtils.isBlank(user.getPassword())) {
return TaotaoResult.build(400, "密码不能为空");
}
if (StringUtils.isNotBlank(user.getPhone())) {
//是否重复校验
taotaoResult = checkData(user.getPhone(), 2);
if (!(boolean) taotaoResult.getData()) {
return TaotaoResult.build(400, "电话号码重复");
}
}
//如果email不为空的话进行是否重复校验
if (StringUtils.isNotBlank(user.getEmail())) {
//是否重复校验
taotaoResult = checkData(user.getEmail(), 3);
if (!(boolean) taotaoResult.getData()) {
return TaotaoResult.build(400, "email重复");
}
}
//补全pojo的属性
user.setCreated(new Date());
user.setUpdated(new Date());
//密码要进行md5加密
String md5Pass = DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
user.setPassword(md5Pass);
//插入数据
userMapper.insert(user);
//返回注册成功
return TaotaoResult.ok();
}
@Override
public TaotaoResult login(String username, String password) {
//判断用户名和密码是否正确
TbUserExample example = new TbUserExample();
Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo(username);
List list = userMapper.selectByExample(example);
if (list == null || list.size() == 0) {
//返回登录失败
return TaotaoResult.build(400, "用户名或密码不正确");
}
TbUser user = list.get(0);
//密码要进行md5加密然后再校验
if (!DigestUtils.md5DigestAsHex(password.getBytes())
.equals(user.getPassword())) {
//返回登录失败
return TaotaoResult.build(400, "用户名或密码不正确");
}
//生成token,使用uuid
String token = UUID.randomUUID().toString();
//清空密码
user.setPassword(null);
//把用户信息保存到redis,key就是token,value就是用户信息
jedisClient.set(USER_SESSION + ":" + token, JsonUtils.objectToJson(user));
//设置key的过期时间
jedisClient.expire(USER_SESSION + ":" + token, SESSION_EXPIRE);
//返回登录成功,其中要把token返回。
return TaotaoResult.ok(token);
}
@Override
public TaotaoResult getUserByToken(String token) {
String json = jedisClient.get(USER_SESSION + ":" + token);
if (StringUtils.isBlank(json)) {
return TaotaoResult.build(400, "用户登录已经过期");
}
//重置Session的过期时间
jedisClient.expire(USER_SESSION + ":" + token, SESSION_EXPIRE);
//把json转换成User对象
TbUser user = JsonUtils.jsonToPojo(json, TbUser.class);
return TaotaoResult.ok(user);
//return TaotaoResult.ok(json);
}
}
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-sso-interface
pom.xml
4.0.0
com.taotao
taotao-sso
0.0.1-SNAPSHOT
taotao-sso-interface
com.taotao
taotao-manager-pojo
0.0.1-SNAPSHOT
package com.taotao.sso.service;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.pojo.TbUser;
public interface UserService {
TaotaoResult checkData(String data, int type);
TaotaoResult register(TbUser user);
TaotaoResult login(String username, String password);
TaotaoResult getUserByToken(String token);
}
taotao-search-web
pom.xml
4.0.0
com.taotao
taotao-parent
0.0.1-SNAPSHOT
com.taotao
taotao-search-web
0.0.1-SNAPSHOT
war
com.taotao
taotao-common
0.0.1-SNAPSHOT
com.taotao
taotao-search-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
/
8085
web.xml
taotao-search-web
index.html
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
taotao-search-web
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/springmvc.xml
1
taotao-search-web
*.html
search.jsp
${query} - 商品搜索 - 淘淘
全部结果 > "${query}"
上一页
1
2
3
4
5
6
…
下一页
共${totalPages}页 到第
-
${item.title}
淘淘价:
¥
由 淘淘 发货
//${paginator.totalPages}
SEARCH.query = "${query}";
SEARCH.bottom_page_html(${page},${totalPages},'');
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"}});
})();
log4j.properties
log4j.rootLogger=INFO,A3,STDOUT
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=[%p] [%l] %10.10c - %m%n
log4j.appender.A3=org.apache.log4j.RollingFileAppender
log4j.appender.A3.file=logs/server.log
log4j.appender.A3.MaxFileSize=1024KB
log4j.appender.A3.MaxBackupIndex=10
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH\:mm\:ss,SSS} method\:%l%n%m%n
springmvc.xml
resource.properties
#\u641c\u7d22\u7ed3\u679c\u6bcf\u9875\u663e\u793a\u7684\u8bb0\u5f55\u6570
SEARCH_RESULT_ROWS=60
package com.taotao.search.exception;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
/**
* 全局异常处理器
* Title: GlobalExceptionResolver
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
public class GlobalExceptionResolver implements HandlerExceptionResolver {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionResolver.class);
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception e) {
logger.info("进入全局异常处理器。。。。。");
logger.debug("测试handler的类型:" + handler.getClass());
//控制台打印异常
e.printStackTrace();
//向日志文件中写入异常
logger.error("系统发生异常", e);
//发邮件
//jmail
//发短信
//展示错误页面
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", "您的电脑有问题,请稍后重试。");
modelAndView.setViewName("error/exception");
return modelAndView;
}
}
package com.taotao.search.controller;
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.RequestParam;
import com.taotao.common.pojo.SearchResult;
import com.taotao.search.service.SearchService;
import javassist.compiler.ast.Pair;
/**
* 搜索服务Controller
* Title: SearchController
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
@Controller
public class SearchController {
@Autowired
private SearchService searchService;
@Value("${SEARCH_RESULT_ROWS}")
private Integer SEARCH_RESULT_ROWS;
@RequestMapping("/search")
public String search(@RequestParam("q")String queryString,
@RequestParam(defaultValue="1")Integer page, Model model) throws Exception {
//int a = 1/0;
//调用服务执行查询
//把查询条件进行转码,解决get乱码问题
queryString = new String(queryString.getBytes("iso8859-1"), "utf-8");
SearchResult searchResult = searchService.search(queryString, page, SEARCH_RESULT_ROWS);
//把结果传递给页面
model.addAttribute("query", queryString);
model.addAttribute("totalPages", searchResult.getTotalPages());
model.addAttribute("itemList", searchResult.getItemList());
model.addAttribute("page", page);
//返回逻辑视图
return "search";
}
}
Taotao-search
pom.xml
4.0.0
com.taotao
taotao-parent
0.0.1-SNAPSHOT
com.taotao
taotao-search
0.0.1-SNAPSHOT
pom
taotao-search-interface
taotao-search-service
com.taotao
taotao-common
0.0.1-SNAPSHOT
org.apache.tomcat.maven
tomcat7-maven-plugin
/
8084
taotao-search-service
pom.xml
4.0.0
com.taotao
taotao-search
0.0.1-SNAPSHOT
taotao-search-service
war
com.taotao
taotao-manager-dao
0.0.1-SNAPSHOT
com.taotao
taotao-search-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
org.apache.solr
solr-solrj
org.apache.activemq
activemq-all
src/main/java
**/*.xml
src/main/resources
**/*.xml
**/*.properties
web.xml
taotao-search
index.jsp
contextConfigLocation
classpath:spring/applicationContext-*.xml
org.springframework.web.context.ContextLoaderListener
applicationContext-solr.xml
applicationContext-service.xml
applicationContext-dao.xml
applicationContext-activemq.xml
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.search.service.impl;
import org.apache.solr.client.solrj.SolrQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.taotao.common.pojo.SearchResult;
import com.taotao.search.dao.SearchDao;
import com.taotao.search.service.SearchService;
/**
* 搜索服务功能实现
* Title: SearchServiceImpl
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
@Service
public class SearchServiceImpl implements SearchService {
@Autowired
private SearchDao searchDao;
@Override
public SearchResult search(String queryString, int page, int rows) throws Exception {
//根据查询条件拼装查询对象
//创建一个SolrQuery对象
SolrQuery query = new SolrQuery();
//设置查询条件
query.setQuery(queryString);
//设置分页条件
if (page < 1) page =1;
query.setStart((page - 1) * rows);
if (rows < 1) rows = 10;
query.setRows(rows);
//设置默认搜索域
query.set("df", "item_title");
//设置高亮显示
query.setHighlight(true);
query.addHighlightField("item_title");
query.setHighlightSimplePre("");
query.setHighlightSimplePost("");
//调用dao执行查询
SearchResult searchResult = searchDao.search(query);
//计算查询结果的总页数
long recordCount = searchResult.getRecordCount();
long pages = recordCount / rows;
if (recordCount % rows > 0) {
pages++;
}
searchResult.setTotalPages(pages);
//返回结果
return searchResult;
}
}
package com.taotao.search.service.impl;
import java.util.List;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.taotao.common.pojo.SearchItem;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.search.mapper.SearchItemMapper;
import com.taotao.search.service.SearchItemService;
/**
* 商品数据导入索引库
* Title: SearchItemServiceImpl
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
@Service
public class SearchItemServiceImpl implements SearchItemService {
@Autowired
private SearchItemMapper searchItemMapper;
@Autowired
private SolrServer solrServer;
@Override
public TaotaoResult importItemsToIndex() {
try {
//1、先查询所有商品数据
List itemList = searchItemMapper.getItemList();
//2、遍历商品数据添加到索引库
for (SearchItem searchItem : itemList) {
//创建文档对象
SolrInputDocument document = new SolrInputDocument();
//向文档中添加域
document.addField("id", searchItem.getId());
document.addField("item_title", searchItem.getTitle());
document.addField("item_sell_point", searchItem.getSell_point());
document.addField("item_price", searchItem.getPrice());
document.addField("item_image", searchItem.getImage());
document.addField("item_category_name", searchItem.getCategory_name());
document.addField("item_desc", searchItem.getItem_desc());
//把文档写入索引库
solrServer.add(document);
}
//3、提交
solrServer.commit();
} catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, "数据导入失败");
}
//4、返回添加成功
return TaotaoResult.ok();
}
}
SearchItemMapper.xml
SELECT
a.id,
a.title,
a.sell_point,
a.price,
a.image,
b. NAME category_name,
c.item_desc
FROM
tb_item a
LEFT JOIN tb_item_cat b ON a.cid = b.id
LEFT JOIN tb_item_desc c ON a.id = c.item_id
WHERE
a.`status` = 1
SELECT
a.id,
a.title,
a.sell_point,
a.price,
a.image,
b. NAME category_name,
c.item_desc
FROM
tb_item a
LEFT JOIN tb_item_cat b ON a.cid = b.id
LEFT JOIN tb_item_desc c ON a.id = c.item_id
WHERE
a.`status` = 1
AND
a.id=#{itemId}
package com.taotao.search.mapper;
import java.util.List;
import com.taotao.common.pojo.SearchItem;
public interface SearchItemMapper {
List getItemList();
SearchItem getItemById(long itemId);
}
package com.taotao.search.listener;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.xml.soap.Text;
/**
* 接收Activemq发送的消息
* Title: MyMessageListener
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
public class MyMessageListener implements MessageListener {
@Override
public void onMessage(Message message) {
try {
//接收到消息
TextMessage textMessage = (TextMessage) message;
String text = textMessage.getText();
System.out.println(text);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.taotao.search.listener;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import com.taotao.common.pojo.SearchItem;
import com.taotao.search.mapper.SearchItemMapper;
/**
* 监听商品添加事件,同步索引库
* Title: ItemAddMessageListener
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
public class ItemAddMessageListener implements MessageListener{
@Autowired
private SearchItemMapper searchItemMapper;
@Autowired
private SolrServer solrServer;
@Override
public void onMessage(Message message) {
try {
//从消息中取商品id
TextMessage textMessage = (TextMessage) message;
String text = textMessage.getText();
long itemId = Long.parseLong(text);
//根据商品id查询数据,取商品信息
//等待事务提交
Thread.sleep(1000);
SearchItem searchItem = searchItemMapper.getItemById(itemId);
//创建文档对象
SolrInputDocument document = new SolrInputDocument();
//向文档对象中添加域
document.addField("id", searchItem.getId());
document.addField("item_title", searchItem.getTitle());
document.addField("item_sell_point", searchItem.getSell_point());
document.addField("item_price", searchItem.getPrice());
document.addField("item_image", searchItem.getImage());
document.addField("item_category_name", searchItem.getCategory_name());
document.addField("item_desc", searchItem.getItem_desc());
//把文档对象写入索引库
solrServer.add(document);
//提交
solrServer.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.taotao.search.dao;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.taotao.common.pojo.SearchItem;
import com.taotao.common.pojo.SearchResult;
/**
* 查询索引库商品dao
* Title: SearchDao
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
@Repository
public class SearchDao {
@Autowired
private SolrServer solrServer;
public SearchResult search(SolrQuery query) throws Exception{
//根据query对象进行查询
QueryResponse response = solrServer.query(query);
//取查询结果
SolrDocumentList solrDocumentList = response.getResults();
//取查询结果总记录数
long numFound = solrDocumentList.getNumFound();
SearchResult result = new SearchResult();
result.setRecordCount(numFound);
List itemList = new ArrayList();
//把查询结果封装到SearchItem对象中
for (SolrDocument solrDocument : solrDocumentList) {
SearchItem item = new SearchItem();
item.setCategory_name((String) solrDocument.get("item_category_name"));
item.setId((String) solrDocument.get("id"));
//取一张图片
String image = (String) solrDocument.get("item_image");
if (StringUtils.isNotBlank(image)) {
image = image.split(",")[0];
}
item.setImage(image);
item.setPrice((long) solrDocument.get("item_price"));
item.setSell_point((String) solrDocument.get("item_sell_point"));
//取高亮显示
Map highlighting = response.getHighlighting();
List list = highlighting.get(solrDocument.get("id")).get("item_title");
String title = "";
if (list != null && list.size() > 0) {
title = list.get(0);
} else {
title = (String) solrDocument.get("item_title");
}
item.setTitle(title);
//添加到商品列表
itemList.add(item);
}
//把结果添加到SearchResult中
result.setItemList(itemList);
//返回
return result;
}
}
taotao-search-interface
pom.xml
4.0.0
com.taotao
taotao-search
0.0.1-SNAPSHOT
taotao-search-interface
com.taotao
taotao-manager-pojo
0.0.1-SNAPSHOT
package com.taotao.search.service;
import com.taotao.common.pojo.SearchResult;
public interface SearchService {
SearchResult search(String queryString, int page, int rows) throws Exception;
}
package com.taotao.search.service;
import com.taotao.common.pojo.TaotaoResult;
public interface SearchItemService {
TaotaoResult importItemsToIndex();
}