fix: 首页UI重构设计

This commit is contained in:
2026-01-12 12:36:50 +08:00
parent 1251897013
commit 2a294898ec
13 changed files with 706 additions and 161 deletions

View File

@@ -74,7 +74,7 @@
<view class="list_nums">
<view class="txt">问诊量 <text>{{item.inquiry_num }}</text></view>
<view class="txt">接诊率 <text>{{item.accept_percent}}</text></view>
<!-- <view class="txt">综合评分 <text>{{item.overall_score}}</text></view> -->
<view class="txt">综合评分 <text>{{item.overall_score}}</text></view>
</view>
</view>
</view>
@@ -129,6 +129,7 @@
import {
dDropdown
} from '@/components/d-dropdown/d-dropdown'
import { isGuestMode } from '@/common/utils/auth.js'
export default {
components: {
dDropdown
@@ -272,8 +273,16 @@
}
}).then((res) => {
// console.log(res, 'res');
if (res.data.errcode == 0) {
this.doctorList = res.data.data.list
// 使用 guest_mode 判断 + code/errcode 双重保险
const isGuest = isGuestMode();
const isNewFormat = isGuest && (res.data.code === 0 || res.data.code === '0');
const isOldFormat = !isGuest && (res.data.errcode === 0 || res.data.errcode === '0');
if (isNewFormat || isOldFormat) {
// 新接口格式:从 result 取值
// 老接口格式:从 data 取值
const responseData = isGuest && res.data.result ? res.data.result : res.data.data;
this.doctorList = responseData.list || []
}
})
},
@@ -287,8 +296,16 @@
}
}).then((res) => {
// console.log(res, 'ks');
if (res.data.errcode == 0) {
this.officeList = res.data.data
// 使用 guest_mode 判断 + code/errcode 双重保险
const isGuest = isGuestMode();
const isNewFormat = isGuest && (res.data.code === 0 || res.data.code === '0');
const isOldFormat = !isGuest && (res.data.errcode === 0 || res.data.errcode === '0');
if (isNewFormat || isOldFormat) {
// 新接口格式:从 result 取值
// 老接口格式:从 data 取值
const responseData = isGuest && res.data.result ? res.data.result : res.data.data;
this.officeList = responseData || [];
} else if (res.data.errcode != 0) {
// uni.showToast({
// title: res.data.msg,

View File

@@ -6,7 +6,7 @@
<!-- 1. 自定义吸顶导航栏 -->
<view class="custom-nav"
:class="[
storeType === '1' ? 'header-pharmacy' : 'header-clinic',
(storeType === '1' || storeType === 1) ? 'header-pharmacy' : 'header-clinic',
{ 'nav-sticky': isSticky }
]"
:style="{ paddingTop: statusBarHeight + 'px', height: (statusBarHeight + 44) + 'px' }">
@@ -14,7 +14,7 @@
<view class="nav-content">
<view class="store-info" @click="toStore">
<text class="store-name u-line-1">{{infoList.store['name'] || storeinfo[0].store['name'] || info.name || '请选择门店'}}</text>
<view class="switch-badge">
<view v-if="!isGuestMode()" class="switch-badge">
<text class="iconfont icon-qiehuan"></text> 切换
</view>
</view>
@@ -22,7 +22,7 @@
</view>
<!-- 2. 头部背景与定位区域 -->
<view class="header" :class="storeType === '1' ? 'header-pharmacy' : 'header-clinic'"
<view class="header" :class="(storeType === '1' || storeType === 1) ? 'header-pharmacy' : 'header-clinic'"
:style="{ paddingTop: (statusBarHeight + 44 + 10) + 'px' }">
<view class="bg-circle"></view>
<view class="location-bar">
@@ -52,7 +52,7 @@
<view v-for="(item, index) in homeZones" :key="index" class="zone-item" @click="goZoneList(item)">
<view class="zone-icon-box">
<image
:src="item.icon || (storeType === '1' ? 'https://img.icons8.com/fluency/48/pill.png' : 'https://img.icons8.com/fluency/48/doctor-male.png')"
:src="item.icon || ((storeType === '1' || storeType === 1) ? 'https://img.icons8.com/fluency/48/pill.png' : 'https://img.icons8.com/fluency/48/doctor-male.png')"
class="zone-img"
mode="aspectFit"
></image>
@@ -64,7 +64,7 @@
<!-- 3. 核心功能导航 (Nav) -->
<view class="nav-grid">
<!-- 诊所模式2列布局 -->
<view v-if="storeType === '0'" class="nav-clinic-grid">
<view v-if="storeType === '0' || storeType === 0" class="nav-clinic-grid">
<view class="nav-card" @click="goYard(1)">
<view class="nav-content">
<view class="nav-title" style="color:#4175EE">到店挂号</view>
@@ -82,7 +82,7 @@
</view>
<!-- 药店模式单列铺满 -->
<view v-if="storeType === '1'" class="nav-pharmacy-grid">
<view v-if="storeType === '1' || storeType === 1" class="nav-pharmacy-grid">
<view class="nav-card" @click="golist(3)">
<view class="nav-content">
<view class="nav-title" style="color:#298DFF">预约购药</view>
@@ -94,7 +94,7 @@
</view>
<!-- 4. 诊所模式内容医生列表 -->
<view v-if="storeType === '0'">
<view v-if="storeType === '0' || storeType === 0">
<view class="section-header">
<view class="section-title">医生推荐</view>
<view class="section-more" @click="goYard(1)">更多 <text class="iconfont icon-jiantou1" style="font-size: 20rpx;"></text></view>
@@ -129,7 +129,7 @@
<view class="stat-label">接诊率</view>
</view>
<view class="stat-item">
<text class="stat-num">10分钟</text>
<text class="stat-num">{{item.average_response_time || 5}}分钟</text>
<view class="stat-label">平均响应</view>
</view>
</view>
@@ -137,7 +137,7 @@
</view>
<!-- 5. 药店模式内容热销好药 -->
<view v-if="storeType === '1'">
<view v-if="storeType === '1' || storeType === 1">
<view class="section-header">
<view class="section-title">{{ topProductsTitle || '热销好药' }}</view>
<view class="section-more" @click="golist(3)">更多 <text class="iconfont icon-jiantou1" style="font-size: 20rpx;"></text></view>
@@ -212,6 +212,7 @@ import { getPlatformQualificationsApi } from '../../request/api/platform'
import { getStoreDrugListBySalespersonApi, getHomeTopProductsApi, getHomeZonesApi, checkOnlineConsultationConfigApi } from "@/request/api/product";
import request from "@/request/api/request";
import MessageNotification from "@/components/MessageNotification/MessageNotification.vue";
import { setGuestMode, isGuestMode, isLoggedIn } from '@/common/utils/auth.js';
export default {
components: {
@@ -250,16 +251,19 @@ export default {
// 解决 template 中复杂表达式导致的渲染错误
displayProductList() {
return this.topProductsList.length > 0 ? this.topProductsList : this.productList;
},
// 判断是否为guest模式用于模板
isGuestMode() {
return isGuestMode;
}
},
onLoad() {
const token = uni.getStorageSync('token')
const userInfo = uni.getStorageSync('userinfo')
if (!token || !userInfo) {
uni.navigateTo({
url: '/pages/home/index'
})
// 判断是否已登录
if (!isLoggedIn()) {
// 未登录时设置guest模式标记和store_id
setGuestMode();
}
this.isShow_envVersion = uni.getStorageSync('isShow_envVersion')
if (this.isShow_envVersion === false) {
this.getList();
@@ -273,6 +277,10 @@ export default {
}
},
onReady() {
// 未登录时也允许访问使用默认store_id=11001
if (!uni.getStorageSync('store_id')) {
uni.setStorageSync('store_id', '11001');
}
if (uni.getStorageSync('store_id')) {
this.getStore();
} else {
@@ -353,12 +361,23 @@ export default {
method: "post",
data: { store_id: uni.getStorageSync('store_id') || '11001' }
}).then((res) => {
if (res.data.errcode == 0) {
this.storeType = res.data.data.store['type']
uni.setStorageSync('store_type', res.data.data.store['type']) // 存储门店类型
this.infoList = res.data.data
this.headerTitle = res.data.data.store['name']
// 使用 guest_mode 判断 + code/errcode 双重保险
const isGuest = isGuestMode();
const isNewFormat = isGuest && (res.data.code === 0 || res.data.code === '0');
const isOldFormat = !isGuest && (res.data.errcode === 0 || res.data.errcode === '0');
if (isNewFormat || isOldFormat) {
// 新接口格式:从 result 取值
// 老接口格式:从 data 取值
const responseData = isGuest && res.data.result ? res.data.result : res.data.data;
if (responseData && responseData.store) {
this.storeType = responseData.store['type']
uni.setStorageSync('store_type', responseData.store['type']) // 存储门店类型
this.infoList = responseData
this.headerTitle = responseData.store['name']
this.getBannered();
}
}
})
} else {
@@ -383,7 +402,9 @@ export default {
this.getBannered();
}
} else {
uni.navigateTo({ url: '/pages/home/index' })
// 未登录时不跳转使用默认store_id=11001
uni.setStorageSync('store_id', '11001');
this.getBannered();
}
})
},
@@ -393,8 +414,16 @@ export default {
method: "post",
data: { store_id: uni.getStorageSync('store_id') || '11001' }
}).then((res) => {
if (res.data.errcode === 0) {
this.doctorList = (res.data.data.list).slice(0, 5)
// 使用 guest_mode 判断 + code/errcode 双重保险
const isGuest = isGuestMode();
const isNewFormat = isGuest && (res.data.code === 0 || res.data.code === '0');
const isOldFormat = !isGuest && (res.data.errcode === 0 || res.data.errcode === '0');
if (isNewFormat || isOldFormat) {
// 新接口格式:从 result 取值
// 老接口格式:从 data 取值
const responseData = isGuest && res.data.result ? res.data.result : res.data.data;
this.doctorList = (responseData.list || []).slice(0, 5)
}
})
},
@@ -411,11 +440,22 @@ export default {
method: "post",
data: { store_id: uni.getStorageSync('store_id') || '11001' }
}).then((res) => {
if (res.data.errcode == 0) {
this.info = res.data.data
this.urlInfo = res.data.data.nav
this.storeType = res.data.data.type
this.list = (res.data.data.nav).map((item) => { return item.pic })
// 使用 guest_mode 判断 + code/errcode 双重保险
const isGuest = isGuestMode();
const isNewFormat = isGuest && (res.data.code === 0 || res.data.code === '0');
const isOldFormat = !isGuest && (res.data.errcode === 0 || res.data.errcode === '0');
if (isNewFormat || isOldFormat) {
// 新接口格式:从 result 取值
// 老接口格式:从 data 取值
const responseData = isGuest && res.data.result ? res.data.result : res.data.data;
if (responseData) {
this.info = responseData
this.urlInfo = responseData.nav || []
this.storeType = responseData.type
this.list = (responseData.nav || []).map((item) => { return item.pic })
}
}
})
},

View File

@@ -130,7 +130,7 @@
<view class="list_nums">
<view class="txt">问诊量 <text>{{item.inquiry_num }}</text></view>
<view class="txt">接诊率 <text>{{item.accept_percent}}</text></view>
<!-- <view class="txt">综合评分 <text>{{item.overall_score}}</text></view> -->
<view class="txt">综合评分 <text>{{item.overall_score}}</text></view>
</view>
</view>
</view>
@@ -146,6 +146,7 @@
getBanner,
getOpen
} from '../../request/api/api'
import { isGuestMode } from '@/common/utils/auth.js'
export default {
data() {
return {
@@ -208,8 +209,16 @@
}
}).then((res) => {
// console.log(res, 'list');
if (res.data.errcode == 0) {
this.doctorList = (res.data.data.list).slice(0, 3)
// 使用 guest_mode 判断 + code/errcode 双重保险
const isGuest = isGuestMode();
const isNewFormat = isGuest && (res.data.code === 0 || res.data.code === '0');
const isOldFormat = !isGuest && (res.data.errcode === 0 || res.data.errcode === '0');
if (isNewFormat || isOldFormat) {
// 新接口格式:从 result 取值
// 老接口格式:从 data 取值
const responseData = isGuest && res.data.result ? res.data.result : res.data.data;
this.doctorList = (responseData.list || []).slice(0, 3)
}
})
this.getBannered()

View File

@@ -65,6 +65,8 @@ import {
getsLogin, storeChange
} from '../../request/api/api.js'
import {bindUserApi} from "@/request/api/salesperson";
import { clearGuestMode, getRedirectInfo, clearRedirectInfo, buildUrlWithParams } from '@/common/utils/auth.js';
import { performLogin } from '@/utils/login.js';
export default {
data() {
@@ -95,8 +97,8 @@ export default {
},
methods: {
back() {
uni.navigateTo({
url: "/pages/home/index",
uni.reLaunch({
url: "/pages/home/home",
fail: (e) => {
// console.log(e);
},
@@ -162,69 +164,15 @@ export default {
})
},
getToLogin(e) {
uni.showLoading({
title: "登录中"
async getToLogin(e) {
// 使用抽离的登录函数,非静默模式(显示提示,执行跳转)
const result = await performLogin({
silent: false,
toastRef: this.$refs.uToast
});
uni.login({
provider: 'weixin',
success: (loginRes) => {
this.code = loginRes.code
getsLogin({
method: "post",
data: {
code: this.code,
status: 1
}
}).then((res) => {
uni.hideLoading();
if (res.data.errcode == 0) {
uni.setStorageSync('token', res.data.data.token) //存储token
uni.setStorageSync('user_id', res.data.data.data.user.id)
uni.setStorageSync('userinfo', res.data.data.data['user'])
if (uni.getStorageSync('salesperson_id')) {
bindUserApi({
user_id: res.data.data.data.user.id,
salesperson_id: uni.getStorageSync('salesperson_id'),
}).then((res) => {
console.log(res, 'bindUserApi', res);
})
}
if (uni.getStorageSync('store_id')) {
storeChange({
method: "post",
data: {
store_id: uni.getStorageSync('store_id')
}
})
} else {
uni.setStorageSync('store_id', res.data.data.data.store_id)
}
if (res.data.data.data.user.mobile != '') {
setTimeout(function () {
uni.reLaunch({
url: '/pages/home/home'
})
}, 500)
} else {
// this.getPhoneNumber(e);
}
} else if (res.data.errcode != 0) {
this.$refs.uToast.show({
title: res.data.msg,
type: 'default',
icon: false
})
}
})
}
})
// 登录成功后的处理已在 performLogin 中完成
// 这里可以添加额外的处理逻辑(如果需要)
},
},
mounted() {