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)和本地网络的 ...
随机推荐
- HBase(1.0.2) API数据模型
几个相关类与HBase数据模型之间的对应关系 java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) H ...
- php实现hashTable
Hash表作为最重要的数据结构之一,也叫做散列表.使用PHP实现Hash表的功能.PHP可以模拟实现Hash表的增删改查.通过对key的映射到数组中的一个位置来访问.映射函数叫做Hash函数,存放记录 ...
- 6423. 【NOIP2019模拟11.11】画
题目描述 Description Input Output Sample Input 3 2 3 3 6 5 1 2 1 3 Sample Output 15 Data Constraint 题解 迫 ...
- #419 Div2 Problem C Karen and Game (贪心 && 暴力)
题目链接:http://codeforces.com/contest/816/problem/C 题意 :给出一个 n*m 的变化后的矩阵,变化前矩阵的元素全是0,变化的规则是选择其中的一行或者一列将 ...
- HDU 6578 Blank
hdu题面 Time limit 1000 ms Memory limit 262144 kB OS Windows Source 2019 Multi-University Training Con ...
- python安装报错error writing to file:......
今天换了win10 64电脑,安装python3.6.8时,报错:error writing to file:...... 安装时,右键--以管理员身份运行,安装成功.
- sh_12_转义字符
sh_12_转义字符 # \t 在控制台输出一个 制表符,协助在输出文本时 垂直方向 保持对齐 print("1\t2\t3") print("10\t20\t30&qu ...
- Html !!!了解一下
1.什么是超文本 超文本:就是指页面内可以包含图片,链接,甚至音乐,程序等非文字元素; 最常用的超文本格式:超文本标记语言(标记通用语言的下个一个应用)和富文本格式 超文本语言的特点: 简易性:超文本 ...
- 【Leetcode】二分法
题目: 在排序数组中查找元素的第一个和最后一个位置. 二分法的思想非常简单,然而其中的实现细节非常繁琐,容易出错.本推文非常详细地介绍二分法的实现细节. 总结几点注意事项: 初始上.下界的取值: 判断 ...
- java中定义注解
创建 @Target({ElementType.Type}) @Retention(RetentionPolicy.RUNTIME) public @interface Fruit { String ...