全栈开发实践:使用Node和Vue创建YouTube风格的推荐引擎

一个App想留住用户,最佳方式就是给他们展现个性化的内容。YouTube视频结束后视频建议推荐(Up Next )就是一个很好的例子。亚马逊也有一个类似浏览商品后的类似商品的建议也是备受欢迎。还有Instagram也有搜索和浏览图片时的展示的图像和视频的方法也是考虑到了个性化的内容展示。

回来再对比天朝的各大智能推荐系统:

概述

这篇文章中虫虫将带领你一步一步构建一个简单应用程序,从后端到前端整个全栈开发的详细过程和步骤。实例的应用可以根据用户最近上传的视频向用户推荐个性化的视频。为了实现这个功能,我们需要利用Cloudinary视频播放器和由Google提供的自动视频标签附加。

成品的应用程序将如下图所示:

依赖

为了构建这个应用程序,我们将为后端使用Node服务器,为前端使用Vue。执行教程脚本,请确保:

你电脑上安装了Node

电脑上有Node包管理器(npm)。

终端中运行以下命令确保是否安装:

Node --version

npm --version

如果执行结果是正常的程序版本号,而不是报错,那么恭喜你,你可以按照本教程进行操作。否则,请先安装node和npm安装这。当然如果只想阅读文章,可以忽略脚本和依赖环境。

1、使用Cloudinary进行设置

Cloudinary是一个图像和视频管理的一站式商店,包括操作、优化和发布。借助Cloudinary,你可以节省大量的时间,避免花费多余的功夫在开发视频操作和发布相关的相关功能。

创建Cloudinary帐户

成功注册Cloudinary后,你将被重定向到仪表板,你可以在其中看到CLOUD_NAME,API_KEY和API_SECRET。稍后将我们会用到这些值。

打开自动视频标签附加组件

你需要给你的账号添加自动视频标签加载项,通过页面头部的Add-one菜单,点击进入组件选择页面,选择Google Auto Tagging组件:

选择,Free,月度50个标签免费套餐,并通过几个简单步骤设置好该组件。

编辑受限制的图像类型

要允许Cloudinary客户端在帐户中查询不同标签的媒体,你需要确保在Cloudinary帐户的安全选项卡下的"受限制的图像类型"中取消选中资源列表选项。如果未被选中,你将无法查询媒体库中的视频标签。

2、构建后端服务

要处理Cloudinary的API调用,我们需要部署一个后端express服务。

安装所需的Node模块

我们需要以下Node模块:

cors,实现应用程序的跨源资源共享

express,后端Web服务器

body-parser,解析JSON请求的内容

connect-multiparty,应用程序的多媒体格式请求,上传文件

cloudinary-core,处理Cloudinary函数的JavaScript核心库包

新建一个目录并进入该目录:

mkdir video-suggestion && cd video-suggestion

用npm安装以上所需的模块

npm install cors express body-parser connect-multiparty cloudinary-core

创建server.js文件

创建一个文件,其中包含我们的服务器在项目目录中工作所需的代码:

touch server.js

这是我们服务运行时的,引导启动文件。在server.js文件中,加载前面安装的Node模块。

加载节点模块

const cors = require('cors')

const express = require('express')

const cloudinary = require('cloudinary-core')

const bodyParser = require('body-parser')

const multipart = require('connect-multiparty')

[...]

创建express应用

现在让我们通过添加以下内容到server.js,创建我们的experess应用:

[...]

const app = express()

[...]

加载中间件

通过添加以下内容到server.js,加载所需的中间件:

[...]

app.use(cors())

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({ extended: false }));

const multipartMiddleware = multipart();

[...]

通过上述语句,我们将应用程序设置为使用cors。我们还设置应用程序以JSON格式解析请求。

配置Cloudinary客户端

现在你需要使用你的CLOUD_NAME,API_KEY和API_SECRET来配置Cloudinary客户端。登录到Cloudinary帐户时,你可以在仪表板上找到这些值。

[...]

cloudinary.config({

cloud_name: 'CLOUDINARY_CLOUD_NAME',

api_key: 'CLOUDINARY_API_KEY',

api_secret: 'CLOUDINARY_API_SECRET'

});

[...]

创建App路由

pload route of our applicati

我们的应用有两条基本路由:

/ upload,上传用户的视频

/suggest, 获取用户感兴趣的视频类别

对于应用程序的上传部分,我们使用Cloudinary客户端和视频,这些视频将app上传时,将上传路径通过调用时作为发布请求的一部分发送给给后端程序。视频文件会发送到Cloudinary媒体库。

在上传命令中,我们还包含google_video_tagging作为类别。这会触发auto_tagging功能,并将检测到的标签与视频一起存储在媒体库中。

[...]

app.post('/upload', multipartMiddleware, function(req, res){

cloudinary.uploader.upload(req.files.video.path,

function(result) {

return res.json({

'status' : true

})

},

{ resource_type: "video", categorization: "google_video_tagging", auto_tagging: 0.4 });

[...]

auto_tagging:0.4表示用于检测到的标签的置信度(匹配率)。

要获取我们用户上传的视频的探测标签,我们设置Cloudinary客户端的resource_type:'video'。

配置应用监听端口

最后是设置应用程序的监听端口:

[...]

let port = process.env.PORT || 3000;

app.listen(port, function () {

console.log('App listening on port ' + port + '!');

});

3、构建前端应用

我们已经构建好了应用程序的后端服务,现在我们需要构建应用程序用户交互界面。这儿,我选择使用最流行火热的Vue.js。 Vue.js是一个快捷易用的渐进式JavaScript框架。

安装Vue.js

如果你已安装Vue,运行以下命令确认安装:

vue --version

如果还没安装,通过npm安装装Vue CLI:

npm install --global vue-cli

要创建前端服务,请在我们在上一步中创建的video-suggestion项目目录下运行:

vue init webpack frontend

安装Node模块

我们将使用Vue组件中的axios获取请求,你需要预先安装它。安装方法:

cd frontend

npm install axios

创建上传组件

接着,创建负责视频上传的上传组件。

cd frontend/src/components

touch Upload.vue

在Upload.vue中,我们需要加载axios模块:

import axios from 'axios'

[...]

然后我们配置组件:

[...]

export default {

name: 'Upload',

data () {

return {

video: null,

loading: ''

}

},

methods: {

upload : function(files){

this.loading = 'Video detected';

this.video = files[0];

},

onSubmit: function(){

// compile the form data

const formData = new FormData();

formData.append('video', this.video);

this.loading = "Uploading...Please wait.";

axios.post('http://localhost:3128/upload', formData)

.then( res => {

this.loading = 'Upload Complete!';

})

}

}

}

组件有两个方法,update和onSubmit。update负责将上传的视频分配给this.video,onSubmit方法将视频添加到formData,然后将发送请求发送到后端服务器的/upload路由。

该组件将有一个如下所示的模板:

Video   

Upload

创建播放列表组件

现在视频已上传,我们希望为用户提供类似视频的播放列表。为此,我们将使用Cloudinary视频播放器:

[...]

[...]

这会导入稍后需要的视频播放器样式表和JavaScript脚本。

创建播放列表组件:

cd frontend/src/components

touch Playlist.vue

在Playlist.vue中,我们导入axios模块:

import axios from 'axios'

[...]

配置该组件:

[...]

export default {

name: 'Playlist',

data () {

return {

interests : '',

loading: ''

}

},

mounted : function(){

axios.get('http://localhost:3128/suggest')

.then( result => {

this.interests = result.data.tags;

let cld = cloudinary.Cloudinary.new({ cloud_name: 'demo' });

let demoplayer = cld.videoPlayer('video-player');

demoplayer.playlistByTag( result.data.tags[0] ,{ autoAdvance: 0, repeat: true, presentUpcoming: 15 })

})

}

}

[...]

当上面的组件被挂载时,我们向我们的服务器的/suggest路由发出get请求,它返回标签列表,然后我们使用Cloudinary VideoPlayer的playlistByTag函数播放资源视频的第一个标签。

该组件有一个如下所示的模板:

[...]

Suggested Video Playist

results are based on video uploads...


Your interests :

id="video-player"

controls

class="cld-video-player cld-video-player-skin-dark"

>

[...]

在App.vue中导入组件

现在我们已经准备好了组件,我们将它们导入到我们的App.vue中,以便在编译视图时捕获它们:

import Upload from './components/Upload'

import Playlist from './components/Playlist'

export default {

name: 'app',

components: {

Upload,

Playlist

}

}

App.vue的模板如下所示:

[...]

我们在这里将会看到上传和播放列表模板。

一旦完成,我们的前端应用就完成了,我们可以使用以下命令运行它:

npm run dev

结论

我们已经演示了如何使用Cloudinary和一些Vue.js构建视频建议应用程序。

当然,还有许多其他场景可以使用有关用户上传的内容的捕获数据,以便为你的应用程序提供更加个性化的体验。

这篇文章虫虫,只是用来展示一下整个JS全栈开发的一个实例,抛砖引玉,希望大家能对此有个了解,并能在自己的实际工作中实践。如果觉得文章还有意义,请关注虫虫,并给我点赞打赏,如果有意见建议,请直接回复本文章。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容