rating detail

This commit is contained in:
zzc
2026-05-07 17:03:19 +08:00
parent 84ae386223
commit 30c62c1b10
3 changed files with 909 additions and 32 deletions

View File

@@ -9,14 +9,6 @@
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
} }
}, },
{
"path": "pages/rating/index",
"style": {
"navigationBarTitleText": "全民评分",
"navigationStyle": "custom",
"enablePullDownRefresh": true
}
},
{ {
"path": "pages/mine/help", "path": "pages/mine/help",
"style": { "style": {
@@ -71,6 +63,22 @@
"enablePullDownRefresh": false, "enablePullDownRefresh": false,
"navigationStyle": "custom" "navigationStyle": "custom"
} }
},
{
"path": "pages/rating/index",
"style": {
"navigationBarTitleText": "全民评分",
"navigationStyle": "custom",
"enablePullDownRefresh": true
}
},
{
"path": "pages/rating/detail",
"style": {
"navigationBarTitleText": "人物详情",
"navigationStyle": "custom",
"enablePullDownRefresh": true
}
} }
], ],
"globalStyle": { "globalStyle": {

858
pages/rating/detail.vue Normal file
View File

@@ -0,0 +1,858 @@
<template>
<view class="page-container">
<!-- 顶部导航栏 -->
<view class="nav-bar" :style="{ paddingTop: statusBarHeight + 'px' }">
<view class="nav-content">
<view class="nav-left" @tap="goBack">
<text class="back-icon"></text>
<text class="nav-title">全民评分</text>
</view>
<view class="nav-right">
<text class="search-icon"></text>
<image class="nav-avatar" src="/static/images/default-avatar.png" mode="aspectFill" />
</view>
</view>
</view>
<!-- 顶部背景与基础信息 -->
<view class="header-bg">
<image class="bg-image" src="https://images.unsplash.com/photo-1548013146-72479768bada?q=80&w=2076&auto=format&fit=crop" mode="aspectFill" />
<view class="bg-mask"></view>
<view class="header-info" :style="{ paddingTop: statusBarHeight + 60 + 'px' }">
<view class="tags-wrap">
<text class="tag">#千古一帝</text>
<text class="tag">#文治武功</text>
<text class="tag">#历史</text>
</view>
<text class="hero-title">{{ detailData.name }}</text>
<view class="hero-stats">
<text class="rank-badge">🏆 No.1</text>
<text class="stat-text">热度 98.2w</text>
<text class="stat-text">23万人参与</text>
</view>
</view>
</view>
<view class="content-body">
<!-- 核心数据面板 -->
<view class="core-panel">
<view class="score-wrap">
<text class="main-score">{{ detailData.score }}</text>
<view class="trend-wrap">
<text class="trend-icon">📈</text>
<text class="trend-text">本周上涨 1 </text>
</view>
</view>
<view class="rate-stats">
<view class="rate-item">
<text class="rate-label">封神率</text>
<text class="rate-value">78%</text>
</view>
<view class="rate-item dispute">
<text class="rate-label">争议度</text>
<text class="rate-value">21%</text>
</view>
</view>
<view class="feature-tags">
<view class="f-tag"><text>👑 千古一帝</text></view>
<view class="f-tag"><text> 战力爆炸</text></view>
<view class="f-tag"><text>📚 文治巅峰</text></view>
<view class="f-tag"><text>🔥 影响力拉满</text></view>
</view>
</view>
<!-- 你的态度评分散面板 -->
<view class="attitude-panel">
<text class="panel-title">你的态度</text>
<view class="action-group">
<view
class="action-item"
v-for="(action, index) in actions"
:key="index"
:class="{ active: currentAction === action.value }"
@tap="handleAction(action.value)"
>
<text class="emoji">{{ action.emoji }}</text>
<text class="action-name">{{ action.label }}</text>
</view>
</view>
<view class="quick-comment">
<input class="comment-input" type="text" placeholder="说点什么吧..." />
<button class="send-btn">发送</button>
</view>
</view>
<!-- AI 观察员 -->
<view class="ai-observer">
<view class="ai-header">
<text class="ai-icon"></text>
<text class="ai-title">AI观察员</text>
</view>
<text class="ai-content">{{ detailData.aiSummary }}</text>
</view>
<!-- 大家都在 PK -->
<view class="pk-panel">
<view class="pk-header">
<text class="panel-title">大家都在 PK</text>
<view class="go-compare">去对比<text class="arrow-right"></text></view>
</view>
<view class="pk-content">
<view class="pk-person">
<image class="pk-avatar blue-border" :src="detailData.avatar" mode="aspectFill" />
<text class="pk-name">{{ detailData.name }}</text>
</view>
<text class="vs-text">VS</text>
<view class="pk-person">
<image class="pk-avatar yellow-border" src="https://api.dicebear.com/7.x/avataaars/svg?seed=13" mode="aspectFill" />
<text class="pk-name">康熙</text>
</view>
</view>
<view class="pk-bar-wrap">
<view class="pk-bar blue-bar" style="width: 63%;"></view>
<view class="pk-bar yellow-bar" style="width: 37%;"></view>
</view>
<view class="pk-data-text">
<text class="blue-text">63% 支持</text>
<text class="yellow-text">37% 支持</text>
</view>
</view>
<!-- 评论区 -->
<view class="comments-section">
<view class="tabs-header">
<view class="tabs">
<text class="tab active">最热</text>
<text class="tab">最新</text>
</view>
<text class="filter-icon"></text>
</view>
<view class="comment-list">
<view class="comment-item" v-for="comment in comments" :key="comment.id">
<image class="c-avatar" :src="comment.avatar" mode="aspectFill" />
<view class="c-content-wrap">
<view class="c-header">
<view class="c-user-info">
<text class="c-name">{{ comment.name }}</text>
<view class="c-badge" v-if="comment.badge">
<text class="b-icon">{{ comment.badgeIcon }}</text>
<text class="b-text">{{ comment.badge }}</text>
</view>
</view>
<view class="c-like">
<text class="like-icon"></text>
<text class="like-count">{{ comment.likes }}</text>
</view>
</view>
<text class="c-time">{{ comment.time }}</text>
<text class="c-text">{{ comment.content }}</text>
</view>
</view>
</view>
<!-- 加载更多 -->
<view class="load-more">
<text>{{ loading ? '加载中...' : (hasMore ? '上拉加载更多' : '没有更多了') }}</text>
</view>
</view>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue';
import { getStatusBarHeight } from "@/utils/system";
import { onLoad, onPullDownRefresh, onReachBottom } from "@dcloudio/uni-app";
const statusBarHeight = ref(getStatusBarHeight() || 44);
const loading = ref(false);
const hasMore = ref(true);
const currentAction = ref('god');
const goBack = () => {
uni.navigateBack();
};
const detailData = ref({
id: 1,
name: '李世民',
score: '9.8',
avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=11',
aiSummary: '多数用户认为李世民综合能力最强,尤其在文治武功方面优势明显。关于玄武门事件的争议依然存在。'
});
const actions = [
{ label: '离谱', value: 'terrible', emoji: '👎' },
{ label: '一般', value: 'bad', emoji: '😐' },
{ label: '不错', value: 'ok', emoji: '🙂' },
{ label: '很强', value: 'good', emoji: '🔥' },
{ label: '封神', value: 'god', emoji: '👑' }
];
const mockComments = [
{
id: 1,
name: '历史课代表',
avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=u1',
time: '2小时前',
content: '李世民唯一缺点是儿子太抽象。',
likes: '2.3k',
badge: '封神',
badgeIcon: '👑'
},
{
id: 2,
name: '贞观长歌',
avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=u2',
time: '5小时前',
content: '不管怎么说,六边形战士在历史上是真罕见。',
likes: '856',
badge: '很强',
badgeIcon: '🔥'
}
];
const comments = ref([...mockComments]);
const handleAction = (val) => {
currentAction.value = val;
};
onLoad((options) => {
// 可以通过 options.itemId 获取传递过来的参数进行数据请求
console.log('Received itemId:', options.itemId);
});
onPullDownRefresh(() => {
setTimeout(() => {
comments.value = [...mockComments];
hasMore.value = true;
uni.stopPullDownRefresh();
}, 1000);
});
onReachBottom(() => {
if (!hasMore.value || loading.value) return;
loading.value = true;
setTimeout(() => {
const more = mockComments.map(c => ({...c, id: c.id + comments.value.length}));
comments.value.push(...more);
loading.value = false;
if (comments.value.length >= 10) hasMore.value = false;
}, 1000);
});
</script>
<style lang="scss" scoped>
.page-container {
min-height: 100vh;
background-color: #f5f6fa;
padding-bottom: 40rpx;
}
/* 导航栏 */
.nav-bar {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 100;
background-color: transparent;
transition: background-color 0.3s;
}
/* 模拟滚动变色可以后续加,这里先用半透明黑色背景保证字看得清 */
.nav-bar {
background-color: rgba(0, 0, 0, 0.2);
backdrop-filter: blur(10px);
}
.nav-content {
height: 44px;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 32rpx;
}
.nav-left {
display: flex;
align-items: center;
}
.back-icon {
width: 40rpx;
height: 40rpx;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='19' y1='12' x2='5' y2='12'%3E%3C/line%3E%3Cpolyline points='12 19 5 12 12 5'%3E%3C/polyline%3E%3C/svg%3E");
background-size: cover;
margin-right: 16rpx;
}
.nav-title {
font-size: 34rpx;
font-weight: bold;
color: #fff;
}
.nav-right {
display: flex;
align-items: center;
}
.search-icon {
width: 40rpx;
height: 40rpx;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232953ff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");
background-size: cover;
margin-right: 24rpx;
}
.nav-avatar {
width: 52rpx;
height: 52rpx;
border-radius: 8rpx;
background-color: #eee;
}
/* 顶部背景与信息 */
.header-bg {
position: relative;
width: 100%;
height: 560rpx;
}
.bg-image {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
}
.bg-mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(to bottom, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0) 50%, rgba(245,246,250,1) 100%);
}
.header-info {
position: relative;
z-index: 10;
padding: 0 32rpx;
}
.tags-wrap {
display: flex;
gap: 16rpx;
margin-bottom: 24rpx;
}
.tag {
background-color: rgba(255,255,255,0.3);
color: #fff;
font-size: 22rpx;
padding: 6rpx 20rpx;
border-radius: 100rpx;
backdrop-filter: blur(4px);
}
.hero-title {
font-size: 64rpx;
font-weight: 900;
color: #fff;
display: block;
margin-bottom: 24rpx;
text-shadow: 0 4rpx 8rpx rgba(0,0,0,0.3);
}
.hero-stats {
display: flex;
align-items: center;
gap: 24rpx;
}
.rank-badge {
color: #ffd700;
font-weight: bold;
font-size: 26rpx;
text-shadow: 0 2rpx 4rpx rgba(0,0,0,0.5);
}
.stat-text {
color: rgba(255,255,255,0.9);
font-size: 24rpx;
text-shadow: 0 2rpx 4rpx rgba(0,0,0,0.5);
}
/* 内容区 */
.content-body {
position: relative;
z-index: 20;
margin-top: -60rpx;
padding: 0 32rpx;
}
/* 核心面板 */
.core-panel {
background-color: #fff;
border-radius: 32rpx;
padding: 40rpx 32rpx;
margin-bottom: 32rpx;
box-shadow: 0 8rpx 32rpx rgba(0,0,0,0.04);
}
.score-wrap {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 32rpx;
}
.main-score {
font-size: 88rpx;
font-weight: 900;
color: #2953ff;
font-family: 'DIN Alternate', sans-serif;
line-height: 1;
margin-bottom: 12rpx;
}
.trend-wrap {
display: flex;
align-items: center;
color: #2953ff;
font-size: 24rpx;
font-weight: bold;
}
.trend-icon {
margin-right: 8rpx;
}
.rate-stats {
display: flex;
justify-content: space-between;
gap: 24rpx;
margin-bottom: 32rpx;
}
.rate-item {
flex: 1;
background-color: #f5f7ff;
border-radius: 20rpx;
padding: 24rpx;
display: flex;
flex-direction: column;
align-items: center;
}
.rate-item.dispute {
background-color: #f8f9fa;
}
.rate-label {
font-size: 24rpx;
color: #666;
margin-bottom: 8rpx;
}
.rate-value {
font-size: 40rpx;
font-weight: 800;
color: #111;
}
.feature-tags {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 16rpx;
}
.f-tag {
background-color: #fff;
border: 2rpx solid #eef1ff;
padding: 10rpx 24rpx;
border-radius: 100rpx;
font-size: 24rpx;
color: #444;
font-weight: bold;
box-shadow: 0 4rpx 12rpx rgba(41,83,255,0.05);
}
/* 你的态度面板 */
.attitude-panel {
background-color: #fff;
border-radius: 32rpx;
padding: 32rpx;
margin-bottom: 32rpx;
}
.panel-title {
font-size: 34rpx;
font-weight: bold;
color: #111;
margin-bottom: 32rpx;
display: block;
}
.action-group {
display: flex;
justify-content: space-between;
margin-bottom: 32rpx;
}
.action-item {
display: flex;
flex-direction: column;
align-items: center;
transition: transform 0.2s;
}
.emoji {
font-size: 56rpx;
margin-bottom: 12rpx;
filter: grayscale(100%);
opacity: 0.6;
}
.action-name {
font-size: 24rpx;
color: #999;
}
.action-item.active .emoji {
filter: grayscale(0%);
opacity: 1;
transform: scale(1.2);
}
.action-item.active .action-name {
color: #2953ff;
font-weight: bold;
}
.quick-comment {
display: flex;
align-items: center;
background-color: #f0f2f7;
border-radius: 100rpx;
padding: 8rpx 8rpx 8rpx 32rpx;
}
.comment-input {
flex: 1;
height: 72rpx;
font-size: 28rpx;
}
.send-btn {
background-color: #4d44f1;
color: #fff;
font-size: 26rpx;
border-radius: 100rpx;
padding: 0 40rpx;
height: 64rpx;
line-height: 64rpx;
margin: 0;
}
.send-btn::after {
border: none;
}
/* AI 观察员 */
.ai-observer {
background: #ffffff;
border: 2rpx solid #e0d6ff;
border-radius: 32rpx;
padding: 32rpx;
margin-bottom: 32rpx;
position: relative;
overflow: hidden;
}
.ai-observer::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: linear-gradient(135deg, rgba(77,68,241,0.05) 0%, rgba(255,255,255,0) 100%);
z-index: 0;
}
.ai-header {
display: flex;
align-items: center;
margin-bottom: 16rpx;
position: relative;
z-index: 1;
}
.ai-icon {
width: 36rpx;
height: 36rpx;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%237B46F1'%3E%3Cpath d='M12 2a2 2 0 0 1 2 2c0 .74-.4 1.39-1 1.73V7h5a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h5V5.73A2 2 0 0 1 10 4a2 2 0 0 1 2-2zm-3 8a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3zm6 0a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3z'/%3E%3C/svg%3E");
background-size: cover;
margin-right: 12rpx;
}
.ai-title {
font-size: 28rpx;
font-weight: 800;
color: #7b46f1;
}
.ai-content {
font-size: 28rpx;
color: #333;
line-height: 1.6;
position: relative;
z-index: 1;
}
/* 大家都在 PK */
.pk-panel {
background-color: #fff;
border-radius: 32rpx;
padding: 32rpx;
margin-bottom: 32rpx;
}
.pk-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 32rpx;
}
.pk-header .panel-title {
margin-bottom: 0;
}
.go-compare {
font-size: 24rpx;
color: #2953ff;
display: flex;
align-items: center;
}
.arrow-right {
width: 24rpx;
height: 24rpx;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232953ff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E");
background-size: cover;
}
.pk-content {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24rpx;
padding: 0 40rpx;
}
.pk-person {
display: flex;
flex-direction: column;
align-items: center;
}
.pk-avatar {
width: 110rpx;
height: 110rpx;
border-radius: 50%;
border: 4rpx solid transparent;
margin-bottom: 12rpx;
}
.blue-border { border-color: #2953ff; }
.yellow-border { border-color: #ffc107; }
.pk-name {
font-size: 28rpx;
font-weight: bold;
color: #333;
}
.vs-text {
font-size: 40rpx;
font-weight: 900;
color: #d1d5db;
font-style: italic;
}
.pk-bar-wrap {
height: 16rpx;
border-radius: 100rpx;
display: flex;
overflow: hidden;
margin-bottom: 16rpx;
}
.pk-bar { height: 100%; }
.blue-bar { background-color: #2953ff; }
.yellow-bar { background-color: #ffc107; }
.pk-data-text {
display: flex;
justify-content: space-between;
font-size: 24rpx;
font-weight: bold;
}
.blue-text { color: #2953ff; }
.yellow-text { color: #d9a000; }
/* 评论区 */
.comments-section {
background-color: #fff;
border-radius: 32rpx;
padding: 32rpx;
}
.tabs-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 32rpx;
border-bottom: 2rpx solid #f0f0f0;
padding-bottom: 16rpx;
}
.tabs {
display: flex;
gap: 32rpx;
}
.tab {
font-size: 32rpx;
color: #666;
font-weight: bold;
position: relative;
padding-bottom: 16rpx;
}
.tab.active {
color: #111;
font-size: 36rpx;
}
.tab.active::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 40rpx;
height: 6rpx;
background-color: #111;
border-radius: 4rpx;
}
.filter-icon {
width: 36rpx;
height: 36rpx;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23333' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='4' y1='21' x2='4' y2='14'%3E%3C/line%3E%3Cline x1='4' y1='10' x2='4' y2='3'%3E%3C/line%3E%3Cline x1='12' y1='21' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='8' x2='12' y2='3'%3E%3C/line%3E%3Cline x1='20' y1='21' x2='20' y2='16'%3E%3C/line%3E%3Cline x1='20' y1='12' x2='20' y2='3'%3E%3C/line%3E%3Cline x1='1' y1='14' x2='7' y2='14'%3E%3C/line%3E%3Cline x1='9' y1='8' x2='15' y2='8'%3E%3C/line%3E%3Cline x1='17' y1='16' x2='23' y2='16'%3E%3C/line%3E%3C/svg%3E");
background-size: cover;
}
.comment-list {
display: flex;
flex-direction: column;
}
.comment-item {
display: flex;
padding: 32rpx 0;
border-bottom: 2rpx solid #f5f5f5;
}
.comment-item:last-child {
border-bottom: none;
}
.c-avatar {
width: 72rpx;
height: 72rpx;
border-radius: 50%;
margin-right: 24rpx;
background-color: #eee;
flex-shrink: 0;
}
.c-content-wrap {
flex: 1;
}
.c-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 8rpx;
}
.c-user-info {
display: flex;
align-items: center;
}
.c-name {
font-size: 28rpx;
font-weight: bold;
color: #333;
margin-right: 16rpx;
}
.c-badge {
display: flex;
align-items: center;
background-color: #f5f6fa;
padding: 2rpx 12rpx;
border-radius: 8rpx;
}
.b-icon { font-size: 20rpx; margin-right: 4rpx; }
.b-text { font-size: 20rpx; color: #666; font-weight: bold; }
.c-like {
display: flex;
align-items: center;
color: #666;
font-size: 24rpx;
}
.like-icon {
width: 28rpx;
height: 28rpx;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3'%3E%3C/path%3E%3C/svg%3E");
background-size: cover;
margin-right: 8rpx;
}
.c-time {
font-size: 24rpx;
color: #999;
display: block;
margin-bottom: 16rpx;
}
.c-text {
font-size: 30rpx;
color: #222;
line-height: 1.6;
}
.load-more {
text-align: center;
padding: 40rpx 0 20rpx;
color: #999;
font-size: 24rpx;
}
</style>

View File

@@ -75,7 +75,12 @@
<!-- 评分项列表 --> <!-- 评分项列表 -->
<view class="rating-list"> <view class="rating-list">
<view class="rating-card" v-for="(item, index) in ratingItems" :key="item.id"> <view
class="rating-card"
v-for="(item, index) in ratingItems"
:key="item.id"
@tap="goToDetail(item.id)"
>
<view class="card-header"> <view class="card-header">
<image class="item-avatar" :src="item.avatar" mode="aspectFill" /> <image class="item-avatar" :src="item.avatar" mode="aspectFill" />
<text class="item-name">{{ item.name }}</text> <text class="item-name">{{ item.name }}</text>
@@ -92,7 +97,7 @@
v-for="(action, aIndex) in actions" v-for="(action, aIndex) in actions"
:key="aIndex" :key="aIndex"
:class="{ active: item.userAction === action.value }" :class="{ active: item.userAction === action.value }"
@tap="handleAction(item, action.value)" @tap.stop="handleAction(item, action.value)"
> >
<view class="action-icon-wrap" :class="'icon-' + action.value"> <view class="action-icon-wrap" :class="'icon-' + action.value">
<text class="emoji">{{ action.emoji }}</text> <text class="emoji">{{ action.emoji }}</text>
@@ -222,6 +227,12 @@ const handleAction = (item, actionValue) => {
item.userAction = item.userAction === actionValue ? '' : actionValue; item.userAction = item.userAction === actionValue ? '' : actionValue;
}; };
const goToDetail = (itemId) => {
uni.navigateTo({
url: `/pages/rating/detail?itemId=${itemId}`
});
};
// 下拉刷新 // 下拉刷新
onPullDownRefresh(() => { onPullDownRefresh(() => {
setTimeout(() => { setTimeout(() => {