express 实现我猜你喜欢功能
2024-10-07 06:14:47
工具:利用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 })
}
})
}
最新文章
- 自己开发一个 vsts agent 的 task
- Spring源码分析——BeanFactory体系之抽象类、类分析(二)
- PHP正则表达式的快速学习方法
- 通过一个表的id同时查询多个表的数据
- iOS 之 工厂模式
- Spring 5.0.0.RC1 - CORS Support 【译文】
- Java基础知识总结【转+整合】
- mysql字符集设置注意事项
- 注解@CrossOrigin解决跨域问题
- 解决关于phpstorm打开速度很慢的问题
- Mysql 5.7.21 单机多实例安装
- <;转>;jmeter(三)SOAP/XML-RPC Request
- (原创)Callable、FutureTask中阻塞超时返回的坑点
- Python Web学习笔记之WebSocket 通信过程与实现
- js 算法
- jdbc如何锁定某一条数据或者表,不让别人操作?
- zabbix的agent端的主动模式关键三个参数
- springMVC中Unknown return value type: java.lang.Integer(解决)
- 微信读书App来了 小伙伴们快去占榜吧
- docker image rm ubuntu 失败
热门文章
- 补充:bytes类型以及字符编码转换
- 设计模式Design Pattern(4) -- 访问者模式
- python接口自动化六(参数化也就是把之前敲过的代码封装成方法)
- arch+xfce4音量控制快捷键插件
- 在 Cloudera Data Flow 上运行你的第一个 Flink 例子
- Cassandra 安装部署
- node.js入门学习(六)--express
- CF191C Fools and Roads - 树剖解法
- Elastic-Job快速入门
- Windows+anaconda+jupyter notebook+R+python3.6