工具:利用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 })
}
})
}

  

最新文章

  1. 自己开发一个 vsts agent 的 task
  2. Spring源码分析——BeanFactory体系之抽象类、类分析(二)
  3. PHP正则表达式的快速学习方法
  4. 通过一个表的id同时查询多个表的数据
  5. iOS 之 工厂模式
  6. Spring 5.0.0.RC1 - CORS Support 【译文】
  7. Java基础知识总结【转+整合】
  8. mysql字符集设置注意事项
  9. 注解@CrossOrigin解决跨域问题
  10. 解决关于phpstorm打开速度很慢的问题
  11. Mysql 5.7.21 单机多实例安装
  12. &lt;转&gt;jmeter(三)SOAP/XML-RPC Request
  13. (原创)Callable、FutureTask中阻塞超时返回的坑点
  14. Python Web学习笔记之WebSocket 通信过程与实现
  15. js 算法
  16. jdbc如何锁定某一条数据或者表,不让别人操作?
  17. zabbix的agent端的主动模式关键三个参数
  18. springMVC中Unknown return value type: java.lang.Integer(解决)
  19. 微信读书App来了 小伙伴们快去占榜吧
  20. docker image rm ubuntu 失败

热门文章

  1. 补充:bytes类型以及字符编码转换
  2. 设计模式Design Pattern(4) -- 访问者模式
  3. python接口自动化六(参数化也就是把之前敲过的代码封装成方法)
  4. arch+xfce4音量控制快捷键插件
  5. 在 Cloudera Data Flow 上运行你的第一个 Flink 例子
  6. Cassandra 安装部署
  7. node.js入门学习(六)--express
  8. CF191C Fools and Roads - 树剖解法
  9. Elastic-Job快速入门
  10. Windows+anaconda+jupyter notebook+R+python3.6