基于SpringBoot+Vue协同过滤视频推荐系统

1.技术介绍

java+springboot+mysql+mybatis+Vue

开发工具:eclipse或idea

2.主要功能说明:

1)用户

注册、登录、首页、个人中心、我的收藏、视频新增、后台管理、

2)管理员

个人中心、用户管理、视频标签管理、视频信息管理、轮播图管理

3)协同过滤算法

根据用户的收藏喜好行为计算相似度,给有相近的用户行为推荐视频

比如:

用户1收藏了视频1、2、3

用户2收藏了视频1、3、6

用户3 收藏了视频1

那个根据协同过滤算法推荐,用户3可能也喜欢视频3

3.部分代码展示

```java

<template>

  <div>

        <div class="container">

      <div class="login-form">

        <h1 class="h1">基于协同过滤算法的短视频推荐系统注册</h1>

<el-form ref="rgsForm" class="rgs-form" :model="rgsForm">

<!-- <div v-if="tableName=='yonghu'" class="input-group">

  <div class="label">账号</div>

  <div class="input-container">

    <input v-model="ruleForm.zhanghao" class="input" type="text" placeholder="账号">

  </div>

</div> -->

<el-form-item label="账号" class="input" v-if="tableName=='yonghu'">

  <el-input v-model="ruleForm.zhanghao" autocomplete="off" placeholder="账号"  />

</el-form-item>

<!-- <div v-if="tableName=='yonghu'" class="input-group">

  <div class="label">密码</div>

  <div class="input-container">

    <input v-model="ruleForm.mima" class="input" type="text" placeholder="密码">

  </div>

</div> -->

<el-form-item label="密码" class="input" v-if="tableName=='yonghu'">

  <el-input v-model="ruleForm.mima" autocomplete="off" placeholder="密码" type="password"#elsetype="text" />

</el-form-item>

<el-form-item label="确认密码" class="input" v-if="tableName=='yonghu'">

  <el-input v-model="ruleForm.mima2" autocomplete="off" placeholder="确认密码" type="password"/>

</el-form-item>

<!-- <div v-if="tableName=='yonghu'" class="input-group">

  <div class="label">姓名</div>

  <div class="input-container">

    <input v-model="ruleForm.xingming" class="input" type="text" placeholder="姓名">

  </div>

</div> -->

<el-form-item label="姓名" class="input" v-if="tableName=='yonghu'">

  <el-input v-model="ruleForm.xingming" autocomplete="off" placeholder="姓名"  />

</el-form-item>

<!-- <div v-if="tableName=='yonghu'" class="input-group">

  <div class="label">年龄</div>

  <div class="input-container">

    <input v-model="ruleForm.nianling" class="input" type="text" placeholder="年龄">

  </div>

</div> -->

<el-form-item label="年龄" class="input" v-if="tableName=='yonghu'">

  <el-input v-model="ruleForm.nianling" autocomplete="off" placeholder="年龄"  />

</el-form-item>

<!-- <div v-if="tableName=='yonghu'" class="input-group">

  <div class="label">手机</div>

  <div class="input-container">

    <input v-model="ruleForm.shouji" class="input" type="text" placeholder="手机">

  </div>

</div> -->

<el-form-item label="手机" class="input" v-if="tableName=='yonghu'">

  <el-input v-model="ruleForm.shouji" autocomplete="off" placeholder="手机"  />

</el-form-item>

<div style="display: flex;flex-wrap: wrap;width: 100%;justify-content: center;">

<el-button class="btn" type="primary" @click="login()">注册</el-button>

<el-button class="btn close" type="primary" @click="close()">取消</el-button>

</div>

</el-form>

      </div>

      <!-- <div class="nk-navigation">

        <a href="#">

          <div @click="login()">注册</div>

        </a>

      </div> -->

    </div>

  </div>

</template>

<script>

export default {

  data() {

    return {

      ruleForm: {

      },

      tableName:"",

      rules: {},

    };

  },

  mounted(){

    let table = this.$storage.get("loginTable");

    this.tableName = table;

      },

  created() {


  },

  methods: {

    // 获取uuid

    getUUID () {

      return new Date().getTime();

    },

    close(){

this.$router.push({ path: "/login" });

    },

    // 注册

    login() {

var url=this.tableName+"/register";

      if((!this.ruleForm.zhanghao) && `yonghu` == this.tableName){

        this.$message.error(`账号不能为空`);

        return

      }

      if((!this.ruleForm.mima) && `yonghu` == this.tableName){

        this.$message.error(`密码不能为空`);

        return

      }

      if((this.ruleForm.mima!=this.ruleForm.mima2) && `yonghu` == this.tableName){

    this.$message.error(`两次密码输入不一致`);

    return

      }

      if((!this.ruleForm.xingming) && `yonghu` == this.tableName){

        this.$message.error(`姓名不能为空`);

        return

      }

      if(`yonghu` == this.tableName && this.ruleForm.nianling&&(!this.$validate.isIntNumer(this.ruleForm.nianling))){

        this.$message.error(`年龄应输入整数`);

        return

      }

      if(`yonghu` == this.tableName && this.ruleForm.shouji&&(!this.$validate.isMobile(this.ruleForm.shouji))){

        this.$message.error(`手机应输入手机格式`);

        return

      }

      this.$http({

        url: url,

        method: "post",

        data:this.ruleForm

      }).then(({ data }) => {

        if (data && data.code === 0) {

          this.$message({

            message: "注册成功",

            type: "success",

            duration: 1500,

            onClose: () => {

              this.$router.replace({ path: "/login" });

            }

          });

        } else {

          this.$message.error(data.msg);

        }

      });

    }

  }

};

</script>

<style lang="scss" scoped>

.el-radio__input.is-checked .el-radio__inner {

border-color: #00c292;

background: #00c292;

}

.el-radio__input.is-checked .el-radio__inner {

border-color: #00c292;

background: #00c292;

}

.el-radio__input.is-checked .el-radio__inner {

border-color: #00c292;

background: #00c292;

}

.el-radio__input.is-checked+.el-radio__label {

color: #00c292;

}

.el-radio__input.is-checked+.el-radio__label {

color: #00c292;

}

.el-radio__input.is-checked+.el-radio__label {

color: #00c292;

}

.h1 {

margin-top: 10px;

}

body {

padding: 0;

margin: 0;

}

// .container {

//    min-height: 100vh;

//    text-align: center;

//    // background-color: #00c292;

//    padding-top: 20vh;

//    background-image: url(../assets/img/bg.jpg);

//    background-size: 100% 100%;

//    opacity: 0.9;

//  }

// .login-form:before {

// vertical-align: middle;

// display: inline-block;

// }

// .login-form {

// max-width: 500px;

// padding: 20px 0;

// width: 80%;

// position: relative;

// margin: 0 auto;

// .label {

// min-width: 60px;

// }

// .input-group {

// max-width: 500px;

// padding: 20px 0;

// width: 80%;

// position: relative;

// margin: 0 auto;

// display: flex;

// align-items: center;

// .input-container {

// display: inline-block;

// width: 100%;

// text-align: left;

// margin-left: 10px;

// }

// .icon {

// width: 30px;

// height: 30px;

// }

// .input {

// position: relative;

// z-index: 2;

// float: left;

// width: 100%;

// margin-bottom: 0;

// box-shadow: none;

// border-top: 0px solid #ccc;

// border-left: 0px solid #ccc;

// border-right: 0px solid #ccc;

// border-bottom: 1px solid #ccc;

// padding: 0px;

// resize: none;

// border-radius: 0px;

// display: block;

// width: 100%;

// height: 34px;

// padding: 6px 12px;

// font-size: 14px;

// line-height: 1.42857143;

// color: #555;

// background-color: #fff;

// }

// }

// }

.nk-navigation {

margin-top: 15px;

a {

display: inline-block;

color: #fff;

background: rgba(255, 255, 255, .2);

width: 100px;

height: 50px;

border-radius: 30px;

text-align: center;

display: flex;

align-items: center;

margin: 0 auto;

justify-content: center;

padding: 0 20px;

}

.icon {

margin-left: 10px;

width: 30px;

height: 30px;

}

}

.register-container {

margin-top: 10px;

a {

display: inline-block;

color: #fff;

max-width: 500px;

height: 50px;

border-radius: 30px;

text-align: center;

display: flex;

align-items: center;

margin: 0 auto;

justify-content: center;

padding: 0 20px;

div {

margin-left: 10px;

}

}

}

.container {

height: 100vh;

background-position: center center;

background-size: cover;

background-repeat: no-repeat;

    background-image: url(http://codegen.caihongy.cn/20211108/7646593eea654d5da677d9a78f0a9254.jpg);


.login-form {

right: 50%;

top: 50%;

transform: translate3d(50%, -50%, 0);

border-radius: 10px;

background-color: rgba(255,255,255,.5);

font-size: 14px;

font-weight: 500;

      box-sizing: border-box;

width: 480px;

height: auto;

padding: 10px;

margin: 0px 0px 0px -10px;

border-radius: 30px;

border-width: 0;

border-style: solid;

border-color: rgba(255,0,0,0);

background-color: rgba(255, 255, 255, 1);

box-shadow: 0 0 8px rgba(248,214,117,1);

.h1 {

width: 450px;

height: 35px;

line-height:35px;

color: #000;

font-size: 20px;

padding: 0;

margin: 0px 0px 10px 0px;

border-radius: 0;

border-width: 0;

border-style: solid;

border-color: rgba(255,0,0,0);

background-color: rgba(0, 206, 209, 0);

box-shadow: 0 0 6px rgba(255,0,0,0);

text-align: center;

}

.rgs-form {

display: flex;

flex-direction: column;

justify-content: center;

align-items: center;

        .el-form-item {

          width: 100%;

          display: flex;

          & /deep/ .el-form-item__content {

            flex: 1;

            display: flex;

          }

        }

.input {

          width: 100%;

          height:auto;

          padding: 0;

          margin: 0px 0px 12px 30px;

          border-radius: 0;

          border-width: 0;

          border-style: solid;

          border-color: rgba(255,0,0,0);

          background-color: rgba(255,0,0,0);

          box-shadow: 0 0 6px rgba(255,0,0,0);

& /deep/ .el-form-item__label {

            width: 100px;

            line-height:44px;

            color: rgba(0, 0, 0, 1);

            font-size: 16px;

            padding: 0px 10px 0px 0px;

            margin: 0px 0px 0px 0px;

            border-radius: 0;

            border-width: 0;

            border-style: solid;

            border-color: rgba(255,0,0,0);

            background-color: rgba(144, 238, 144, 0);

            box-shadow: 0 0 6px rgba(255,0,0,0);

}

& /deep/ .el-input__inner {

            width: 300px;

            height: 44px;

            line-height:44px;

            color: rgba(0, 0, 0, 1);

            font-size: 14px;

            padding: 0 12px;

            margin: 0;

            border-radius: 5px;

            border-width: 0;

            border-style: solid;

            border-color: #606266;

            background-color: #fff;

            box-shadow: 0 0 8px 1px rgba(248,213,117,1);

            text-align: left;

}

}

        .send-code {

          & /deep/ .el-input__inner {

            width: 220px;

            height: 44px;

            line-height:44px;

            color: #606266;

            font-size: 14px;

            padding: 0 12px;

            margin: 0;

            border-radius: 5px 0 0 5px;

            border-width: 0;

            border-style: solid;

            border-color: #606266;

            background-color: #fff;

            box-shadow: 0 0 8px 1px rgba(248,213,117,1);

            text-align: left;

          }

          .register-code {

            margin: 0;

            padding: 0;

            width: 80px;

            height: 44px;

            line-height:44px;

            color: #fff;

            font-size: 14px;

            border-width: 0;

            border-style: solid;

            border-color: rgba(255,0,0,0);

            border-radius: 0 5px 5px 0;

            background-color: rgba(64, 158, 255, 1);

            box-shadow: 0 0 6px rgba(255,0,0,0);

          }

        }

.btn {

margin: 0px 10px 0px 30px;

          padding: 0;

width: 88px;

height: 40px;

          line-height:40px;

color: #fff;

font-size: 14px;

border-width: 0;

border-style: solid;

border-color: #409EFF;

border-radius: 4px;

background-color: rgba(64, 158, 255, 1);

          box-shadow: 0 0 6px rgba(255,0,0,0);

}

.close {

          margin: 0 10px;

          padding: 0;

          width: 88px;

          height: 40px;

          line-height:40px;

          color: rgba(255, 255, 255, 1);

          font-size: 14px;

          border-width: 0;

          border-style: solid;

          border-color: #409EFF;

          border-radius: 4px;

          background-color: rgba(64, 158, 255, 1);

          box-shadow: 0 0 6px rgba(255,0,0,0);

}

}

}

}

</style>

```

4.系统演示地址:

链接:https://pan.baidu.com/s/1CFA2062rrN1CeFlX2DWtbA

提取码:m09z

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

推荐阅读更多精彩内容