hookehuyr

✨ feat(作品详情页): 新增留言模块相应功能

...@@ -27,7 +27,7 @@ const $router = useRouter(); ...@@ -27,7 +27,7 @@ const $router = useRouter();
27 /* 全局修改主色调 */ 27 /* 全局修改主色调 */
28 // --van-blue: #F9D95C; 28 // --van-blue: #F9D95C;
29 29
30 - background-color: #FAFAFA; 30 + // background-color: #FAFAFA;
31 p { 31 p {
32 margin: 0; 32 margin: 0;
33 padding: 0; 33 padding: 0;
......
1 +<template>
2 + <van-popup
3 + v-model:show="show"
4 + :close-on-click-overlay="false"
5 + position="bottom"
6 + :style="{ height: '100%' }"
7 + >
8 + <div class="van-hairline--bottom">
9 + <van-row>
10 + <van-col span="4">
11 + </van-col>
12 + <van-col span="16" style="color: #222222; text-align: center; line-height: 3;">
13 + <span v-if="type === 'comment'">留言</span>
14 + <span v-else>回复</span>
15 + </van-col>
16 + <van-col span="4" @click="closeBtn">
17 + <div style="padding: 1rem;">
18 + <van-icon :name="icon_y" size="1.25rem" />
19 + </div>
20 + </van-col>
21 + </van-row>
22 + </div>
23 + <div style="background-color: #F7F7F7; font-size: 0.9rem;">
24 + <p style="color: #777777; padding: 1rem;">您的留言评论将会展示在页面中,请谨慎发表留言评论</p>
25 + <van-row>
26 + <van-col span="16">
27 + <p v-if="type === 'comment'" style="padding: 1rem; padding-top: 0;">请写下你友善的留言:</p>
28 + <p v-else style="padding: 1rem; padding-top: 0;">回复<span style="color: #0B3A72;">@是妮妮吖~:</span></p>
29 + </van-col>
30 + <van-col span="8">
31 + <div class="button-primary-comment" @click="submitComment">发送</div>
32 + </van-col>
33 + </van-row>
34 + </div>
35 + <div>
36 + <van-cell-group inset>
37 + <van-field
38 + v-model="message"
39 + rows="2"
40 + autosize
41 + label=""
42 + type="textarea"
43 + maxlength="200"
44 + :placeholder="type === 'comment' ? '请输入留言内容' : '请输入回复内容'"
45 + show-word-limit
46 + />
47 + </van-cell-group>
48 + </div>
49 + </van-popup>
50 +</template>
51 +
52 +<script setup>
53 +import icon_x from '@images/x.png'
54 +import icon_y from '@images/y.png'
55 +import MyButton from '@/components/MyButton/index.vue'
56 +
57 +import { ref, reactive, onMounted } from 'vue'
58 +// const props = defineProps({
59 +// showPopup: Boolean
60 +// })
61 +
62 +const message = ref('')
63 +
64 + onMounted(() => {
65 + })
66 +</script>
67 +
68 +<script>
69 +export default {
70 + props: ['showPopup', 'type'],
71 + data () {
72 + return {
73 + show: false
74 + }
75 + },
76 + mounted () {
77 + },
78 + watch: {
79 + showPopup (value, pre) {
80 + if (value) {
81 + this.show = value;
82 + }
83 + }
84 + },
85 + methods: {
86 + onClose () {
87 + this.show = false;
88 + },
89 + refreshBtn () {},
90 + closeBtn () {
91 + this.$emit('on-close', false)
92 + this.show = false;
93 + },
94 + submitComment () {
95 + this.$emit('on-close', false)
96 + this.show = false;
97 + }
98 + }
99 +}
100 +</script>
101 +
102 +<style lang="less" scoped>
103 +.comment-wrapper {
104 + color: #999999;
105 + padding: 1rem;
106 + line-height: 1.75;
107 +
108 + .reply-wrapper {
109 + background: #F7F7F7;
110 + border-radius: 10px;
111 + padding: 0.5rem;
112 + margin-top: 0.5rem;
113 + color: #0B3A72;
114 +
115 + .content {
116 + color: #222222;
117 + }
118 + }
119 +}
120 +
121 +.button-primary-comment {
122 + width: 5rem;
123 + height: auto;
124 + text-align: center;
125 + padding: 0.2rem;
126 + // margin: 0.25rem;
127 + font-size: 0.9rem;
128 + background: #F9D95C;
129 + border-radius: 24px;
130 + border: 1px solid #F9D95C;
131 + color: #713610;
132 + font-weight: bold;
133 + margin-left: 1rem;
134 + margin-bottom: 1rem;
135 +}
136 +</style>
...\ No newline at end of file ...\ No newline at end of file
1 +<template>
2 + <van-popup
3 + v-model:show="show"
4 + :close-on-click-overlay="false"
5 + round
6 + position="bottom"
7 + :style="{ height: '70%' }"
8 + >
9 + <div class="van-hairline--bottom">
10 + <van-row>
11 + <van-col span="4" @click="refreshBtn">
12 + <div style="padding: 1rem; text-align: center;">
13 + <van-icon :name="icon_x" size="1.25rem" />
14 + </div>
15 + </van-col>
16 + <van-col span="16" style="color: #222222; text-align: center; line-height: 3;">
17 + <span>12条回复</span>
18 + </van-col>
19 + <van-col span="4" @click="closeBtn">
20 + <div style="padding: 1rem;">
21 + <van-icon :name="icon_y" size="1.25rem" />
22 + </div>
23 + </van-col>
24 + </van-row>
25 + </div>
26 + <div class="comment-wrapper">
27 + <van-row style="font-size: 0.9rem;">
28 + <van-col span="4">
29 + <van-image round width="3rem" height="3rem" src="https://cdn.jsdelivr.net/npm/@vant/assets/cat.jpeg" />
30 + </van-col>
31 + <van-col span="16">
32 + <p>是妮妮吖~</p>
33 + <p>杨浦民办科技幼稚园</p>
34 + </van-col>
35 + <van-col span="4" style="text-align: center;">
36 + <p style="color: #333333;">回复</p>
37 + <p>2-25</p>
38 + </van-col>
39 + </van-row>
40 + <van-row>
41 + <van-col offset="4">
42 + <span style="color: #222222;">瑟日古娜小朋友表演的可真棒,感谢你的精彩演绎,希望有更多的小朋友能够学习到!</span>
43 + </van-col>
44 + </van-row>
45 + </div>
46 + <div class="comment-wrapper" style="background-color: #F7F7F7;">
47 + <van-row style="font-size: 0.9rem;">
48 + <van-col span="4">
49 + <van-image round width="3rem" height="3rem" src="https://cdn.jsdelivr.net/npm/@vant/assets/cat.jpeg" />
50 + </van-col>
51 + <van-col span="16">
52 + <p>是妮妮吖~</p>
53 + <p>杨浦民办科技幼稚园</p>
54 + </van-col>
55 + <van-col span="4" style="text-align: center;">
56 + <p style="color: #333333;">回复</p>
57 + <p>2-25</p>
58 + </van-col>
59 + </van-row>
60 + <van-row>
61 + <van-col offset="4">
62 + <span style="color: #222222;">瑟日古娜小朋友表演的可真棒,感谢你的精彩演绎,希望有更多的小朋友能够学习到!</span>
63 + </van-col>
64 + </van-row>
65 + </div>
66 + </van-popup>
67 +</template>
68 +
69 +<script setup>
70 +import icon_x from '@images/x.png'
71 +import icon_y from '@images/y.png'
72 +
73 +import { ref, reactive, onMounted } from 'vue'
74 +// const props = defineProps({
75 +// showPopup: Boolean
76 +// })
77 +
78 + onMounted(() => {
79 + })
80 +</script>
81 +
82 +<script>
83 +export default {
84 + props: ['showPopup'],
85 + data () {
86 + return {
87 + show: false
88 + }
89 + },
90 + mounted () {
91 + },
92 + watch: {
93 + showPopup (value, pre) {
94 + if (value) {
95 + this.show = value;
96 + }
97 + }
98 + },
99 + methods: {
100 + onClose () {
101 + this.show = false;
102 + },
103 + refreshBtn () {},
104 + closeBtn () {
105 + this.$emit('on-close', false)
106 + this.show = false;
107 + }
108 + }
109 +}
110 +</script>
111 +
112 +<style lang="less" scoped>
113 +.comment-wrapper {
114 + color: #999999;
115 + padding: 1rem;
116 + line-height: 1.75;
117 +
118 + .reply-wrapper {
119 + background: #F7F7F7;
120 + border-radius: 10px;
121 + padding: 0.5rem;
122 + margin-top: 0.5rem;
123 + color: #0B3A72;
124 +
125 + .content {
126 + color: #222222;
127 + }
128 + }
129 +}
130 +</style>
...\ No newline at end of file ...\ No newline at end of file
...@@ -45,7 +45,13 @@ export default [{ ...@@ -45,7 +45,13 @@ export default [{
45 meta: { 45 meta: {
46 title: '作品' 46 title: '作品'
47 }, 47 },
48 - children: [] 48 + children: [
49 + {
50 + path: 'comment',
51 + name: '评论详情',
52 + component: () => import('./views/client/videoDetailComment.vue')
53 + }
54 + ]
49 }, { 55 }, {
50 path: '/image', 56 path: '/image',
51 name: 'html转图片', 57 name: 'html转图片',
......
1 <template> 1 <template>
2 <div class="video-detail-page"> 2 <div class="video-detail-page">
3 - <div style="padding: 1rem;"> 3 + <div class="detail-header">
4 - <div> 4 + <van-row>
5 - <van-image 5 + <van-col span="4">
6 - round 6 + <van-image round width="3rem" height="3rem" src="https://cdn.jsdelivr.net/npm/@vant/assets/cat.jpeg" />
7 - width="2rem" 7 + </van-col>
8 - height="2rem" 8 + <van-col style="line-height: 3rem;">
9 - src="https://cdn.jsdelivr.net/npm/@vant/assets/cat.jpeg" 9 + <div class="name-info">瑟日古娜</div>
10 - /> 10 + </van-col>
11 - <span style="color: #222222;">瑟日古娜</span> 11 + </van-row>
12 - </div> 12 + <div class="other-info">呼和浩特市新城区蒙古族幼儿园 | 蒙语</div>
13 </div> 13 </div>
14 +
15 + <div class="video-player">
16 + <video-detail :item="data_video"></video-detail>
17 + </div>
18 +
19 + <div class="video-main">
20 + <van-row>
21 + <van-col span="24" style="padding-top: 0.2rem;">
22 + <van-tabs sticky v-model:active="active" @click-tab="onClickTab" color="#F9D95C" background="#F7F7F7" title-active-color="#222222" title-inactive-color="#777777">
23 + <van-tab title="简介" :title-style="tabClass">
24 + <div class="intro"> 瑟日古娜小朋友是一名来自呼和浩特市新城区蒙古族幼儿园,六岁的蒙古族小姑娘,小姑娘用纯正的蒙古族语言生动形象的演绎了逃家小兔的活泼机灵,以及兔子妈妈的深情。 </div>
25 + </van-tab>
26 + <van-tab :title="'留言 ' + commentSum" :title-style="tabClass" to="/client/videoDetail/comment">
27 + <router-view></router-view>
28 + </van-tab>
29 + </van-tabs>
30 + </van-col>
31 + </van-row>
32 + </div>
33 +
34 +
14 </div> 35 </div>
15 </template> 36 </template>
16 37
17 <script setup> 38 <script setup>
39 +import VideoDetail from '@/components/VideoDetail/index.vue'
18 import { ref, reactive, onMounted } from 'vue' 40 import { ref, reactive, onMounted } from 'vue'
19 import { useRoute, useRouter } from 'vue-router' 41 import { useRoute, useRouter } from 'vue-router'
20 import axios from '@/utils/axios'; 42 import axios from '@/utils/axios';
...@@ -23,9 +45,51 @@ import { Toast } from 'vant'; ...@@ -23,9 +45,51 @@ import { Toast } from 'vant';
23 const $route = useRoute(); 45 const $route = useRoute();
24 const $router = useRouter(); 46 const $router = useRouter();
25 47
26 - onMounted(() => { 48 +const data_video = reactive({
27 - 49 + "case_id": "424589807164071936",
28 - }) 50 + "code": "N06",
51 + "title": "复旦管理学奖励基金会",
52 + "detail": "我国自古就有优秀的管理思想和实践,但中国现代管理科学则是在改革开放之后才逐步发展起来的。为进一步推动我国现代管理科学发展,原中共中央政治局常委、国务院副总理李岚清同志于2005年发起成立了复旦管理学奖励基金会,这也是中国人自己设立的管理学界第一个奖励基金会。\r\n“要真正解决好中国的管理问题,最终还是要依靠中国人自己。”这句话道出了“管理”必须根植于一个国家的社会组织和民族文化。管理科学,是兴国之道,也是一个国家软实力的重要组成部分。\r\n十六年来,基金会各项管理逐步完善,2020年首次参加社会组织等级评估即被授予“5A级社会组织”荣誉称号;FTI透明指数排名连获最优等级。基金会的评奖工作,及其开展的一系列公益项目,获得了来自各界人士的一致认可;同时借助媒体之力,不断拓宽公众对中国管理学的认识边界,受益人数不断增加。如今,基金会已逐渐发展成为中国管理学界最具影响力、最具公信力的基金会。\r\n作为一个“奖励性”的基金会,我们希望打造中国管理学界的“诺贝尔奖”。基金会目前设立了“复旦管理学杰出贡献奖”“复旦管理学终身成就奖”“复旦企业管理杰出贡献奖”三大奖项,已成为我国管理学界享有崇高声誉、具有广泛影响力的重要奖项。截至2020年,已评选出57位获奖人,他们中不乏成思危、苏东水等矢志推动中国特色的管理学及其研究走向世界的杰出专家学者,亦有张瑞敏、任正非等对中国管理学不断实践、探索的优秀民族企业家。\r\n评奖之外,基金会还积极开展了丰富多样的公益活动。自2013年起,面向我国高等学府,面向青年师生,面向中西部地区举办了“校园公益”系列讲座活动,辐射师生5000余人。\r\n联合我国管理学一级学会,举办了一系列具有国际影响力的管理学学术盛会。其中,“中国管理学年会”是中国管理学领域规模最大、层次最高的综合性学术会议。另外,基金会通过支持“中国管理学青年论坛”,为有潜力的优秀青年架起了跨学科、跨层次的学习交流平台,旨在培养中国管理学的中青年力量。\r\n为加强学术界和实业界的合作,基金会充分发挥“桥梁·引领·赋能”作用,做到将“管理学带出去”,“管理领进来”,邀请获奖人、专家学者与企业家共话“管理”。\r\n基金会还与复旦大学东方管理研究院、第一财经合作开展了“中国杰出企业家管理思想访谈录”项目,已通过42集电视专题片、6部《改变世界》、14本研究丛书等形式对外发布,另有10多个优秀案例走进了高校课堂,收益人数达10亿多人。\r\n基金会积极响应习近平总书记“把论文写在祖国大地上”的号召,与《管理学报》合作,举办专题学术研讨会,开辟“中国企业家管理思想”专栏;与知名企业合作开展“海尔生态雨林计划”等专项研究。\r\n2020年新冠疫情的突发,对全国各地的公共卫生治理都是前所未有的考验。为总结出应对疫情的科学、高效的经验,提供疫情应对经验给相关部门,基金会资助了“新冠疫情防控防治的中国特色管理理论与方法”系列专著及案例研究。于基金会而言,这件事意义非常。\r\n作为一个扎根于中国管理学领域发展的公益组织,基金会在各级领导的亲切关怀下不断发展。获奖人所提出管理思想、管理理论和实践的创新、各项公益活动等,对于上海乃至全国各地的社会治理、公共管理与企业管理都发挥了重要的作用。在每年的颁奖典礼上,历任上海市领导均受邀出席并致辞。当今世界正面临百年未有的大变局,发展中国特色的管理学、并让中国特色管理学发挥更大的影响力,这比任何时候都更加迫切。在未来的公益发展事业中,基金会将继续助力中国特色管理学的探索和创新,为增强上海自主创新能力,提高城市国际竞争力,做出新的重大的贡献!",
53 + "cover": {
54 + "name": "N06.jpg",
55 + "url": "http://gyzs.onwall.cn/2021gyzs/N06.jpg",
56 + "uid": 1564543218846,
57 + "status": "success"
58 + },
59 + "video": {
60 + "name": "N06.mp4",
61 + "url": "http://gyzs.onwall.cn/2021gyzs/N06.mp4",
62 + "uid": 1564543218846,
63 + "status": "success"
64 + },
65 + "status": "ENABLE",
66 + "public_vote": 3406,
67 + "score": 0,
68 + "award": null,
69 + "optr_date": "2021-12-31T15:50:00.547Z",
70 + "corp": {
71 + "name": "复旦管理学奖励基金会"
72 + },
73 + "voted": false,
74 + "liked": false,
75 + "collected": false
76 +})
77 +
78 +const active = ref(1); // index 0 为简介,1 为留言
79 +const onClickTab = ({ title }) => {
80 + console.warn(title);
81 +};
82 +
83 +const tabClass = {
84 + fontSize: '1rem'
85 +}
86 +
87 +const commentSum = ref(18)
88 +
89 +
90 +onMounted(() => {
91 +
92 +})
29 </script> 93 </script>
30 94
31 <script> 95 <script>
...@@ -33,12 +97,12 @@ import mixin from 'common/mixin'; ...@@ -33,12 +97,12 @@ import mixin from 'common/mixin';
33 97
34 export default { 98 export default {
35 mixins: [mixin.init], 99 mixins: [mixin.init],
36 - data () { 100 + data() {
37 return { 101 return {
38 102
39 } 103 }
40 }, 104 },
41 - mounted () { 105 + mounted() {
42 106
43 }, 107 },
44 methods: { 108 methods: {
...@@ -49,6 +113,25 @@ export default { ...@@ -49,6 +113,25 @@ export default {
49 113
50 <style lang="less" scoped> 114 <style lang="less" scoped>
51 .video-detail-page { 115 .video-detail-page {
52 - 116 + background-color: #FFFFFF;
117 + .detail-header {
118 + padding: 1rem;
119 + .name-info {
120 + color: #222222;
121 + font-size: 1.15rem;
122 + }
123 + .other-info {
124 + color: #999999;
125 + }
126 + }
127 + .video-player {
128 + height: auto;
129 + }
130 + .video-main {
131 + height: auto;
132 + .intro {
133 + padding: 1rem; color: #333333;
134 + }
135 + }
53 } 136 }
54 </style> 137 </style>
...\ No newline at end of file ...\ No newline at end of file
......
1 +<template>
2 + <div class="">
3 + <!-- 回复条数大于20才加载 后端需要给我总条数 -->
4 + <template v-if="sum >= 20">
5 + <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了" @load="onLoad">
6 + <div v-for="item in list" :key="item" :title="item">
7 + {{ item }}
8 + </div>
9 + </van-list>
10 + </template>
11 + <template v-else>
12 + <div class="comment-wrapper">
13 + <van-row style="font-size: 0.9rem;">
14 + <van-col span="4">
15 + <van-image round width="3rem" height="3rem" src="https://cdn.jsdelivr.net/npm/@vant/assets/cat.jpeg" />
16 + </van-col>
17 + <van-col span="16">
18 + <p>是妮妮吖~</p>
19 + <p>杨浦民办科技幼稚园</p>
20 + </van-col>
21 + <van-col span="4" style="text-align: center;">
22 + <p @click="setComment('11', 'reply')" style="color: #333333;">回复</p>
23 + <p>2-25</p>
24 + </van-col>
25 + </van-row>
26 + <van-row>
27 + <van-col offset="4">
28 + <span style="color: #222222;">瑟日古娜小朋友表演的可真棒,感谢你的精彩演绎,希望有更多的小朋友能够学习到!</span>
29 + </van-col>
30 + </van-row>
31 + <van-row>
32 + <van-col offset="4">
33 + <div class="reply-wrapper">
34 + <p><span>瑟日古娜(作者):</span><span class="content">谢谢您的表扬,我会继续加油的!</span></p>
35 + <p><span>阿布日达 </span>回复<span> @瑟日古娜(作者):</span><span class="content">厉害的呀,棒!!</span></p>
36 + <p @click="getMore()">共12条回复 ></p>
37 + </div>
38 + </van-col>
39 + </van-row>
40 + </div>
41 + </template>
42 + <div style="height: 5rem;"></div>
43 + <div class="reply-btn" @click="setComment('222', 'comment')">
44 + <div class="text">写下你友善的留言</div>
45 + </div>
46 + </div>
47 + <comment-list :showPopup="showCommentListPopup" @on-close="closeCommentList"></comment-list>
48 + <comment-box :showPopup="showCommentBoxPopup" :type="commentType" @on-close="closeCommentBox"></comment-box>
49 +</template>
50 +
51 +<script setup>
52 +import CommentList from '@/components/CommentList/index.vue'
53 +import CommentBox from '@/components/CommentBox/index.vue'
54 +
55 +import { ref, reactive, onMounted } from 'vue'
56 +import { useRoute, useRouter } from 'vue-router'
57 +import axios from '@/utils/axios';
58 +import $ from 'jquery'
59 +import { Toast } from 'vant';
60 +const $route = useRoute();
61 +const $router = useRouter();
62 +
63 +const list = ref([]);
64 +const sum = ref(0);
65 +const loading = ref(false);
66 +const finished = ref(false);
67 +
68 +const onLoad = () => {
69 + // 异步更新数据
70 + // setTimeout 仅做示例,真实场景中一般为 ajax 请求
71 + setTimeout(() => {
72 + for (let i = 0; i < 10; i++) {
73 + list.value.push(list.value.length + 1);
74 + }
75 +
76 + // 加载状态结束
77 + loading.value = false;
78 +
79 + // 数据全部加载完成
80 + if (list.value.length >= 100) {
81 + finished.value = true;
82 + }
83 + }, 1000);
84 +};
85 +
86 +// 回复消息列表模块
87 +const showCommentListPopup = ref(false);
88 +const getMore = (v) => { // 查看更多回复
89 + showCommentListPopup.value = true;
90 +}
91 +const closeCommentList = (v) => { // 查看更多回复
92 + showCommentListPopup.value = v;
93 +}
94 +// 回复评论控件
95 +const showCommentBoxPopup = ref(false);
96 +const commentType = ref('comment'); // 类型 comment 为评论/类型 reply 为回复
97 +const setComment = (v, type) => { // 回复/评论
98 + showCommentBoxPopup.value = true;
99 + commentType.value = type;
100 +}
101 +const closeCommentBox = (v) => { // 查看更多回复
102 + showCommentBoxPopup.value = v;
103 +}
104 +
105 +
106 +onMounted(() => {
107 + sum.value = 10; // 获取评论总条数,判断是否加载控件
108 +})
109 +</script>
110 +
111 +<script>
112 +import mixin from 'common/mixin';
113 +
114 +export default {
115 + mixins: [mixin.init],
116 + data() {
117 + return {
118 +
119 + }
120 + },
121 + mounted() {
122 +
123 + },
124 + methods: {
125 +
126 + }
127 +}
128 +</script>
129 +
130 +<style lang="less" scoped>
131 +.comment-wrapper {
132 + color: #999999;
133 + padding: 1rem;
134 + line-height: 1.75;
135 +
136 + .reply-wrapper {
137 + background: #F7F7F7;
138 + border-radius: 10px;
139 + padding: 0.5rem;
140 + margin-top: 0.5rem;
141 + color: #0B3A72;
142 +
143 + .content {
144 + color: #222222;
145 + }
146 + }
147 +}
148 +
149 +.reply-btn {
150 + position: fixed;
151 + bottom: 1rem;
152 + left: 0;
153 + right: 0;
154 +
155 + .text {
156 + text-align: center;
157 + padding: 0.5rem;
158 + margin: 0.8rem;
159 + font-size: 0.85rem;
160 + border-radius: 24px;
161 + border: 1px solid F7F7F7;
162 + color: #B7B7B7;
163 + background-color: #FFFFFF;
164 + box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.06);
165 + }
166 +}
167 +</style>
...\ No newline at end of file ...\ No newline at end of file