Files
medical-mall/App.uvue

463 lines
12 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script lang="uts">
import { setIsLoggedIn, setUserProfile, getCurrentUser } from '@/utils/store.uts'
import supa from '@/components/supadb/aksupainstance.uts'
import { HOME_REDIRECT } from '@/ak/config.uts'
import { handleDeliveryUnauthorized, isCurrentDeliveryPage } from '@/utils/deliveryAuth.uts'
import { CURRENT_PAGES_MODE } from '@/utils/pagesMode.uts'
export default {
onLaunch: function () {
console.log('App Launch')
uni.$on('AUTH_SESSION_EXPIRED', () => {
this.handleAuthSessionExpired()
})
// 检查是否已有有效会话,有则恢复登录状态
this.checkExistingSession()
},
onShow: function () {
console.log('App Show')
},
onHide: function () {
console.log('App Hide')
},
methods: {
handleAuthSessionExpired: function(): void {
if (isCurrentDeliveryPage()) {
handleDeliveryUnauthorized('', '')
}
},
shouldGuestBrowseHome: function(): boolean {
return CURRENT_PAGES_MODE == 'consumer' || CURRENT_PAGES_MODE == 'full'
},
getLoginEntryUrl: function(): string {
if (CURRENT_PAGES_MODE == 'delivery') {
return '/pages/user/login?mode=delivery'
}
if (CURRENT_PAGES_MODE == 'merchant') {
return '/pages/user/login?mode=merchant'
}
return '/pages/user/login'
},
safeReLaunch: function(targetUrl: string, fallbackUrl: string): void {
try {
uni.reLaunch({
url: targetUrl,
fail: function() {
if (fallbackUrl !== '') {
uni.reLaunch({ url: fallbackUrl })
}
}
})
} catch (e) {
if (fallbackUrl !== '') {
try {
uni.reLaunch({ url: fallbackUrl })
} catch (ee) {
console.warn('safeReLaunch fallback failed', ee)
}
}
}
},
checkExistingSession: function(): void {
if (CURRENT_PAGES_MODE == 'delivery') {
this.safeReLaunch(this.getLoginEntryUrl(), '/pages/user/login')
return
}
// 检查是否已有有效会话
const session = supa.getSession()
if (session.user != null) {
console.log('已有有效会话,恢复登录状态')
setIsLoggedIn(true)
// #ifdef H5
this.safeReLaunch(HOME_REDIRECT, '/pages/user/login')
// #endif
// #ifdef MP-WEIXIN
this.safeReLaunch(HOME_REDIRECT, '/pages/user/login')
// #endif
// #ifndef H5 || MP-WEIXIN
this.safeReLaunch(HOME_REDIRECT, '/pages/user/login')
// #endif
return
}
// 检查本地存储的登录状态
const savedUserId = uni.getStorageSync('user_id')
if (savedUserId != null && savedUserId != '') {
console.log('本地存储中有用户ID尝试恢复会话')
getCurrentUser().then((profile) => {
if (profile != null) {
console.log('会话恢复成功')
setIsLoggedIn(true)
// #ifdef H5
this.safeReLaunch(HOME_REDIRECT, '/pages/user/login')
// #endif
// #ifdef MP-WEIXIN
this.safeReLaunch(HOME_REDIRECT, '/pages/user/login')
// #endif
// #ifndef H5 || MP-WEIXIN
this.safeReLaunch(HOME_REDIRECT, '/pages/user/login')
// #endif
}
}).catch(() => {
console.log('会话恢复失败,需要重新登录')
setIsLoggedIn(false)
if (this.shouldGuestBrowseHome()) {
console.log('consumer 模式允许游客浏览首页,恢复失败后继续进入首页')
this.safeReLaunch(HOME_REDIRECT, '/pages/user/login')
} else {
this.safeReLaunch(this.getLoginEntryUrl(), '/pages/user/login')
}
})
return
}
if (this.shouldGuestBrowseHome()) {
console.log('无有效会话consumer 模式允许游客浏览首页')
setIsLoggedIn(false)
this.safeReLaunch(HOME_REDIRECT, '/pages/user/login')
return
}
// 没有有效会话,显示登录页
console.log('无有效会话,显示登录页')
this.safeReLaunch(this.getLoginEntryUrl(), '/pages/user/login')
}
}
}
</script>
<style>
/* #ifdef H5 */
/* 引入管理后台通用响应式样式(仅 H5 需要) */
@import "@/layouts/admin/styles/admin-responsive.css";
/* ===== 全局重置样式H5===== */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body {
height: 100%;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
font-size: 14px;
line-height: 1.5;
color: #262626;
background-color: #f0f2f5;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* #endif */
view, text, input, textarea, button {
box-sizing: border-box;
}
/* ===== 全局主题色 (建议移动到 uni.scss 或使用 class) ===== */
/* :root 选择器在 UVUE 中可能不支持,建议定义为 class */
.theme-vars {
/* 主色调 */
--primary-color: #1890ff;
--primary-hover: #40a9ff;
--primary-active: #096dd9;
/* 成功色 */
--success-color: #52c41a;
--success-hover: #73d13d;
--success-active: #389e0d;
/* 警告色 */
--warning-color: #faad14;
--warning-hover: #ffc53d;
--warning-active: #d48806;
/* 错误色 */
--error-color: #ff4d4f;
--error-hover: #ff7875;
--error-active: #d4380d;
/* 中性色 */
--text-primary: #262626;
--text-secondary: #595959;
--text-disabled: #bfbfbf;
--text-inverse: #ffffff;
/* 边框色 */
--border-color: #d9d9d9;
--border-color-light: #f0f0f0;
--border-color-dark: #bfbfbf;
/* 背景色 */
--background-color: #ffffff;
--background-color-light: #fafafa;
--background-color-dark: #f5f5f5;
/* 阴影 */
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08);
--shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
--shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.08);
--shadow-xl: 0 6px 16px rgba(0, 0, 0, 0.12);
/* 圆角 */
--border-radius-sm: 2px;
--border-radius: 4px;
--border-radius-lg: 6px;
--border-radius-xl: 8px;
/* 间距 */
--spacing-xs: 4px;
--spacing-sm: 8px;
--spacing: 16px;
--spacing-lg: 24px;
--spacing-xl: 32px;
--spacing-xxl: 48px;
/* 字体大小 */
--font-size-xs: 12px;
--font-size-sm: 14px;
--font-size: 16px;
--font-size-lg: 18px;
--font-size-xl: 20px;
--font-size-xxl: 24px;
/* 行高 */
--line-height-tight: 1.25;
--line-height-normal: 1.5;
--line-height-relaxed: 1.75;
}
/* ===== 全局字体设置 ===== */
.text-xs { font-size: var(--font-size-xs); }
.text-sm { font-size: var(--font-size-sm); }
.text-base { font-size: var(--font-size); }
.text-lg { font-size: var(--font-size-lg); }
.text-xl { font-size: var(--font-size-xl); }
.text-2xl { font-size: var(--font-size-xxl); }
.font-medium { font-weight: 400; } /* UVUE不支持500 */
.font-semibold { font-weight: 700; } /* UVUE不支持600 */
.font-bold { font-weight: 700; }
/* ===== 全局颜色类 ===== */
.text-primary { color: var(--primary-color); }
.text-success { color: var(--success-color); }
.text-warning { color: var(--warning-color); }
.text-error { color: var(--error-color); }
.text-secondary { color: var(--text-secondary); }
.text-disabled { color: var(--text-disabled); }
/* ===== 全局背景类 ===== */
.bg-white { background-color: var(--background-color); }
.bg-light { background-color: var(--background-color-light); }
.bg-dark { background-color: var(--background-color-dark); }
/* ===== 全局边框类 ===== */
.border { border: 1px solid var(--border-color); }
.border-light { border: 1px solid var(--border-color-light); }
.border-primary { border: 1px solid var(--primary-color); }
/* ===== 全局阴影类 ===== */
.shadow-sm { box-shadow: var(--shadow-sm); }
.shadow { box-shadow: var(--shadow); }
.shadow-lg { box-shadow: var(--shadow-lg); }
.shadow-xl { box-shadow: var(--shadow-xl); }
/* ===== 全局圆角类 ===== */
.rounded-sm { border-radius: var(--border-radius-sm); }
.rounded { border-radius: var(--border-radius); }
.rounded-lg { border-radius: var(--border-radius-lg); }
.rounded-xl { border-radius: var(--border-radius-xl); }
/* ===== 全局间距类 ===== */
.m-1 { margin: var(--spacing-xs); }
.m-2 { margin: var(--spacing-sm); }
.m-3 { margin: var(--spacing); }
.m-4 { margin: var(--spacing-lg); }
.m-5 { margin: var(--spacing-xl); }
.p-1 { padding: var(--spacing-xs); }
.p-2 { padding: var(--spacing-sm); }
.p-3 { padding: var(--spacing); }
.p-4 { padding: var(--spacing-lg); }
.p-5 { padding: var(--spacing-xl); }
/* ===== 全局布局类 ===== */
.flex { display: flex; }
.inline-flex { display: flex; } /* UVUE仅支持flex */
.block { display: flex; } /* UVUE仅支持flex */
.inline-block { display: flex; } /* UVUE仅支持flex */
.flex-col { flex-direction: column; }
.flex-row { flex-direction: row; }
.flex-wrap { flex-wrap: wrap; }
.flex-nowrap { flex-wrap: nowrap; }
.items-start { align-items: flex-start; }
.items-center { align-items: center; }
.items-end { align-items: flex-end; }
.items-stretch { align-items: stretch; }
.justify-start { justify-content: flex-start; }
.justify-center { justify-content: center; }
.justify-end { justify-content: flex-end; }
.justify-between { justify-content: space-between; }
.justify-around { justify-content: space-around; }
.flex-1 { flex: 1; }
.flex-auto { flex: auto; }
.flex-none { flex: none; }
/* ===== 全局工具类 ===== */
.w-full { width: 100%; }
.h-full { height: 100%; }
.text-left { text-align: left; }
.text-center { text-align: center; }
.text-right { text-align: right; }
/* .cursor-pointer { cursor: pointer; } */
/* .cursor-default { cursor: default; } */
/* ===== 响应式断点 (App-UVUE 不支持 @media :root) ===== */
/*
@media (min-width: 1200px) {
:root {
--container-width: 1200px;
}
}
@media (max-width: 1199px) and (min-width: 768px) {
:root {
--container-width: 100%;
}
}
@media (max-width: 767px) {
:root {
--container-width: 100%;
}
}
*/
/* ===== App根容器 ===== */
.app-root {
/* min-height: 100vh; */ /* UVUE不支持vh */
background-color: var(--background-color);
flex: 1;
}
/* ===== 24栅格系统 (App-UVUE暂不支持百分比max-width) ===== */
/*
.row {
display: flex;
flex-wrap: wrap;
margin: 0 calc(-1 * var(--spacing-sm));
}
.col {
padding: 0 var(--spacing-sm);
}
.col-1 { flex: 0 0 4.16666667%; max-width: 4.16666667%; }
/* Grid system disabled */
/* (Grid system md disabled) */
/* ===== 按钮基础样式 ===== */
.btn {
display: flex; /* UVUE 不支持 inline-flex */
align-items: center;
justify-content: center;
padding: var(--spacing-sm) var(--spacing);
font-size: var(--font-size-sm);
font-weight: 400;
line-height: var(--line-height-tight);
white-space: nowrap;
border: 1px solid transparent;
border-radius: var(--border-radius);
/* cursor: pointer; */
transition: all 0.2s ease;
/* user-select: none; */
}
.btn:disabled {
opacity: 0.6;
/* cursor: not-allowed; */
}
.btn-primary {
color: var(--text-inverse);
background-color: var(--primary-color);
border-color: var(--primary-color);
}
/* .btn-primary:hover:not(:disabled) {
background-color: var(--primary-hover);
border-color: var(--primary-hover);
} */
.btn-secondary {
color: var(--text-secondary);
background-color: var(--background-color);
border-color: var(--border-color);
}
/* .btn-secondary:hover:not(:disabled) {
color: var(--primary-color);
border-color: var(--primary-color);
} */
/* ===== 卡片基础样式 ===== */
.card {
background-color: var(--background-color);
border: 1px solid var(--border-color-light);
border-radius: var(--border-radius-lg);
box-shadow: var(--shadow);
overflow: hidden;
}
/* ===== 输入框基础样式 ===== */
.input {
display: flex; /* UVUE 不支持 block */
width: 100%;
padding: var(--spacing-sm) var(--spacing);
font-size: var(--font-size-sm);
line-height: var(--line-height-tight);
color: var(--text-primary);
background-color: var(--background-color);
border: 1px solid var(--border-color);
border-radius: var(--border-radius);
transition: border-color 0.2s ease;
}
.input:focus {
/* outline: none; */
border-color: var(--primary-color);
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
/* ===== 滚动条样式 (App-UVUE 不支持 CSS 滚动条设置) ===== */
/*
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: var(--background-color-light);
border-radius: 3px;
}
::-webkit-scrollbar-thumb {
background: var(--border-color);
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--text-disabled);
}
*/
</style>