您当前的位置: 首页 >  redis

wespten

暂无认证

  • 0浏览

    0关注

    899博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

FastDFS,Redis,Solr,ActiveMQ核心技术整合一

wespten 发布时间:2020-04-04 12:58:59 ,浏览量:0

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&)

  1. 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();
    }
    

     

    关注
    打赏
    1665965058
    查看更多评论
    立即登录/注册

    微信扫码登录

    0.0479s