Vue2.5 для создания простого видеовеб-приложения

Vue.js

bili-video

Проект веб-сайта имитации билибили, неофициальный веб-сайт, этот проект предназначен только для изучения и ознакомления! !

Введение

Из-за эпидемии я долго сидел дома, поэтому за это время закрепил и усвоил фронтенд знания, но после обучения какое-то время есть ощущение, что я освоил некоторые технологии, но не некуда применить, поэтому пришла в голову идея сделать проект. После этой идеи, что вы хотите сделать? Когда я однажды был на станции B, извините, я сделал это (имитация видео Bilibili, веб-приложение)

После проведения бизнес-анализа этого проекта с самого начала у меня есть твердая решимость поддерживать этот проект в течение длительного времени Будь то интерфейс данных или применение технологий, я много работал и столкнулся с трудностями в середине , У меня есть идея отказаться, потому что интерфейс данных этого проекта был проблемой в начале. Поскольку в Интернете нет стандартного документа, связанного с интерфейсом данных, он был наконец преодолен. После того, как проект в основном завершен, он будет отсортирован для использования в этом проекте Интерфейс данных для справки. Передо мной пекинская капуста, и большие парни слегка брызгают, хи-хи-хи.

Войдите в репозиторий проекта GitHub.(Добро пожаловать в звездочку и упомяните пр.)

Войдите в онлайн-предварительный просмотр проекта(рекомендуется использовать хром для открытия)

[Примечание] Текущий этап этого проекта все еще относительно грубый, и в будущем он будет улучшен и оптимизирован!

Функциональный модуль проекта

титульная страница

  • компонент переключателя
  • Карусельный компонент
  • компонент прокрутки (улучшенная вторичная инкапсуляция прокрутки)
  • Список рекомендуемых видео
  • компонент загрузки
  • подтвердить компонент

Страница воспроизведения видео

  • видео-плеер
  • Видео введение
  • Видеорекомендация
  • видео обзор

страница поиска

  • Популярные поисковые теги
  • История поиска
  • Ключевые слова для поиска с защитой от сотрясений и выделение
  • список результатов поиска

Видео раздел

  • Список видео классификации разделов

Таблица лидеров дивизиона видео

  • Список лидеров дивизиона видео

реальный источник данных

  • Часть видеоданных, полученных в результате моего собственного исследования
  • от GitHubSocialSisterYiЧасть предоставленных видеоданных (спасибо, что сэкономили мне много работы)

Интерфейсы данных, используемые в этом проекте:интерфейс данных проекта

Примечание. Все API, используемые в этом проекте, находятся в папке src/api.

2. Введение проекта

Общая структура проекта

Это общая архитектура, которую обычно ожидает проект в настоящее время, и она может измениться в ходе последующей разработки. . .

Структура каталогов

Здесь представлено только содержимое папки src

├─api               //数据请求接口、相关函数和基础配置
├─base              //基础UI组件
├─common            //通用样式、工具类函数和icon图标
├─components        //核心功能组件
├─router            //路由配置文件
└─store             //vuex状态管理文件
  App.vue           //根组件
  main.js           //入口文件

стек технологий

  • vue2.5: прогрессивный фреймворк для создания пользовательских интерфейсов.
  • vue-router: Официальный менеджер маршрутов Vue.js
  • vue-lazyload: Модуль Vue, который лениво загружает изображения в приложение.
  • vue-awesome-swiper: Плагин эффекта скольжения Vue на основе пакета swiper.
  • fastclick: устраняет задержку в 300 мс между физическим кликом и инициированием события клика в мобильных браузерах.
  • better-scroll: подключаемый модуль, который решает различные сценарии прокрутки на мобильном терминале.
  • axios: запрашивать данные API серверной части
  • vuex: шаблон управления состоянием, разработанный специально для приложений Vue.js.

проблема проекта

  • Производительность текущего проекта низкая, и есть много возможностей для оптимизации, поэтому производительность будет оптимизирована после разработки проекта.
  • Содержимое окна поиска не может содержать пробелы, если они есть, это вызовет проблему, что код не может быть скомпилирован в результатах поиска.
  • В поле поиска необходимо очистить текстовое поле и ввести его, чтобы отобразить запрос на поиск.
  • Функция воспроизведения плеера несовместима с браузером Safari, что приводит к невозможности воспроизведения
  • Дизайнерская идея модуля видео-листа в проекте неверна

(Вышеуказанные проблемы - это проблемы, которые курица обнаружила, но не решила, и они будут рассмотрены позже)

3. Введение в функцию

Домашний раздел

首页部分

Страница воспроизведения видео

视频播放页

страница поиска

搜索页

Таблица лидеров видео

视频排行榜

Страница раздела видео

视频分区页

Пять, часть отображения функционального кода

Основной код защиты от сотрясений окна поиска

// 防抖
export function debounce (func, delay) {
  let timer
  return function (...args) {
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(() => {
      func.apply(this, args)
    }, delay)
  }
}

Выделите основной код поискового запроса

// 高亮关键词
export function setHighlight (keyword, item, className) {
  let s = new Set()
  for (let k of keyword) {
    s.add(k)
  }
  s.forEach(function (value) {
    item = item.replace(value, function () {
      return `<em class="${className}">${value}</em>`
    })
  })
  return item
}

Компонент переключателя реализует эффект переключения меток.

Функция: этот компонент имеет два состояния.Чтобы обеспечить плавную интерактивную анимацию, компонент обладает высокой гибкостью, а нижняя движущаяся полоса будет автоматически изменяться в зависимости от ширины элемента. Просто передайте массив списков, которые необходимо отобразить. Когда происходит щелчок, он будет реагировать на индекс текущей позиции вызывающего компонента.

  1. Когда компонент необходимо использовать на панели навигации с прокруткой, стиль компонента переключается на правый макет следующим образом:
    在这里插入图片描述
  2. Когда компонент необходимо использовать на вкладке переключения, которая не требует прокрутки, стиль компонента переключается на расположение по центру следующим образом:
    在这里插入图片描述
<template>
  <div class="switcher" ref="switcher" :class="switcherType">
    <div class="switcher-tab" v-for="(item, index) in list" :key="index" :class="{active : index === indexTab}" @click="switchTab(index)">
      <span>{{item}}</span>
    </div>
    <div ref="anchor" class="switcher-header-anchor"></div>
  </div>
</template>

<script type="text/ecmascript-6">
export default {
  props: {
    list: {
      type: Array,
      default: () => []
    },
    indexTab: {
      type: Number,
      default: 0
    },
    displayType: {
      type: String, // start居左,around居中
      default: 'start'
    }
  },
  computed: {
    switcherType () {
      return this.displayType === 'start' ? 'switcher-start' : 'switcher-around'
    }
  },
  created () {
    setTimeout(() => {
      this.moveAnchor(this.indexTab)
    }, 20)
  },
  methods: {
    switchTab (index) {
      if (this.indexTab !== index) {
        this.$emit('switchTab', index)
        this.moveAnchor(index)
      }
    },
    moveAnchor (index) {
      let tab = this.$refs.switcher.childNodes[index]
      this.$refs.anchor.style['transform'] = `translateX(${tab.offsetLeft + 16}px)`
      this.$refs.anchor.style.width = tab.offsetWidth - 32 + 'px'
    }
  },
  watch: {
    indexTab (newIndex) {
      if (newIndex) {
        this.moveAnchor(newIndex)
      }
    }
  }
}
</script>

<style lang="stylus" scoped rel="stylesheet/stylus">
@import '~common/stylus/variable.styl';

.switcher {
  position: relative;
  display: flex;
  flex-direction: row;
  font-size: $font-size-medium;

  &.switcher-around {
    justify-content: space-evenly;
  }

  &.switcher-start {
    text-align: left;
  }

  .switcher-tab {
    display: inline-block;
    text-align: center;
    vertical-align: middle;
    height: 40px;
    line-height: 40px;
    white-space: nowrap;
    padding: 0 16px;
    color: #505050;

    &.active {
      color: $color-theme;
    }
  }

  .switcher-header-anchor {
    display: block;
    position: absolute;
    left: 0;
    bottom: 0;
    height: 2px;
    border-radius: 2px;
    background: $color-theme;
    transition: 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
  }
}
</style>

4. Будущие ожидания

В настоящее время в этом проекте еще много функций, которые еще не реализованы, поэтому остальные функции будут реализованы как можно скорее в будущем, и будет представлен полный проект веб-приложения. очень рад за звезду и пр. Хи хи хи, этот проект все еще упорно работает над развитием. . . .