工具:利用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 实现我猜你喜欢功能的更多相关文章

  1. Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)

    目录 前言 formidable简介 创建项目并安装formidable 实现上传功能 运行结果 部分疑惑解析 写在之后 前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能---- ...

  2. node+express实现文件上传功能

    在进行node web开发时,我们可能经常遇到上传文件的问题,这一块如果我们没有经验,可能会遇到很多坑,下面我将跟大家分享一下,实现文件上传的一些方式. 一.node+express文件上传的常用方式 ...

  3. Nodejs学习笔记(八)—Node.js + Express 实现上传文件功能(felixge/node-formidable)

    前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次 ...

  4. 潭州课堂25班:Ph201805201 tornado 项目 第八课 增加喜欢功能(课堂笔记)

    tornado 相关说明 新增一个页面,用来做图片收藏, 还要在 account.py 创建一个数据库表,记录用户喜欢的图片,哪些图片用户疯狂传奇 cd 到 项目目录下,执行数据库更新 alembic ...

  5. nodejs之express框架商品管理系统登录功能

    1.该系统主要使用express.body-parser.express-session.ejs.mongodb-connect . npm install express --save npm in ...

  6. 在SQL Server Express版本中没有代理功能如何自动备份数据库

    因为是免费的且单个数据库可以支持到10GB,对于一般企业完全足够了,也就将就使用了,备份将分为两步: 1.创建备份脚本 2.创建系统的计划任务进行每天的备份 详细做法如下: 1.创建备份脚本 打开SS ...

  7. 真刀实战地搭建React+Webpack+Express搭建一个简易聊天室

    一.前面bb两句 因为自惭(自残)webpack配置还不够熟悉,想折腾着做一个小实例熟悉.想着七夕快到了,做一个聊天室自己和自己聊天吧哈哈.好了,可以停止bb了,说一下干货. 二. 这个项目能学到啥? ...

  8. NodeJS旅程 : express - nodejs MVC 中的王牌

    express 正如ASP.NET MVC 在作为.net平台下最佳的 Mvc框架的地位一样,express在 node.js 环境也有着相同的重要性.在百度上 "nodejs expres ...

  9. express-6 请求和响应对象(1)

    URL的组成部分 协议: 协议确定如何传输请求.我们主要是处理http和https.其他常见的协议还有file和ftp. 主机名: 主机名标识服务器.运行在本地计算机(localhost)和本地网络的 ...

随机推荐

  1. MYSQL<一>

    -- ########## 01.数据库概述 ########## -- 1.信息:现实世界中各种可以接触到的东西 -- 2.数据:信息在计算机世界中的映射(反映) -- Java中可以把数据存储在内 ...

  2. javascript(腾讯)

    var a={key:"1",value:2}; war b=a; b.value+=a.key, 打印b.value是多少,a.value呢? 答案:都是21.因为javascr ...

  3. 【长郡NOIP2014模拟10.22】搞笑的代码

    题目 在OI界存在着一位传奇选手--QQ,他总是以风格迥异的搞笑代码受世人围观 某次某道题目的输入是一个排列,他使用了以下伪代码来生成数据 while 序列长度<n do { 随机生成一个整数属 ...

  4. LDA终极分析

    http://www.cnblogs.com/pinard/p/6867828.html http://www.52nlp.cn/lda-math-mcmc-和-gibbs-sampling2 htt ...

  5. xgboost调参过程

    from http://blog.csdn.net/han_xiaoyang/article/details/52665396

  6. caffe的网络层结构(1)

    1.concat层 该层有两个相同作用的参数: message ConcatParameter { //指定拼接的维度,默认为1即以channel通道进行拼接;支持负索引,即-1表示最后一个维度 op ...

  7. ReentrantReadWriteLock源码分析笔记

    ReentrantReadWriteLock包含两把锁,一是读锁ReadLock, 此乃共享锁, 一是写锁WriteLock, 此乃排它锁. 这两把锁都是基于AQS来实现的. 下面通过源码来看看Ree ...

  8. LeetCode - 滑动窗口最大值

    给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 输入: nums ...

  9. Windows 环境上域名配置

    1.Hosts位置 C:\Windows\System32\drivers\etc\hosts 2.Hosts内容 # Copyright (c) 1993-2009 Microsoft Corp. ...

  10. Java 性能优化的55个细节(珍藏版)

    在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间 ...