From 12af499e64f38b7ff3a79fcc5bf527855cf359f3 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期二, 03 六月 2025 16:41:49 +0800
Subject: [PATCH] 视频主页基本信息接口对接
---
api/user.js | 16 +++
api/video.js | 13 ++
pages/tabbar/index/home.vue | 7
pages/video/home-page.vue | 232 ++++++++++++++++++++++++++++++++-------------
4 files changed, 196 insertions(+), 72 deletions(-)
diff --git a/api/user.js b/api/user.js
index 1f1ebaf..5dc926a 100644
--- a/api/user.js
+++ b/api/user.js
@@ -33,3 +33,19 @@
params: params
});
}
+
+
+/**
+ * 鑾峰彇瑙嗛涓婚〉-浣滆�呮敹钘忕殑瑙嗛鍒嗛〉
+ *
+ * @param params
+ */
+ export function getAuthorCollectVideoPage(params) {
+ return http.request({
+ url: "/lmk/video/author-collect-video-page",
+ method: Method.GET,
+ needToken: true,
+ params: params
+ });
+}
+
diff --git a/api/video.js b/api/video.js
index c46c6b9..f3a56c8 100644
--- a/api/video.js
+++ b/api/video.js
@@ -62,6 +62,19 @@
}
/**
+ * 鍙栨秷鍏虫敞浣滆��
+ *
+ * @param params
+ */
+ export function unSubscribe(authorId) {
+ return http.request({
+ url: "/lmk/my-subscribe/unSubscribe/" + authorId,
+ method: Method.POST,
+ needToken: true
+ });
+}
+
+/**
* 鑾峰彇瑙嗛璇勮
*
* @param params
diff --git a/pages/tabbar/index/home.vue b/pages/tabbar/index/home.vue
index d6a2f29..356bd51 100644
--- a/pages/tabbar/index/home.vue
+++ b/pages/tabbar/index/home.vue
@@ -75,16 +75,16 @@
<view class="avatar-container">
<image class="avatar" @click="() => jumpToHomePage(item.authorId)" :src="item.authorAvatar" mode="aspectFill"></image>
<!-- 鍏虫敞鍥炬爣 - 浣跨敤缁濆瀹氫綅 -->
- <view v-if="!item.subscribeThisAuthor" class="follow-icon" @click="subscribeAuth(index, item.authorId)">
+ <view v-if="!item.subscribeThisAuthor" class="follow-icon" @click="() => subscribeAuth(index, item.authorId)">
<text class="iconfont"></text>
</view>
</view>
- <view class="action-item" @click="toggleCollect(item, index)">
+ <view class="action-item" @click="() => toggleCollect(item, index)">
<text class="iconfont" v-if="item.collected"></text>
<text class="iconfont" v-else></text>
<text style="font-size: 10px;font-weight: lighter;">{{item.collectNum}}</text>
</view>
- <view class="action-item" @click="showComments(item)">
+ <view class="action-item" @click="() => showComments(item)">
<text class="iconfont"></text>
<text style="font-size: 10px;font-weight: lighter;">{{item.commentNum}}</text>
</view>
@@ -495,7 +495,6 @@
async loadVideos() {
if (this.loading) return;
this.loading = true;
-
getRecommendVideos({pageNumber: this.page, pageSize: this.pageSize}).then(res => {
console.log(res, "瑙嗛鏁版嵁");
if (this.page === 1) {
diff --git a/pages/video/home-page.vue b/pages/video/home-page.vue
index 9f9ddbf..a16c832 100644
--- a/pages/video/home-page.vue
+++ b/pages/video/home-page.vue
@@ -11,7 +11,7 @@
<view class="user-info">
<view class="user-name">{{userInfo.nickName}}</view>
<view class="user-id">ID: {{userInfo.userId}}</view>
- <view class="user-desc">{{userInfo.motto || '杩欎釜浜哄緢鎳掞紝浠�涔堥兘娌$暀涓媬'}}</view>
+ <view class="user-desc">{{userInfo.motto || '娌℃湁绛惧悕锛屼篃寰堜釜鎬'}}</view>
</view>
<view class="stats-container">
<view class="stat-item" @click="navigateToFollow('fans')">
@@ -47,7 +47,7 @@
:class="{active: currentTab === 'works'}"
@click="switchTab('works')"
>
- 浣滃搧
+ 浣滃搧{{`(${videoTotal})`}}
</view>
<view
class="tab-item"
@@ -59,35 +59,63 @@
</view>
<!-- 瑙嗛鍒楄〃 -->
- <view class="video-list">
- <view
- class="video-item"
- v-for="(item, index) in videoList"
- :key="item.id"
- @click="playVideo(index)"
- >
- <image class="video-cover" :src="item.cover" mode="aspectFill"></image>
- <view class="video-info">
- <view class="video-stats">
- <view class="stat">
- <uni-icons type="heart" size="14" color="#fff"></uni-icons>
- <text>{{item.collectNum}}</text>
- </view>
- </view>
- </view>
- </view>
- </view>
+ <scroll-view class="video-list" scroll-y :show-scrollbar="false" @scrolltolower="getPage" v-show="currentTab === 'works' && videoList.length > 0">
+ <view class="video-container">
+ <view
+ class="video-item"
+ v-for="(item, index) in videoList"
+ :key="item.id"
+ @click="playVideo(index)"
+ >
+ <image class="video-cover" :src="item.coverUrl" mode="aspectFill"></image>
+ <view class="video-info">
+ <view class="video-stats">
+ <view class="stat">
+ <uni-icons type="heart" size="16" color="#fff"></uni-icons>
+ <text>{{item.collectNum}}</text>
+ </view>
+ </view>
+ </view>
+ </view>
+ </view>
+ </scroll-view>
+ <scroll-view class="video-list" scroll-y :show-scrollbar="false" @scrolltolower="getPage" v-show="currentTab === 'likes' && collectVideoList.length > 0">
+ <view class="video-container">
+ <view
+ class="video-item"
+ v-for="(item, index) in collectVideoList"
+ :key="item.id"
+ @click="playVideo(index)"
+ >
+ <image class="video-cover" :src="item.coverUrl" mode="aspectFill"></image>
+ <view class="video-info">
+ <view class="video-stats">
+ <view class="stat">
+ <uni-icons type="heart" size="16" color="#fff"></uni-icons>
+ <text>{{item.collectNum}}</text>
+ </view>
+ </view>
+ </view>
+ </view>
+ </view>
+ </scroll-view>
<!-- 绌虹姸鎬� -->
- <view class="empty-state" v-if="videoList.length === 0">
- <image src="/static/images/empty.png" mode="aspectFit" class="empty-image"></image>
- <text class="empty-text">{{currentTab === 'works' ? '浣犺繕娌℃湁鍙戝竷浣滃搧鍝' : '浣犺繕娌℃湁鐐硅禐浣滃搧鍝'}}</text>
+ <view class="empty-state" v-if="videoList.length === 0 && currentTab === 'works'">
+ <!-- <image src="/static/images/empty.png" mode="aspectFit" class="empty-image"></image> -->
+ <text class="empty-text">杩樻湭鍙戝竷浣滃搧鍝</text>
</view>
+ <!-- 绌虹姸鎬� -->
+ <view class="empty-state" v-if="collectVideoList.length === 0 && currentTab === 'likes'">
+ <!-- <image src="/static/images/empty.png" mode="aspectFit" class="empty-image"></image> -->
+ <text class="empty-text">杩樻病鏈夌偣璧炰綔鍝佸摝~</text>
+ </view>
</view>
</template>
<script>
-import {getAuthorInfo, getAuthorVideoPage} from '@/api/user.js'
+import {getAuthorInfo, getAuthorVideoPage, getAuthorCollectVideoPage} from '@/api/user.js'
+import {subscribe, unSubscribe} from '@/api/video.js'
export default {
data() {
return {
@@ -109,7 +137,16 @@
pageNumber: 1,
pageSize: 10
},
- videoList: []
+ collectVideoQuery: {
+ authorId: '',
+ pageNumber: 1,
+ pageSize: 10
+ },
+ videoTotal: 0,
+ videoList: [], // 浣滃搧
+ collectVideoList: [], // 鏀惰棌
+ nomoreVideo: false,
+ nomoreCollectVideo: false
}
},
onLoad(option) {
@@ -118,63 +155,113 @@
this.getAuthorVideoPage();
},
methods: {
+ getPage() {
+ if(this.currentTab === 'works') {
+ if(this.nomoreVideo) {
+ return;
+ }
+ getAuthorVideoPage(this.videoQuery).then(res => {
+ if(this.videoQuery.pageNumber === 1) {
+ this.videoList = res.data.data
+ } else {
+ this.videoList = [
+ ...this.videoList,
+ ...res.data.data.filter(
+ (newItem) => !this.videoList.some((oldItem) => oldItem.id === newItem.id)
+ ),
+ ];
+ }
+ if(res.data.data.length < this.videoQuery.pageSize) {
+ this.nomoreVideo = true;
+ } else {
+ this.videoQuery.pageNumber += 1;
+ }
+ })
+ } else if(this.currentTab === 'likes') {
+ if(this.nomoreCollectVideo) {
+ return;
+ }
+ getAuthorCollectVideoPage(this.collectVideoQuery).then(res => {
+ if(this.collectVideoQuery.pageNumber === 1) {
+ this.collectVideoList = res.data.data
+ } else {
+ this.collectVideoList = [
+ ...this.collectVideoList,
+ ...res.data.data.filter(
+ (newItem) => !this.collectVideoList.some((oldItem) => oldItem.id === newItem.id)
+ ),
+ ];
+ }
+ if(res.data.data.length < this.collectVideoQuery.pageSize) {
+ this.nomoreCollectVideo = true;
+ } else {
+ this.collectVideoQuery.pageNumber += 1;
+ }
+ })
+ }
+ },
// 鑾峰彇涓汉淇℃伅
async getAuthorInfo() {
getAuthorInfo(this.authorId).then(res => {
this.userInfo = res.data.data
})
},
+ // 鑾峰彇浣滆�呬綔鍝�
async getAuthorVideoPage() {
this.videoQuery.authorId = this.authorId;
getAuthorVideoPage(this.videoQuery).then(res => {
- if(this.videoQuery.pageNumber === 1) {
- this.videoList = res.data.data
- } else {
- this.videoList = [
- ...this.videoList,
- ...res.data.data.filter(
- (newItem) => !this.videoList.some((oldItem) => oldItem.id === newItem.id)
- ),
- ];
- }
+ this.videoList = res.data.data
+ this.videoTotal = res.data.total
})
},
// 鑾峰彇浣滃搧淇℃伅
// 鍒囨崲鍏虫敞鐘舵��
toggleFollow() {
- // 妯℃嫙璇锋眰鏈嶅姟鍣�
- uni.showLoading({
- title: '澶勭悊涓�...'
- });
-
- setTimeout(() => {
- this.isFollowed = !this.isFollowed;
-
- // 鏇存柊绮変笣鏁�
- if(this.isFollowed) {
- this.userInfo.fansCount++;
- uni.showToast({
- title: '鍏虫敞鎴愬姛',
- icon: 'success'
- });
- } else {
- this.userInfo.fansCount--;
- uni.showToast({
- title: '宸插彇娑堝叧娉�',
- icon: 'none'
- });
- }
-
- uni.hideLoading();
- }, 500);
+ if(this.userInfo.hasSub) {
+ // 鍙栨秷鍏虫敞
+ unSubscribe(this.authorId).then(res => {
+ uni.showToast({
+ title: '宸插彇娑堝叧娉�',
+ icon: 'none'
+ });
+ this.userInfo.hasSub = false
+ this.userInfo.fansNum -= 1;
+ })
+ } else {
+ // 鍏虫敞
+ subscribe(this.authorId).then(res => {
+ uni.showToast({
+ title: '鍏虫敞鎴愬姛',
+ icon: 'success'
+ });
+ this.userInfo.hasSub = true
+ this.userInfo.fansNum += 1;
+ })
+ }
},
// 鍒囨崲浣滃搧/鍠滄tab
switchTab(tab) {
+ if(this.currentTab === tab) {
+ return
+ }
this.currentTab = tab;
- // 杩欓噷搴旇鏍规嵁tab鍒囨崲璇锋眰涓嶅悓鐨勬暟鎹�
- // this.loadVideoList();
+ if(tab === 'works') {
+ this.collectVideoList = []
+ this.videoQuery.pageNumber = 1
+ this.getAuthorVideoPage()
+ } else if(tab === 'likes') {
+ this.videoList = []
+ this.collectVideoQuery.pageNumber = 1
+ this.getAuthorCollectVideoPage()
+ }
},
-
+ // 鑾峰彇浣滆�呯殑鏀惰棌瑙嗛
+ async getAuthorCollectVideoPage() {
+ this.collectVideoQuery.authorId = this.authorId
+ getAuthorCollectVideoPage(this.collectVideoQuery).then(res => {
+ this.collectVideoList = res.data.data
+ })
+ },
// 鎾斁瑙嗛
playVideo(index) {
const videoItem = this.videoList[index];
@@ -208,9 +295,12 @@
</script>
<style lang="scss" scoped>
+body {
+ background-color: #fff !important;
+}
.container {
padding-bottom: 20rpx;
- background-color: #f5f5f5;
+ background-color: white;
min-height: 100vh;
}
@@ -300,7 +390,7 @@
.tab-bar {
display: flex;
background-color: #fff;
- margin-bottom: 20rpx;
+ padding-bottom: 20rpx;
}
.tab-item {
@@ -330,9 +420,10 @@
}
.video-list {
- display: flex;
- flex-wrap: wrap;
+ width: calc(100% - 20rpx);
padding: 0 10rpx;
+ height: calc(100vh - 554rpx);
+ background-color: #fff;
}
.video-item {
@@ -344,7 +435,7 @@
.video-cover {
width: 100%;
- height: 350rpx;
+ height: 500rpx;
border-radius: 10rpx;
display: block;
}
@@ -431,4 +522,9 @@
.user-header {
position: relative;
}
+
+.video-container {
+ display: flex;
+ flex-wrap: wrap
+}
</style>
\ No newline at end of file
--
Gitblit v1.8.0