zyronon 1 year ago
parent
commit
62cc947be5
  1. 3
      src/components/Comment.vue
  2. 4
      src/components/UserPanel.vue
  3. 10
      src/components/slide/ItemDesc.vue
  4. 360
      src/pages/other/AlbumDetail2.vue
  5. 328
      src/pages/other/VideoDetail.vue
  6. 2
      src/pages/shop/GoodsDetail.vue
  7. 3
      src/router/routes.js

3
src/components/Comment.vue

@ -404,6 +404,9 @@ export default { @@ -404,6 +404,9 @@ export default {
span {
margin-right: 5rem;
}
svg{
font-size: 10rem;
}
}
}

4
src/components/UserPanel.vue

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
<Icon @click="$emit('back')" class="icon" icon="eva:arrow-ios-back-fill"/>
<transition name="fade">
<div class="float-user" v-if="state.floatFixed">
<img v-lazy="Utils.$imgPreview(props.currentItem.author.avatar_168x168.url_list[0])" class="avatar"/>
<img v-lazy="_checkImgUrl(props.currentItem.author.avatar_168x168.url_list[0])" class="avatar"/>
<img v-if="!props.currentItem.author.follow_status" src="@/assets/img/icon/add-light.png" alt=""
class="add">
<span @click="followButton">{{ props.currentItem.author.follow_status ? '私信' : '关注' }}</span>
@ -99,7 +99,7 @@ @@ -99,7 +99,7 @@
<div class="other">
<div class="scroll-x" @touchmove="stop">
<div class="item" v-for="item in props.currentItem.author.card_entries">
<img :src="item.icon_dark.url_list[0]" alt="">
<img :src="_checkImgUrl(item.icon_dark.url_list[0])" alt="">
<div class="right">
<div class="top">{{ item.title }}</div>
<div class="bottom">{{ item.sub_title }}</div>

10
src/components/slide/ItemDesc.vue

@ -44,13 +44,13 @@ const state = reactive({ @@ -44,13 +44,13 @@ const state = reactive({
</div>
</div>
<div class="name mb1r f18 fb" @click.stop="$emit('goUserInfo')">@{{ props.item.author.nickname }}</div>
<div class="description mb1r">
<div class="description">
{{ props.item.desc }}
</div>
<div class="music" @click.stop="bus.emit('nav','/home/music')">
<img src="../../assets/img/icon/music.svg" alt="" class="music-image">
<span>{{ props.item.music.title }}</span>
</div>
<!-- <div class="music" @click.stop="bus.emit('nav','/home/music')">-->
<!-- <img src="../../assets/img/icon/music.svg" alt="" class="music-image">-->
<!-- <span>{{ props.item.music.title }}</span>-->
<!-- </div>-->
</div>
<div v-else class="comment-status">
<div class="comment">

360
src/pages/other/AlbumDetail2.vue

@ -1,360 +0,0 @@ @@ -1,360 +0,0 @@
<template>
<div class="goods-detail base-page1">
<header>
<Icon
@click="$back()"
icon="material-symbols-light:arrow-back-ios-new"/>
<div class="option" @click="nav('/home/search')">
<Icon icon="jam:search"/>
</div>
</header>
<div class="slide-imgs">
<SlideHorizontal v-model:index="state.index">
<SlideItem v-for="item in state.detail.note_card?.image_list">
<img :src="_checkImgUrl(item.info_list?.[0]?.url)" alt="">
</SlideItem>
</SlideHorizontal>
<div class="indicator-bar" v-if="state.detail.note_card?.image_list?.length > 1">
<div class="indicator"
:class="[i <= state.index+1 && 'active']"
v-for="i in state.detail.note_card?.image_list?.length"></div>
</div>
</div>
<div class="content">
<div class="shop">
<header>
<img class="avatar" :src="_checkImgUrl(state.detail.note_card?.user?.avatar)"/>
<div class="right">
<div class="name">{{ state.detail.note_card.user.nick_name }}</div>
<div class="r">关注</div>
</div>
</header>
<div class="desc">
{{ state.detail.note_card?.display_title }}
</div>
<div class="date">{{ state.detail.note_card.createTime }}</div>
</div>
<div class="card comments">
<header>
<span class="l">评论 {{ state.detail.note_card.comment_list.length }}</span>
<div class="r">
<span>查看全部</span>
<Icon class="arrow" icon="mingcute:right-line"/>
</div>
</header>
<div class="comment" v-for="i in state.detail.note_card.comment_list.slice(0,2)">
<img src="https://cdn.seovx.com/?mom=302" alt="" class="avatar">
<span>
{{ i.name }}{{ i.text }}
</span>
</div>
</div>
</div>
<div class="toolbar">
<div class="input-wrap">
说点什么...
</div>
<div class="options">
<div class="option">
<Icon icon="solar:heart-linear"/>
<div class="text">{{ state.detail.note_card?.interact_info?.liked_count }}</div>
</div>
<div class="option">
<Icon icon="mage:message-dots-round" class="icon"/>
<div class="text">{{ state.detail.note_card.comment_list.length }}</div>
</div>
<div class="option">
<Icon icon="mage:star"/>
<div class="text">{{ state.detail.note_card?.interact_info?.collect_count }}</div>
</div>
<div class="option">
<Icon icon="ph:share-fat-light"/>
<div class="text">{{ state.detail.note_card?.interact_info?.share_count }}</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import SlideHorizontal from "@/components/slide/SlideHorizontal.vue";
import SlideItem from "@/components/slide/SlideItem.vue";
import {onMounted, reactive} from "vue";
import {useNav} from "@/utils/hooks/useNav";
import {Icon} from "@iconify/vue";
import {useBaseStore} from "@/store/pinia";
import {_checkImgUrl, cloneDeep} from "@/utils";
import Mock from 'mockjs'
const nav = useNav()
const store = useBaseStore()
defineOptions({
name: 'Album-Detail'
})
const state = reactive({
detail: {
"id": "",
"note_card": {
"interact_info": {},
"cover": {},
"image_list": [],
"display_title": "",
"user": {},
comment_list: [],
createTime: ''
}
},
index: 0,
})
onMounted(() => {
state.detail = cloneDeep(store.routeData)
let data = Mock.mock({
'comment_list|3-50': [{
name: '@cname',
text: '@cparagraph(3)'
}]
})
state.detail.note_card.comment_list = data.comment_list
state.detail.note_card.createTime = Mock.Random.date('MM-dd')
state.detail.note_card.interact_info.collect_count = Mock.Random.integer(60, 3000)
state.detail.note_card.interact_info.share_count = Mock.Random.integer(60, 3000)
console.log('sta', state.detail)
})
</script>
<style scoped lang="less">
@import "@/assets/less/index.less";
.goods-detail {
background: var(--color-message);
color: white;
font-size: 14rem;
@c: #a2a2a2;
@c2: #c0c0c0;
@red: rgb(248, 38, 74);
& > header {
position: fixed;
left: 0;
top: 0;
width: 100vw;
z-index: 9;
display: flex;
justify-content: space-between;
padding: 15rem;
box-sizing: border-box;
svg {
font-size: 20rem;
background: rgba(176, 176, 176, 0.4);
padding: 5rem;
color: white;
border-radius: 50%;
}
}
.slide-imgs {
position: relative;
height: 55vh;
img {
height: 100%;
width: 100%;
object-fit: cover;
touch-action: none;
}
.indicator-bar {
position: absolute;
bottom: 5rem;
left: 3vw;
width: 94vw;
display: flex;
gap: 5rem;
.indicator {
background: rgba(162, 160, 160, 0.5);
height: 3rem;
flex: 1;
border-radius: 2rem;
}
.active {
background: rgba(250, 246, 246, 0.58);
}
}
.index {
font-size: 12rem;
position: absolute;
padding: 3rem 10rem;
border-radius: 15rem;
background: rgba(91, 89, 89, 0.5);
right: 10rem;
bottom: 30rem;
color: white;
}
}
.card {
margin-top: 15rem;
border-radius: 10rem;
padding: 10rem 15rem;
background: black;
}
.arrow {
font-size: 16rem;
}
.content {
padding: 15rem;
padding-bottom: 10vh;
border-radius: 16rem 16rem 0 0;
.comments {
& > header {
margin-bottom: 16rem;
display: flex;
justify-content: space-between;
align-items: center;
.l {
font-size: 15rem;
}
.r {
color: gray;
font-size: 12rem;
display: flex;
align-items: center;
}
}
.comment {
margin-bottom: 16rem;
display: flex;
align-items: center;
gap: 5rem;
span {
display: inline-block;
white-space: nowrap;
flex: 1;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
}
img {
border-radius: 50%;
width: 20rem;
height: 20rem;
}
&:last-child {
margin-bottom: 0;
}
}
}
.shop {
& > header {
display: flex;
align-items: center;
gap: 10rem;
img {
width: 36rem;
height: 36rem;
border-radius: 50%;
}
.right {
flex: 1;
display: flex;
justify-content: space-between;
align-items: center;
.name {
font-size: 16rem;
}
.r {
border-radius: 4rem;
padding: 6rem 16rem;
background: var(--primary-btn-color);
font-size: 12rem;
color: white;
}
}
}
.desc {
margin-top: 10rem;
}
.date {
font-size: 12rem;
margin-top: 10rem;
color: gray;
}
}
}
.toolbar {
position: fixed;
bottom: 0;
width: 100vw;
left: 0;
background: var(--color-message);
border-top: 1px solid rgba(white, .1);
display: flex;
align-items: center;
padding: 8rem 10rem;
padding-right: 0;
box-sizing: border-box;
gap: 6rem;
.input-wrap {
width: 110rem;
padding-left: 15rem;
height: 34rem;
border-radius: 30rem;
background: var(--second-btn-color-tran);
color: gray;
display: flex;
align-items: center;
}
.options {
flex: 1;
display: flex;
.option {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
font-size: 13rem;
color: white;
svg {
font-size: 24rem;
}
}
}
}
}
</style>

328
src/pages/other/VideoDetail.vue

@ -1,11 +1,21 @@ @@ -1,11 +1,21 @@
<template>
<div id="video-detail">
<div class="search-wrapper">
<dy-back class="back" @click="$back"/>
<Search></Search>
<Icon class="back" icon="icon-park-outline:left" @click="$back"/>
<div class="search" @click="nav('/home/search')">
<div class="left">
<Icon class="icon" icon="ion:search"/>
<span>搜你想看的</span>
</div>
<div class="right">
<span class="gang">|</span>
<span class="txt">搜索</span>
</div>
</div>
</div>
<div class="content">
<SlideVerticalInfinite
v-if="false"
ref="listRef"
v-love="state.uniqueId"
:id="state.uniqueId"
@ -19,106 +29,33 @@ @@ -19,106 +29,33 @@
/>
</div>
<div class="footer">
<div class="share-to-friend" v-if="!data.isMy">
<span>留下你的精彩评论吧</span>
<div class="share-btn" @click="data.dialog.shareToFriend = true">分享给朋友</div>
</div>
<div class="permission-setting" v-if="data.isMy">
<div class="comment">
<div class="left">
<img :src="_checkImgUrl(store.userinfo.avatar_168x168.url_list[0])" class="avatar" alt=""/>
<span>善语结善缘恶言伤人心</span>
</div>
<div class="right">
<img src="../../assets/img/icon/play-white.png" alt="">
<span>3030浏览</span>
<Icon icon="tabler:photo"/>
<Icon icon="ion:at-sharp"/>
<Icon icon="fa-regular:laugh"/>
</div>
<div class="share-btn" @click="data.dialog.permissionDialog = true">权限设置</div>
</div>
</div>
<from-bottom-dialog
page-id="video-detail"
v-model="data.dialog.shareToFriend"
height="50vh"
mode="light"
mask-mode="light"
>
<div class="share-dialog">
<div class="collection" @click="data.dialog.shareToFriend = false">
<img src="../../assets/img/icon/me/collection-black.png" alt="">
收藏
</div>
<div class="friends">
<div class="friend" v-for="i in 6">
<img src="../../assets/img/icon/head-image.jpeg" alt="">
<div class="right">
<span>三分钟情</span>
<div class="share-btn">分享</div>
</div>
</div>
<div class="friend">
<img src="../../assets/img/icon/head-image.jpeg" alt="">
<div class="right">
<span>更多好友</span>
</div>
</div>
</div>
</div>
</from-bottom-dialog>
<from-bottom-dialog
page-id="video-detail"
v-model="data.dialog.permissionDialog"
height="40vh"
mode="white"
mask-mode="white"
>
<div class="permission-dialog">
<div class="setting" @click="data.dialog.permissionDialog = false">
<img src="../../assets/img/icon/head-image.jpeg" alt="">
<div class="right">
<span>公开 所有人可见</span>
<img src="../../assets/img/icon/head-image.jpeg" alt="">
</div>
</div>
<div class="setting">
<img src="../../assets/img/icon/head-image.jpeg" alt="">
<div class="right">
<span>朋友 互关朋友可见</span>
<img src="../../assets/img/icon/head-image.jpeg" alt="">
</div>
</div>
<div class="setting">
<img src="../../assets/img/icon/head-image.jpeg" alt="">
<div class="right">
<span>私密 仅自己见</span>
<img src="../../assets/img/icon/head-image.jpeg" alt="">
</div>
</div>
<div class="setting" style="border-bottom: none;">
<img src="../../assets/img/icon/head-image.jpeg" alt="">
<div class="right">
<span>不给谁看</span>
<img src="../../assets/img/icon/head-image.jpeg" alt="">
</div>
</div>
<div class="space"></div>
<div class="setting pb4r">
<img src="../../assets/img/icon/head-image.jpeg" alt="">
<div class="right">
<span>更多好友</span>
</div>
</div>
</div>
</from-bottom-dialog>
</div>
</template>
<script setup>
import Search from "../../components/Search.vue";
import FromBottomDialog from "../../components/dialog/FromBottomDialog.vue";
import {onMounted, reactive} from "vue";
import {useBaseStore} from "@/store/pinia";
import SlideVerticalInfinite from "@/components/slide/SlideVerticalInfinite.vue";
import {useSlideListItemRender} from "@/utils/hooks/useSlideListItemRender";
import {_checkImgUrl} from "@/utils";
import {useNav} from "@/utils/hooks/useNav";
defineOptions({
name: 'VideoDetail'
})
const nav = useNav()
const store = useBaseStore()
const data = reactive({
dialog: {
@ -126,7 +63,7 @@ const data = reactive({ @@ -126,7 +63,7 @@ const data = reactive({
permissionDialog: false,
test: false,
},
isMy: true
isMy: false
})
const state = reactive({
index: 0,
@ -139,11 +76,10 @@ const state = reactive({ @@ -139,11 +76,10 @@ const state = reactive({
const render = useSlideListItemRender()
onMounted(() => {
console.log('s', store.routeData)
// console.log('s', store.routeData)
state.index = store.routeData.index
state.list = store.routeData.list
console.log('sss', state.list[state.index])
// console.log('sss', state.list[state.index])
})
</script>
@ -152,31 +88,68 @@ onMounted(() => { @@ -152,31 +88,68 @@ onMounted(() => {
#video-detail {
position: fixed;
font-size: 14rem;
top: 0;
bottom: 0;
left: 0;
right: 0;
height: 100%;
width: 100%;
background: black;
.search-wrapper {
height: var(--common-header-height);
z-index: 9;
position: fixed;
top: 10rem;
left: 15rem;
right: 15rem;
top: 8rem;
left: 0;
width: 100vw;
padding: 0 15rem;
box-sizing: border-box;
display: flex;
align-items: center;
gap: 15rem;
.back {
width: 20rem;
height: 20rem;
margin-right: 10rem;
color: white;
font-size: 30rem;
}
.search-ctn {
width: 100%;
.search {
color: var(--second-btn-color);
display: flex;
background: rgba(171, 169, 169, 0.4);
border-radius: 8rem;
flex: 1;
padding: 8rem;
justify-content: space-between;
.left {
font-size: 15rem;
display: flex;
align-items: center;
color: gainsboro;
gap: 5rem;
line-height: 1;
svg {
font-size: 14rem;
}
}
.right {
display: flex;
align-items: center;
gap: 10rem;
font-size: 16rem;
.gang {
color: dimgrey;
}
.txt {
color: white;
}
}
}
}
@ -186,166 +159,43 @@ onMounted(() => { @@ -186,166 +159,43 @@ onMounted(() => {
.footer {
height: var(--footer-height);
}
.share-to-friend {
color: var(--second-text-color);
height: var(--footer-height);
z-index: 9;
position: fixed;
bottom: 0;
width: 100%;
box-sizing: border-box;
padding: 0 20px;
display: flex;
justify-content: space-between;
justify-content: center;
align-items: center;
.share-btn {
color: darkgray;
padding: 6px 14px;
background: rgb(44, 44, 44);
border-radius: 50px;
}
}
.permission-setting {
.comment {
color: var(--second-text-color);
height: var(--footer-height);
z-index: 9;
position: fixed;
bottom: 0;
width: 100%;
width: 95%;
height: 75%;
box-sizing: border-box;
padding: 0 20px;
padding: 0 10px;
display: flex;
justify-content: space-between;
align-items: center;
background: rgb(37, 37, 37);
border-radius: 50rem;
.right {
display: flex;
align-items: center;
font-size: 14rem;
img {
margin-right: 10px;
width: 15px;
height: 15px;
}
.avatar {
height: 70%;
border-radius: 50%;
}
.share-btn {
color: darkgray;
padding: 6px 14px;
background: rgb(44, 44, 44);
border-radius: 50px;
}
}
.share-dialog {
.collection {
background: white;
margin: 0 10rem 10rem 10rem;
width: calc(100% - 20rem);
border-radius: 6px;
.left {
height: 100%;
display: flex;
align-items: center;
font-size: 16rem;
font-weight: bold;
padding: 10px;
box-sizing: border-box;
img {
background: white;
width: 35px;
height: 35px;
margin-right: 10px;
}
}
.friends {
margin: 10rem 10rem 0 10rem;
width: calc(100% - 20rem);
background: white;
border-radius: 6px 6px 0 0;
.friend {
box-sizing: border-box;
padding: 10px;
width: 100%;
display: flex;
align-items: center;
//border-bottom: 1px solid ghostwhite;
border-bottom: 1px solid gainsboro;
img {
border-radius: 50%;
width: 40px;
height: 40px;
}
.right {
margin: 0 5px 0 15px;
font-size: 16rem;
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.share-btn {
font-size: 14rem;
color: white;
padding: 5px 20px;
background: var(--primary-btn-color);
border-radius: 2px;
}
}
}
gap: 10rem;
}
}
.permission-dialog {
.space {
height: 10rem;
background: whitesmoke;
}
.setting {
background: white;
box-sizing: border-box;
padding: 10rem 20rem;
width: 100%;
display: flex;
align-items: center;
//border-bottom: 1px solid ghostwhite;
border-bottom: 1px solid gainsboro;
img {
border-radius: 50%;
width: 30rem;
height: 30rem;
}
.right {
margin: 0 5rem 0 15rem;
font-size: 14rem;
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.share-btn {
font-size: 14rem;
color: white;
padding: 5rem 20rem;
background: var(--primary-btn-color);
border-radius: 2rem;
}
}
.right {
.left;
gap: 15rem;
font-size: 24rem;
}
}
}

2
src/pages/shop/GoodsDetail.vue

@ -342,7 +342,7 @@ function scroll() { @@ -342,7 +342,7 @@ function scroll() {
const state = reactive({
detail: goods.list[1],
index: 2,
index: 0,
list: goods.list,
listEl: null,
fixed: false

3
src/router/routes.js

@ -1,7 +1,6 @@ @@ -1,7 +1,6 @@
import Home from "../pages/home";
import Test from "../pages/test/Test";
import Test4 from "../pages/test/Test4";
import GoodsDetail from "@/pages/shop/GoodsDetail.vue";
const routes = [
// {path: '/', redirect: '/attention'},
@ -93,7 +92,7 @@ const routes = [ @@ -93,7 +92,7 @@ const routes = [
{path: '/message/share-to-friend', component: () => import('@/pages/message/Share2Friend.vue')},
{path: '/video-detail', name: 'video-detail', component: () => import('@/pages/other/VideoDetail.vue')},
{path: '/album-detail', component: () => import('@/pages/other/AlbumDetail.vue')},
// {path: '/album-detail', component: () => import('@/pages/other/AlbumDetail.vue')},
{path: '/home/search', component: () => import('@/pages/home/SearchPage.vue')},

Loading…
Cancel
Save