hookehuyr

✨ feat(服务端): 视频审核页面,我的视频页面新增

1 +<template>
2 + <div class="video-wrapper" style="position: relative;">
3 + <div v-if="status === 'PROCESS'" class="status">
4 + <van-image v-if="item.status === 'ENABLE'" round width="6rem" height="6rem" style="vertical-align: bottom;"
5 + :src="icon_enable" />
6 + <van-image v-if="item.status === 'REFUSE'" round width="6rem" height="6rem" style="vertical-align: bottom;"
7 + :src="icon_refuse" />
8 + <van-image v-if="item.status === 'APPLY'" round width="6rem" height="6rem" style="vertical-align: bottom;"
9 + :src="icon_apply" />
10 + </div>
11 + <div class="video-div" :id="'mui-player-' + item.case_id">
12 + </div>
13 + <div>
14 + <div class="video-bar">
15 + <van-row align="center">
16 + <van-col span="8">
17 + <van-image round width="2rem" height="2rem" style="vertical-align: middle;"
18 + src="https://cdn.jsdelivr.net/npm/@vant/assets/cat.jpeg" />&nbsp;
19 + <span style="font-size: 1.05rem; vertical-align: middle;">王忆慈</span>
20 + </van-col>
21 + <van-col span="16">
22 + <div style="color: #999999; text-align: right;">杨浦民办科技幼稚园 | 藏语</div>
23 + </van-col>
24 + </van-row>
25 + </div>
26 + </div>
27 + <div v-if="status === 'PROCESS'" style="margin-top: 1rem;">
28 + <div v-if="item.status === 'REFUSE'" style="padding: 0 1rem 1rem 1rem; font-size: 0.85rem;">
29 + <p style="color: #999999; margin-bottom: 0.25rem;">老师留言:</p>
30 + <p>下次我们继续加油,争取有更好的表现哦~</p>
31 + </div>
32 + </div>
33 + <div class="book-intro">
34 + <div id="book-intro" :class="{ 'van-multi-ellipsis--l3': isToggle }">
35 + 从前有一只小兔子,总是想要离家出走。有一天他对妈妈说:“我要跑走啦!”“如果你跑走了我就去追你,因为你是我的小宝贝呀!”妈妈说。
36 + 一场爱的捉迷藏就此展开了
37 + </div>
38 + <div v-if="hasToggle">
39 + <div v-if="isToggle" @click="onToggle(false)" class="book-toggle-icon">展开&nbsp;
40 + <van-icon style="vertical-align: middle;" size="0.9rem" :name="icon_down" />
41 + </div>
42 + <div v-else @click="onToggle(true)" class="book-toggle-icon">折叠&nbsp;
43 + <van-icon style="vertical-align: middle;" size="0.9rem" :name="icon_up" />
44 + </div>
45 + </div>
46 + </div>
47 + <div v-if="status === 'PENDING'" class="van-hairline--top" style="padding: 0 1rem;">
48 + <van-row>
49 + <van-col offset="3" style="padding: 1rem;" @click="onRefuse()">
50 + <div style="background: #B4B4B3; border-radius: 15px; color: #FFFFFF; padding: 0.25rem 0.8rem;">
51 + <van-icon name="close" />&nbsp;不通过
52 + </div>
53 + </van-col>
54 + <van-col style="padding: 1rem;" @click="onPass()">
55 + <div style="background: #F9D95C; border-radius: 15px; color: #713610; padding: 0.25rem 1.5rem;">
56 + <van-icon name="passed" />&nbsp;通过
57 + </div>
58 + </van-col>
59 + </van-row>
60 + </div>
61 + </div>
62 +
63 + <van-overlay :show="showNotice" z-index="1000">
64 + <div class="wrapper" @click.stop>
65 + <div class="block">
66 + <div style="position: absolute; top: -2rem; right: 1rem; font-size: 1.5rem;"><van-icon name="close" color="#FFFFFF" @click="closeNotice" /></div>
67 + <div class="van-hairline--bottom" style="color: #222222; font-size: 1.25rem; font-weight: bold; text-align: center; padding-bottom: 1rem;">作品审核建议</div>
68 + <div>
69 + <van-field v-model="message" rows="2" autosize label="" type="textarea" maxlength="200" placeholder="请填写您对小朋友的温馨鼓励" show-word-limit />
70 + </div>
71 + <div style="margin: 3rem 0;">
72 + <my-button @on-click="onConfirm" type="primary">确定</my-button>
73 + </div>
74 + </div>
75 + </div>
76 + </van-overlay>
77 +
78 + <van-dialog v-model:show="show" title="温馨提示" show-cancel-button confirmButtonColor="#F9D95C" @confirm="onPassConfirm">
79 + <div style="padding: 1rem; text-align: center;">是否确认审核通过该视频 ?</div>
80 + </van-dialog>
81 +</template>
82 +
83 +<script setup>
84 +import icon_up from '@images/icon-guanbi@2x.png'
85 +import icon_down from '@images/icon-zhankai@2x.png'
86 +
87 +import icon_refuse from '@images/icon-jujue@2x.png'
88 +import icon_apply from '@images/icon-shenhe@2x.png'
89 +import icon_enable from '@images/icon-tongguo@2x.png'
90 +
91 +import MyButton from '@/components/MyButton/index.vue'
92 +import { ref, reactive, onMounted, nextTick, watch, onUpdated } from 'vue'
93 +import 'mui-player/dist/mui-player.min.css'
94 +import MuiPlayer from 'mui-player'
95 +import _ from 'lodash';
96 +import tools from '@/common/tool'
97 +
98 +import { useRoute, useRouter } from 'vue-router'
99 +const $route = useRoute();
100 +const $router = useRouter();
101 +
102 +// 判断是否显示简介的展开图标
103 +const hasToggle = ref(false); // 判断是否有展开文字,默认没有
104 +const isToggle = ref(true); // 判断展开状态,默认展开
105 +
106 +const onToggle = (v) => { // 展开/折叠
107 + isToggle.value = v
108 +}
109 +
110 +const showNotice = ref(false)
111 +const onConfirm = () => {
112 + showNotice.value = false;
113 +}
114 +const closeNotice = () => {
115 + showNotice.value = false;
116 +}
117 +
118 +const show = ref(false);
119 +
120 +const onRefuse = () => {
121 + showNotice.value = true;
122 +}
123 +const onPass = () => {
124 + show.value = true;
125 +}
126 +const onPassConfirm = () => { // 审核通过视频
127 + console.warn('审核通过视频');
128 +}
129 +const message = ref('')
130 +
131 +const props = defineProps({
132 + item: Object,
133 + status: String
134 +})
135 +
136 +onMounted(() => {
137 + // 判断是否显示简介的展开图标
138 + nextTick(() => {
139 + hasToggle.value = tools.hasEllipsis('book-intro');
140 + })
141 +})
142 +
143 +</script>
144 +
145 +<script>
146 +export default {
147 + // props: ['item', 'status'],
148 + data() {
149 + return {
150 + detail: {}
151 + }
152 + },
153 + created() {
154 + },
155 + mounted() {
156 + var mp = new MuiPlayer({
157 + container: '#mui-player-' + this.item.case_id,
158 + title: this.item.title,
159 + src: this.item.video.url,
160 + poster: this.item.cover.url,
161 + autoFit: false,
162 + videoAttribute: [ // 声明启用同层播放, 不让会自动全屏播放
163 + { attrKey: 'webkit-playsinline', attrValue: 'webkit-playsinline' },
164 + { attrKey: 'playsinline', attrValue: 'playsinline' },
165 + { attrKey: 'x5-video-player-type', attrValue: 'h5-page' },
166 + ]
167 + })
168 + this.detail = _.cloneDeep(this.item)
169 + },
170 + methods: {
171 + setLike() {
172 + this.detail.liked = !this.detail.liked
173 + },
174 + setComment() {
175 + console.warn('跳转详情页,移动到留言页');
176 + console.warn(this.detail.case_id);
177 + }
178 + }
179 +}
180 +</script>
181 +
182 +<style lang="less" scoped>
183 +.video-wrapper {
184 + margin: 1rem;
185 + border-bottom-left-radius: 5px;
186 + border-bottom-right-radius: 5px;
187 + box-shadow: 0px 4px 8px 0px rgba(0, 0, 0, 0.13);
188 +
189 + .status {
190 + position: absolute;
191 + top: 0;
192 + right: 0;
193 + z-index: 999;
194 + }
195 +
196 + .video-div {
197 + border-top-left-radius: 5px;
198 + border-top-right-radius: 5px;
199 + }
200 +
201 + .video-bar {
202 + color: #713610;
203 + padding: 1rem;
204 + padding-bottom: 0.5rem;
205 + }
206 +
207 + .book-intro {
208 + padding: 1rem;
209 + padding-top: 0;
210 +
211 + .book-post {
212 + color: #222222;
213 + font-size: 1.25rem;
214 + font-weight: bold;
215 + }
216 +
217 + #book-intro {
218 + color: #333333;
219 + margin-top: 0.25rem;
220 + }
221 +
222 + .book-toggle-icon {
223 + text-align: right;
224 + color: #713610;
225 + font-size: 1rem;
226 + }
227 + }
228 +}
229 +
230 +.wrapper {
231 + display: flex;
232 + align-items: center;
233 + justify-content: center;
234 + height: 100%;
235 + width: auto;
236 + text-align: center;
237 +}
238 +
239 +.block {
240 + width: 80%;
241 + // height: 25rem;
242 + background-color: #fff;
243 + border-radius: 10px;
244 + padding: 1rem;
245 + position: relative;
246 + margin-top: 1rem;
247 + margin-bottom: 5rem;
248 +}
249 +</style>
...\ No newline at end of file ...\ No newline at end of file
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
12 <div class="sub"> 12 <div class="sub">
13 <van-icon :name="icon_video" />&nbsp;&nbsp;<span>54个作品</span> 13 <van-icon :name="icon_video" />&nbsp;&nbsp;<span>54个作品</span>
14 </div> 14 </div>
15 - <div v-if="type === 'B'" class="upload" @click="onUpload(item)"> 上传视频 </div> 15 + <div v-if="type === 'B'" class="upload" @click="onUpload(item)">上传视频</div>
16 </van-col> 16 </van-col>
17 </van-row> 17 </van-row>
18 </div> 18 </div>
......
1 import { createApp } from 'vue'; 1 import { createApp } from 'vue';
2 -import { Button, Image as VanImage, Col, Row, Icon, Form, Field, CellGroup, ConfigProvider, Toast, Uploader, Empty, Tab, Tabs, Overlay, NumberKeyboard, Lazyload, List, PullRefresh, Popup, Picker, Sticky, Stepper, Tag, Swipe, SwipeItem } from 'vant'; 2 +import { Button, Image as VanImage, Col, Row, Icon, Form, Field, CellGroup, ConfigProvider, Toast, Uploader, Empty, Tab, Tabs, Overlay, NumberKeyboard, Lazyload, List, PullRefresh, Popup, Picker, Sticky, Stepper, Tag, Swipe, SwipeItem, Dialog } from 'vant';
3 import router from './router'; 3 import router from './router';
4 import App from './App.vue'; 4 import App from './App.vue';
5 import axios from './utils/axios'; 5 import axios from './utils/axios';
...@@ -35,6 +35,7 @@ app.use(Stepper); ...@@ -35,6 +35,7 @@ app.use(Stepper);
35 app.use(Tag); 35 app.use(Tag);
36 app.use(Swipe); 36 app.use(Swipe);
37 app.use(SwipeItem); 37 app.use(SwipeItem);
38 +app.use(Dialog);
38 39
39 app.use(ConfigProvider); 40 app.use(ConfigProvider);
40 41
......
This diff is collapsed. Click to expand it.
...@@ -238,10 +238,10 @@ export default [{ ...@@ -238,10 +238,10 @@ export default [{
238 children: [] 238 children: []
239 }, { 239 }, {
240 path: '/business/myVideo', 240 path: '/business/myVideo',
241 - name: '视频审核', 241 + name: '我的视频',
242 component: () => import('./views/business/myVideo.vue'), 242 component: () => import('./views/business/myVideo.vue'),
243 meta: { 243 meta: {
244 - title: '视频审核' 244 + title: '我的视频'
245 }, 245 },
246 children: [] 246 children: []
247 }, { 247 }, {
......
1 <template> 1 <template>
2 - <div class=""></div> 2 + <div class="">
3 + <van-tabs v-model:active="active" sticky @click-tab="onClickTab" color="#F9D95C" background="#F7F7F7"
4 + title-active-color="#222222" title-inactive-color="#777777">
5 + <van-tab title="待审核" badge="24" :title-style="titleStyle">
6 + <template v-if="!active">
7 + <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
8 + <template v-for="item in dataList" :key="item" style="height: 3rem;">
9 + <b-video-card :item="item" status="PENDING"></b-video-card>
10 + </template>
11 + </van-list>
12 + </template>
13 + </van-tab>
14 + <van-tab title="已审核" :title-style="titleStyle">
15 + <template v-if="active">
16 + <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
17 + <template v-for="item in dataList1" :key="item" style="height: 3rem;">
18 + <b-video-card :item="item" status="PROCESS"></b-video-card>
19 + </template>
20 + </van-list>
21 + </template>
22 + </van-tab>
23 + </van-tabs>
24 + </div>
3 </template> 25 </template>
4 26
5 <script setup> 27 <script setup>
28 +import dataList from '@/mock/video_list'
29 +import dataList1 from '@/mock/video_list1'
30 +import BVideoCard from '@/components/BVideoCard/index.vue'
31 +
6 import { ref, reactive, onMounted } from 'vue' 32 import { ref, reactive, onMounted } from 'vue'
7 import { useRoute, useRouter } from 'vue-router' 33 import { useRoute, useRouter } from 'vue-router'
8 import axios from '@/utils/axios'; 34 import axios from '@/utils/axios';
...@@ -11,6 +37,39 @@ import { Toast } from 'vant'; ...@@ -11,6 +37,39 @@ import { Toast } from 'vant';
11 const $route = useRoute(); 37 const $route = useRoute();
12 const $router = useRouter(); 38 const $router = useRouter();
13 39
40 +const titleStyle = {
41 + fontSize: '1rem'
42 +}
43 +
44 +const active = ref(0)
45 +let tabStatus = ref('PENDING')
46 +const onClickTab = () => {
47 + console.warn(0);
48 +}
49 +
50 +// 处理书籍下作品列表
51 +const list = ref([]);
52 +const loading = ref(false);
53 +const finished = ref(false);
54 +
55 +const onLoad = () => {
56 + // 异步更新数据
57 + // setTimeout 仅做示例,真实场景中一般为 ajax 请求
58 + setTimeout(() => {
59 + for (let i = 0; i < 20; i++) {
60 + list.value.push(list.value.length + 1);
61 + }
62 +
63 + // 加载状态结束
64 + loading.value = false;
65 +
66 + // 数据全部加载完成
67 + if (list.value.length >= 100) {
68 + finished.value = true;
69 + }
70 + }, 1000);
71 +};
72 +
14 onMounted(() => { 73 onMounted(() => {
15 74
16 }) 75 })
...@@ -36,5 +95,10 @@ export default { ...@@ -36,5 +95,10 @@ export default {
36 </script> 95 </script>
37 96
38 <style lang="less" scoped> 97 <style lang="less" scoped>
39 - 98 +:global(.van-badge--top-right) {
99 + right: -10px;
100 +}
101 +:global(.van-sticky--fixed) {
102 + z-index: 1000;
103 +}
40 </style> 104 </style>
...\ No newline at end of file ...\ No newline at end of file
......
1 <template> 1 <template>
2 - <div class=""></div> 2 + <div class="">
3 + <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
4 + <template v-for="item in dataList" :key="item" style="height: 3rem;">
5 + <b-video-card :item="item"></b-video-card>
6 + </template>
7 + </van-list>
8 + </div>
3 </template> 9 </template>
4 10
5 <script setup> 11 <script setup>
12 +import dataList from '@/mock/video_list'
13 +import BVideoCard from '@/components/BVideoCard/index.vue'
14 +
6 import { ref, reactive, onMounted } from 'vue' 15 import { ref, reactive, onMounted } from 'vue'
7 import { useRoute, useRouter } from 'vue-router' 16 import { useRoute, useRouter } from 'vue-router'
8 import axios from '@/utils/axios'; 17 import axios from '@/utils/axios';
...@@ -11,6 +20,29 @@ import { Toast } from 'vant'; ...@@ -11,6 +20,29 @@ import { Toast } from 'vant';
11 const $route = useRoute(); 20 const $route = useRoute();
12 const $router = useRouter(); 21 const $router = useRouter();
13 22
23 +// 处理书籍下作品列表
24 +const list = ref([]);
25 +const loading = ref(false);
26 +const finished = ref(false);
27 +
28 +const onLoad = () => {
29 + // 异步更新数据
30 + // setTimeout 仅做示例,真实场景中一般为 ajax 请求
31 + setTimeout(() => {
32 + for (let i = 0; i < 20; i++) {
33 + list.value.push(list.value.length + 1);
34 + }
35 +
36 + // 加载状态结束
37 + loading.value = false;
38 +
39 + // 数据全部加载完成
40 + if (list.value.length >= 100) {
41 + finished.value = true;
42 + }
43 + }, 1000);
44 +};
45 +
14 onMounted(() => { 46 onMounted(() => {
15 47
16 }) 48 })
......
...@@ -92,6 +92,7 @@ ...@@ -92,6 +92,7 @@
92 <van-overlay :show="showNotice" z-index="1000"> 92 <van-overlay :show="showNotice" z-index="1000">
93 <div class="wrapper" @click.stop> 93 <div class="wrapper" @click.stop>
94 <div class="block"> 94 <div class="block">
95 + <div style="position: absolute; top: -2rem; right: 1rem; font-size: 1.5rem;"><van-icon name="close" color="#FFFFFF" @click="closeNotice" /></div>
95 <div> 96 <div>
96 <van-image width="100" height="100" :src="icon_notice" /> 97 <van-image width="100" height="100" :src="icon_notice" />
97 <p style="margin: 1rem; font-size: 1.15rem; font-weight: bold; color: #222222;">温馨提示</p> 98 <p style="margin: 1rem; font-size: 1.15rem; font-weight: bold; color: #222222;">温馨提示</p>
...@@ -125,7 +126,7 @@ import icon_notice from '@images/que-tishi@2x.png' ...@@ -125,7 +126,7 @@ import icon_notice from '@images/que-tishi@2x.png'
125 126
126 import ShortcutFixed from '@/components/ShortcutFixed/index.vue' 127 import ShortcutFixed from '@/components/ShortcutFixed/index.vue'
127 import tools from '@/common/tool' 128 import tools from '@/common/tool'
128 -import { ref, reactive, onMounted } from 'vue' 129 +import { ref, reactive, onMounted, nextTick } from 'vue'
129 import { useRoute, useRouter } from 'vue-router' 130 import { useRoute, useRouter } from 'vue-router'
130 import axios from '@/utils/axios'; 131 import axios from '@/utils/axios';
131 import $ from 'jquery' 132 import $ from 'jquery'
...@@ -181,7 +182,9 @@ const onConfirm = ({ selectedOptions }) => { ...@@ -181,7 +182,9 @@ const onConfirm = ({ selectedOptions }) => {
181 182
182 onMounted(() => { 183 onMounted(() => {
183 // 判断是否显示简介的展开图标 184 // 判断是否显示简介的展开图标
184 - hasToggle.value = tools.hasEllipsis('book-intro'); 185 + nextTick(() => {
186 + hasToggle.value = tools.hasEllipsis('book-intro');
187 + })
185 for (let index = 0; index < 20; index++) { 188 for (let index = 0; index < 20; index++) {
186 items.push({ 189 items.push({
187 id: index, 190 id: index,
...@@ -402,5 +405,8 @@ export default { ...@@ -402,5 +405,8 @@ export default {
402 background-color: #fff; 405 background-color: #fff;
403 border-radius: 10px; 406 border-radius: 10px;
404 padding: 1rem; 407 padding: 1rem;
408 + position: relative;
409 + margin-top: 1rem;
410 + margin-bottom: 5rem;
405 } 411 }
406 </style> 412 </style>
...\ No newline at end of file ...\ No newline at end of file
......