18 changed files with 2295 additions and 4 deletions
-
5app.json
-
8pages/home/home.js
-
2pages/home/home.wxml
-
4pages/login/login.js
-
BINpagesA/images/ch.png
-
BINpagesA/images/jh.png
-
104pagesA/pages/askingSy/askingSy.js
-
4pagesA/pages/askingSy/askingSy.json
-
87pagesA/pages/askingSy/askingSy.wxml
-
415pagesA/pages/askingSy/askingSy.wxss
-
148pagesA/pages/askingSyAdd/askingSyAdd.js
-
4pagesA/pages/askingSyAdd/askingSyAdd.json
-
163pagesA/pages/askingSyAdd/askingSyAdd.wxml
-
350pagesA/pages/askingSyAdd/askingSyAdd.wxss
-
198pagesA/pages/askingSyDetails/askingSyDetails.js
-
4pagesA/pages/askingSyDetails/askingSyDetails.json
-
160pagesA/pages/askingSyDetails/askingSyDetails.wxml
-
643pagesA/pages/askingSyDetails/askingSyDetails.wxss
|
After Width: 200 | Height: 200 | Size: 2.4 KiB |
|
After Width: 200 | Height: 200 | Size: 1.7 KiB |
@ -0,0 +1,104 @@ |
|||||
|
Page({ |
||||
|
data: { |
||||
|
diagnosisList: [ |
||||
|
{ |
||||
|
id: 1, |
||||
|
status: 'replied', |
||||
|
createdAt:'2025-02-12', |
||||
|
userInfo: { |
||||
|
avatar: '/pages/images/tx.png', |
||||
|
nickName: '张小明' |
||||
|
}, |
||||
|
petInfo: { |
||||
|
type: '狗', |
||||
|
age: 3, |
||||
|
gender: '公' |
||||
|
}, |
||||
|
description: '最近三天食欲不振,精神萎靡,偶尔呕吐黄色泡沫,大便偏软带血丝,体温正常但鼻头干燥。', |
||||
|
images: ['/images/pet1.jpg', '/images/pet2.jpg'], |
||||
|
replies: [{}, {}, {}] |
||||
|
}, |
||||
|
{ |
||||
|
id: 2, |
||||
|
status: 'pending', |
||||
|
createdAt: '2025-02-12', |
||||
|
userInfo: { |
||||
|
avatar: '/pages/images/tx.png', |
||||
|
nickName: '李小花' |
||||
|
}, |
||||
|
petInfo: { |
||||
|
type: '猫', |
||||
|
age: 2, |
||||
|
gender: '母' |
||||
|
}, |
||||
|
description: '今天发现眼睛有黄色分泌物,频繁抓挠眼睛周围,食欲正常但饮水量减少。', |
||||
|
images: ['/images/cat1.jpg'], |
||||
|
replies: [] |
||||
|
}, |
||||
|
{ |
||||
|
id: 3, |
||||
|
status: 'replied', |
||||
|
createdAt: '2025-02-12', |
||||
|
userInfo: { |
||||
|
avatar: '/pages/images/tx.png', |
||||
|
nickName: '王先生' |
||||
|
}, |
||||
|
petInfo: { |
||||
|
type: '狗', |
||||
|
age: 5, |
||||
|
gender: '公' |
||||
|
}, |
||||
|
description: '狗狗最近走路跛脚,右前腿不敢着地,触摸时会叫。之前从沙发上跳下来可能受伤了。', |
||||
|
images: [], |
||||
|
replies: [{}, {}] |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
|
||||
|
onLoad: function() { |
||||
|
// 页面加载
|
||||
|
}, |
||||
|
|
||||
|
// 格式化日期显示
|
||||
|
formatDate: function(dateString) { |
||||
|
const date = new Date(dateString); |
||||
|
const now = new Date(); |
||||
|
const diff = now - date; |
||||
|
const diffDays = Math.floor(diff / (1000 * 60 * 60 * 24)); |
||||
|
const diffHours = Math.floor(diff / (1000 * 60 * 60)); |
||||
|
const diffMinutes = Math.floor(diff / (1000 * 60)); |
||||
|
|
||||
|
if (diffMinutes < 60) { |
||||
|
return `${diffMinutes}分钟前`; |
||||
|
} else if (diffHours < 24) { |
||||
|
return `${diffHours}小时前`; |
||||
|
} else if (diffDays === 1) { |
||||
|
return '昨天'; |
||||
|
} else if (diffDays === 2) { |
||||
|
return '前天'; |
||||
|
} else if (diffDays < 7) { |
||||
|
return `${diffDays}天前`; |
||||
|
} else { |
||||
|
const month = date.getMonth() + 1; |
||||
|
const day = date.getDate(); |
||||
|
return `${month}月${day}日`; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 显示创建问诊单
|
||||
|
showCreateModal: function() { |
||||
|
wx.navigateTo({ |
||||
|
url: '/pagesA/pages/askingSyAdd/askingSyAdd', |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 查看详情
|
||||
|
viewDetail: function(e) { |
||||
|
const index = e.currentTarget.dataset.index; |
||||
|
const item = this.data.diagnosisList[index]; |
||||
|
wx.navigateTo({ |
||||
|
url: `/pagesA/pages/askingSyDetails/askingSyDetails`, |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
}); |
||||
@ -0,0 +1,4 @@ |
|||||
|
{ |
||||
|
"navigationBarTitleText":"问兽医", |
||||
|
"usingComponents": {} |
||||
|
} |
||||
@ -0,0 +1,87 @@ |
|||||
|
<view class="wzbox"> |
||||
|
<!-- 顶部标题栏 --> |
||||
|
<view class="header"> |
||||
|
<view class="header-content"> |
||||
|
<view class="title-section"> |
||||
|
<text class="title">问诊</text> |
||||
|
<text class="subtitle">专业兽医在线解答</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="header-decoration"> |
||||
|
<view class="decoration-circle circle-1"></view> |
||||
|
<view class="decoration-circle circle-2"></view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 问诊记录列表 --> |
||||
|
<scroll-view class="record-list" scroll-y enable-back-to-top> |
||||
|
<!-- 空状态 --> |
||||
|
<view wx:if="{{diagnosisList.length === 0}}" class="empty-state"> |
||||
|
<image class="empty-icon" src="/images/empty-icon.png"></image> |
||||
|
<text class="empty-text">暂无问诊记录</text> |
||||
|
<text class="empty-tip">开始您的第一次问诊吧</text> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 问诊记录卡片 --> |
||||
|
<view wx:else class="records-container"> |
||||
|
<view class="section-header"> |
||||
|
<text class="section-title">问诊记录</text> |
||||
|
<text class="section-count">{{diagnosisList.length}}条</text> |
||||
|
</view> |
||||
|
|
||||
|
<view wx:for="{{diagnosisList}}" wx:key="id" class="record-card" bindtap="viewDetail" data-index="{{index}}"> |
||||
|
<!-- 卡片头部:用户信息 + 状态 --> |
||||
|
<view class="card-header"> |
||||
|
<view class="user-info"> |
||||
|
<image class="user-avatar" src="{{item.userInfo.avatar || '/icons/default-avatar.svg'}}"></image> |
||||
|
<view class="user-details"> |
||||
|
<text class="user-name">{{item.userInfo.nickName || '用户'}}</text> |
||||
|
<text class="pet-info">{{item.petInfo.type}},{{item.petInfo.age}}岁,{{item.petInfo.gender}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="status-tag {{item.status === 'replied' ? 'status-replied' : 'status-pending'}}"> |
||||
|
{{item.status === 'replied' ? '已回复' : '待回复'}} |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 症状描述 --> |
||||
|
<view class="symptom-section"> |
||||
|
<view class="section-title-row"> |
||||
|
<text class="section-title-text">症状描述</text> |
||||
|
</view> |
||||
|
<view class="symptom-content"> |
||||
|
<text class="symptom-text">{{item.description}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 卡片底部 --> |
||||
|
<view class="card-footer"> |
||||
|
<view class="footer-left"> |
||||
|
<view class="time-info"> |
||||
|
<text class="time-text">{{item.createdAt}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="footer-right"> |
||||
|
<view class="reply-info"> |
||||
|
<text class="reply-count">{{item.replies.length}}条回复</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 列表底部提示 --> |
||||
|
<view wx:if="{{diagnosisList.length > 0}}" class="list-footer"> |
||||
|
<text class="footer-text">已显示全部记录</text> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
|
||||
|
<!-- 新增问诊按钮 --> |
||||
|
<view class="create-btn-container"> |
||||
|
<view class="create-btn" bindtap="showCreateModal"> |
||||
|
<image class="btn-icon" src="/pagesA/images/jh.png"></image> |
||||
|
<text class="btn-text">问诊单</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
@ -0,0 +1,415 @@ |
|||||
|
/* 全局样式 */ |
||||
|
.wzbox{ |
||||
|
min-height: 100vh; |
||||
|
position: relative; |
||||
|
background: linear-gradient(180deg, #F8FBFF 0%, #F0F7FF 100%); |
||||
|
} |
||||
|
|
||||
|
/* 头部样式优化 */ |
||||
|
.header { |
||||
|
padding: 20rpx 40rpx 20rpx; |
||||
|
background: linear-gradient(135deg, #6D9EFF 0%, #4A7CFF 100%); |
||||
|
border-radius: 0 0 36rpx 36rpx; |
||||
|
box-shadow: 0 4rpx 20rpx rgba(74, 144, 226, 0.15); |
||||
|
position: relative; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.header-content { |
||||
|
position: relative; |
||||
|
z-index: 2; |
||||
|
} |
||||
|
|
||||
|
.title-section { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
gap: 8rpx; |
||||
|
} |
||||
|
|
||||
|
.title { |
||||
|
font-size: 44rpx; |
||||
|
font-weight: 700; |
||||
|
color: #FFFFFF; |
||||
|
letter-spacing: 0.5rpx; |
||||
|
text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
.subtitle { |
||||
|
font-size: 28rpx; |
||||
|
color: rgba(255, 255, 255, 0.9); |
||||
|
font-weight: 400; |
||||
|
} |
||||
|
|
||||
|
/* 头部装饰元素 */ |
||||
|
.header-decoration { |
||||
|
position: absolute; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
overflow: hidden; |
||||
|
z-index: 1; |
||||
|
} |
||||
|
|
||||
|
.decoration-circle { |
||||
|
position: absolute; |
||||
|
border-radius: 50%; |
||||
|
background: rgba(255, 255, 255, 0.08); |
||||
|
} |
||||
|
|
||||
|
.circle-1 { |
||||
|
width: 200rpx; |
||||
|
height: 200rpx; |
||||
|
top: -80rpx; |
||||
|
right: -40rpx; |
||||
|
} |
||||
|
|
||||
|
.circle-2 { |
||||
|
width: 120rpx; |
||||
|
height: 120rpx; |
||||
|
bottom: -40rpx; |
||||
|
left: -20rpx; |
||||
|
} |
||||
|
|
||||
|
/* 问诊记录列表 */ |
||||
|
.record-list { |
||||
|
height: calc(100vh - 200rpx); |
||||
|
padding: 0 32rpx 20rpx; |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
|
||||
|
.records-container { |
||||
|
padding-top: 24rpx; |
||||
|
} |
||||
|
|
||||
|
/* 列表头部 */ |
||||
|
.section-header { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
margin-bottom: 24rpx; |
||||
|
padding: 0 4rpx; |
||||
|
} |
||||
|
|
||||
|
.section-title { |
||||
|
font-size: 32rpx; |
||||
|
font-weight: 700; |
||||
|
color: #1A1A1A; |
||||
|
position: relative; |
||||
|
padding-left: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.section-title::before { |
||||
|
content: ''; |
||||
|
position: absolute; |
||||
|
left: 0; |
||||
|
top: 50%; |
||||
|
transform: translateY(-50%); |
||||
|
width: 3rpx; |
||||
|
height: 20rpx; |
||||
|
background: linear-gradient(180deg, #6D9EFF 0%, #4A7CFF 100%); |
||||
|
border-radius: 2rpx; |
||||
|
} |
||||
|
|
||||
|
.section-count { |
||||
|
font-size: 26rpx; |
||||
|
color: #666; |
||||
|
background: #F0F7FF; |
||||
|
padding: 6rpx 16rpx; |
||||
|
border-radius: 16rpx; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
/* 问诊记录卡片 */ |
||||
|
.record-card { |
||||
|
background: #FFFFFF; |
||||
|
border-radius: 24rpx; |
||||
|
margin-bottom: 24rpx; |
||||
|
box-shadow: 0 6rpx 24rpx rgba(74, 144, 226, 0.08); |
||||
|
position: relative; |
||||
|
overflow: hidden; |
||||
|
transition: all 0.3s cubic-bezier(0.2, 0, 0.2, 1); |
||||
|
border: 1rpx solid #F0F7FF; |
||||
|
} |
||||
|
|
||||
|
.record-card:active { |
||||
|
transform: translateY(-2rpx); |
||||
|
box-shadow: 0 10rpx 30rpx rgba(74, 144, 226, 0.15); |
||||
|
} |
||||
|
|
||||
|
/* 卡片头部 */ |
||||
|
.card-header { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: flex-start; |
||||
|
padding: 28rpx 28rpx 24rpx; |
||||
|
border-bottom: 1rpx solid #F5F9FF; |
||||
|
} |
||||
|
|
||||
|
.user-info { |
||||
|
display: flex; |
||||
|
align-items: flex-start; |
||||
|
gap: 16rpx; |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.user-avatar { |
||||
|
width: 60rpx; |
||||
|
height: 60rpx; |
||||
|
border-radius: 50%; |
||||
|
border: 2rpx solid rgba(255, 255, 255, 0.8); |
||||
|
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.08); |
||||
|
} |
||||
|
|
||||
|
.user-details { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
gap: 6rpx; |
||||
|
} |
||||
|
|
||||
|
.user-name { |
||||
|
font-size: 28rpx; |
||||
|
color: #1A1A1A; |
||||
|
font-weight: 600; |
||||
|
line-height: 1.2; |
||||
|
} |
||||
|
|
||||
|
.pet-info { |
||||
|
font-size: 24rpx; |
||||
|
color: #666; |
||||
|
font-weight: 400; |
||||
|
line-height: 1.2; |
||||
|
} |
||||
|
|
||||
|
/* 状态标签 - 移至右上角 */ |
||||
|
.status-tag { |
||||
|
padding: 8rpx 20rpx; |
||||
|
border-radius: 20rpx; |
||||
|
font-size: 22rpx; |
||||
|
font-weight: 600; |
||||
|
min-width: 80rpx; |
||||
|
text-align: center; |
||||
|
flex-shrink: 0; |
||||
|
margin-left: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.status-replied { |
||||
|
background: linear-gradient(135deg, rgba(76, 217, 100, 0.12) 0%, rgba(46, 204, 113, 0.12) 100%); |
||||
|
color: #2ECC71; |
||||
|
border: 1rpx solid rgba(46, 204, 113, 0.2); |
||||
|
} |
||||
|
|
||||
|
.status-pending { |
||||
|
background: linear-gradient(135deg, rgba(255, 149, 0, 0.12) 0%, rgba(255, 127, 0, 0.12) 100%); |
||||
|
color: #FF9500; |
||||
|
border: 1rpx solid rgba(255, 149, 0, 0.2); |
||||
|
} |
||||
|
|
||||
|
/* 症状描述 */ |
||||
|
.symptom-section { |
||||
|
padding: 24rpx 28rpx; |
||||
|
border-bottom: 1rpx solid #F5F9FF; |
||||
|
} |
||||
|
|
||||
|
.section-title-row { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 12rpx; |
||||
|
margin-bottom: 16rpx; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.section-title-text { |
||||
|
font-size: 28rpx; |
||||
|
font-weight: 600; |
||||
|
color: #1A1A1A; |
||||
|
} |
||||
|
|
||||
|
.symptom-content { |
||||
|
display: flex; |
||||
|
align-items: flex-start; |
||||
|
gap: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.symptom-text { |
||||
|
flex: 1; |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
line-height: 1.6; |
||||
|
font-weight: 400; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/* 卡片底部 */ |
||||
|
.card-footer { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
padding: 20rpx 28rpx; |
||||
|
} |
||||
|
|
||||
|
.time-info { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 8rpx; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.time-text { |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
font-weight: 400; |
||||
|
} |
||||
|
|
||||
|
.reply-info { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 8rpx; |
||||
|
padding: 8rpx 16rpx; |
||||
|
background: #F0F7FF; |
||||
|
border-radius: 16rpx; |
||||
|
border: 1rpx solid #E5EFFF; |
||||
|
} |
||||
|
|
||||
|
.reply-count { |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 500; |
||||
|
color: #4A7CFF; |
||||
|
} |
||||
|
|
||||
|
/* 空状态优化 */ |
||||
|
.empty-state { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
padding-top: 120rpx; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.empty-icon { |
||||
|
width: 240rpx; |
||||
|
height: 180rpx; |
||||
|
margin-bottom: 32rpx; |
||||
|
opacity: 0.5; |
||||
|
} |
||||
|
|
||||
|
.empty-text { |
||||
|
font-size: 32rpx; |
||||
|
color: #666; |
||||
|
margin-bottom: 12rpx; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
|
||||
|
.empty-tip { |
||||
|
font-size: 26rpx; |
||||
|
color: #999; |
||||
|
margin-bottom: 40rpx; |
||||
|
line-height: 1.4; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* 列表底部 */ |
||||
|
.list-footer { |
||||
|
text-align: center; |
||||
|
padding: 40rpx 0; |
||||
|
color: #999; |
||||
|
font-size: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.footer-text { |
||||
|
opacity: 0.6; |
||||
|
letter-spacing: 1rpx; |
||||
|
} |
||||
|
|
||||
|
/* 新建问诊按钮优化 */ |
||||
|
.create-btn-container { |
||||
|
position: fixed; |
||||
|
bottom: 40rpx; |
||||
|
right: 32rpx; |
||||
|
z-index: 100; |
||||
|
} |
||||
|
|
||||
|
.create-btn { |
||||
|
width: 140rpx; |
||||
|
height: 140rpx; |
||||
|
background: linear-gradient(135deg, #6D9EFF 0%, #4A7CFF 100%); |
||||
|
border-radius: 50%; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
box-shadow: 0 8rpx 32rpx rgba(74, 144, 226, 0.3); |
||||
|
transition: all 0.3s cubic-bezier(0.2, 0, 0.2, 1); |
||||
|
position: relative; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.create-btn::after { |
||||
|
content: ''; |
||||
|
position: absolute; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
background: rgba(255, 255, 255, 0.1); |
||||
|
opacity: 0; |
||||
|
transition: opacity 0.2s ease; |
||||
|
} |
||||
|
|
||||
|
.create-btn:active { |
||||
|
transform: scale(0.95); |
||||
|
box-shadow: 0 4rpx 20rpx rgba(74, 144, 226, 0.4); |
||||
|
} |
||||
|
|
||||
|
.create-btn:active::after { |
||||
|
opacity: 1; |
||||
|
} |
||||
|
|
||||
|
.btn-icon { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
margin-bottom: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.btn-text { |
||||
|
font-size: 26rpx; |
||||
|
color: white; |
||||
|
font-weight: 600; |
||||
|
letter-spacing: 0.5rpx; |
||||
|
} |
||||
|
|
||||
|
/* 卡片入场动画 */ |
||||
|
@keyframes cardSlideIn { |
||||
|
from { |
||||
|
opacity: 0; |
||||
|
transform: translateY(30rpx); |
||||
|
} |
||||
|
to { |
||||
|
opacity: 1; |
||||
|
transform: translateY(0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.record-card { |
||||
|
animation: cardSlideIn 0.4s ease-out forwards; |
||||
|
opacity: 0; |
||||
|
} |
||||
|
|
||||
|
.record-card:nth-child(1) { animation-delay: 0.1s; } |
||||
|
.record-card:nth-child(2) { animation-delay: 0.15s; } |
||||
|
.record-card:nth-child(3) { animation-delay: 0.2s; } |
||||
|
.record-card:nth-child(4) { animation-delay: 0.25s; } |
||||
|
.record-card:nth-child(5) { animation-delay: 0.3s; } |
||||
|
|
||||
|
/* 响应式适配 */ |
||||
|
@media screen and (min-width: 768px) { |
||||
|
.record-card { |
||||
|
max-width: 600rpx; |
||||
|
margin-left: auto; |
||||
|
margin-right: auto; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,148 @@ |
|||||
|
Page({ |
||||
|
/** |
||||
|
* 页面的初始数据 |
||||
|
*/ |
||||
|
data: { |
||||
|
formData: { |
||||
|
petType: '', |
||||
|
petAge: '', |
||||
|
petGender: '', |
||||
|
symptoms: '', |
||||
|
images: [] |
||||
|
}, |
||||
|
symptomsLength: 0, |
||||
|
isSubmitting: false, |
||||
|
isFormValid: false |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面加载 |
||||
|
*/ |
||||
|
onLoad(options) { |
||||
|
// 初始化表单验证
|
||||
|
this.checkFormValidity(); |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
// 宠物类型输入
|
||||
|
onPetTypeInput(e) { |
||||
|
const value = e.detail.value; |
||||
|
this.setData({ |
||||
|
'formData.petType': value |
||||
|
}, () => { |
||||
|
this.checkFormValidity(); |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 宠物年龄输入
|
||||
|
onPetAgeInput(e) { |
||||
|
const value = e.detail.value; |
||||
|
this.setData({ |
||||
|
'formData.petAge': value |
||||
|
}, () => { |
||||
|
this.checkFormValidity(); |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 选择性别
|
||||
|
selectGender(e) { |
||||
|
const value = e.currentTarget.dataset.value; |
||||
|
this.setData({ |
||||
|
'formData.petGender': value |
||||
|
}, () => { |
||||
|
this.checkFormValidity(); |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 症状描述输入
|
||||
|
onSymptomsInput(e) { |
||||
|
const value = e.detail.value; |
||||
|
this.setData({ |
||||
|
'formData.symptoms': value, |
||||
|
symptomsLength: value.length |
||||
|
}, () => { |
||||
|
this.checkFormValidity(); |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 选择图片
|
||||
|
chooseImage() { |
||||
|
if (this.data.formData.images.length >= 3) { |
||||
|
wx.showToast({ |
||||
|
title: '最多上传3张图片', |
||||
|
icon: 'none' |
||||
|
}); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
wx.chooseImage({ |
||||
|
count: 3 - this.data.formData.images.length, |
||||
|
sizeType: ['compressed'], |
||||
|
sourceType: ['album', 'camera'], |
||||
|
success: (res) => { |
||||
|
const tempFilePaths = res.tempFilePaths; |
||||
|
const images = [...this.data.formData.images, ...tempFilePaths]; |
||||
|
this.setData({ |
||||
|
'formData.images': images |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 移除图片
|
||||
|
removeImage(e) { |
||||
|
const index = e.currentTarget.dataset.index; |
||||
|
const images = [...this.data.formData.images]; |
||||
|
images.splice(index, 1); |
||||
|
this.setData({ |
||||
|
'formData.images': images |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 预览图片
|
||||
|
previewImage(e) { |
||||
|
const current = e.currentTarget.dataset.url; |
||||
|
const urls = e.currentTarget.dataset.urls; |
||||
|
|
||||
|
wx.previewImage({ |
||||
|
current, |
||||
|
urls |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 检查表单有效性
|
||||
|
checkFormValidity() { |
||||
|
const { petType, petAge, petGender, symptoms } = this.data.formData; |
||||
|
const isValid = petType.trim() && petAge && petGender && symptoms.trim(); |
||||
|
this.setData({ |
||||
|
isFormValid: !!isValid |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 表单提交
|
||||
|
submitForm(e) { |
||||
|
if (this.data.isSubmitting || !this.data.isFormValid) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
this.setData({ |
||||
|
isSubmitting: true |
||||
|
}); |
||||
|
|
||||
|
// 模拟提交
|
||||
|
setTimeout(() => { |
||||
|
wx.showToast({ |
||||
|
title: '提交成功', |
||||
|
icon: 'success', |
||||
|
duration: 1500, |
||||
|
success: () => { |
||||
|
setTimeout(() => { |
||||
|
wx.navigateTo({ |
||||
|
url: '/pagesA/pages/askingSy/askingSy', |
||||
|
}) |
||||
|
}, 1500); |
||||
|
} |
||||
|
}); |
||||
|
}, 1500); |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1,4 @@ |
|||||
|
{ |
||||
|
"navigationBarTitleText":"问诊单", |
||||
|
"usingComponents": {} |
||||
|
} |
||||
@ -0,0 +1,163 @@ |
|||||
|
<view class="xqbox"> |
||||
|
|
||||
|
<!-- 表单内容 --> |
||||
|
<scroll-view class="page-content" scroll-y> |
||||
|
<form bindsubmit="submitForm"> |
||||
|
|
||||
|
<!-- 宠物类型 --> |
||||
|
<view class="form-section"> |
||||
|
<view class="section-header"> |
||||
|
<view class="section-title"> |
||||
|
<text>牲畜类型</text> |
||||
|
</view> |
||||
|
<text class="section-required">必填</text> |
||||
|
</view> |
||||
|
<input |
||||
|
class="form-input" |
||||
|
name="petType" |
||||
|
placeholder="请输入牲畜品种(如:山羊、奶牛)" |
||||
|
value="{{formData.petType}}" |
||||
|
bindinput="onPetTypeInput" |
||||
|
maxlength="20" |
||||
|
/> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 宠物信息 --> |
||||
|
<view class="form-section"> |
||||
|
<view class="section-header"> |
||||
|
<view class="section-title"> |
||||
|
<text>宠物信息</text> |
||||
|
</view> |
||||
|
<text class="section-required">必填</text> |
||||
|
</view> |
||||
|
|
||||
|
<view class="info-grid"> |
||||
|
<!-- 年龄 --> |
||||
|
<view class="info-item"> |
||||
|
<view class="item-label"> |
||||
|
<text>年龄</text> |
||||
|
</view> |
||||
|
<view class="item-input-wrapper"> |
||||
|
<input |
||||
|
class="item-input" |
||||
|
name="petAge" |
||||
|
type="digit" |
||||
|
placeholder="0" |
||||
|
value="{{formData.petAge}}" |
||||
|
bindinput="onPetAgeInput" |
||||
|
/> |
||||
|
<text class="input-unit">岁</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 性别 --> |
||||
|
<view class="info-item"> |
||||
|
<view class="item-label"> |
||||
|
<text>性别</text> |
||||
|
</view> |
||||
|
<view class="gender-buttons"> |
||||
|
<view |
||||
|
class="gender-btn {{formData.petGender === '公' ? 'active' : ''}}" |
||||
|
data-value="公" |
||||
|
bindtap="selectGender" |
||||
|
> |
||||
|
<text>公</text> |
||||
|
</view> |
||||
|
<view |
||||
|
class="gender-btn {{formData.petGender === '母' ? 'active' : ''}}" |
||||
|
data-value="母" |
||||
|
bindtap="selectGender" |
||||
|
> |
||||
|
<text>母</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 症状描述 --> |
||||
|
<view class="form-section"> |
||||
|
<view class="section-header"> |
||||
|
<view class="section-title"> |
||||
|
<text>症状描述</text> |
||||
|
</view> |
||||
|
<text class="section-required">必填</text> |
||||
|
</view> |
||||
|
<view class="symptom-box"> |
||||
|
<textarea |
||||
|
class="symptom-textarea" |
||||
|
name="symptoms" |
||||
|
placeholder="请详细描述宠物的症状,包括持续时间、频率、具体表现等..." |
||||
|
value="{{formData.symptoms}}" |
||||
|
bindinput="onSymptomsInput" |
||||
|
maxlength="500" |
||||
|
auto-height |
||||
|
/> |
||||
|
<view class="textarea-counter"> |
||||
|
<text>{{symptomsLength}}/500</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 图片上传 --> |
||||
|
<view class="form-section"> |
||||
|
<view class="section-header"> |
||||
|
<view class="section-title"> |
||||
|
|
||||
|
<text>上传图片</text> |
||||
|
</view> |
||||
|
<text class="section-optional">可选</text> |
||||
|
</view> |
||||
|
|
||||
|
<view class="upload-tips"> |
||||
|
<text>最多可上传3张图片,用于帮助医生更直观了解病情</text> |
||||
|
</view> |
||||
|
|
||||
|
<view class="image-upload-grid"> |
||||
|
<!-- 已上传图片 --> |
||||
|
<block wx:for="{{formData.images}}" wx:key="*this"> |
||||
|
<view class="image-preview"> |
||||
|
<image |
||||
|
class="preview-image" |
||||
|
src="{{item}}" |
||||
|
mode="aspectFill" |
||||
|
bindtap="previewImage" |
||||
|
data-url="{{item}}" |
||||
|
data-urls="{{formData.images}}" |
||||
|
></image> |
||||
|
<view class="remove-overlay" data-index="{{index}}" bindtap="removeImage"> |
||||
|
<image class="remove-icon" src="/pagesA/images/ch.png"></image> |
||||
|
</view> |
||||
|
</view> |
||||
|
</block> |
||||
|
|
||||
|
<!-- 上传按钮 --> |
||||
|
<view |
||||
|
class="upload-btn" |
||||
|
wx:if="{{formData.images.length < 3}}" |
||||
|
bindtap="chooseImage" |
||||
|
> |
||||
|
<view class="upload-icon-wrapper"> |
||||
|
<image class="upload-icon" src="/pagesA/images/jh.png"></image> |
||||
|
</view> |
||||
|
<text class="upload-text">上传图片</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 提交按钮 --> |
||||
|
<view class="submit-section"> |
||||
|
<button |
||||
|
class="submit-btn" |
||||
|
type="primary" |
||||
|
formType="submit" |
||||
|
loading="{{isSubmitting}}" |
||||
|
disabled="{{isSubmitting || !isFormValid}}" |
||||
|
> |
||||
|
{{isSubmitting ? '提交中...' : '提交问诊单'}} |
||||
|
</button> |
||||
|
</view> |
||||
|
|
||||
|
</form> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
@ -0,0 +1,350 @@ |
|||||
|
.xqbox{ |
||||
|
min-height: 100vh; |
||||
|
background: #F8FBFF; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* 页面内容 */ |
||||
|
.page-content { |
||||
|
height: calc(100vh - 120rpx); |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
|
||||
|
/* 表单区域 */ |
||||
|
.form-section { |
||||
|
background: #FFFFFF; |
||||
|
margin-bottom: 24rpx; |
||||
|
padding: 32rpx; |
||||
|
border-radius: 0; |
||||
|
border-bottom: 1rpx solid #F0F7FF; |
||||
|
} |
||||
|
|
||||
|
.section-header { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
margin-bottom: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.section-title { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 12rpx; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.section-title text { |
||||
|
font-size: 32rpx; |
||||
|
font-weight: 700; |
||||
|
color: #1A1A1A; |
||||
|
} |
||||
|
|
||||
|
.section-required { |
||||
|
font-size: 24rpx; |
||||
|
color: #FF6B6B; |
||||
|
font-weight: 500; |
||||
|
background: rgba(255, 107, 107, 0.1); |
||||
|
padding: 4rpx 12rpx; |
||||
|
border-radius: 12rpx; |
||||
|
} |
||||
|
|
||||
|
.section-optional { |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
font-weight: 400; |
||||
|
} |
||||
|
|
||||
|
/* 表单输入 */ |
||||
|
.form-input { |
||||
|
height: 96rpx; |
||||
|
background: #F8FBFF; |
||||
|
border-radius: 20rpx; |
||||
|
padding: 0 32rpx; |
||||
|
font-size: 30rpx; |
||||
|
color: #333; |
||||
|
border: 1rpx solid #E5F0FF; |
||||
|
box-sizing: border-box; |
||||
|
width: 100%; |
||||
|
transition: all 0.2s ease; |
||||
|
} |
||||
|
|
||||
|
.form-input::placeholder { |
||||
|
color: #BBB; |
||||
|
font-size: 28rpx; |
||||
|
} |
||||
|
|
||||
|
.form-input:focus { |
||||
|
border-color: #4A90E2; |
||||
|
background: #FFFFFF; |
||||
|
box-shadow: 0 0 0 3rpx rgba(74, 144, 226, 0.1); |
||||
|
} |
||||
|
|
||||
|
/* 宠物信息网格 */ |
||||
|
.info-grid { |
||||
|
display: grid; |
||||
|
grid-template-columns: 1fr 1fr; |
||||
|
gap: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.info-item { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
gap: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.item-label { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 8rpx; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.item-label text { |
||||
|
font-size: 26rpx; |
||||
|
color: #666; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
.item-input-wrapper { |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.item-input { |
||||
|
height: 80rpx; |
||||
|
background: #F8FBFF; |
||||
|
border-radius: 20rpx; |
||||
|
padding: 0 32rpx 0 24rpx; |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
border: 1rpx solid #E5F0FF; |
||||
|
box-sizing: border-box; |
||||
|
width: 100%; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.input-unit { |
||||
|
position: absolute; |
||||
|
right: 24rpx; |
||||
|
top: 50%; |
||||
|
transform: translateY(-50%); |
||||
|
font-size: 26rpx; |
||||
|
color: #999; |
||||
|
font-weight: 400; |
||||
|
} |
||||
|
|
||||
|
/* 性别选择 */ |
||||
|
.gender-buttons { |
||||
|
display: flex; |
||||
|
gap: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.gender-btn { |
||||
|
flex: 1; |
||||
|
height: 80rpx; |
||||
|
background: #F8FBFF; |
||||
|
border-radius: 20rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
font-size: 28rpx; |
||||
|
color: #666; |
||||
|
border: 1rpx solid #E5F0FF; |
||||
|
transition: all 0.2s ease; |
||||
|
} |
||||
|
|
||||
|
.gender-btn.active { |
||||
|
background: linear-gradient(135deg, #4A90E2 0%, #357AE8 100%); |
||||
|
color: #FFFFFF; |
||||
|
border-color: #4A90E2; |
||||
|
font-weight: 600; |
||||
|
box-shadow: 0 4rpx 12rpx rgba(74, 144, 226, 0.2); |
||||
|
} |
||||
|
|
||||
|
/* 症状描述 */ |
||||
|
.symptom-box { |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.symptom-textarea { |
||||
|
width: 100%; |
||||
|
min-height: 240rpx; |
||||
|
background: #F8FBFF; |
||||
|
border-radius: 20rpx; |
||||
|
padding: 32rpx; |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
border: 1rpx solid #E5F0FF; |
||||
|
box-sizing: border-box; |
||||
|
line-height: 1.6; |
||||
|
transition: all 0.2s ease; |
||||
|
} |
||||
|
|
||||
|
.symptom-textarea::placeholder { |
||||
|
color: #BBB; |
||||
|
font-size: 28rpx; |
||||
|
} |
||||
|
|
||||
|
.symptom-textarea:focus { |
||||
|
border-color: #4A90E2; |
||||
|
background: #FFFFFF; |
||||
|
box-shadow: 0 0 0 3rpx rgba(74, 144, 226, 0.1); |
||||
|
} |
||||
|
|
||||
|
.textarea-counter { |
||||
|
position: absolute; |
||||
|
right: 20rpx; |
||||
|
bottom: 20rpx; |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
background: rgba(255, 255, 255, 0.9); |
||||
|
padding: 4rpx 12rpx; |
||||
|
border-radius: 12rpx; |
||||
|
} |
||||
|
|
||||
|
/* 图片上传 */ |
||||
|
.upload-tips { |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
margin-bottom: 24rpx; |
||||
|
line-height: 1.4; |
||||
|
} |
||||
|
|
||||
|
.image-upload-grid { |
||||
|
display: grid; |
||||
|
grid-template-columns: repeat(3, 1fr); |
||||
|
gap: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.image-preview { |
||||
|
width: 200rpx; |
||||
|
height: 200rpx; |
||||
|
border-radius: 20rpx; |
||||
|
overflow: hidden; |
||||
|
position: relative; |
||||
|
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.08); |
||||
|
} |
||||
|
|
||||
|
.preview-image { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
object-fit: cover; |
||||
|
} |
||||
|
|
||||
|
.remove-overlay { |
||||
|
position: absolute; |
||||
|
top: 8rpx; |
||||
|
right: 8rpx; |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
background: rgba(0, 0, 0, 0.6); |
||||
|
border-radius: 50%; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
backdrop-filter: blur(4rpx); |
||||
|
transition: all 0.2s ease; |
||||
|
} |
||||
|
|
||||
|
.remove-overlay:active { |
||||
|
background: rgba(0, 0, 0, 0.8); |
||||
|
transform: scale(0.95); |
||||
|
} |
||||
|
|
||||
|
.remove-icon { |
||||
|
width: 20rpx; |
||||
|
height: 20rpx; |
||||
|
} |
||||
|
|
||||
|
/* 上传按钮 */ |
||||
|
.upload-btn { |
||||
|
width: 200rpx; |
||||
|
height: 200rpx; |
||||
|
border: 2rpx dashed #D9E7FF; |
||||
|
border-radius: 20rpx; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
background: #F8FBFF; |
||||
|
transition: all 0.2s ease; |
||||
|
} |
||||
|
|
||||
|
.upload-btn:active { |
||||
|
border-color: #4A90E2; |
||||
|
background: #F0F7FF; |
||||
|
transform: scale(0.98); |
||||
|
} |
||||
|
|
||||
|
.upload-icon-wrapper { |
||||
|
width: 60rpx; |
||||
|
height: 60rpx; |
||||
|
background: linear-gradient(135deg, #4A90E2 0%, #357AE8 100%); |
||||
|
border-radius: 50%; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
margin-bottom: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.upload-icon { |
||||
|
width: 28rpx; |
||||
|
height: 28rpx; |
||||
|
} |
||||
|
|
||||
|
.upload-text { |
||||
|
font-size: 24rpx; |
||||
|
color: #4A90E2; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
/* 提交按钮 */ |
||||
|
.submit-section { |
||||
|
padding: 40rpx 32rpx 80rpx; |
||||
|
background: #FFFFFF; |
||||
|
} |
||||
|
|
||||
|
.submit-btn { |
||||
|
height: 96rpx; |
||||
|
background: linear-gradient(135deg, #4A90E2 0%, #357AE8 100%); |
||||
|
border-radius: 24rpx; |
||||
|
font-size: 32rpx; |
||||
|
font-weight: 700; |
||||
|
color: #FFFFFF; |
||||
|
border: none; |
||||
|
transition: all 0.3s ease; |
||||
|
box-shadow: 0 8rpx 32rpx rgba(74, 144, 226, 0.25); |
||||
|
} |
||||
|
|
||||
|
.submit-btn:active { |
||||
|
transform: translateY(2rpx); |
||||
|
box-shadow: 0 4rpx 20rpx rgba(74, 144, 226, 0.3); |
||||
|
} |
||||
|
|
||||
|
.submit-btn[disabled] { |
||||
|
opacity: 0.6; |
||||
|
transform: none; |
||||
|
box-shadow: none; |
||||
|
} |
||||
|
|
||||
|
/* 动画效果 */ |
||||
|
@keyframes fadeIn { |
||||
|
from { |
||||
|
opacity: 0; |
||||
|
transform: translateY(20rpx); |
||||
|
} |
||||
|
to { |
||||
|
opacity: 1; |
||||
|
transform: translateY(0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.form-section { |
||||
|
animation: fadeIn 0.4s ease-out forwards; |
||||
|
opacity: 0; |
||||
|
} |
||||
|
|
||||
|
.form-section:nth-child(1) { animation-delay: 0.1s; } |
||||
|
.form-section:nth-child(2) { animation-delay: 0.15s; } |
||||
|
.form-section:nth-child(3) { animation-delay: 0.2s; } |
||||
|
.form-section:nth-child(4) { animation-delay: 0.25s; } |
||||
@ -0,0 +1,198 @@ |
|||||
|
Page({ |
||||
|
/** |
||||
|
* 页面的初始数据 |
||||
|
*/ |
||||
|
data: { |
||||
|
diagnosisData: { |
||||
|
id: 1, |
||||
|
status: 'replied', |
||||
|
createdAt: '2025-02-21', |
||||
|
userInfo: { |
||||
|
avatar: '/images/avatars/user1.jpg', |
||||
|
nickName: '张小明' |
||||
|
}, |
||||
|
petInfo: { |
||||
|
type: '狗', |
||||
|
age: 3, |
||||
|
gender: '公' |
||||
|
}, |
||||
|
description: '最近三天食欲不振,精神萎靡,偶尔呕吐黄色泡沫,大便偏软带血丝,体温正常但鼻头干燥。已经尝试喂食清淡食物但无改善。昨晚开始呼吸似乎有些急促。', |
||||
|
images: [ |
||||
|
'/images/pet1.jpg', |
||||
|
'/images/pet2.jpg', |
||||
|
'/images/pet3.jpg' |
||||
|
], |
||||
|
replies: [ |
||||
|
{ |
||||
|
id: 1, |
||||
|
vet: { |
||||
|
avatar: '/images/vets/vet1.jpg', |
||||
|
name: '李医生', |
||||
|
title: '主治兽医', |
||||
|
hospital: '爱宠动物医院', |
||||
|
years: 8 |
||||
|
}, |
||||
|
content: '根据您的描述,狗狗可能出现了消化系统问题。呕吐黄色泡沫通常是胃液,结合大便带血丝的情况,建议立即禁食12小时观察。可以少量喂水,但不要喂食。如果症状持续或加重,建议立即带往医院进行血常规和粪便检查。', |
||||
|
createdAt: '2025-02-21', |
||||
|
likes: 12, |
||||
|
liked: false |
||||
|
}, |
||||
|
{ |
||||
|
id: 2, |
||||
|
vet: { |
||||
|
avatar: '/images/vets/vet2.jpg', |
||||
|
name: '王医生', |
||||
|
title: '资深兽医', |
||||
|
hospital: '萌宠医疗中心', |
||||
|
years: 12 |
||||
|
}, |
||||
|
content: '同意李医生的建议。此外,呼吸急促需要特别关注,可能是疼痛或炎症反应。建议测量肛温,正常范围是38-39℃。如果超过39.5℃需要紧急处理。可以检查牙龈颜色,正常应为粉色,发白或发紫需要立即就医。', |
||||
|
createdAt: '2025-02-21', |
||||
|
likes: 8, |
||||
|
liked: true |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
refreshing: false |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 生命周期函数--监听页面加载 |
||||
|
*/ |
||||
|
onLoad(options) { |
||||
|
if (options.id) { |
||||
|
// 根据id加载问诊数据
|
||||
|
this.loadDiagnosisData(options.id); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 加载问诊数据
|
||||
|
loadDiagnosisData(id) { |
||||
|
// 这里应该是API请求,暂时使用模拟数据
|
||||
|
// TODO: 替换为实际API调用
|
||||
|
console.log('加载问诊数据:', id); |
||||
|
|
||||
|
// 确保时间数据正确显示
|
||||
|
this.setData({ |
||||
|
'diagnosisData.createdAt': new Date().toISOString(), |
||||
|
'diagnosisData.replies[0].createdAt': new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(), |
||||
|
'diagnosisData.replies[1].createdAt': new Date(Date.now() - 4 * 60 * 60 * 1000).toISOString() |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 格式化时间 - 确保正确显示
|
||||
|
formatTime(dateString) { |
||||
|
if (!dateString) return '刚刚'; |
||||
|
|
||||
|
try { |
||||
|
const date = new Date(dateString); |
||||
|
const now = new Date(); |
||||
|
const diff = now - date; |
||||
|
const diffSeconds = Math.floor(diff / 1000); |
||||
|
const diffMinutes = Math.floor(diff / (1000 * 60)); |
||||
|
const diffHours = Math.floor(diff / (1000 * 60 * 60)); |
||||
|
const diffDays = Math.floor(diff / (1000 * 60 * 60 * 24)); |
||||
|
|
||||
|
if (diffSeconds < 60) { |
||||
|
return '刚刚'; |
||||
|
} else if (diffMinutes < 60) { |
||||
|
return `${diffMinutes}分钟前`; |
||||
|
} else if (diffHours < 24) { |
||||
|
return `${diffHours}小时前`; |
||||
|
} else if (diffDays === 1) { |
||||
|
return '昨天'; |
||||
|
} else if (diffDays < 7) { |
||||
|
return `${diffDays}天前`; |
||||
|
} else { |
||||
|
const month = date.getMonth() + 1; |
||||
|
const day = date.getDate(); |
||||
|
const hours = date.getHours().toString().padStart(2, '0'); |
||||
|
const minutes = date.getMinutes().toString().padStart(2, '0'); |
||||
|
return `${month}月${day}日 ${hours}:${minutes}`; |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.error('时间格式化错误:', error); |
||||
|
return '刚刚'; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 返回上一页
|
||||
|
goBack() { |
||||
|
wx.navigateBack(); |
||||
|
}, |
||||
|
|
||||
|
// 分享
|
||||
|
onShare() { |
||||
|
wx.showActionSheet({ |
||||
|
itemList: ['分享给好友', '保存到相册'], |
||||
|
success: (res) => { |
||||
|
if (res.tapIndex === 0) { |
||||
|
wx.showToast({ |
||||
|
title: '已分享', |
||||
|
icon: 'success' |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 下拉刷新
|
||||
|
onRefresh() { |
||||
|
this.setData({ |
||||
|
refreshing: true |
||||
|
}); |
||||
|
|
||||
|
setTimeout(() => { |
||||
|
this.setData({ |
||||
|
refreshing: false |
||||
|
}); |
||||
|
wx.showToast({ |
||||
|
title: '刷新成功', |
||||
|
icon: 'success' |
||||
|
}); |
||||
|
}, 1000); |
||||
|
}, |
||||
|
|
||||
|
// 预览图片
|
||||
|
previewImage(e) { |
||||
|
const current = e.currentTarget.dataset.url; |
||||
|
const urls = e.currentTarget.dataset.urls; |
||||
|
|
||||
|
wx.previewImage({ |
||||
|
current, |
||||
|
urls |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 点赞/取消点赞
|
||||
|
toggleLike(e) { |
||||
|
const index = e.currentTarget.dataset.index; |
||||
|
const replies = [...this.data.diagnosisData.replies]; |
||||
|
const reply = replies[index]; |
||||
|
|
||||
|
if (reply.liked) { |
||||
|
// 取消点赞
|
||||
|
reply.liked = false; |
||||
|
reply.likes = Math.max(0, (reply.likes || 1) - 1); |
||||
|
wx.showToast({ |
||||
|
title: '已取消', |
||||
|
icon: 'none' |
||||
|
}); |
||||
|
} else { |
||||
|
// 点赞
|
||||
|
reply.liked = true; |
||||
|
reply.likes = (reply.likes || 0) + 1; |
||||
|
wx.showToast({ |
||||
|
title: '已点赞', |
||||
|
icon: 'success' |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
this.setData({ |
||||
|
'diagnosisData.replies': replies |
||||
|
}); |
||||
|
|
||||
|
// 震动反馈
|
||||
|
wx.vibrateShort(); |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1,4 @@ |
|||||
|
{ |
||||
|
"navigationBarTitleText":"问诊详情", |
||||
|
"usingComponents": {} |
||||
|
} |
||||
@ -0,0 +1,160 @@ |
|||||
|
<view class="xqbox"> |
||||
|
|
||||
|
<!-- 页面内容 --> |
||||
|
<scroll-view class="page-content" scroll-y refresher-enabled refresher-triggered="{{refreshing}}" bindrefresherrefresh="onRefresh"> |
||||
|
|
||||
|
<!-- 用户问诊卡片 --> |
||||
|
<view class="user-query-card card-enter"> |
||||
|
<!-- 用户信息 --> |
||||
|
<view class="user-info-section"> |
||||
|
<view class="avatar-wrapper"> |
||||
|
<image class="user-avatar" src="/pages/images/tx.png"></image> |
||||
|
</view> |
||||
|
<view class="user-details"> |
||||
|
<view class="user-name-row"> |
||||
|
<text class="user-name">{{diagnosisData.userInfo.nickName || '用户'}}</text> |
||||
|
<view class="status-badge {{diagnosisData.status === 'replied' ? 'status-replied' : 'status-pending'}} pulse"> |
||||
|
{{diagnosisData.status === 'replied' ? '已回复' : '待回复'}} |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="pet-info"> |
||||
|
<view class="pet-info-tags"> |
||||
|
<view class="pet-tag gradient-blue">{{diagnosisData.petInfo.type}}</view> |
||||
|
<view class="pet-tag gradient-orange">{{diagnosisData.petInfo.age}}岁</view> |
||||
|
<view class="pet-tag gradient-pink">{{diagnosisData.petInfo.gender}}</view> |
||||
|
</view> |
||||
|
<view class="time-info"> |
||||
|
<text class="time-text">{{diagnosisData.createdAt}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 症状描述 --> |
||||
|
<view class="symptom-section"> |
||||
|
<view class="section-header"> |
||||
|
<text class="section-title">症状描述</text> |
||||
|
<view class="title-decoration"></view> |
||||
|
</view> |
||||
|
<view class="symptom-content"> |
||||
|
<view class="quote-left"> |
||||
|
<text>"</text> |
||||
|
</view> |
||||
|
<text class="symptom-text">{{diagnosisData.description}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 相关图片 --> |
||||
|
<view class="image-section" wx:if="{{diagnosisData.images && diagnosisData.images.length > 0}}"> |
||||
|
<view class="section-header"> |
||||
|
<text class="section-title">相关图片</text> |
||||
|
<text class="image-count gradient-blue">{{diagnosisData.images.length}}张</text> |
||||
|
</view> |
||||
|
<scroll-view class="images-scroll" scroll-x> |
||||
|
<view class="images-container"> |
||||
|
<block wx:for="{{diagnosisData.images}}" wx:key="*this" wx:for-index="index"> |
||||
|
<view class="image-wrapper"> |
||||
|
<image |
||||
|
class="symptom-image" |
||||
|
src="{{item}}" |
||||
|
mode="aspectFill" |
||||
|
bindtap="previewImage" |
||||
|
data-url="{{item}}" |
||||
|
data-urls="{{diagnosisData.images}}" |
||||
|
></image> |
||||
|
<view class="image-overlay"> |
||||
|
<text class="image-index">{{index + 1}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</block> |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 卡片装饰 --> |
||||
|
<view class="card-decoration"> |
||||
|
<view class="decoration-dot dot-1"></view> |
||||
|
<view class="decoration-dot dot-2"></view> |
||||
|
<view class="decoration-dot dot-3"></view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 兽医回复区域 --> |
||||
|
<view class="replies-section"> |
||||
|
<view class="section-header"> |
||||
|
<text class="section-title">兽医回复</text> |
||||
|
<view class="reply-count gradient-purple"> |
||||
|
<text class="count-number">{{diagnosisData.replies.length}}</text> |
||||
|
<text class="count-text">条回复</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 回复列表 --> |
||||
|
<view class="replies-list"> |
||||
|
<block wx:for="{{diagnosisData.replies}}" wx:key="id" wx:for-index="index"> |
||||
|
<view class="vet-reply-card fade-in-up" style="animation-delay: {{index * 0.1}}s;"> |
||||
|
<!-- 兽医信息 --> |
||||
|
<view class="vet-info"> |
||||
|
<view class="avatar-wrapper"> |
||||
|
<image class="vet-avatar" src="/pages/images/tx.png"></image> |
||||
|
<view class="vet-verified"></view> |
||||
|
</view> |
||||
|
<view class="vet-details"> |
||||
|
<view class="vet-name-row"> |
||||
|
<text class="vet-name">{{item.vet.name}}</text> |
||||
|
<view class="vet-badge gradient-gold"> |
||||
|
<text class="vet-title">{{item.vet.title}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="vet-meta"> |
||||
|
<view class="meta-item"> |
||||
|
<image class="meta-icon" src="/icons/hospital.svg"></image> |
||||
|
<text class="vet-hospital">{{item.vet.hospital}}</text> |
||||
|
</view> |
||||
|
<view class="meta-item"> |
||||
|
<image class="meta-icon" src="/icons/experience.svg"></image> |
||||
|
<text class="vet-experience">{{item.vet.years}}年经验</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 回复内容 --> |
||||
|
<view class="reply-content"> |
||||
|
<view class="reply-bubble"> |
||||
|
<text class="reply-text">{{item.content}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 回复底部 --> |
||||
|
<view class="reply-footer"> |
||||
|
<view class="reply-time"> |
||||
|
<text class="time-text">{{item.createdAt}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 回复装饰 --> |
||||
|
<view class="reply-decoration"> |
||||
|
<image class="decoration-icon" src="/icons/star.svg"></image> |
||||
|
</view> |
||||
|
</view> |
||||
|
</block> |
||||
|
|
||||
|
<!-- 无回复状态 --> |
||||
|
<view wx:if="{{diagnosisData.replies.length === 0}}" class="no-replies fade-in"> |
||||
|
<image class="no-replies-icon" src="/images/waiting.png"></image> |
||||
|
<text class="no-replies-title">等待兽医回复中</text> |
||||
|
<text class="no-replies-desc">专业兽医通常会在24小时内为您解答</text> |
||||
|
<view class="waiting-animation"> |
||||
|
<view class="loading-dot dot-1"></view> |
||||
|
<view class="loading-dot dot-2"></view> |
||||
|
<view class="loading-dot dot-3"></view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 底部安全区域 --> |
||||
|
<view class="page-bottom"></view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
@ -0,0 +1,643 @@ |
|||||
|
.xqbox { |
||||
|
background: linear-gradient(180deg, #F8FBFF 0%, #F0F7FF 100%); |
||||
|
min-height: 100vh; |
||||
|
} |
||||
|
|
||||
|
/* 页面内容 */ |
||||
|
.page-content { |
||||
|
height: calc(100vh - 120rpx); |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
|
||||
|
/* 动画效果 */ |
||||
|
@keyframes cardEnter { |
||||
|
0% { |
||||
|
opacity: 0; |
||||
|
transform: translateY(40rpx) scale(0.95); |
||||
|
} |
||||
|
100% { |
||||
|
opacity: 1; |
||||
|
transform: translateY(0) scale(1); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes fadeInUp { |
||||
|
0% { |
||||
|
opacity: 0; |
||||
|
transform: translateY(30rpx); |
||||
|
} |
||||
|
100% { |
||||
|
opacity: 1; |
||||
|
transform: translateY(0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@keyframes fadeIn { |
||||
|
from { opacity: 0; } |
||||
|
to { opacity: 1; } |
||||
|
} |
||||
|
|
||||
|
@keyframes pulse { |
||||
|
0% { transform: scale(1); } |
||||
|
50% { transform: scale(1.05); } |
||||
|
100% { transform: scale(1); } |
||||
|
} |
||||
|
|
||||
|
@keyframes float { |
||||
|
0%, 100% { transform: translateY(0); } |
||||
|
50% { transform: translateY(-10rpx); } |
||||
|
} |
||||
|
|
||||
|
.card-enter { |
||||
|
animation: cardEnter 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; |
||||
|
} |
||||
|
|
||||
|
.fade-in-up { |
||||
|
animation: fadeInUp 0.5s ease-out forwards; |
||||
|
opacity: 0; |
||||
|
} |
||||
|
|
||||
|
.fade-in { |
||||
|
animation: fadeIn 0.8s ease-out forwards; |
||||
|
opacity: 0; |
||||
|
} |
||||
|
|
||||
|
.pulse { |
||||
|
animation: pulse 2s infinite; |
||||
|
} |
||||
|
|
||||
|
.hover-effect { |
||||
|
transition: all 0.3s ease; |
||||
|
} |
||||
|
|
||||
|
.hover-effect:active { |
||||
|
transform: scale(0.95); |
||||
|
} |
||||
|
|
||||
|
/* 渐变背景 */ |
||||
|
.gradient-blue { |
||||
|
background: linear-gradient(135deg, #6D9EFF 0%, #4A7CFF 100%); |
||||
|
color: white !important; |
||||
|
} |
||||
|
|
||||
|
.gradient-orange { |
||||
|
background: linear-gradient(135deg, #FF9500 0%, #FF7F00 100%); |
||||
|
color: white !important; |
||||
|
} |
||||
|
|
||||
|
.gradient-pink { |
||||
|
background: linear-gradient(135deg, #FF6B9D 0%, #FF4081 100%); |
||||
|
color: white !important; |
||||
|
} |
||||
|
|
||||
|
.gradient-purple { |
||||
|
background: linear-gradient(135deg, #9D4BFF 0%, #7C3AED 100%); |
||||
|
color: white !important; |
||||
|
} |
||||
|
|
||||
|
.gradient-gold { |
||||
|
background: linear-gradient(135deg, #FFD700 0%, #FFB300 100%); |
||||
|
color: white !important; |
||||
|
} |
||||
|
|
||||
|
/* 用户问诊卡片 */ |
||||
|
.user-query-card { |
||||
|
background: #FFFFFF; |
||||
|
margin: 24rpx; |
||||
|
border-radius: 28rpx; |
||||
|
box-shadow: 0 12rpx 48rpx rgba(74, 144, 226, 0.15); |
||||
|
border: 2rpx solid #FFFFFF; |
||||
|
overflow: hidden; |
||||
|
position: relative; |
||||
|
backdrop-filter: blur(20rpx); |
||||
|
} |
||||
|
|
||||
|
/* 卡片装饰 */ |
||||
|
.card-decoration { |
||||
|
position: absolute; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
pointer-events: none; |
||||
|
z-index: 1; |
||||
|
} |
||||
|
|
||||
|
.decoration-dot { |
||||
|
position: absolute; |
||||
|
border-radius: 50%; |
||||
|
background: linear-gradient(135deg, rgba(109, 158, 255, 0.1) 0%, rgba(74, 124, 255, 0.1) 100%); |
||||
|
} |
||||
|
|
||||
|
.dot-1 { |
||||
|
width: 120rpx; |
||||
|
height: 120rpx; |
||||
|
top: -40rpx; |
||||
|
right: -40rpx; |
||||
|
} |
||||
|
|
||||
|
.dot-2 { |
||||
|
width: 80rpx; |
||||
|
height: 80rpx; |
||||
|
bottom: 60rpx; |
||||
|
left: -20rpx; |
||||
|
} |
||||
|
|
||||
|
.dot-3 { |
||||
|
width: 60rpx; |
||||
|
height: 60rpx; |
||||
|
bottom: -20rpx; |
||||
|
right: 80rpx; |
||||
|
} |
||||
|
|
||||
|
/* 用户信息区域 */ |
||||
|
.user-info-section { |
||||
|
padding: 40rpx 32rpx 32rpx; |
||||
|
display: flex; |
||||
|
align-items: flex-start; |
||||
|
position: relative; |
||||
|
z-index: 2; |
||||
|
} |
||||
|
|
||||
|
.avatar-wrapper { |
||||
|
position: relative; |
||||
|
margin-right: 24rpx; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.user-avatar { |
||||
|
width: 88rpx; |
||||
|
height: 88rpx; |
||||
|
border-radius: 50%; |
||||
|
border: 3rpx solid #FFFFFF; |
||||
|
box-shadow: 0 8rpx 24rpx rgba(74, 144, 226, 0.3); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.user-details { |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.user-name-row { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
margin-bottom: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.user-name { |
||||
|
font-size: 34rpx; |
||||
|
font-weight: 700; |
||||
|
color: #1A1A1A; |
||||
|
line-height: 1.2; |
||||
|
text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
.status-badge { |
||||
|
padding: 10rpx 24rpx; |
||||
|
border-radius: 24rpx; |
||||
|
font-size: 26rpx; |
||||
|
font-weight: 700; |
||||
|
min-width: 88rpx; |
||||
|
text-align: center; |
||||
|
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
.status-replied { |
||||
|
background: linear-gradient(135deg, #2ECC71 0%, #27AE60 100%); |
||||
|
color: white; |
||||
|
} |
||||
|
|
||||
|
.status-pending { |
||||
|
background: linear-gradient(135deg, #FF9500 0%, #F39C12 100%); |
||||
|
color: white; |
||||
|
} |
||||
|
|
||||
|
.pet-info { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
gap: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.pet-info-tags { |
||||
|
display: flex; |
||||
|
gap: 12rpx; |
||||
|
flex-wrap: wrap; |
||||
|
} |
||||
|
|
||||
|
.pet-tag { |
||||
|
padding: 6rpx 20rpx; |
||||
|
border-radius: 20rpx; |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 600; |
||||
|
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
.time-info { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 8rpx; |
||||
|
background: rgba(109, 158, 255, 0.08); |
||||
|
padding: 8rpx 16rpx; |
||||
|
border-radius: 20rpx; |
||||
|
align-self: flex-start; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.time-text { |
||||
|
font-size: 24rpx; |
||||
|
color: #6D9EFF; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
/* 症状描述区域 - 调整到最左边 */ |
||||
|
.symptom-section { |
||||
|
padding: 32rpx; |
||||
|
position: relative; |
||||
|
z-index: 2; |
||||
|
} |
||||
|
|
||||
|
.section-header { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-bottom: 28rpx; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
.section-title { |
||||
|
font-size: 32rpx; |
||||
|
font-weight: 700; |
||||
|
color: #1A1A1A; |
||||
|
position: relative; |
||||
|
padding-right: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.title-decoration { |
||||
|
flex: 1; |
||||
|
height: 2rpx; |
||||
|
background: linear-gradient(90deg, #E5F0FF 0%, #6D9EFF 50%, #E5F0FF 100%); |
||||
|
margin-left: 16rpx; |
||||
|
border-radius: 1rpx; |
||||
|
} |
||||
|
|
||||
|
.symptom-content { |
||||
|
background: #F8FBFF; |
||||
|
border-radius: 24rpx; |
||||
|
padding: 36rpx 32rpx; |
||||
|
border: 2rpx solid #E5F0FF; |
||||
|
position: relative; |
||||
|
box-shadow: 0 4rpx 16rpx rgba(74, 144, 226, 0.1); |
||||
|
transition: all 0.3s ease; |
||||
|
} |
||||
|
|
||||
|
.symptom-content:active { |
||||
|
transform: translateY(-2rpx); |
||||
|
box-shadow: 0 8rpx 24rpx rgba(74, 144, 226, 0.15); |
||||
|
} |
||||
|
|
||||
|
.quote-left { |
||||
|
position: absolute; |
||||
|
top: 20rpx; |
||||
|
left: 20rpx; |
||||
|
font-size: 48rpx; |
||||
|
color: #6D9EFF; |
||||
|
font-weight: 700; |
||||
|
opacity: 0.3; |
||||
|
} |
||||
|
|
||||
|
.symptom-text { |
||||
|
font-size: 30rpx; |
||||
|
color: #333; |
||||
|
line-height: 1.8; |
||||
|
font-weight: 400; |
||||
|
text-align: left; |
||||
|
} |
||||
|
|
||||
|
/* 图片展示区域 */ |
||||
|
.image-section { |
||||
|
padding: 32rpx; |
||||
|
position: relative; |
||||
|
z-index: 2; |
||||
|
} |
||||
|
|
||||
|
.image-count { |
||||
|
margin-left: auto; |
||||
|
padding: 6rpx 16rpx; |
||||
|
border-radius: 20rpx; |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
|
||||
|
.images-scroll { |
||||
|
width: 100%; |
||||
|
} |
||||
|
|
||||
|
.images-container { |
||||
|
display: flex; |
||||
|
padding: 8rpx 0; |
||||
|
} |
||||
|
|
||||
|
.image-wrapper { |
||||
|
margin-right: 20rpx; |
||||
|
position: relative; |
||||
|
border-radius: 20rpx; |
||||
|
overflow: hidden; |
||||
|
box-shadow: 0 8rpx 24rpx rgba(0, 0, 0, 0.15); |
||||
|
transition: all 0.3s ease; |
||||
|
} |
||||
|
|
||||
|
.image-wrapper:last-child { |
||||
|
margin-right: 0; |
||||
|
} |
||||
|
|
||||
|
.image-wrapper:active { |
||||
|
transform: scale(0.98); |
||||
|
} |
||||
|
|
||||
|
.symptom-image { |
||||
|
width: 220rpx; |
||||
|
height: 220rpx; |
||||
|
border-radius: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.image-overlay { |
||||
|
position: absolute; |
||||
|
top: 12rpx; |
||||
|
left: 12rpx; |
||||
|
background: rgba(0, 0, 0, 0.6); |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
border-radius: 50%; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
backdrop-filter: blur(4rpx); |
||||
|
} |
||||
|
|
||||
|
.image-index { |
||||
|
color: white; |
||||
|
font-size: 20rpx; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
|
||||
|
/* 兽医回复区域 */ |
||||
|
.replies-section { |
||||
|
margin: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.reply-count { |
||||
|
margin-left: auto; |
||||
|
padding: 8rpx 20rpx; |
||||
|
border-radius: 24rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 4rpx; |
||||
|
box-shadow: 0 4rpx 12rpx rgba(157, 75, 255, 0.3); |
||||
|
} |
||||
|
|
||||
|
.count-number { |
||||
|
font-size: 30rpx; |
||||
|
font-weight: 700; |
||||
|
} |
||||
|
|
||||
|
.count-text { |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 500; |
||||
|
opacity: 0.9; |
||||
|
} |
||||
|
|
||||
|
/* 回复列表 */ |
||||
|
.replies-list { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
gap: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.vet-reply-card { |
||||
|
background: #FFFFFF; |
||||
|
border-radius: 28rpx; |
||||
|
padding: 36rpx; |
||||
|
box-shadow: 0 12rpx 48rpx rgba(74, 144, 226, 0.15); |
||||
|
border: 2rpx solid #FFFFFF; |
||||
|
position: relative; |
||||
|
overflow: hidden; |
||||
|
backdrop-filter: blur(20rpx); |
||||
|
} |
||||
|
|
||||
|
/* 回复装饰 */ |
||||
|
.reply-decoration { |
||||
|
position: absolute; |
||||
|
top: 20rpx; |
||||
|
right: 20rpx; |
||||
|
opacity: 0.1; |
||||
|
} |
||||
|
|
||||
|
.decoration-icon { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
animation: float 3s ease-in-out infinite; |
||||
|
} |
||||
|
|
||||
|
/* 兽医信息 */ |
||||
|
.vet-info { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-bottom: 32rpx; |
||||
|
} |
||||
|
|
||||
|
.vet-avatar { |
||||
|
width: 80rpx; |
||||
|
height: 80rpx; |
||||
|
border-radius: 50%; |
||||
|
border: 3rpx solid #FFFFFF; |
||||
|
box-shadow: 0 8rpx 24rpx rgba(255, 215, 0, 0.3); |
||||
|
margin-right: 20rpx; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.vet-verified { |
||||
|
position: absolute; |
||||
|
bottom: 2rpx; |
||||
|
right: 2rpx; |
||||
|
width: 20rpx; |
||||
|
height: 20rpx; |
||||
|
background: #2ECC71; |
||||
|
border: 2rpx solid white; |
||||
|
border-radius: 50%; |
||||
|
} |
||||
|
|
||||
|
.vet-details { |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.vet-name-row { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-bottom: 12rpx; |
||||
|
} |
||||
|
|
||||
|
.vet-name { |
||||
|
font-size: 32rpx; |
||||
|
font-weight: 700; |
||||
|
color: #1A1A1A; |
||||
|
margin-right: 16rpx; |
||||
|
text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
.vet-badge { |
||||
|
padding: 6rpx 20rpx; |
||||
|
border-radius: 20rpx; |
||||
|
box-shadow: 0 4rpx 12rpx rgba(255, 215, 0, 0.3); |
||||
|
} |
||||
|
|
||||
|
.vet-title { |
||||
|
font-size: 24rpx; |
||||
|
font-weight: 700; |
||||
|
letter-spacing: 0.5rpx; |
||||
|
} |
||||
|
|
||||
|
.vet-meta { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.meta-item { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 6rpx; |
||||
|
background: rgba(109, 158, 255, 0.08); |
||||
|
padding: 6rpx 12rpx; |
||||
|
border-radius: 16rpx; |
||||
|
} |
||||
|
|
||||
|
.meta-icon { |
||||
|
width: 20rpx; |
||||
|
height: 20rpx; |
||||
|
opacity: 0.7; |
||||
|
} |
||||
|
|
||||
|
.vet-hospital, |
||||
|
.vet-experience { |
||||
|
font-size: 24rpx; |
||||
|
color: #6D9EFF; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
/* 回复内容 */ |
||||
|
.reply-content { |
||||
|
margin-bottom: 28rpx; |
||||
|
} |
||||
|
|
||||
|
.reply-bubble { |
||||
|
background: #F8FBFF; |
||||
|
border-radius: 24rpx; |
||||
|
padding: 32rpx; |
||||
|
border: 2rpx solid #E5F0FF; |
||||
|
position: relative; |
||||
|
box-shadow: 0 4rpx 16rpx rgba(74, 144, 226, 0.1); |
||||
|
} |
||||
|
|
||||
|
.reply-bubble::before { |
||||
|
content: ''; |
||||
|
position: absolute; |
||||
|
top: -12rpx; |
||||
|
left: 40rpx; |
||||
|
width: 0; |
||||
|
height: 0; |
||||
|
border-left: 12rpx solid transparent; |
||||
|
border-right: 12rpx solid transparent; |
||||
|
border-bottom: 12rpx solid #F8FBFF; |
||||
|
} |
||||
|
|
||||
|
.reply-text { |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
line-height: 1.8; |
||||
|
font-weight: 400; |
||||
|
} |
||||
|
|
||||
|
/* 回复底部 */ |
||||
|
.reply-footer { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
padding-top: 24rpx; |
||||
|
border-top: 2rpx dashed #E5F0FF; |
||||
|
} |
||||
|
|
||||
|
.reply-time { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
gap: 10rpx; |
||||
|
background: rgba(109, 158, 255, 0.1); |
||||
|
padding: 8rpx 20rpx; |
||||
|
border-radius: 20rpx; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/* 无回复状态 */ |
||||
|
.no-replies { |
||||
|
background: #FFFFFF; |
||||
|
border-radius: 28rpx; |
||||
|
padding: 80rpx 40rpx; |
||||
|
text-align: center; |
||||
|
box-shadow: 0 12rpx 48rpx rgba(74, 144, 226, 0.15); |
||||
|
border: 2rpx solid #FFFFFF; |
||||
|
position: relative; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.no-replies-icon { |
||||
|
width: 200rpx; |
||||
|
height: 150rpx; |
||||
|
margin-bottom: 32rpx; |
||||
|
opacity: 0.6; |
||||
|
filter: hue-rotate(200deg); |
||||
|
} |
||||
|
|
||||
|
.no-replies-title { |
||||
|
font-size: 32rpx; |
||||
|
color: #333; |
||||
|
font-weight: 700; |
||||
|
margin-bottom: 16rpx; |
||||
|
display: block; |
||||
|
text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
.no-replies-desc { |
||||
|
font-size: 26rpx; |
||||
|
color: #999; |
||||
|
line-height: 1.4; |
||||
|
max-width: 400rpx; |
||||
|
margin: 0 auto; |
||||
|
} |
||||
|
|
||||
|
.waiting-animation { |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
gap: 12rpx; |
||||
|
margin-top: 40rpx; |
||||
|
} |
||||
|
|
||||
|
.loading-dot { |
||||
|
width: 16rpx; |
||||
|
height: 16rpx; |
||||
|
border-radius: 50%; |
||||
|
background: #6D9EFF; |
||||
|
animation: pulse 1.5s infinite ease-in-out; |
||||
|
} |
||||
|
|
||||
|
.loading-dot.dot-1 { animation-delay: 0s; } |
||||
|
.loading-dot.dot-2 { animation-delay: 0.2s; } |
||||
|
.loading-dot.dot-3 { animation-delay: 0.4s; } |
||||
|
|
||||
|
/* 页面底部安全区域 */ |
||||
|
.page-bottom { |
||||
|
height: 60rpx; |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue