This commit is contained in:
Your Name
2026-03-18 14:53:09 +08:00
parent 338b104d50
commit 7832514f28
315 changed files with 7071 additions and 1136 deletions
+59 -56
View File
@@ -57,7 +57,7 @@
<!-- 空状态 -->
<view v-if="!loading && cardList.length === 0" class="empty-state">
<uni-icons type="wallet" size="60" color="#999"></uni-icons>
<uni-icons type="wallet" size="80" color="#1890ff"></uni-icons>
<text class="empty-text">暂无就诊卡</text>
<view class="add-card-btn" @click="createCard">新建就诊卡</view>
</view>
@@ -204,39 +204,41 @@ const formatDate = (timestamp) => {
</script>
<style lang="less" scoped>
/* 适老化设计:50-80岁 - 大字号、高对比、大触控区 */
.card-container {
min-height: 100vh;
background: linear-gradient(180deg, #f0f7ff 0%, #ffffff 100%);
padding-bottom: 40rpx;
background: linear-gradient(180deg, #e8f0fa 0%, #ffffff 100%);
padding-bottom: 56rpx;
}
.header {
background: #ffffff;
padding: 40rpx 30rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
padding: 48rpx 40rpx;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
.header-title {
font-size: 40rpx;
font-size: 48rpx;
font-weight: bold;
color: #1890ff;
}
}
.card-list {
padding: 30rpx;
padding: 40rpx;
}
.card-item {
background: #ffffff;
border-radius: 20rpx;
padding: 30rpx;
margin-bottom: 24rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
border-radius: 28rpx;
padding: 44rpx;
margin-bottom: 36rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.08);
transition: all 0.3s;
min-height: 200rpx;
&:active {
transform: scale(0.98);
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.1);
}
}
@@ -244,100 +246,100 @@ const formatDate = (timestamp) => {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24rpx;
padding-bottom: 20rpx;
border-bottom: 2rpx solid #f0f0f0;
margin-bottom: 32rpx;
padding-bottom: 28rpx;
border-bottom: 4rpx solid #e8eaed;
}
.card-id {
.label {
font-size: 28rpx;
color: #666666;
font-size: 34rpx;
color: #555;
}
.value {
font-size: 32rpx;
font-size: 40rpx;
font-weight: bold;
color: #333333;
color: #1a1a1a;
}
}
.status-badge {
padding: 8rpx 20rpx;
border-radius: 20rpx;
font-size: 24rpx;
padding: 12rpx 28rpx;
border-radius: 28rpx;
font-size: 32rpx;
font-weight: 500;
&.status-confirmed {
background: #f6ffed;
color: #204e2b;
border: 2rpx solid #204e2b;
border: 4rpx solid #204e2b;
}
&.status-pending {
background: #fff7e6;
color: #fa8c16;
border: 2rpx solid #ffd591;
border: 4rpx solid #ffd591;
}
}
.card-info {
margin-bottom: 20rpx;
margin-bottom: 28rpx;
}
.info-row {
display: flex;
align-items: center;
margin-bottom: 16rpx;
margin-bottom: 24rpx;
.info-label {
font-size: 28rpx;
color: #666666;
min-width: 160rpx;
font-size: 34rpx;
color: #555;
min-width: 200rpx;
}
.info-value {
font-size: 30rpx;
color: #333333;
font-size: 36rpx;
color: #1a1a1a;
font-weight: 500;
}
}
.card-footer {
padding-top: 20rpx;
border-top: 2rpx solid #f0f0f0;
padding-top: 28rpx;
border-top: 4rpx solid #e8eaed;
}
.time-info {
display: flex;
align-items: center;
margin-bottom: 12rpx;
margin-bottom: 20rpx;
.time-label {
font-size: 24rpx;
color: #999999;
min-width: 140rpx;
font-size: 30rpx;
color: #555;
min-width: 180rpx;
}
.time-value {
font-size: 26rpx;
color: #666666;
font-size: 32rpx;
color: #555;
}
}
.view-count {
display: flex;
align-items: center;
margin-top: 8rpx;
margin-top: 12rpx;
.count-icon {
font-size: 28rpx;
margin-right: 8rpx;
font-size: 34rpx;
margin-right: 12rpx;
}
.count-text {
font-size: 24rpx;
color: #999999;
font-size: 30rpx;
color: #555;
}
}
@@ -346,37 +348,38 @@ const formatDate = (timestamp) => {
flex-direction: column;
align-items: center;
justify-content: center;
padding: 120rpx 0;
padding: 160rpx 0;
.empty-icon {
font-size: 120rpx;
margin-bottom: 30rpx;
font-size: 140rpx;
margin-bottom: 40rpx;
}
.empty-text {
font-size: 32rpx;
color: #999999;
margin-bottom: 40rpx;
font-size: 40rpx;
color: #555;
margin-bottom: 56rpx;
}
}
.add-card-btn {
padding: 24rpx 64rpx;
padding: 36rpx 88rpx;
background: #1890ff;
color: #ffffff;
font-size: 30rpx;
font-size: 40rpx;
font-weight: 500;
border-radius: 48rpx;
border-radius: 56rpx;
min-height: 100rpx;
}
.loading-state {
display: flex;
justify-content: center;
padding: 80rpx 0;
padding: 120rpx 0;
.loading-text {
font-size: 28rpx;
color: #999999;
font-size: 36rpx;
color: #555;
}
}
</style>
+1 -1
View File
@@ -1837,7 +1837,7 @@ const goBack = () => {
color: #333333;
background: transparent;
box-sizing: border-box;
min-height: 60rpx;
min-height: 80rpx;
display: block;
}
+129 -93
View File
@@ -1,59 +1,59 @@
<template>
<view class="container">
<!-- 搜索栏 -->
<view class="search-section">
<!-- <view class="search-section">
<view class="search-bar">
<text class="search-icon">🔍</text>
<input class="search-input" placeholder="搜索药材、医生或症状..." type="text" />
<text class="search-filter"></text>
</view>
</view>
</view> -->
<!-- 科室分类 -->
<view class="department-section">
<!-- 平台资质 -->
<view class="qualification-section">
<view class="section-header">
<text class="section-title">科室分类</text>
<text class="more-link" @click="navigateToDepartments">查看全部</text>
<text class="section-title">平台资质</text>
<!-- <text class="more-link" @click="navigateToQualifications">查看详情</text> -->
</view>
<view class="department-grid">
<view class="dept-col-left">
<view class="qualification-grid">
<view class="qual-col-left">
<view
class="department-card large"
@click="navigateToDepartment(departments[0])"
class="qualification-card large"
@click="navigateToQualification(qualifications[0])"
>
<view class="dept-card-inner dept-green">
<view class="dept-icon"><text class="icon-text"></text></view>
<text class="dept-name text-white">针灸</text>
<text class="dept-desc text-white-sub">调理气血</text>
<view class="qual-card-inner qual-primary">
<view class="qual-icon"><image src="/static/wjw.png" style="width: 100rpx; margin-left: -5px;" mode="widthFix"></image></view>
<text class="qual-name text-white">卫健委认证机构</text>
<text class="qual-desc text-white-sub">互联网诊疗资质备案</text>
</view>
</view>
</view>
<view class="dept-col-right">
<view class="qual-col-right">
<view
class="department-card small"
@click="navigateToDepartment(departments[1])"
class="qualification-card small"
@click="navigateToQualification(qualifications[1])"
>
<view class="dept-card-inner dept-beige">
<view class="dept-icon-wrap">
<view class="dept-icon"><text class="icon-text"></text></view>
<view class="qual-card-inner qual-beige">
<view class="qual-icon-wrap">
<view class="qual-icon"><image src="/static/yy.png" style="width: 100rpx; margin-left: -10px;" mode="widthFix"></image></view>
</view>
<view>
<text class="dept-name">中药</text>
<text class="dept-desc">古法方剂</text>
<text class="qual-name">互联网医院</text>
<text class="qual-desc">持证合规运营</text>
</view>
</view>
</view>
<view
class="department-card small"
@click="navigateToDepartment(departments[2])"
class="qualification-card small"
@click="navigateToAllDoctors"
>
<view class="dept-card-inner dept-grey">
<view class="dept-icon-wrap">
<view class="dept-icon"><text class="icon-text"></text></view>
<view class="qual-card-inner qual-grey">
<view class="qual-icon-wrap">
<view class="qual-icon"><image src="/static/ys.png" style="width: 90rpx; margin-left: -5px;" mode="widthFix"></image></view>
</view>
<view>
<text class="dept-name">推拿</text>
<text class="dept-desc">中医按摩</text>
<text class="qual-name">执业医师认证</text>
<text class="qual-desc">持证医师在线问诊</text>
</view>
</view>
</view>
@@ -84,7 +84,7 @@
<text class="doctor-specialty">{{ doctor.specialty || doctor.title || '中医' }}</text>
<view class="doctor-price-row">
<text class="doctor-price">{{ doctor.price || '' }}</text>
<text class="doctor-unit">/</text>
<text class="doctor-unit" v-if="doctor.title">{{doctor.title}}</text>
</view>
<view class="doctor-actions">
<view class="appointment-btn" @click.stop="selectDoctor(doctor)">预约</view>
@@ -102,18 +102,18 @@
</view>
<scroll-view class="encyclopedia-scroll no-scrollbar" scroll-x :show-scrollbar="false">
<view
v-for="article in articles"
v-for="(article, index) in articles"
:key="article.id"
class="article-card"
:class="{ 'article-card-secondary': article.id === 2 }"
:class="{ 'article-card-secondary': index % 2 === 1 }"
@click="navigateToArticle(article)"
>
<view class="article-image-wrap">
<image :src="article.cover" class="article-image" mode="aspectFill"></image>
<view class="article-gradient" :class="{ 'gradient-secondary': article.id === 2 }"></view>
<view class="article-tag" :class="{ 'tag-secondary': article.id === 2 }">{{ article.tag }}</view>
<view class="article-gradient" :class="{ 'gradient-secondary': index % 2 === 1 }"></view>
<view class="article-tag" :class="{ 'tag-secondary': index % 2 === 1 }">{{ article.tag }}</view>
</view>
<text class="article-title" :class="{ 'title-secondary': article.id === 2 }">{{ article.title }}</text>
<text class="article-title" :class="{ 'title-secondary': index % 2 === 1 }">{{ article.title }}</text>
<text class="article-desc">{{ article.desc }}</text>
</view>
</scroll-view>
@@ -124,26 +124,41 @@
<script setup>
import { ref, onMounted } from 'vue'
import { getCurrentInstance } from 'vue'
import { onShow, onShareAppMessage } from '@dcloudio/uni-app'
const { proxy } = getCurrentInstance()
const doctors = ref([])
const loading = ref(false)
const defaultAvatar = '/static/user/user.png'
// 科室分类
const departments = ref([
{ id: 1, name: '针灸', desc: '调理气血', icon: '✦', iconClass: 'icon-acupuncture', bgColor: 'linear-gradient(135deg, #2d5a3d 0%, #3d7a4d 100%)', dark: true, size: 'large', pattern: true },
{ id: 2, name: '中药', desc: '古法方剂', icon: '◉', iconClass: 'icon-herb', bgColor: '#F5E6D3', dark: false, size: 'small' },
{ id: 3, name: '推拿', desc: '中医按摩', icon: '☯', iconClass: 'icon-massage', bgColor: '#E8E4DF', dark: false, size: 'small' }
// 平台资质
const qualifications = ref([
{ id: 1, name: '卫健委认证机构', desc: '互联网诊疗资质备案', icon: '', dark: true, size: 'large' },
{ id: 2, name: '互联网医院', desc: '持证合规运营', icon: '', dark: false, size: 'small' },
{ id: 3, name: '执业医师认证', desc: '持证医师在线问诊', icon: '', dark: false, size: 'small' }
])
// 健康百科
const articles = ref([
{ id: 1, title: '晨间生姜:脾胃健康的催化剂', desc: '了解每天早晨一片生姜如何改善您的新陈代谢...', tag: '膳食营养', cover: 'https://picsum.photos/seed/herb/300/180' },
{ id: 2, title: '四时呼吸:顺应节气养生', desc: '顺应节气,调养身心...', tag: '正念冥想', cover: 'https://picsum.photos/seed/nature/300/180' },
{ id: 3, title: '中医养生之道', desc: '传统智慧,现代健康...', tag: '养生保健', cover: 'https://picsum.photos/seed/health/300/180' }
])
const articles = ref([])
const fetchArticles = async () => {
try {
const response = await proxy.apiUrl({
url: '/api/article/lists',
method: 'GET',
data: { page_no: 1, page_size: 10 }
})
if (response && response.code === 1) {
articles.value = (response.data.lists || []).map(item => ({
...item,
cover: item.image,
tag: item.cid || ''
}))
}
} catch (error) {
console.error('获取文章列表失败:', error)
}
}
const selectDoctor = (doctor) => {
uni.navigateTo({
@@ -151,16 +166,21 @@ const selectDoctor = (doctor) => {
})
}
const navigateToDepartments = () => {
uni.showToast({ title: '科室列表', icon: 'none' })
const navigateToQualifications = () => {
uni.showToast({ title: '资质详情', icon: 'none' })
}
const navigateToDepartment = (item) => {
uni.showToast({ title: item.name, icon: 'none' })
const navigateToQualification = (item) => {
// 根据类型打开不同的协议页面
uni.navigateTo({
url: '/pages/Card/contact?type=health'
})
}
const navigateToAllDoctors = () => {
uni.showToast({ title: '更多医生', icon: 'none' })
uni.navigateTo({
url: '/doctor/pages/doctor/list/list'
})
}
const navigateToEncyclopedia = () => {
@@ -168,7 +188,7 @@ const navigateToEncyclopedia = () => {
}
const navigateToArticle = (article) => {
uni.showToast({ title: article.title, icon: 'none' })
uni.navigateTo({ url: `/doctor/pages/article/article?id=${article.id}` })
}
const fetchDoctors = async () => {
@@ -196,9 +216,28 @@ const fetchDoctors = async () => {
loading.value = false
}
}
const userinfo = async (code) => {
try {
// 通过 proxy 调用全局的 apiUrl
const res = await proxy.apiUrl({
url: '/api/user/info',
method: 'POST',
}, false) // 不显示加载中
uni.setStorageSync('userData', res.data)
} catch (err) {
}
}
onMounted(() => {
fetchDoctors()
fetchArticles()
userinfo()
})
</script>
@@ -289,28 +328,28 @@ $outline: #727970;
font-weight: 500;
}
// 科室分类 - grid 布局
.department-section {
// 平台资质 - grid 布局
.qualification-section {
margin-bottom: 64rpx;
}
.department-grid {
.qualification-grid {
display: flex;
gap: 32rpx;
}
.dept-col-left {
.qual-col-left {
flex: 1;
}
.dept-col-right {
.qual-col-right {
flex: 1;
display: flex;
flex-direction: column;
gap: 32rpx;
}
.department-card {
.qualification-card {
&.large {
height: 100%;
min-height: 320rpx;
@@ -322,7 +361,7 @@ $outline: #727970;
}
}
.dept-card-inner {
.qual-card-inner {
border-radius: 24rpx;
padding: 40rpx;
height: 100%;
@@ -335,24 +374,24 @@ $outline: #727970;
overflow: hidden;
}
/* 针灸 - primary-container */
.dept-green {
/* 卫健委认证 - primary-container */
.qual-primary {
background: $primary-container;
color: $on-primary;
}
.dept-green .dept-icon .icon-text,
.dept-green .dept-name {
.qual-primary .qual-icon .icon-text,
.qual-primary .qual-name {
color: $on-primary;
}
.dept-green .dept-desc {
.qual-primary .qual-desc {
color: $on-primary-container;
font-size: 24rpx;
}
/* 中药 - secondary-container */
.dept-beige {
/* 互联网医院 - secondary-container */
.qual-beige {
background: $secondary-container;
color: $on-secondary-container;
flex-direction: row;
@@ -361,32 +400,28 @@ $outline: #727970;
padding: 32rpx;
}
.dept-beige .dept-icon-wrap {
background: rgba(255, 255, 255, 0.4);
padding: 16rpx;
border-radius: 16rpx;
}
.dept-beige .dept-icon .icon-text {
.qual-beige .qual-icon .icon-text {
font-size: 40rpx;
color: $on-secondary-container;
}
.dept-beige .dept-name {
.qual-beige .qual-name {
color: $on-secondary-container;
margin-bottom: 4rpx;
display: block;
}
.dept-beige .dept-desc {
.qual-beige .qual-desc {
color: $on-secondary-container;
opacity: 0.8;
font-size: 20rpx;
display: block;
}
/* 推拿 - surface-container-high */
.dept-grey {
/* 执业医师认证 - surface-container-high */
.qual-grey {
background: $surface-container-high;
color: $on-surface;
flex-direction: row;
@@ -395,43 +430,39 @@ $outline: #727970;
padding: 32rpx;
}
.dept-grey .dept-icon-wrap {
background: rgba(255, 255, 255, 0.6);
padding: 16rpx;
border-radius: 16rpx;
}
.dept-grey .dept-icon .icon-text {
.qual-grey .qual-icon .icon-text {
font-size: 40rpx;
color: $primary;
}
.dept-grey .dept-name {
.qual-grey .qual-name {
color: $on-surface;
display: block;
}
.dept-grey .dept-desc {
.qual-grey .qual-desc {
color: $on-surface-variant;
font-size: 20rpx;
display: block;
}
.dept-icon {
.qual-icon {
margin-bottom: 16rpx;
}
.dept-beige .dept-icon,
.dept-grey .dept-icon {
.qual-beige .qual-icon,
.qual-grey .qual-icon {
margin-bottom: 0;
}
.dept-icon .icon-text {
.qual-icon .icon-text {
font-size: 56rpx;
color: $on-primary;
}
.dept-name {
.qual-name {
font-size: 36rpx;
font-weight: 600;
color: $on-surface;
@@ -443,7 +474,7 @@ $outline: #727970;
}
}
.dept-desc {
.qual-desc {
font-size: 26rpx;
color: $on-surface-variant;
@@ -512,11 +543,13 @@ $outline: #727970;
font-size: 28rpx;
color: $on-surface-variant;
margin-bottom: 16rpx;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.doctor-price-row {
margin-bottom: 16rpx;
}
.doctor-price {
font-size: 28rpx;
@@ -533,6 +566,9 @@ $outline: #727970;
.doctor-actions {
display: flex;
justify-content: flex-end;
position: relative;
right: 0;
bottom: 0;
}
.appointment-btn {
+2 -2
View File
@@ -83,8 +83,8 @@ onShareAppMessage((res) =>{
return {
title: '视频问诊通话邀请',
path: '/pages/index/video',
imageUrl: '/static/share-img.png',
desc: '自定义分享描述',
imageUrl: '',
desc: '视频问诊通话邀请',
success() {
uni.showToast({ title: '分享成功', icon: 'success' });
},
+20 -3
View File
@@ -356,6 +356,7 @@
<script setup>
import { ref,onMounted,getCurrentInstance } from "vue";
import { onShow, onShareAppMessage } from '@dcloudio/uni-app'
// 2. 获取组件实例,通过 proxy 访问全局属性
const { proxy } = getCurrentInstance()
const formData = ref({
@@ -433,7 +434,21 @@ onMounted(() => {
getDictOptions();
loadDiagnosisDetail();
});
onShareAppMessage((res) =>{
return {
title: '诊单确认',
path: '/pages/order/monad/monad?id='+diagnosisId+'&share_user_id='+share_user_id,
imageUrl: '',
desc: '诊单确认',
success() {
uni.showToast({ title: '分享成功', icon: 'success' });
},
fail(err) {
console.log('分享失败:', err);
uni.showToast({ title: '分享失败', icon: 'none' });
}
}
});
// 获取字典数据
const getDictOptions = async () => {
try {
@@ -518,7 +533,8 @@ const getDictData = async (type) => {
return null;
}
};
let diagnosisId=''
let share_user_id='';
// 加载诊单详情
const loadDiagnosisDetail = async () => {
// 从页面参数获取诊单ID
@@ -526,7 +542,8 @@ const loadDiagnosisDetail = async () => {
const currentPage = pages[pages.length - 1];
const params = proxy.$parsePageParams(currentPage.options);
dingdan_ok.value=uni.getStorageSync('dingdan_ok');
const diagnosisId = params.id;
diagnosisId = params.id;
share_user_id = params.share_user_id;
console.log('进入onMounted:', params, '诊单ID:', diagnosisId);
if (!diagnosisId) {
+61 -57
View File
@@ -6,23 +6,23 @@
<image class="avatar" :src="userInfo.avatar" mode="aspectFill" />
<div class="user-info">
<text class="nickname">{{ userInfo.nickname || '未登录' }}</text>
<text class="vip-tag">VIP会员</text>
<!-- <text class="vip-tag">VIP会员</text> -->
</div>
<div class="qr-code" @click.stop="showQRCode">
<!-- <div class="qr-code" @click.stop="showQRCode">
<uni-icons type="scan" size="20" color="#333"></uni-icons>
</div>
</div> -->
</div>
<div class="stat-row">
<div class="stat-item">
<text class="value">{{ userInfo.balance ||0}}</text>
<text class="value">{{ userInfo.balance || 0 }}</text>
<text class="label">钱包()</text>
</div>
<div class="stat-item">
<text class="value">{{ userInfo.points ||0}}</text>
<text class="value">{{ userInfo.points || 0 }}</text>
<text class="label">积分</text>
</div>
<div class="stat-item">
<text class="value">{{ userInfo.coupons ||0}}</text>
<text class="value">{{ userInfo.coupons || 0 }}</text>
<text class="label">优惠券</text>
</div>
</div>
@@ -68,23 +68,23 @@
</div>
</div> -->
<!-- 服务菜单列表 -->
<!-- 服务菜单列表适老化显示全部大触控区 -->
<div class="service-list">
<div
class="service-item"
v-for="(item, index) in allServices.slice(4)"
v-for="(item, index) in allServices"
:key="index"
@click="navigateTo(item.path)"
>
<div class="left">
<div class="service-icon" :class="item.class">
<uni-icons :type="item.icon" size="20" color="#fff"></uni-icons>
<uni-icons :type="item.icon" size="28" color="#fff"></uni-icons>
</div>
<text class="service-name">{{ item.name }}</text>
</div>
<div class="right">
<text v-if="item.desc" class="desc">{{ item.desc }}</text>
<uni-icons type="right" size="14" color="#999"></uni-icons>
<uni-icons type="right" size="20" color="#666"></uni-icons>
</div>
</div>
</div>
@@ -92,6 +92,7 @@
</template>
<script>
import { onShow, onShareAppMessage } from '@dcloudio/uni-app'
export default {
name: 'profileB',
data() {
@@ -137,19 +138,15 @@ export default {
}
],
allServices: [
{ name: '收藏夹', icon: 'star', path: '/pages/favorite/index', class: 'bg-red' },
{ name: '浏览记录', icon: 'eye', path: '/pages/history/index', class: 'bg-blue' },
{ name: '收货地址', icon: 'location', path: '/pages/address/list', class: 'bg-green' },
{ name: '优惠券', icon: 'gift', path: '/pages/coupon/list', class: 'bg-purple' },
{ name: '就诊卡', icon: 'folder-add', path: '/pages/Card/Card', class: 'bg-cyan' },
{ name: '设置', icon: 'gear', path: '/pages/user/userinfo', class: 'bg-gray' }// ,
{ name: '设置', icon: 'gear', path: '/pages/user/userinfo', class: 'bg-gray' }// ,
// { name: '客服中心', icon: 'headphones', path: '/pages/service/index', class: 'bg-orange', desc: '在线客服' }
]
}
},
onShow() {
this.userInfo=uni.getStorageSync('userData')
this.user()
},
methods: {
navigateTo(path) {
@@ -163,56 +160,59 @@ export default {
</script>
<style lang="scss" scoped>
/* 适老化设计:50-80岁老人 - 大字号、高对比、大触控区 */
.mine-page {
min-height: 100vh;
background: #f5f6fa;
padding: 30rpx;
background: #e8eaed;
padding: 40rpx;
}
.user-card {
background: #fff;
border-radius: 24rpx;
padding: 40rpx;
margin-bottom: 30rpx;
box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.04);
border-radius: 28rpx;
padding: 48rpx;
margin-bottom: 40rpx;
box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.06);
.user-header {
display: flex;
align-items: center;
margin-bottom: 40rpx;
margin-bottom: 48rpx;
.avatar {
width: 120rpx;
height: 120rpx;
border-radius: 60rpx;
margin-right: 30rpx;
width: 160rpx;
height: 160rpx;
border-radius: 80rpx;
margin-right: 36rpx;
border: 4rpx solid #e0e0e0;
}
.user-info {
flex: 1;
.nickname {
font-size: 36rpx;
font-size: 48rpx;
font-weight: 600;
color: #333;
margin-bottom: 12rpx;
color: #1a1a1a;
margin-bottom: 16rpx;
display: block;
letter-spacing: 1rpx;
}
.vip-tag {
background: linear-gradient(90deg, #FFD700 0%, #FFA500 100%);
color: #fff;
font-size: 24rpx;
padding: 4rpx 16rpx;
border-radius: 20rpx;
font-size: 28rpx;
padding: 6rpx 20rpx;
border-radius: 24rpx;
display: inline-block;
}
}
.qr-code {
width: 72rpx;
height: 72rpx;
border-radius: 36rpx;
width: 88rpx;
height: 88rpx;
border-radius: 44rpx;
background: #f5f6fa;
display: flex;
align-items: center;
@@ -222,24 +222,26 @@ export default {
.stat-row {
display: flex;
padding-top: 30rpx;
border-top: 2rpx solid #f5f6fa;
padding-top: 40rpx;
border-top: 4rpx solid #e8eaed;
.stat-item {
flex: 1;
text-align: center;
min-height: 120rpx;
.value {
font-size: 40rpx;
font-size: 52rpx;
font-weight: 600;
color: #333;
margin-bottom: 8rpx;
color: #1a1a1a;
margin-bottom: 12rpx;
display: block;
}
.label {
font-size: 24rpx;
color: #999;
font-size: 32rpx;
color: #555;
font-weight: 500;
}
}
}
@@ -354,16 +356,17 @@ export default {
.service-list {
background: #fff;
border-radius: 24rpx;
padding: 10rpx 30rpx;
box-shadow: 0 4rpx 16rpx rgba(0,0,0,0.04);
border-radius: 28rpx;
padding: 20rpx 40rpx;
box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.06);
.service-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 30rpx 0;
border-bottom: 2rpx solid #f5f6fa;
padding: 44rpx 0;
border-bottom: 4rpx solid #e8eaed;
min-height: 120rpx;
&:last-child {
border-bottom: none;
@@ -374,18 +377,19 @@ export default {
align-items: center;
.service-icon {
width: 64rpx;
height: 64rpx;
border-radius: 32rpx;
margin-right: 24rpx;
width: 88rpx;
height: 88rpx;
border-radius: 44rpx;
margin-right: 32rpx;
display: flex;
align-items: center;
justify-content: center;
}
.service-name {
font-size: 28rpx;
color: #333;
font-size: 38rpx;
color: #1a1a1a;
font-weight: 500;
}
}
@@ -394,9 +398,9 @@ export default {
align-items: center;
.desc {
font-size: 24rpx;
color: #999;
margin-right: 16rpx;
font-size: 30rpx;
color: #555;
margin-right: 20rpx;
}
}
}
+66 -61
View File
@@ -21,8 +21,7 @@
mode="aspectFill"
/>
<view class="avatar-upload" @click="uploadAvatar">
<uni-icons type="upload-filled" size="14" color="#999" class="upload-icon"></uni-icons>
<uni-icons type="upload-filled" size="24" color="#FFA500" class="upload-icon"></uni-icons>
<text class="upload-text">更换头像</text>
</view>
</view>
@@ -281,9 +280,10 @@ const goBack = () => {
</script>
<style scoped>
/* 适老化设计:50-80岁 - 大字号、高对比、大触控区 */
.userinfo-container {
min-height: 100vh;
background: #f5f5f5;
background: #e8eaed;
}
.header {
@@ -291,30 +291,30 @@ const goBack = () => {
justify-content: space-between;
align-items: center;
background: #ffffff;
padding: 20rpx 30rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
padding: 24rpx 40rpx;
box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
}
.header-back {
font-size: 40rpx;
font-size: 48rpx;
color: #FFA500;
width: 60rpx;
height: 60rpx;
width: 88rpx;
height: 88rpx;
display: flex;
align-items: center;
justify-content: center;
}
.header-title {
font-size: 36rpx;
font-size: 44rpx;
font-weight: bold;
color: #333333;
color: #1a1a1a;
flex: 1;
text-align: center;
}
.header-placeholder {
width: 60rpx;
width: 88rpx;
}
.loading-state {
@@ -322,34 +322,34 @@ const goBack = () => {
justify-content: center;
align-items: center;
height: 100vh;
font-size: 28rpx;
color: #999999;
font-size: 36rpx;
color: #555;
}
.form-wrapper {
padding: 30rpx;
padding: 40rpx;
}
.form-section {
background: #ffffff;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05);
border-radius: 24rpx;
padding: 40rpx;
margin-bottom: 36rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.06);
}
.section-title {
font-size: 32rpx;
font-size: 40rpx;
font-weight: bold;
color: #FFA500;
margin-bottom: 24rpx;
margin-bottom: 32rpx;
display: block;
padding-bottom: 16rpx;
border-bottom: 2rpx solid #f0f0f0;
padding-bottom: 24rpx;
border-bottom: 4rpx solid #f0f0f0;
}
.form-group {
margin-bottom: 24rpx;
margin-bottom: 36rpx;
}
.form-group:last-child {
@@ -358,111 +358,116 @@ const goBack = () => {
.form-label {
display: block;
font-size: 28rpx;
color: #333333;
font-size: 36rpx;
color: #1a1a1a;
font-weight: 500;
margin-bottom: 16rpx;
line-height: 1.5;
margin-bottom: 20rpx;
line-height: 1.6;
}
.form-input {
width: 100%;
padding: 20rpx;
border: 2rpx solid #e8e8e8;
border-radius: 12rpx;
font-size: 28rpx;
line-height: 1.5;
color: #333333;
padding: 28rpx;
border: 4rpx solid #e0e0e0;
border-radius: 16rpx;
font-size: 36rpx;
line-height: 1.6;
color: #1a1a1a;
background: #ffffff;
box-sizing: border-box;
display: block;
height: auto;
min-height: 60rpx;
min-height: 96rpx;
}
.form-input::placeholder {
color: #cccccc;
color: #999;
font-size: 34rpx;
}
.avatar-container {
display: flex;
align-items: center;
gap: 20rpx;
gap: 32rpx;
}
.avatar-image {
width: 120rpx;
height: 120rpx;
border-radius: 60rpx;
width: 160rpx;
height: 160rpx;
border-radius: 80rpx;
background: #f0f0f0;
border: 4rpx solid #e0e0e0;
}
.avatar-upload {
flex: 1;
padding: 20rpx;
border: 2rpx dashed #FFA500;
border-radius: 12rpx;
padding: 36rpx;
border: 4rpx dashed #FFA500;
border-radius: 20rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8rpx;
gap: 16rpx;
min-height: 120rpx;
}
.upload-icon {
font-size: 40rpx;
font-size: 56rpx;
}
.upload-text {
font-size: 24rpx;
font-size: 34rpx;
color: #FFA500;
font-weight: 500;
}
.sex-group {
display: flex;
gap: 20rpx;
gap: 28rpx;
}
.sex-btn {
flex: 1;
padding: 20rpx;
border: 2rpx solid #e8e8e8;
border-radius: 12rpx;
padding: 32rpx;
border: 4rpx solid #e0e0e0;
border-radius: 16rpx;
text-align: center;
font-size: 28rpx;
font-size: 38rpx;
line-height: 1.5;
color: #666666;
color: #555;
background: #ffffff;
transition: all 0.3s;
display: flex;
align-items: center;
justify-content: center;
min-height: 60rpx;
min-height: 96rpx;
}
.sex-btn.active {
border-color: #FFA500;
background: #e6f7ff;
background: #fff7e6;
color: #FFA500;
font-weight: bold;
}
.button-group {
display: flex;
gap: 20rpx;
margin-top: 40rpx;
margin-bottom: 40rpx;
gap: 28rpx;
margin-top: 56rpx;
margin-bottom: 56rpx;
}
.btn {
flex: 1;
padding: 20rpx;
border-radius: 12rpx;
font-size: 32rpx;
padding: 36rpx;
border-radius: 20rpx;
font-size: 40rpx;
font-weight: bold;
border: none;
cursor: pointer;
transition: all 0.3s;
min-height: 100rpx;
}
.btn:active {
@@ -476,7 +481,7 @@ const goBack = () => {
.btn-cancel {
background: #f0f0f0;
color: #666666;
color: #555;
}
.btn-submit {
@@ -485,6 +490,6 @@ const goBack = () => {
}
.btn-submit:active:not(:disabled) {
background: #0050b3;
background: #e69500;
}
</style>