Browse Source

优化

pull/29/head
zyronon 3 years ago
parent
commit
42aaf7e602
  1. 11
      README.md
  2. 4
      src/components/Share.vue
  3. 63
      src/mock/index.js
  4. 112
      src/pages/slideHooks/index.vue

11
README.md

@ -1,17 +1,14 @@
### 简体中文 | [English](README-en-US.md) ### 简体中文 | [English](README-en-US.md)
## 预览 ## 预览
### 注:电脑端请用Chrome手机模式访问
### 注:手机请用安卓Via浏览器预览。其他浏览器检测到页面内有视频会强制将视频全屏,并显示控制按钮,导致css和js都失效
[在线预览DEMO](https://ttentau.github.io/ttentau/dy/) [在线预览DEMO](https://ttentau.github.io/ttentau/dy/)
### 注意:电脑端请用Chrome手机模式访问
### 注意:安卓手机请用Via浏览器预览。其他浏览器检测到页面内有视频会强制将视频全屏,并显示控制按钮,导致css和js都失效
## 简介 ## 简介
**douyin** 是一个模仿抖音的移动端短视频项目,它基于 [vue 3](https://v3.cn.vuejs.org/), **douyin** 是一个模仿抖音的移动端短视频项目,它基于 [Vue 3](https://v3.cn.vuejs.org/),
[vite 2](https://cn.vitejs.dev/) [Vite](https://cn.vitejs.dev/)
实现。使用了最新的Vue全家桶技术栈,后台数据通过[mock-js](http://mockjs.com)搭建。相信不管你是处于哪个段位的工程师,本项目都能帮助到你。 实现。使用了最新的Vue全家桶技术栈,后台数据通过[mock-js](http://mockjs.com)搭建。相信不管你是处于哪个段位的工程师,本项目都能帮助到你。
## 功能点 ## 功能点

4
src/components/Share.vue

@ -7,7 +7,7 @@
:show-heng-gang="false" :show-heng-gang="false"
:touch-moved="false" :touch-moved="false"
maskMode="light" maskMode="light"
height="37rem" height="370rem"
mode="dark"> mode="dark">
<div class="share"> <div class="share">
<div class="title"> <div class="title">
@ -279,7 +279,7 @@ export default {
.title { .title {
font-size: 14rem; font-size: 14rem;
padding: 20px; padding: 20rem;
position: relative; position: relative;
display: flex; display: flex;
align-items: center; align-items: center;

63
src/mock/index.js

@ -1,6 +1,7 @@
import Mock from 'mockjs' import Mock from 'mockjs'
import globalMethods from '../utils' import globalMethods from '../utils'
import resource from "../assets/data/resource.js"; import resource from "../assets/data/resource.js";
import {shuffle} from "lodash";
function getParams(options) { function getParams(options) {
let params = globalMethods.$parseURL(options.url).params let params = globalMethods.$parseURL(options.url).params
@ -19,21 +20,28 @@ function getPage(options) {
Mock.setup({ Mock.setup({
timeout: '500-1000' timeout: '500-1000'
}) })
let allRecommendVideos = [] let allRecommendVideos = resource.videos.map(v => {
v.type = 'recommend-video'
return v
})
for (let i = 0; i < 10; i++) { for (let i = 0; i < 50; i++) {
allRecommendVideos = allRecommendVideos.concat(resource.videos) allRecommendVideos = allRecommendVideos.concat(
shuffle(resource.videos)
.slice(0, 10)
.map(v => {
v.type = 'recommend-video'
return v
}))
} }
Mock.mock(/recommended/, options => { Mock.mock(/recommended/, options => {
let page = getPage(options) let page = getPage(options)
return Mock.mock({ return Mock.mock({
data: { data: {
total: allRecommendVideos.length, total: allRecommendVideos.length, list: allRecommendVideos.slice(page.offset, page.limit),
list: allRecommendVideos.slice(page.offset, page.limit), }, code: 200, msg: '',
}, code: 200, msg: '', })
}) })
}
)
// Mock.Random.extend({ // Mock.Random.extend({
// imgs: function (date) { // imgs: function (date) {
@ -84,9 +92,7 @@ Mock.mock(/my/, options => {
console.log('mock', page) console.log('mock', page)
return Mock.mock({ return Mock.mock({
data: { data: {
pageNo: page.pageNo, pageNo: page.pageNo, total: resource.my.length, list: resource.my.slice(page.offset, page.limit),
total: resource.my.length,
list: resource.my.slice(page.offset, page.limit),
}, code: 200, msg: '', }, code: 200, msg: '',
}) })
}) })
@ -94,9 +100,7 @@ Mock.mock(/like/, options => {
let page = getPage(options) let page = getPage(options)
return Mock.mock({ return Mock.mock({
data: { data: {
pageNo: page.pageNo, pageNo: page.pageNo, total: resource.like.length, list: resource.like.slice(page.offset, page.limit),
total: resource.like.length,
list: resource.like.slice(page.offset, page.limit),
}, code: 200, msg: '', }, code: 200, msg: '',
}) })
}) })
@ -104,9 +108,7 @@ Mock.mock(/private1/, options => {
let page = getPage(options) let page = getPage(options)
return Mock.mock({ return Mock.mock({
data: { data: {
pageNo: page.pageNo, pageNo: page.pageNo, total: resource.private1.length, list: resource.private1.slice(page.offset, page.limit),
total: resource.private1.length,
list: resource.private1.slice(page.offset, page.limit),
}, code: 200, msg: '', }, code: 200, msg: '',
}) })
}) })
@ -114,12 +116,9 @@ Mock.mock(/collect/, options => {
return Mock.mock({ return Mock.mock({
data: { data: {
video: { video: {
total: resource.videos.length, total: resource.videos.length, list: resource.videos,
list: resource.videos, }, music: {
}, total: resource.music.length, list: resource.music,
music: {
total: resource.music.length,
list: resource.music,
} }
}, code: 200, msg: '', }, code: 200, msg: '',
}) })
@ -128,10 +127,8 @@ Mock.mock(/historyVideo/, options => {
let page = getPage(options) let page = getPage(options)
return Mock.mock({ return Mock.mock({
data: { data: {
pageNo: page.pageNo, pageNo: page.pageNo, // total: resource.my.length,
// total: resource.my.length, total: 50, list: resource.my.slice(page.offset, page.limit),
total: 50,
list: resource.my.slice(page.offset, page.limit),
}, code: 200, msg: '', }, code: 200, msg: '',
}) })
}) })
@ -139,9 +136,7 @@ Mock.mock(/historyOther/, options => {
let page = getPage(options) let page = getPage(options)
return Mock.mock({ return Mock.mock({
data: { data: {
pageNo: page.pageNo, pageNo: page.pageNo, total: 0, list: [],
total: 0,
list: [],
}, code: 200, msg: '', }, code: 200, msg: '',
}) })
}) })

112
src/pages/slideHooks/index.vue

@ -82,7 +82,7 @@
navIndex:5, navIndex:5,
}" }"
@loadMore="loadMore" @loadMore="loadMore"
@refresh="refresh" @refresh="() => getData(true)"
> >
</VInfinite> </VInfinite>
</SlideItem> </SlideItem>
@ -107,6 +107,24 @@
<Comment page-id="slideHook" v-model="state.commentVisible" <Comment page-id="slideHook" v-model="state.commentVisible"
@close="closeComments" @close="closeComments"
/> />
<Share v-model="state.isSharing"
ref="share"
page-id="slideHook"
@dislike="dislike"
:videoId="state.recommendVideos[state.itemIndex]?.id"
:canDownload="state.recommendVideos[state.itemIndex]?.canDownload"
@play-feedback="state.showPlayFeedback = true"
@showShareDuoshan="delayShowDialog(e => state.showShareDuoshan = true)"
@shareToFriend="delayShowDialog(e => state.shareToFriend = true)"
@showDouyinCode="state.showDouyinCode = true"
@showShare2WeChatZone="state.shareType = 2"
@share2WeChat="state.shareType = 3"
@share2QQZone="state.shareType = 4"
@share2QQ="state.shareType = 5"
@share2Webo="state.shareType = 8"
@download="state.shareType = 9"
/>
</div> </div>
</template> </template>
@ -118,26 +136,26 @@ import SlideAlbum from "../../components/slide/SlideAlbum";
import SlideUser from "../../components/slide/SlideUser"; import SlideUser from "../../components/slide/SlideUser";
import BVideo from "../../components/slide/BVideo"; import BVideo from "../../components/slide/BVideo";
import Comment from "../../components/Comment"; import Comment from "../../components/Comment";
import Share from "../../components/Share";
import IndicatorHome from "../slide/IndicatorHome"; import IndicatorHome from "../slide/IndicatorHome";
import {computed, onMounted, onUnmounted, reactive, ref} from "vue";
import resource from "../../assets/data/resource.js";
import {onMounted, onUnmounted, provide, reactive, ref} from "vue";
import bus, {EVENT_KEY} from "../../utils/bus"; import bus, {EVENT_KEY} from "../../utils/bus";
import {useNav} from "../../utils/hooks/useNav"; import {useNav} from "../../utils/hooks/useNav";
import Utils from "@/utils"; import Utils from "@/utils";
import {shuffle} from "lodash"; import api from "@/api";
import {useStore} from "vuex";
const nav = useNav() const nav = useNav()
const videos = resource.videos.slice().map(v => {
v.type = 'recommend-video'
return v
})
function stop(e) { function stop(e) {
e.stopPropagation() e.stopPropagation()
} }
const store = useStore()
const friends = computed(() => store.state.friends)
const bodyHeight = computed(() => store.state.bodyHeight)
const bodyWidth = computed(() => store.state.bodyWidth)
const subTypeRef = ref(null) const subTypeRef = ref(null)
const state = reactive({ const state = reactive({
baseIndex: 0, baseIndex: 0,
@ -156,7 +174,6 @@ const state = reactive({
type: 'user', type: 'user',
src: `http://douyin.ttentau.top/0.mp4?vframe/jpg/offset/0/w/${document.body.clientWidth}` src: `http://douyin.ttentau.top/0.mp4?vframe/jpg/offset/0/w/${document.body.clientWidth}`
}, },
// ...videos
], ],
isSharing: false, isSharing: false,
@ -182,32 +199,33 @@ const state = reactive({
subType: -1, subType: -1,
//zindexslidesubType. //zindexslidesubType.
subTypeIsTop: false, subTypeIsTop: false,
totalSize: 0,
pageSize: 10,
pageNo: 0,
}) })
function loadMore() { async function getData(refresh = false) {
if (state.loading) return if (state.loading) return
state.loading = true state.loading = true
console.log('loadMore') let res = await api.videos.recommended({pageNo: refresh ? 0 : state.pageNo, pageSize: state.pageSize})
setTimeout(() => { console.log('loadMore-', 'refresh', refresh, res)
state.recommendVideos = state.recommendVideos.concat(shuffle(resource.videos).slice(0, 10).map(v => { state.loading = false
v.type = 'recommend-video' if (res.code === 200) {
return v state.totalSize = res.data.total
})) if (refresh) {
state.loading = false state.recommendVideos = []
}, 500) }
state.recommendVideos = state.recommendVideos.concat(res.data.list)
} else {
state.pageNo--
}
} }
function refresh() { function loadMore() {
if (state.loading) return if (!state.loading) {
state.loading = true state.pageNo++
console.log('refresh') getData()
setTimeout(() => { }
state.recommendVideos = shuffle(resource.videos).slice(0, 5).map(v => {
v.type = 'recommend-video'
return v
})
state.loading = false
}, 500)
} }
function showSubType(e) { function showSubType(e) {
@ -233,7 +251,24 @@ function pageClick(e) {
} }
} }
function delayShowDialog(cb) {
setTimeout(() => {
cb()
}, 400)
}
function dislike() {
// this.$refs.virtualList.dislike(this.videos[10])
// this.videos[this.videoIndex] = this.videos[10]
// this.$notice('')
}
function end() {
// this.$notice('')
}
onMounted(() => { onMounted(() => {
getData()
bus.on('singleClick', () => { bus.on('singleClick', () => {
let id = '' let id = ''
if (state.navIndex === 4) { if (state.navIndex === 4) {
@ -269,7 +304,7 @@ function closeComments() {
} }
function render(item, itemIndex, play, position) { function render(item, itemIndex, play, position) {
console.log('item',item) // console.log('item', item)
let node let node
if (item.type === 'img') { if (item.type === 'img') {
node = <img src={item.src} style="height:100%;"/> node = <img src={item.src} style="height:100%;"/>
@ -280,6 +315,9 @@ function render(item, itemIndex, play, position) {
if (item.type === 'user') { if (item.type === 'user') {
node = <SlideUser/> node = <SlideUser/>
} }
if (item.type === 'send-video') {
node = <video src={item.src} style="height:100%;"/>
}
if (item.type === 'recommend-video') { if (item.type === 'recommend-video') {
node = <BVideo node = <BVideo
isPlay={false} isPlay={false}
@ -292,16 +330,6 @@ function render(item, itemIndex, play, position) {
return node return node
} }
// if (item.type === 'send-video') {
// node = <video src={item.src} style="height:100%;"/>
// }
// if (item.type === 'user') {
// node = <SlideUser onClose={this.t} modelValue={item}/>
// }
// return node
// }
</script> </script>
<style scoped lang="less"> <style scoped lang="less">

Loading…
Cancel
Save