Vue中使用baberrage实现弹幕效果

在Vue中使用baberrage插件实现弹幕效果

什么是baberrage?

链接:https://github.com/superhos/vue-baberrage/blob/master/docs/zh/README.md

是一位大佬制作的插件,实现弹幕的效果

效果

Vue中使用baberrage实现弹幕效果

这里用作留言界面

1. 创建所需要的数据库

DROP TABLE IF EXISTS `tb_message`;
CREATE TABLE `tb_message`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `nickname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '昵称',
  `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '头像',
  `message_content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '留言内容',
  `time` tinyint(1) NULL DEFAULT NULL COMMENT '弹幕速度',
  `create_time` datetime(0) NOT NULL COMMENT '发布时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3432 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

2. 在Vue中加入baberrage

  • npm install vue-baberrage
    

    全局引入

  • import { vueBaberrage } from 'vue-baberrage'
    Vue.use(vueBaberrage)
    

3. 创建留言页面

Message.vue

<template>
  <div>
    <Nav></Nav>
    <!-- banner -->
    <div class="message-banner">
      <!-- 弹幕输入框 -->
      <div class="message-container">
        <h1 class="message-title">留言板</h1>
        <div class="animate__animated animate__fadeInUp message-input-wrapper">
          <input v-if="userVo == null"
              style="color: #1b1c1d; width: 20%"
              v-model="messageNickname"
              @click="show = true"
              @keyup.enter="addToList"
              placeholder="昵称"
          />
          <input
              style="color: #1b1c1d;"
              v-model="messageContent"
              @click="show = true"
              @keyup.enter="addToList"
              placeholder="说点什么吧"
          />
          <el-button
              round
              type="info"
              class="ml-3 animate__animated animate__backInRight"
              @click="addToList"
              v-show="show"
          >
            发送
          </el-button>
        </div>
      </div>
      <!-- 弹幕列表 -->
      <div class="barrage-container">
        <vue-baberrage :barrageList="barrageList">
          <template v-slot:default="slotProps">
            <span class="barrage-items">
              <img
                  :src="slotProps.item.avatar"
                  width="30"
                  height="30"
                  style="border-radius:50%"
              />
              <span class="ml-2">{{ slotProps.item.nickname }} :</span>
              <span class="ml-2">{{ slotProps.item.messageContent }}</span>
            </span>
          </template>
        </vue-baberrage>
      </div>
    </div>
  </div>
</template>

<script>
import Nav from "../../components/index/Nav";

export default {
  name:"Message",
  components:{Nav},
  mounted() {
    this.listMessage();
  },
  data() {
    return {
      show: false,
      messageNickname: "",
      messageContent: "",
      barrageList: [],
      avatar: '',
      userVo: null
    }
  },
  methods: {
    addToList() {
      const _this = this;
      if (this.messageNickname.trim() == ""){
        this.$message.error("昵称不能为空")
        return false;
      }
      if (this.messageContent.trim() == ""){
        this.$message.error("留言不能为空")
        return false;
      }
        //如果本地有用户数据则使用本地用户头像
        //否则随机赋予头像(本地存放了30个头像)
      if (this.userVo != null){
        this.avatar = this.userVo.avatar
      }else {
        this.avatar = "/images/commentAvatar/" + "avatar" +Math.floor((Math.random() * 30) + 1) + ".png"
      }

      var message = {
          avatar: this.avatar,
          nickname: this.messageNickname,
          messageContent: this.messageContent,
          time: Math.floor(Math.random() * (10 - 7)) + 7,
          userVo: this.userVo
      };
      this.barrageList.push(message);
      this.messageContent = "";

      this.$axios.post('http://localhost:8181/tbMessage',message)
    },
    listMessage() {
      this.$axios.get("http://localhost:8181/tbMessage").then(res => {
        this.barrageList = res.data.data;

      });
    }
  },
  created() {
    this.userVo = JSON.parse(localStorage.getItem("userInfo"))
    //将localStorage中的用户名取出
    this.messageNickname = this.userVo.username;
  }
};
</script>

<style scoped>
.message-banner {
  position: absolute;

  left: 0;
  right: 0;
  height: 100vh;
  background-image: url("../../../public/images/message.jpg");

  animation: header-effect 1s;
}
.message-title {
  color: #eee;
  animation: title-scale 1s;
}
.message-container {
  position: absolute;
  width: 360px;
  top: 35%;
  left: 0;
  right: 0;
  text-align: center;
  z-index: 5;
  margin: 0 auto;
  color: #fff;
}
.message-input-wrapper {
  display: flex;
  justify-content: center;
  height: 2.5rem;
  margin-top: 2rem;
}
.message-input-wrapper input {
  outline: none;
  width: 70%;
  border-radius: 20px;
  height: 100%;
  padding: 0 1.25rem;
  color: #eee;
  border: #fff 1px solid;
}
.message-input-wrapper input::-webkit-input-placeholder {
  color: #eeee;
}
.message-input-wrapper button {
  outline: none;
  border-radius: 20px;
  height: 100%;
  padding: 0 1.25rem;
  border: #fff 1px solid;
}
.barrage-container {
  position: absolute;
  top: 50px;
  left: 0;
  right: 0;
  bottom: 0;
  height: calc(100% -50px);
  width: 100%;
}
.barrage-items {
  background: rgb(0, 0, 0, 0.7);
  border-radius: 100px;
  color: #fff;
  padding: 5px 10px 5px 5px;
  align-items: center;
  display: flex;
}
.ml-3{
  margin-left: 12px!important;
}

.ml-2{
  margin-left: 8px!important;
}
</style>

4. 后台接收数据

(后台前面就是基本的查询和添加就不列举了)

MessageController

/**
 * 留言板留言
 */
@RestController
public class TbMessageController {

    @Autowired
    private TbMessageService tbMessageService;

    @GetMapping("/tbMessage")
    public Result getAll(){

        List<TbMessage> allTbMessage = tbMessageService.getAllTbMessage();

        return Result.success(allTbMessage);
    }

    @PostMapping("/tbMessage")
    public Result saveAll(@RequestBody TbMessage tbMessage){

       // System.err.println("tbMessage=>" + tbMessage);


        int i = tbMessageService.saveTbMessage(tbMessage);

        if (i == 0){
            return Result.fail("发布失败");
        }else{
            return Result.success("发布成功");
        }
    }
}
上一篇:mysql中emoji表情存储


下一篇:关于解决运行sql文件时,找不到MySQL默认编码utf8mb4的问题