express 实现我猜你喜欢功能
工具:利用cookie-parser中间件;
原理: 每次访问某一具体的文章,就表明可能客户端对这类文章感兴趣, 将这类文章的标签添加到cookie里,字段是like;
然后退回到含有 我猜你喜欢模块 的时候,就去发送aios请求, 请求的参数是cookies.like,然后就能返回数据,渲染到客户端就可以
cookie可以不加密,也可以加密,当然 这种不涉及隐私的我觉得没必要加密.
前端代码
               getCookie() {
                    const cookieArr = document.cookie.split(';');
                    const cookieObj = {}
                    cookieArr && cookieArr.forEach(ele => {
                        cookieObj[ele.split('=')[0]] = ele.split('=')[1]
                    })
                    return cookieObj;
                },
                getGuessLike() {
                  //如果getCookie().like有值,说明可以去请求数据
                    if(this.getCookie().like){
                        axios({
                            url: '/getGuessLike',
                        }).then((result)=>{
                            console.log(result)
                            this.guessLike = result.data.data;
                        })
                    }else{//cookie不存在,赋值hotPassage
                        this.guessLike = this.hotPassage;
                    }
                },
后端代码:
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser('fasd'))//里面的字符串可以随机生成
app.use('/getGuessLike',getGuessLike);
app.use('/getPassageDetail',getPassageDetail);
function getPassageDetail(req, resp) {
    const { id } = req.query;
    passage.getPassageDetail(id, function (result) {
        if (result.mes == "ok") {
            resp.cookie('like', result.data.tags, { signed: true }) //请求完数据,添加cookie like(加密),这一步可以进一步优化,
//比如可以根据客户端查看的文章,动态获取查看文章最多的类型,然后再根据类型去查,等等
            resp.status(200).send(JSON.stringify({ mes: "ok", data: result }))
        } else {
            result.mes = 'fail'
            resp.status(200).send(JSON.stringify({ mes: "fail", data: result }))
        }
    })
}
function getGuessLike(req, resp) {
    const like = req.signedCookies.like;      //获取签名的cookie
    passage.getGuessLike(like, function (result) {
        console.log(result)
        if (result.mes == "ok") {
            resp.json({ mes: "ok",data: result.data})
        }
    });
}
DAO部分:
function getGuessLike(likeTag, cb) {
    const connection = dbUtil.createConnection();
    let queryArr = [];
    likeTag.split(' ').forEach((ele) => {
        queryArr.push(ele)
    });
    let querySql = "SELECT p.title, p.id FROM passage p JOIN passage_tag_mapping m ON p.id = m.passage_id JOIN tags t ON t.id = m.tag_id WHERE t.tag = ? ORDER BY views LIMIT 5";
    if (queryArr.length > 1) {//这是一个根据cookie like设置的sql查询语句,动态添加查询条件
        const reg = /\?/;
        for (let i = 0; i < queryArr.length; i++) {
            querySql.replace(reg, "? or where tag = ?")
        }
    }
        connection.connect();
        connection.query(querySql, queryArr, function (err, result) {
            if (!err) {
                cb({ mes: "ok", data: result })
            } else {
                console.log(err)
                cb({ mes: "fail", data: err })
            }
        })
    }
express 实现我猜你喜欢功能的更多相关文章
- Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)
		目录 前言 formidable简介 创建项目并安装formidable 实现上传功能 运行结果 部分疑惑解析 写在之后 前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能---- ... 
- node+express实现文件上传功能
		在进行node web开发时,我们可能经常遇到上传文件的问题,这一块如果我们没有经验,可能会遇到很多坑,下面我将跟大家分享一下,实现文件上传的一些方式. 一.node+express文件上传的常用方式 ... 
- Nodejs学习笔记(八)—Node.js + Express 实现上传文件功能(felixge/node-formidable)
		前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次 ... 
- 潭州课堂25班:Ph201805201 tornado 项目 第八课  增加喜欢功能(课堂笔记)
		tornado 相关说明 新增一个页面,用来做图片收藏, 还要在 account.py 创建一个数据库表,记录用户喜欢的图片,哪些图片用户疯狂传奇 cd 到 项目目录下,执行数据库更新 alembic ... 
- nodejs之express框架商品管理系统登录功能
		1.该系统主要使用express.body-parser.express-session.ejs.mongodb-connect . npm install express --save npm in ... 
- 在SQL Server Express版本中没有代理功能如何自动备份数据库
		因为是免费的且单个数据库可以支持到10GB,对于一般企业完全足够了,也就将就使用了,备份将分为两步: 1.创建备份脚本 2.创建系统的计划任务进行每天的备份 详细做法如下: 1.创建备份脚本 打开SS ... 
- 真刀实战地搭建React+Webpack+Express搭建一个简易聊天室
		一.前面bb两句 因为自惭(自残)webpack配置还不够熟悉,想折腾着做一个小实例熟悉.想着七夕快到了,做一个聊天室自己和自己聊天吧哈哈.好了,可以停止bb了,说一下干货. 二. 这个项目能学到啥? ... 
- NodeJS旅程 : express - nodejs MVC 中的王牌
		express 正如ASP.NET MVC 在作为.net平台下最佳的 Mvc框架的地位一样,express在 node.js 环境也有着相同的重要性.在百度上 "nodejs expres ... 
- express-6 请求和响应对象(1)
		URL的组成部分 协议: 协议确定如何传输请求.我们主要是处理http和https.其他常见的协议还有file和ftp. 主机名: 主机名标识服务器.运行在本地计算机(localhost)和本地网络的 ... 
随机推荐
- MYSQL<一>
			-- ########## 01.数据库概述 ########## -- 1.信息:现实世界中各种可以接触到的东西 -- 2.数据:信息在计算机世界中的映射(反映) -- Java中可以把数据存储在内 ... 
- javascript(腾讯)
			var a={key:"1",value:2}; war b=a; b.value+=a.key, 打印b.value是多少,a.value呢? 答案:都是21.因为javascr ... 
- 【长郡NOIP2014模拟10.22】搞笑的代码
			题目 在OI界存在着一位传奇选手--QQ,他总是以风格迥异的搞笑代码受世人围观 某次某道题目的输入是一个排列,他使用了以下伪代码来生成数据 while 序列长度<n do { 随机生成一个整数属 ... 
- LDA终极分析
			http://www.cnblogs.com/pinard/p/6867828.html http://www.52nlp.cn/lda-math-mcmc-和-gibbs-sampling2 htt ... 
- xgboost调参过程
			from http://blog.csdn.net/han_xiaoyang/article/details/52665396 
- caffe的网络层结构(1)
			1.concat层 该层有两个相同作用的参数: message ConcatParameter { //指定拼接的维度,默认为1即以channel通道进行拼接;支持负索引,即-1表示最后一个维度 op ... 
- ReentrantReadWriteLock源码分析笔记
			ReentrantReadWriteLock包含两把锁,一是读锁ReadLock, 此乃共享锁, 一是写锁WriteLock, 此乃排它锁. 这两把锁都是基于AQS来实现的. 下面通过源码来看看Ree ... 
- LeetCode - 滑动窗口最大值
			给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 输入: nums ... 
- Windows 环境上域名配置
			1.Hosts位置 C:\Windows\System32\drivers\etc\hosts 2.Hosts内容 # Copyright (c) 1993-2009 Microsoft Corp. ... 
- Java 性能优化的55个细节(珍藏版)
			在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间 ... 
