hookehuyr

✨ feat(教师视频,家长视频): API联调

...@@ -3,38 +3,35 @@ ...@@ -3,38 +3,35 @@
3 <div v-if="status === 'PROCESS'" class="status"> 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;" 4 <van-image v-if="item.status === 'ENABLE'" round width="6rem" height="6rem" style="vertical-align: bottom;"
5 :src="icon_enable" /> 5 :src="icon_enable" />
6 - <van-image v-if="item.status === 'REFUSE'" round width="6rem" height="6rem" style="vertical-align: bottom;" 6 + <van-image v-if="item.status === 'DISABLE'" round width="6rem" height="6rem" style="vertical-align: bottom;"
7 :src="icon_refuse" /> 7 :src="icon_refuse" />
8 <van-image v-if="item.status === 'APPLY'" round width="6rem" height="6rem" style="vertical-align: bottom;" 8 <van-image v-if="item.status === 'APPLY'" round width="6rem" height="6rem" style="vertical-align: bottom;"
9 :src="icon_apply" /> 9 :src="icon_apply" />
10 </div> 10 </div>
11 - <div class="video-div" :id="'mui-player-' + item.case_id"> 11 + <div class="video-div" :id="'mui-player-' + item.id">
12 </div> 12 </div>
13 + <div class="control-bar">
13 <div> 14 <div>
14 <div class="video-bar"> 15 <div class="video-bar">
15 <van-row align="center"> 16 <van-row align="center">
16 <van-col span="8"> 17 <van-col span="8">
17 - <van-image round width="2rem" height="2rem" style="vertical-align: middle;" 18 + <van-image round width="2rem" height="2rem" style="vertical-align: middle;" :src="item.cover" />&nbsp;
18 - src="https://cdn.jsdelivr.net/npm/@vant/assets/cat.jpeg" />&nbsp; 19 + <span style="font-size: 1.05rem; vertical-align: middle;">{{ item.name }}</span>
19 - <span style="font-size: 1.05rem; vertical-align: middle;">王忆慈</span>
20 </van-col> 20 </van-col>
21 <van-col span="16"> 21 <van-col span="16">
22 - <div style="color: #999999; text-align: right;">杨浦民办科技幼稚园 | 藏语</div> 22 + <div style="color: #999999; text-align: right;">{{ item.book_name }} | {{ item.localism_type }}</div>
23 </van-col> 23 </van-col>
24 </van-row> 24 </van-row>
25 </div> 25 </div>
26 </div> 26 </div>
27 <div v-if="status === 'PROCESS'" style="margin-top: 1rem;"> 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;"> 28 + <div v-if="item.status === 'DISABLE'" style="padding: 0 1rem 1rem 1rem; font-size: 0.85rem;">
29 <p style="color: #999999; margin-bottom: 0.25rem;">老师留言:</p> 29 <p style="color: #999999; margin-bottom: 0.25rem;">老师留言:</p>
30 - <p>下次我们继续加油,争取有更好的表现哦~</p> 30 + <p>{{ item.check_note }}</p>
31 </div> 31 </div>
32 </div> 32 </div>
33 <div class="book-intro"> 33 <div class="book-intro">
34 - <div id="book-intro" :class="{ 'van-multi-ellipsis--l3': isToggle }"> 34 + <div id="book-intro" :class="{ 'van-multi-ellipsis--l3': isToggle }">{{ item.note }}</div>
35 - 从前有一只小兔子,总是想要离家出走。有一天他对妈妈说:“我要跑走啦!”“如果你跑走了我就去追你,因为你是我的小宝贝呀!”妈妈说。
36 - 一场爱的捉迷藏就此展开了
37 - </div>
38 <div v-if="hasToggle"> 35 <div v-if="hasToggle">
39 <div v-if="isToggle" @click="onToggle(false)" class="book-toggle-icon">展开&nbsp; 36 <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" /> 37 <van-icon style="vertical-align: middle;" size="0.9rem" :name="icon_down" />
...@@ -59,23 +56,29 @@ ...@@ -59,23 +56,29 @@
59 </van-row> 56 </van-row>
60 </div> 57 </div>
61 </div> 58 </div>
59 + </div>
62 60
63 <van-overlay :show="showNotice" z-index="1000"> 61 <van-overlay :show="showNotice" z-index="1000">
64 <div class="wrapper" @click.stop> 62 <div class="wrapper" @click.stop>
65 <div class="block"> 63 <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> 64 + <div style="position: absolute; top: -2rem; right: 1rem; font-size: 1.5rem;">
67 - <div class="van-hairline--bottom" style="color: #222222; font-size: 1.25rem; font-weight: bold; text-align: center; padding-bottom: 1rem;">作品审核建议</div> 65 + <van-icon name="close" color="#FFFFFF" @click="closeNotice" />
66 + </div>
67 + <div class="van-hairline--bottom"
68 + style="color: #222222; font-size: 1.25rem; font-weight: bold; text-align: center; padding-bottom: 1rem;">
69 + 作品审核建议</div>
68 <div> 70 <div>
69 - <van-field v-model="message" rows="2" autosize label="" type="textarea" maxlength="200" placeholder="请填写您对小朋友的温馨鼓励" show-word-limit /> 71 + <van-field v-model="message" rows="2" autosize label="" type="textarea" maxlength="200"
72 + placeholder="请填写您对小朋友的温馨鼓励" show-word-limit />
70 </div> 73 </div>
71 <div style="margin: 3rem 0;"> 74 <div style="margin: 3rem 0;">
72 - <my-button @on-click="onConfirm" type="primary">确定</my-button> 75 + <my-button @on-click="handleAudit('disable')" type="primary">确定</my-button>
73 </div> 76 </div>
74 </div> 77 </div>
75 </div> 78 </div>
76 </van-overlay> 79 </van-overlay>
77 80
78 - <van-dialog v-model:show="show" title="温馨提示" show-cancel-button confirmButtonColor="#F9D95C" @confirm="onPassConfirm"> 81 + <van-dialog v-model:show="show" title="温馨提示" show-cancel-button confirmButtonColor="#F9D95C" @confirm="handleAudit('enable')">
79 <div style="padding: 1rem; text-align: center;">是否确认审核通过该视频 ?</div> 82 <div style="padding: 1rem; text-align: center;">是否确认审核通过该视频 ?</div>
80 </van-dialog> 83 </van-dialog>
81 </template> 84 </template>
...@@ -84,6 +87,7 @@ ...@@ -84,6 +87,7 @@
84 import icon_up from '@images/icon-guanbi@2x.png' 87 import icon_up from '@images/icon-guanbi@2x.png'
85 import icon_down from '@images/icon-zhankai@2x.png' 88 import icon_down from '@images/icon-zhankai@2x.png'
86 89
90 +// TODO: 让娜娜做一张不是透明的看看效果
87 import icon_refuse from '@images/icon-jujue@2x.png' 91 import icon_refuse from '@images/icon-jujue@2x.png'
88 import icon_apply from '@images/icon-shenhe@2x.png' 92 import icon_apply from '@images/icon-shenhe@2x.png'
89 import icon_enable from '@images/icon-tongguo@2x.png' 93 import icon_enable from '@images/icon-tongguo@2x.png'
...@@ -92,10 +96,12 @@ import MyButton from '@/components/MyButton/index.vue' ...@@ -92,10 +96,12 @@ import MyButton from '@/components/MyButton/index.vue'
92 import { ref, reactive, onMounted, nextTick, watch, onUpdated } from 'vue' 96 import { ref, reactive, onMounted, nextTick, watch, onUpdated } from 'vue'
93 import 'mui-player/dist/mui-player.min.css' 97 import 'mui-player/dist/mui-player.min.css'
94 import MuiPlayer from 'mui-player' 98 import MuiPlayer from 'mui-player'
99 +import axios from '@/utils/axios';
95 import _ from 'lodash'; 100 import _ from 'lodash';
96 import tools from '@/common/tool' 101 import tools from '@/common/tool'
97 102
98 import { useRoute, useRouter } from 'vue-router' 103 import { useRoute, useRouter } from 'vue-router'
104 +import { Toast } from 'vant';
99 const $route = useRoute(); 105 const $route = useRoute();
100 const $router = useRouter(); 106 const $router = useRouter();
101 107
...@@ -107,32 +113,6 @@ const onToggle = (v) => { // 展开/折叠 ...@@ -107,32 +113,6 @@ const onToggle = (v) => { // 展开/折叠
107 isToggle.value = v 113 isToggle.value = v
108 } 114 }
109 115
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(() => { 116 onMounted(() => {
137 // 判断是否显示简介的展开图标 117 // 判断是否显示简介的展开图标
138 nextTick(() => { 118 nextTick(() => {
...@@ -144,10 +124,14 @@ onMounted(() => { ...@@ -144,10 +124,14 @@ onMounted(() => {
144 124
145 <script> 125 <script>
146 export default { 126 export default {
147 - // props: ['item', 'status'], 127 + props: ['item', 'status'],
148 data() { 128 data() {
149 return { 129 return {
150 - detail: {} 130 + detail: {},
131 + mp: '',
132 + message: '',
133 + showNotice: false,
134 + show: false
151 } 135 }
152 }, 136 },
153 created() { 137 created() {
...@@ -155,10 +139,10 @@ export default { ...@@ -155,10 +139,10 @@ export default {
155 mounted() { 139 mounted() {
156 setTimeout(() => { 140 setTimeout(() => {
157 var mp = new MuiPlayer({ 141 var mp = new MuiPlayer({
158 - container: '#mui-player-' + this.item.case_id, 142 + container: '#mui-player-' + this.item.id,
159 title: this.item.title, 143 title: this.item.title,
160 - src: this.item.video.url, 144 + src: this.item.video,
161 - poster: this.item.cover.url, 145 + poster: this.item.cover,
162 autoFit: false, 146 autoFit: false,
163 videoAttribute: [ // 声明启用同层播放, 不让会自动全屏播放 147 videoAttribute: [ // 声明启用同层播放, 不让会自动全屏播放
164 { attrKey: 'webkit-playsinline', attrValue: 'webkit-playsinline' }, 148 { attrKey: 'webkit-playsinline', attrValue: 'webkit-playsinline' },
...@@ -166,16 +150,43 @@ export default { ...@@ -166,16 +150,43 @@ export default {
166 { attrKey: 'x5-video-player-type', attrValue: 'h5-page' }, 150 { attrKey: 'x5-video-player-type', attrValue: 'h5-page' },
167 ] 151 ]
168 }) 152 })
153 + this.mp = mp;
169 this.detail = _.cloneDeep(this.item) 154 this.detail = _.cloneDeep(this.item)
170 }, 500); 155 }, 500);
171 }, 156 },
172 methods: { 157 methods: {
173 - setLike() { 158 + closeNotice() {
174 - this.detail.liked = !this.detail.liked 159 + this.showNotice = false;
160 + },
161 + onRefuse() { // 不通过审核
162 + this.showNotice = true;
163 + },
164 + onPass() { // 通过审核
165 + this.show = true;
175 }, 166 },
176 - setComment() { 167 + handleAudit (status) {
177 - console.warn('跳转详情页,移动到留言页'); 168 + axios.post('/srv/?a=check_prod', {
178 - console.warn(this.detail.case_id); 169 + prod_id: this.detail.id,
170 + status,
171 + check_note: this.message,
172 + })
173 + .then(res => {
174 + if (res.data.code === 1) {
175 + Toast.success('操作成功');
176 + this.message = '';
177 + this.showNotice = false;
178 + this.show = false;
179 + } else {
180 + console.warn(res);
181 + Toast({
182 + icon: 'close',
183 + message: res.data.msg
184 + });
185 + }
186 + })
187 + .catch(err => {
188 + console.error(err);
189 + })
179 } 190 }
180 } 191 }
181 } 192 }
......
...@@ -27,6 +27,7 @@ export const useUnwatchList = () => { ...@@ -27,6 +27,7 @@ export const useUnwatchList = () => {
27 .then(res => { 27 .then(res => {
28 if (res.data.code === 1) { 28 if (res.data.code === 1) {
29 prod_list.value = _.concat(prod_list.value, res.data.data.prod); 29 prod_list.value = _.concat(prod_list.value, res.data.data.prod);
30 + prod_list.value = _.uniqBy(prod_list.value, 'id');
30 offset.value = prod_list.value.length; 31 offset.value = prod_list.value.length;
31 loading.value = false; 32 loading.value = false;
32 // 数据全部加载完成 33 // 数据全部加载完成
......
...@@ -102,6 +102,7 @@ export const useVideoList = ($route) => { ...@@ -102,6 +102,7 @@ export const useVideoList = ($route) => {
102 if (res.data.code === 1) { 102 if (res.data.code === 1) {
103 bookInfo.value = res.data.data; 103 bookInfo.value = res.data.data;
104 prod_list.value = _.concat(prod_list.value, res.data.data.prod_list); 104 prod_list.value = _.concat(prod_list.value, res.data.data.prod_list);
105 + prod_list.value = _.uniqBy(prod_list.value, 'id');
105 offset.value = prod_list.value.length; 106 offset.value = prod_list.value.length;
106 loading.value = false; 107 loading.value = false;
107 // 数据全部加载完成 108 // 数据全部加载完成
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
2 <div class=""> 2 <div class="">
3 <van-tabs v-model:active="active" sticky @click-tab="onClickTab" color="#F9D95C" background="#F7F7F7" 3 <van-tabs v-model:active="active" sticky @click-tab="onClickTab" color="#F9D95C" background="#F7F7F7"
4 title-active-color="#222222" title-inactive-color="#777777"> 4 title-active-color="#222222" title-inactive-color="#777777">
5 - <van-tab title="待审核" badge="24" :title-style="titleStyle"> 5 + <van-tab title="待审核" :badge="prod_num" :title-style="titleStyle">
6 <template v-if="!active"> 6 <template v-if="!active">
7 <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad"> 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;"> 8 + <template v-for="item in prod_list" :key="item" style="height: 3rem;">
9 <b-video-card :item="item" status="PENDING"></b-video-card> 9 <b-video-card :item="item" status="PENDING"></b-video-card>
10 </template> 10 </template>
11 </van-list> 11 </van-list>
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
14 <van-tab title="已审核" :title-style="titleStyle"> 14 <van-tab title="已审核" :title-style="titleStyle">
15 <template v-if="active"> 15 <template v-if="active">
16 <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad"> 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;"> 17 + <template v-for="item in prod_list" :key="item" style="height: 3rem;">
18 <b-video-card :item="item" status="PROCESS"></b-video-card> 18 <b-video-card :item="item" status="PROCESS"></b-video-card>
19 </template> 19 </template>
20 </van-list> 20 </van-list>
...@@ -25,54 +25,98 @@ ...@@ -25,54 +25,98 @@
25 </template> 25 </template>
26 26
27 <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' 28 import BVideoCard from '@/components/BVideoCard/index.vue'
31 29
32 import { ref, reactive, onMounted } from 'vue' 30 import { ref, reactive, onMounted } from 'vue'
33 import { useRoute, useRouter } from 'vue-router' 31 import { useRoute, useRouter } from 'vue-router'
34 import axios from '@/utils/axios'; 32 import axios from '@/utils/axios';
35 -import $ from 'jquery' 33 +import _ from 'lodash'
36 import { Toast } from 'vant'; 34 import { Toast } from 'vant';
35 +
37 const $route = useRoute(); 36 const $route = useRoute();
38 const $router = useRouter(); 37 const $router = useRouter();
39 38
39 +
40 const titleStyle = { 40 const titleStyle = {
41 fontSize: '1rem' 41 fontSize: '1rem'
42 } 42 }
43 43
44 +
45 +/**
46 + * 重载刷新程序
47 + */
48 +const onReload = (v) => {
49 + status.value = v
50 + offset.value = 0
51 + prod_list.value = []
52 + loading.value = true;
53 + finished.value = false;
54 + onLoad()
55 +}
56 +
44 const active = ref(0) 57 const active = ref(0)
45 let tabStatus = ref('PENDING') 58 let tabStatus = ref('PENDING')
46 -const onClickTab = () => { 59 +
47 - console.warn(0); 60 +const onClickTab = (v) => {
61 + if (!v.name) {
62 + onReload('apply')
63 + } else {
64 + onReload('checked')
65 + }
48 } 66 }
49 67
68 +// 绑定页面数据
69 +const status = ref('apply');
70 +const prod_num = ref('');
71 +const prod_list = ref([]);
72 +const limit = ref(10)
73 +const offset = ref(0)
74 +
50 // 处理书籍下作品列表 75 // 处理书籍下作品列表
51 -const list = ref([]);
52 const loading = ref(false); 76 const loading = ref(false);
53 const finished = ref(false); 77 const finished = ref(false);
54 78
79 +/**
80 + * 向下滚动查询数据
81 + */
55 const onLoad = () => { 82 const onLoad = () => {
56 // 异步更新数据 83 // 异步更新数据
57 - // setTimeout 仅做示例,真实场景中一般为 ajax 请求 84 + axios.get('/srv/?a=check_prod_list', {
58 - setTimeout(() => { 85 + params: {
59 - for (let i = 0; i < 20; i++) { 86 + status: status.value,
60 - list.value.push(list.value.length + 1); 87 + limit: limit.value,
88 + offset: offset.value
61 } 89 }
62 - 90 + })
63 - // 加载状态结束 91 + .then(res => {
92 + if (res.data.code === 1) {
93 + prod_num.value = res.data.data.prod_num;
94 + _.each(res.data.data.prod, item => {
95 + item.status = item.status.toUpperCase()
96 + })
97 + prod_list.value = _.concat(prod_list.value, res.data.data.prod);
98 + prod_list.value = _.uniqBy(prod_list.value, 'id');
99 + offset.value = prod_list.value.length;
64 loading.value = false; 100 loading.value = false;
65 -
66 // 数据全部加载完成 101 // 数据全部加载完成
67 - if (list.value.length >= 100) { 102 + if (!res.data.data.prod.length) {
103 + // 加载状态结束
68 finished.value = true; 104 finished.value = true;
69 } 105 }
70 - }, 1000); 106 + } else {
107 + console.warn(res);
108 + Toast({
109 + icon: 'close',
110 + message: res.data.msg
111 + });
112 + }
113 + })
114 + .catch(err => {
115 + console.error(err);
116 + })
71 }; 117 };
72 118
73 - onMounted(() => {
74 119
75 - })
76 </script> 120 </script>
77 121
78 <script> 122 <script>
...@@ -80,12 +124,12 @@ import mixin from 'common/mixin'; ...@@ -80,12 +124,12 @@ import mixin from 'common/mixin';
80 124
81 export default { 125 export default {
82 mixins: [mixin.init], 126 mixins: [mixin.init],
83 - data () { 127 + data() {
84 return { 128 return {
85 129
86 } 130 }
87 }, 131 },
88 - mounted () { 132 + mounted() {
89 133
90 }, 134 },
91 methods: { 135 methods: {
...@@ -98,6 +142,7 @@ export default { ...@@ -98,6 +142,7 @@ export default {
98 :global(.van-badge--top-right) { 142 :global(.van-badge--top-right) {
99 right: -10px; 143 right: -10px;
100 } 144 }
145 +
101 :global(.van-sticky--fixed) { 146 :global(.van-sticky--fixed) {
102 z-index: 1000; 147 z-index: 1000;
103 } 148 }
......
1 <template> 1 <template>
2 <div class=""> 2 <div class="">
3 - <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad"> 3 + <template v-for="item in kgProdList" :key="item" style="height: 3rem;">
4 - <template v-for="item in dataList" :key="item" style="height: 3rem;">
5 <b-video-card :item="item"></b-video-card> 4 <b-video-card :item="item"></b-video-card>
6 </template> 5 </template>
7 - </van-list> 6 + <div style="height: 2rem;"></div>
8 </div> 7 </div>
9 </template> 8 </template>
10 9
11 <script setup> 10 <script setup>
12 -import dataList from '@/mock/video_list'
13 import BVideoCard from '@/components/BVideoCard/index.vue' 11 import BVideoCard from '@/components/BVideoCard/index.vue'
14 12
15 import { ref, reactive, onMounted } from 'vue' 13 import { ref, reactive, onMounted } from 'vue'
16 import { useRoute, useRouter } from 'vue-router' 14 import { useRoute, useRouter } from 'vue-router'
17 import axios from '@/utils/axios'; 15 import axios from '@/utils/axios';
18 -import $ from 'jquery' 16 +import _ from 'lodash'
19 import { Toast } from 'vant'; 17 import { Toast } from 'vant';
20 const $route = useRoute(); 18 const $route = useRoute();
21 const $router = useRouter(); 19 const $router = useRouter();
22 20
23 // 处理书籍下作品列表 21 // 处理书籍下作品列表
24 -const list = ref([]); 22 +const kgProdList = ref([])
25 -const loading = ref(false); 23 +axios.get('/srv/?a=kg_prod_list')
26 -const finished = ref(false); 24 +.then(res => {
27 - 25 + if (res.data.code === 1) {
28 -const onLoad = () => { 26 + _.each(res.data.data.prod, item => {
29 - // 异步更新数据 27 + item.status = item.status.toUpperCase()
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 -
46 - onMounted(() => {
47 -
48 }) 28 })
29 + kgProdList.value = res.data.data.prod;
30 + } else {
31 + console.warn(res);
32 + Toast({
33 + icon: 'close',
34 + message: res.data.msg
35 + });
36 + }
37 +})
38 +.catch(err => {
39 + console.error(err);
40 +})
49 </script> 41 </script>
50 42
51 <script> 43 <script>
......