商城学习03(踏坑)

19号

任务重点:搜索功能的实现

*Spring Boot伪静态化

*Solr 服务的搭建

*搜索功能的实现

商品信息导入索引库
调用服务实现搜索功能

过程步骤:

*wps第八天

*课堂知识:(详细步骤:请看Solr搜索引擎)

  1. 配置了环境变量就不用定位到可执行文件下用./启动可执行文件

    在这里插入图片描述

更新之后:运行命令:source ~/.bashrc或者重新;连接服务端

  1. 向Linux中粘贴代码格式化

    需要在命令模式下输入(:set paste)、这样粘贴的代码才不会乱


*Linux下配置Solr搜索引擎需要有Java环境

  1. java环境搭建:
配置环境变量
# vim ~/.bashrc
查看配置路径
# echo $PATH
查看是否安装:
java -verson
javac -verson

在这里插入图片描述

  1. 配置TomCat(解压——启动即可(./startup.sh))

  2. 安装mysql:

    [root@localhost ~]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
    
    
    
    [root@localhost ~]# yum -y install mysql57-community-release-el7-10.noarch.rpm
    
    
    //这步有点慢,超级慢:推荐使用-浏览器搜索:centos7 离线 rpm MySQL
    [root@localhost ~]# yum -y install mysql-community-server
    
  3. 用idea(maven打包成war包,上传到Linux下的webapps目录下(可能需要更改ROOT(改为ROOT.bak备份一下!)为当前运行的war夹包;例如:springmvc.war——改为ROOT.war))

  4. 运行,是否成功!Linux——MySQL 密码:(Cxp123456.)

  5. 开启防火墙:(firewalld和iptables区别)(使用ftp服务的时候都不能开启!!)

    systemctl start firewalld

    systemctl stop firewalld

    systemctl disable firewalld

    systemctl restart firewalld

  6. MySQL操作:

    systemctl status mysqld.service

    systemctl start mysqld.service

    service mysqld restart

    mysql -uroot -p

    在这里插入图片描述在这里插入图片描述

  7. 回收站恢复(失败并没有什么卵用!)

第一步:点击电脑桌面左下角的Windows标志图标,并输入“运行”二字,进行搜索。

第二步:在搜索到“运行”这个程序后,那就可以点击该程序,运行程序。

第三步:程序运行后,在输入框里面键入“regedit”这个单词并且点击确定,启动注册表。

第四步:找到“HKEY_LOCAL_MACHINE”这个文件,并点击文件前的三角按钮。

第五步:在展开的文件夹中,找到“SOFTWARE”文件并再次展开,找到“Microsoft”文件并再次展开,找到“Windows”文件继续展开,找到“CurrentVersion”文件再次展开。

第六步:在展开的文件夹中,找到“Explorer”并展开,找到“DeskTop”文件再次展开,找到“NameSpace”文件夹,在其右边的对话框内会出现“默认”等文件。

第七步:在对话框内点击新建项后,将文件重命名为“{645FFO40—5081—101B—9F08—00AA002F954E}”,然后改一下主键名字为“回收站”重启电脑,回收站文件就可以找回。(然而并没有什么卵用!)

  1. Solr搜索引擎(Linux配置):

    • 添加中文分词器(改变两个配置文件,主要是添加代码)

    • 单机启动和集群启动(详细请看Solr搜索引擎文章!)

    • 主要命令:

      #集群模式下:
      #在配置了环境变量的的基础上
      solr start -c
      
      solr start -c -p 7574 -z 10.10.13.105:9983
      
      
      solr create -c taotao08 -s 2 -rf 2
      
      #令人happy的一段话
      Created collection 'taotao08' with 2 shard(s), 2 replica(s) with config-set 'taotao08'
      
      #先删除后停止
      solr delete -c taotao06
      
      solr stop -all
      
      ps aux | grep solr
      

踏过的坑(KENG):

*==值得条条浏览!!!

  1. 伪静态化:(第一次接触:提高搜索排名、方便搜索工具(solr)收录)

  2. chmod +x *.sh :统一加执行权限

  3. Linux启动Tomcat:http://10.10.13.105:8080/(可修改,在C:\Windows\System32\drivers\etc目录下的hosts改变在本机的访问名称)

    在这里插入图片描述

  4. 网络端口占用命令(Linux):netstat -anp | grep 8080 等。。。

    Linux小命令:

    top:查看任务管理器

    free:-m \ -g :查看内存

    iostat:查看io使用率

    df -h :以能看懂的方式查看硬盘

    du:计算当前目录所有文件大小 -h:每个文件大小\-sh:总和(sum)

  5. 报错,

    • 您的打开文件限制当前为1024。应将其设置为65000,以避免操作中断(警告没管)
    • 以root用户身份启动Solr是一种安全风险,不被视为最佳实践。(然后换了个用户:peng)
    • 请安装lsof,因为此脚本需要它来确定Solr是否正在侦听端口8983。(yum install lsof)
    • 终于能启动了Solr————(http://10.10.13.105:8983/solr)
  6. 中文分词器

    第一步:在文件managed- schema中添加

    <!--中文分词器-->
    	<fieldType name="text_zh" class="solr.TextField" positionIncrementGap="100">
    		<analyzer type="index">
    		  <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
    		  <filter class="solr.CJKWidthFilterFactory"/>
    		  <filter class="solr.StopFilterFactory"
    				  words="org/apache/lucene/analysis/cn/smart/stopwords.txt"/>
    		  <filter class="solr.PorterStemFilterFactory"/>
    		  <filter class="solr.LowerCaseFilterFactory"/>
    		  </analyzer>
    		<analyzer type="query">
    		  <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
    		  <filter class="solr.CJKWidthFilterFactory"/>
    		  <filter class="solr.StopFilterFactory"
    				  words="org/apache/lucene/analysis/cn/smart/stopwords.txt"/>
    		  <filter class="solr.PorterStemFilterFactory"/>
    		  <filter class="solr.LowerCaseFilterFactory"/>
    		</analyzer>
    	</fieldType>
    

    第二步:在solrconfig.xml文件中添加(成功!)|(配置的时候“/” windows环境下和Linux环境下不一样

    <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-ltr-\d.*\.jar" />
    <lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs" regex=".*\.jar" />
    
  7. 创建core成功

    在这里插入图片描述

  8. solr单机启动和集群方式启动(完成之后就可以设置数据库字段,然后给项目进行加solr功能!即设置业务系统Field)在postMan中添加字段地址:http://10.10.13.105:8983/solr/taotao/schema

    单机启动

    bin/solr start # linux、macos
    bin\solr.cmd start # windows

    创建core核心:

    bin/solr create -c 核心名 # linux、macos
    bin\solr.cmd create -c 核心名 # windows

    集群启动

    bin/solr start -c # linux、macos
    bin\solr.cmd start -c # windows

    创建 Collection集群:

    solr create -c taotao -s 2 -rf 2

    集群启动另一个端口

    solr start -c -p 7574 -z 10.10.13.105:9983

    在这里插入图片描述

  9. 创建collection失败——错误信息:(不慌忽略就行!)

    onality. NOT RECOMMENDED for production use.
    To turn off: bin/solr config -c taotao -p 7574 -action set-user-property -property update.autoCreateFields -value false()

  10. 服务器有个可用内存的问题:

    收录的:(内存不够(大部分服务器搭的solr集群是启不来的)就算是启来了创建的时候也会报一系列错误)(中午试试调整虚拟机内存)

  11. solr 网站报错。。。(错误一大堆)(内存不够zooKeeper会报错!)

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

  12. 写代码,不搞这了(之前有个问题保存的时候缓存更新时机?(看似没问题运行有bug)已搞定!)


以上很烦人的问题:创建core或者Collection虽然网页上显示有,但是后台是错的(原因是虚拟机或者服务器的内存太小了跑不动、一个solr的集群端口就要512M。(原理上应该说是起不来第二个集群点的))

solr目录里面虽然有副本的目录但是相当于是假的、所以页面上才会显示以上和以下错误!

在这里插入图片描述


20号

任务重点:*商品详情页实现

*完善solr(解决遗留问题)

*商品详情页实现

1、商品查询服务事项

2、商品详情展示

3、添加缓存()

过程步骤:

*wps第九天

  1. ZooKeeper (了解一下)

  2. copy字段

    {
      "add-copy-field":{
         "source":"item_title",
         "dest":"item_keywords"}
    }
    

    需要添加的字段

    <field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
      <field name="item_category_name" type="text_general" multiValued="false" stored="true"/>
      <field name="item_desc" type="text_zh" multiValued="false" indexed="true" stored="true"/>
      <field name="item_image" type="text_general" multiValued="false" stored="true"/>
      <field name="item_price" type="plong" multiValued="false" stored="true"/>
      <field name="item_sell_point" type="text_zh" multiValued="false" indexed="true" required="false" stored="true"/>
      <field name="item_title" type="text_zh" multiValued="false" indexed="true" required="false" stored="true"/>
    <field name="item_keywords" type="text_zh" multiValued="true" indexed="true" required="false" stored="false"/>
    <copyField source="item_title" dest="item_keywords"/>
    <copyField source="item_sell_point" dest="item_keywords"/>
    <copyField source="item_category_name" dest="item_keywords"/>
    <copyField source="item_desc" dest="item_keywords"/>
    
  3. solr添加字段:

    {"add-field": {"name":"item_keywords", "type":"text_zh", "multiValued":true, "stored":false,"indexed":true,"required":"false"}}
    

踏过的坑(INTERESTING)

*==值得条条浏览!!!

  1. springboot多模块resources共享问题(未解决)

  2. 我的虚拟机防火墙每次开机都需要重开重关一下(iptables存在一个假关闭状态!)否则布置什么项目都会被拦截!

  3. Servlet——path配置的是(大总管)默认访问的路径(localhost:8080)

  4. 搜索有时候会报500 错误(时而出来时而没有)

    在这里插入图片描述

    ==原因:==有些字段在后来添加的时候没添加某些字段,所以后端处理的时候对一些非空字段做处理的时候会报空指针异常。|数据库添加字段然后再重新导入solr库、。

    在这里插入图片描述

  5. 刺激 报404商品搜索的时候(这个很刺激就是)在这里插入图片描述

  6. (之前很迷,脑回路不清晰!)导入solr搜索库数据方式(1、在浏览器直接输入路径访问一下。 *2、在CMS后台管理处添加一个按钮,填入这个链接,手动添加过商品之后,点击此按钮更新solr库,(这里有一个问题庞大的数据量?(它虽然会自动覆盖更新但是数据库总是很多,只更新一条就要重新导入全部覆盖吗?)))地址链接(后来改变了默认地址!)

    在这里插入图片描述

  7. redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required.(密码问题)

    在这里插入图片描述

    • 使用静态块(不知道是不是必要的(按说加个注解自动注入就行啊!))
    	//JedisCluster类的使用(配置文件里面也要加上密码属性)
    		//这里不能这样单独写妥妥的空指针
            private static JedisCluster jedisCluster;
            private static String password = "cxp123456.";
            static {
                // 添加集群的服务节点Set集合
                Set<HostAndPort> hostAndPortsSet = new HashSet<HostAndPort>();
                // 添加节点
                hostAndPortsSet.add(new HostAndPort("10.10.13.105", 7001));
                hostAndPortsSet.add(new HostAndPort("10.10.13.105", 7002));
                hostAndPortsSet.add(new HostAndPort("10.10.13.105", 7003));
                hostAndPortsSet.add(new HostAndPort("10.10.13.105", 7004));
                hostAndPortsSet.add(new HostAndPort("10.10.13.105", 7005));
                hostAndPortsSet.add(new HostAndPort("10.10.13.105", 7006));
    
                // Jedis连接池配置
                JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
                //Springboot配置文件已经配置
               /* // 最大空闲连接数, 默认8个
                //jedisPoolConfig.setMaxIdle(100);
                // 最大连接数, 默认8个
                //jedisPoolConfig.setMaxTotal(500);
                //最小空闲连接数, 默认0
                //jedisPoolConfig.setMinIdle(0);
                // 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1
                //jedisPoolConfig.setMaxWaitMillis(2000); // 设置2秒*/
                //对拿到的connection进行validateObject校验______//connectionTimeout:60*60,soTimeout:50,maxAttempts:50
                jedisPoolConfig.setTestOnBorrow(true);
                //就是因为这行代码用的构造参数(虽然在配置文件里面也配置了密码但是在这里不配置他还会报没权限的错误)
                jedisCluster = new JedisCluster(hostAndPortsSet,60*60,50,50,password,jedisPoolConfig);
        }
    
    • 使用配置类
    @Configuration
    
    @ConditionalOnClass({JedisCluster.class})
    
    public class RedisConfig {
    
        @Value("${spring.redis.cluster.nodes}")
    
        private String clusterNodes;
    
        @Value("${spring.redis.password}")
    
        private String password;
    
        @Value("${spring.redis.timeout}")
    
        private int timeout;
    
        @Value("${spring.redis.commandTimeout}")
    
        private int commandTimeout;
    
        @Bean
    
        public JedisCluster getJedisCluster() {
    
            String[] cNodes = clusterNodes.split(",");
    
            Set<HostAndPort> nodes = new HashSet<>();
    
            //分割出集群节点
    
            for (String node : cNodes) {
    
                String[] hp = node.split(":");
    
                nodes.add(new HostAndPort(hp[0], Integer.parseInt(hp[1])));
    
            }
    
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    
            //创建集群对象。没有密码的请使用这一个
    
            // JedisCluster jedisCluster = new JedisCluster(nodes,commandTimeout);
    
            //有密码的请使用这一个。 我这里是redis有密码的所以我使用的这一个
    
            return new JedisCluster(nodes,commandTimeout,commandTimeout,5,password, jedisPoolConfig);
    
        }
    
    }
    

21号

任务重点:sso单点登录(建议多练几遍)

  • 实现单点登录系统
  • 实现用户的登录功能
  • 实现用户的注册功能
  • 安全退出

过程步骤:

*wps第十天:重点都在这

  1. yml和properties都可以使用@Value取值(但是Springboot默认扫描application.yml.properties文件。使用另一个需要加注解@PropertySource)

  2. 在这里插入图片描述

    在这里插入图片描述

踏过的坑:

==*值得条条浏览!!!

  • 调到登录页后的回调URL拼接:(taotao.js)

    在这里插入图片描述

  • solr查询503错误(翻译:没有托管分片的服务器:集群内有挂掉的shard主要是虚拟机重启导致集群冲突:原理有待研究)(22号今天来了个404.。。。)

    在这里插入图片描述

    虚拟机和服务端的区别(在这里就体现了(重启)那这种情况如何在服务器上防止呢)

    在虚拟机上建议使用休眠状态(这样之前的那些配置都不用重启防火墙也正常!!!(但是有时候防火墙还会有问题重开在关闭一下!))

    在这里插入图片描述

      • solr503错误:

    在这里插入图片描述

      • solr404错误:

    在这里插入图片描述

  • 安全退出cookie清理(原因,debug会看到cookie中的path并没有从前台带回来,所以删除的时候需要set路径)

    在这里插入图片描述

  • 为什么删不掉redis的值啊(未解决)(已解决!!!

  • 原因:redis配置的类未生效,当时从网上找的用法还没研究好,delete(key)的时候返回的是false

    @Configuration
    public class RedisConfiguration {
    
        /**
         * 设置序列化策略: Key用默认的String序列化,Value用Jackson序列化成JSON
         * @param redisConnectionFactory
         * @return
         */
        @Bean
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            redisTemplate.setKeySerializer(new StringRedisSerializer());
    
            // 修改Value的序列化策略:由默认的JdkSerializationRedisSerializer改成Jackson序列化
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.disableDefaultTyping();
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
    
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }
    }
    
  • redis一会存不上(存上了是因为不在7001节点),一会删不掉(不在7001端口)。。。。(Java代码中能搜到,但是虚拟机中查不到(是因为所在端口7003不一样?)。。。)

    在这里插入图片描述

  • 难道是redis集群的原因?(我起了6个 节点,如果存到7001,会被删掉,存到其他节点上竟然删不掉??,。。)

    在这里插入图片描述

23号

任务重点:

  • 实现淘淘商城的购物车功能

  • 实现订单系统

  • 前端系统实现下单功能

  • 用到的模块:portal和order、rest

    订单接口和其他接口(作业)

过程步骤:

*wps第十一天

踏过的坑:(amusing)

==*值得条条浏览!!!

  1. 多张表操作,要加事务Springboot是一个注解(0)

  2. CartItem和TbItem之间发呆(否定CartItem)

  3. Consider defining a bean of type ‘redis.clients.jedis.JedisCluster’ in your configuration.(这个问题配置了一个static块(上有示例代码))

  4. service跨模块

        *//**
         * 注意为何报错?(跨模块的service)
         *//*
        @Autowired
        private CartItemOrderService cIos;*/
    注入不进去
    
  5. 基本就是说有重复的RequestMapping了,(地址重复)

    在这里插入图片描述

  6. 拼变量

    location.href="'+item.id+'"
    
  7. 弹窗乱码

    		response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8;");
    
  8. 登录跳转回调的时候不支持get方法(登录信息肯定用的是post方法)

    • 改了这里也不行,不仅存在安全问题还会影响回调的url

    在这里插入图片描述

location.href="’+item.id+’":默认是get请求

改不了这里

在这里插入图片描述

只能改下边的了或者改变拦截时机(后来其实也没改,换了个地方跳转登录就好了)

 	<script>
	document.write("<form action= method=post name=form1 style='display:none'>"); 
    document.write("<input type=hidden name=name value='"+username+"'");  
    document.write("</form>");  
    document.form1.submit();
 	</script>
  1. 通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上(强)

    httpClientUtil中的doPostJson

     public static String doPostJson(String url, String json) {
    
            // 创建Httpclient对象
            CloseableHttpClient httpClient = HttpClients.createDefault();
            CloseableHttpResponse response = null;
            String resultString = "";
            try {
                // 创建Http Post请求
                HttpPost httpPost = new HttpPost(url);
                // 创建请求内容(重要部分)
                StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
                httpPost.setEntity(entity);
                // 执行http请求
                response = httpClient.execute(httpPost);
                resultString = EntityUtils.toString(response.getEntity(), "utf-8");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    response.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            return resultString;
        }
    
  2. 刺激(订单服务!!!存在一个登录跳转回调)

    重点:(这里我使用redisTemplate 的时候取值是空)

    在这里插入图片描述

    java代码:

    package com.taotao.portal.web;
    
    /**
     * 订单结算页面!
     */
    @Controller
    @RequestMapping("/order")
    public class PortalOrderController {
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
        @Autowired
        private PortalOrderService orderService;
        @Autowired
        private CartItemOrderService cIos;
        /**
         * 显示订单确认画面
         * <p>Title: showOrderCart</p>
         * <p>Description: </p>
         * @param request
         * @param model
         * @return
         */
        @RequestMapping("/order-cart")
        public String showOrderCart(@CookieValue(value = "TT_TOKEN",required = false) String token,HttpServletRequest request, HttpServletResponse response,TbUser user, Model model) throws IOException {
    
            response.setContentType("text/html;charset=utf-8;");
    
            //自配(失败换前台跳)
            StringBuffer requestURL = request.getRequestURL();
    
            String loginUrl = "http://localhost:8088/user/showLogin/" + "?" + "redirectUrl=" + requestURL;
    
            //自配(如果无用户,跳到登录页)
            if (token == null) {
                //怎么调不了(然后我加了一个else就生效了有点神奇。这种默认是get请求)
                response.getWriter().print("<script>alert('请登录后结算!');location.href='" + loginUrl + "'</script>");
            }else {
                //从cookie中把商品列表取出来
                List<TbItem> itemsList = cIos.getCartItemsList(request);
                model.addAttribute("cartList", itemsList);
                return "order-cart";
            }
            return null;
        }
    //点击结算的时候就让它登录(上边)
    
        @RequestMapping(value="/create", method= RequestMethod.POST)
        public String createOrder(@CookieValue(value = "TT_TOKEN",required = false) String token, Order order, Model model) throws IOException {
            /*response.setContentType("text/html;charset=utf-8;");
            //从request中取用户信息(我这里让他从cookie中取值)
            //TbUser user = (TbUser)request.getAttribute("user");
    
            //自配(失败换前台跳)
            StringBuffer requestURL = request.getRequestURL();
    
            String loginUrl = "http://localhost:8088/user/showLogin/" + "?" + "redirectUrl=" + requestURL;
    
            //自配(如果无用户,跳到登录页)
            if (token == null) {
                //怎么调不了(然后我加了一个else就生效了有点神奇。这种默认是get请求)
                response.getWriter().print("<script>alert('请登录后结算!');location.href='" + loginUrl + "'</script>");
    
                //不能使用这个是service跨域工具类(主要是后台跳后台)
                // HttpClientUtil.doGet(loginUrl );
            }*/
            //从缓存中将user取出来
            //ValueOperations ops = redisTemplate.opsForValue();
            ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
    
            String jsonUser = ops.get("user_redis_info-" + token);
            TbUser user = JsonUtils.jsonToPojo(jsonUser, TbUser.class);
            /*************************************************/
            //把用户信息补充到order对象中
            System.out.println("redis中的值:" + user);
            order.setUserId(user.getId());
            order.setBuyerNick(user.getUsername());
    
            //提交订单
            TaotaoResult result = null;
            try {
                result = orderService.createService(order);
                //订单创建成功
                if (result.getStatus() == 200) {
                    model.addAttribute("orderId", result.getData());
                    model.addAttribute("payment", order.getPayment());
                    //两天后送达
                    DateTime dateTime = new DateTime();
                    dateTime = dateTime.plusDays(2);
                    model.addAttribute("date", dateTime.toString("yyyy-MM-dd"));
                    //从order工程转一圈回来成功与否在此一搏!
                    return "success";
                }
            } catch (Exception e) {
                e.printStackTrace();
                result = TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
            }
            model.addAttribute("message", result.getMsg());
            //订单创建失败
            return "error/exception";
        }
    }
    
    
    1. js中生成当前地址栏url:相关资料

      • 这是一种不再列其他的。想更多了解看(相关资料链接在上!)

      在这里插入图片描述

    2. 后台使用作用域获取当前页面URI(部分路径)或urL(全路径)

      URL:

      在这里插入图片描述

      URI:

      在这里插入图片描述

24号

优化、总结、和填坑

  1. 遗留问题总结:(重构预览)

    在这里插入图片描述

  2. request可以通过setAttribute()和getAttribute方法存取值实现页面中的信息传递,

  3. 登录cookie(拦截器的时候)和redis延长(取用户信息的时候)

  4. cookie过期时间设置方式:

    cookie.setMaxAge(0);//不记录cookie

    cookie.setMaxAge(-1);//会话级cookie,关闭浏览器失效

    cookie.setMaxAge(60*60);//过期时间为1小时

  5. redis延长:

    /**
         * 按照token获取用户登录信息
         * @param token
         * @return
         */
        @Override
        public TaotaoResult getUserByToken(String token,HttpServletResponse response,HttpServletRequest request) {
            if(StringUtils.isBlank(token)) {
                return TaotaoResult.build(500,"token不能为空!");
            }
            String redisKey = getTokenRedisKey(token);
    
            TbUser tbUser = null;
            try {
                String userJson = redisTemplate.opsForValue().get(redisKey);
                System.out.println("redis 中的值:" + userJson);
                tbUser = JsonUtils.jsonToPojo(userJson, TbUser.class);
                //获取成功要给redis续生效时间
                redisTemplate.expire(token,30,TimeUnit.MINUTES);
                //给cookie也要续生效时间
                CookieUtils.setCookie(request, response, "TT_TOKEN", token, (int)TimeUnit.MINUTES.toSeconds(30));
            } catch (Exception e) {
                log.error("获取用户信息失败, token: " + token, e);
            }
            if(tbUser == null) {
                return TaotaoResult.build(500,"获取用户信息失败");
            }
            return TaotaoResult.ok(tbUser);
        }
    
  6. git工程的时候子包下无pom文件就让它搜索所有的子包

    在这里插入图片描述

后台model中存储了json,前端如何应用?

ftp文件上传后的大小为0K

首先检查防火墙(绝大部分都是这原因还有网络的原因)(虚拟机有问题,明明关了非带开一遍再重关闭才不是0K)

ftp上传到服务器分主动模式和被动模式,

外网ip上传主动模式:ftp.enterLocalActiveMode();(默认)

内网ip上传被动模式:ftp.enterLocalPassiveMode();

否则就会出现如题的问题。

  1. a标签触发点击事件示例

    // var html = username + ",欢迎来到淘淘!<input type='button' οnclick='logout()' class=\"link-logout\" value='退出'/>";
    var html = username + ",欢迎来到淘淘!<a href=\"javascript:void(0);\" οnclick='logout()' class=\"link-logout\">[退出]</a>";
    
    
    
    //jsonp格式调转后台
    function logout() {
    	$.ajax({
    		url :"http://localhost:8088/user/logout",
    		dataType : "jsonp",
    		type : "GET",
    		success : function(data){
    			console.log(data + "loginOut");
    			if(data.status == 200){
    				location.href = "http://localhost:8082";
    			}else {
    				alert("退出失败,原因是:" + data.msg);
    			}
    		}
    	});
    };
    
  2. redis的配置(如果用的是集群模式host和port属性就不用配置)

    spring:
      redis:
    #    host: 10.10.13.105
        password: cxp123456.
        jedis:
          pool:
            max-active: 10
            max-idle: 2
            min-idle: 1
        cluster:
          nodes: 10.10.13.105:7001,10.10.13.105:7002,10.10.13.105:7003,10.10.13.105:7004,10.10.13.105:7005,10.10.13.105:7006
    #    port: 7001
    
      datasource:
        url: jdbc:mysql://localhost:3306/taotao?characterEncoding=utf8&useSSL=false&serverTimezone=UTC
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: cxp123456.
    mybatis:
      mapper-locations: classpath*:/mappers/*.xml
    server:
      port: 8087
    

Author : 陈祥朋

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值