Compare commits
2
Commits
b362f627f1
...
8ce6bec02d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ce6bec02d | ||
|
|
2769773667 |
+55
-7
@@ -33,22 +33,70 @@ button { cursor: pointer; }
|
||||
linear-gradient(145deg, #0b5548, #123d37 74%);
|
||||
border-radius: 0 0 42px 42px;
|
||||
}
|
||||
.brand-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 5px 14px 5px 6px;
|
||||
background: rgba(255, 255, 255, 0.12);
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
border-radius: 24px;
|
||||
font-size: 12px;
|
||||
margin-bottom: 20px;
|
||||
backdrop-filter: blur(8px);
|
||||
}
|
||||
.brand-badge-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
background: var(--gold);
|
||||
color: #fff;
|
||||
border-radius: 50%;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
font-family: serif;
|
||||
font-weight: 700;
|
||||
font-size: 13px;
|
||||
}
|
||||
.brand-mark {
|
||||
display: grid; place-items: center; width: 48px; height: 48px; margin-bottom: 28px;
|
||||
border: 1px solid rgba(255,255,255,.42); border-radius: 50%; font-family: serif; font-size: 24px;
|
||||
}
|
||||
.brand-panel h1 { max-width: 560px; margin: 0; font-family: "Songti SC", serif; font-size: clamp(32px, 8vw, 54px); line-height: 1.2; font-weight: 500; }
|
||||
.brand-copy { max-width: 480px; margin: 18px 0 24px; color: rgba(255,255,255,.72); line-height: 1.7; }
|
||||
.feature-row { display: flex; gap: 10px; flex-wrap: wrap; }
|
||||
.feature-row span { padding: 7px 12px; background: rgba(255,255,255,.09); border: 1px solid rgba(255,255,255,.14); border-radius: 20px; font-size: 12px; }
|
||||
.feature-row, .feature-pill-row { display: flex; gap: 8px; flex-wrap: wrap; }
|
||||
.feature-row span, .feature-pill-row span { padding: 6px 12px; background: rgba(255,255,255,.1); border: 1px solid rgba(255,255,255,.16); border-radius: 20px; font-size: 12px; }
|
||||
|
||||
.auth-card { position: relative; width: min(520px, calc(100% - 32px)); margin: -20px auto 0; padding: 28px 22px; background: #fff; border-radius: 24px; box-shadow: 0 18px 50px rgba(24,59,52,.12); }
|
||||
.auth-heading h2 { margin: 0; font-family: "Songti SC", serif; font-size: 28px; }
|
||||
.auth-heading > p:last-child { margin: 8px 0 24px; color: #70817d; font-size: 14px; }
|
||||
.auth-card { position: relative; width: min(520px, calc(100% - 32px)); margin: -20px auto 0; padding: 24px 20px; background: #fff; border-radius: 24px; box-shadow: 0 18px 50px rgba(24,59,52,.12); }
|
||||
.auth-tab-switch {
|
||||
display: flex;
|
||||
background: #f1efea;
|
||||
border-radius: 12px;
|
||||
padding: 3px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.auth-tab-switch button {
|
||||
flex: 1;
|
||||
padding: 9px 0;
|
||||
border: 0;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
border-radius: 9px;
|
||||
color: #72847d;
|
||||
background: transparent;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
.auth-tab-switch button.active {
|
||||
background: #ffffff;
|
||||
color: var(--green);
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
|
||||
}
|
||||
.auth-heading h2 { margin: 0; font-family: "Songti SC", serif; font-size: 24px; }
|
||||
.auth-heading > p:last-child { margin: 8px 0 20px; color: #70817d; font-size: 13px; }
|
||||
.auth-card .van-field { margin-bottom: 12px; padding: 14px 12px; background: #f7f7f3; border-radius: 12px; }
|
||||
.auth-card .van-button { margin-top: 20px; height: 48px; }
|
||||
.auth-card .van-button { margin-top: 18px; height: 48px; font-size: 15px; font-weight: 600; }
|
||||
.text-button { display: block; margin: 18px auto 0; border: 0; background: transparent; color: var(--green); font-size: 14px; }
|
||||
.privacy-note { margin: 20px 0 0; color: #9a9f9c; font-size: 11px; line-height: 1.6; text-align: center; }
|
||||
.privacy-note { margin: 18px 0 0; color: #9a9f9c; font-size: 11px; line-height: 1.6; text-align: center; }
|
||||
|
||||
.page-shell { min-height: 100vh; padding: 28px 16px 110px; background: #f3f1ea; }
|
||||
.page-header, .dashboard-header { max-width: 760px; margin: 0 auto 24px; padding: 12px 4px; }
|
||||
|
||||
+34
-16
@@ -9,7 +9,7 @@ const router = useRouter()
|
||||
const mode = ref<'login' | 'register'>('login')
|
||||
const loading = ref(false)
|
||||
const form = reactive({ phone: '', password: '', displayName: '' })
|
||||
const title = computed(() => mode.value === 'login' ? '欢迎回来' : '创建健康档案')
|
||||
const title = computed(() => mode.value === 'login' ? '欢迎回来' : '开启专属健康档案')
|
||||
|
||||
async function submit() {
|
||||
loading.value = true
|
||||
@@ -31,20 +31,41 @@ async function submit() {
|
||||
<template>
|
||||
<main class="auth-page">
|
||||
<section class="brand-panel">
|
||||
<div class="brand-mark">常</div>
|
||||
<div class="brand-badge">
|
||||
<span class="brand-badge-icon">常</span>
|
||||
<span>一人一方 · 康养管理</span>
|
||||
</div>
|
||||
<p class="eyebrow">EVERGREEN HEALTH</p>
|
||||
<h1>一人一方<br />健康与空间协同管理</h1>
|
||||
<p class="brand-copy">从睡眠、运动与饮食开始,让环境与健康方案每天同步。</p>
|
||||
<div class="feature-row">
|
||||
<span>个性方案</span><span>智能场景</span><span>持续反馈</span>
|
||||
<h1>一人一方<br />健康与空间协同</h1>
|
||||
<p class="brand-copy">以睡眠为切入点,融合五感空间与动态健康方案,开启日常健康管理。</p>
|
||||
<div class="feature-pill-row">
|
||||
<span>🌿 六维处方</span><span>🌙 五感微环境</span><span>📊 闭环调理</span>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="auth-card">
|
||||
<div class="auth-tab-switch">
|
||||
<button
|
||||
type="button"
|
||||
:class="{ active: mode === 'login' }"
|
||||
@click="mode = 'login'"
|
||||
>
|
||||
账号登录
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
:class="{ active: mode === 'register' }"
|
||||
@click="mode = 'register'"
|
||||
>
|
||||
注册建档
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="auth-heading">
|
||||
<p class="eyebrow">常青树健康管理</p>
|
||||
<h2>{{ title }}</h2>
|
||||
<p>{{ mode === 'login' ? '登录后查看今日健康方案' : '第一步,建立您的专属健康账户' }}</p>
|
||||
<h2 style="font-size: 20px; font-weight: 700; color: #142e27; margin-bottom: 4px;">{{ title }}</h2>
|
||||
<p style="color: #72847d; font-size: 13px; margin-bottom: 16px;">
|
||||
{{ mode === 'login' ? '登录后查看今日健康方案与空间联动' : '第一步,填写信息创建您的专属健康档案' }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<van-form @submit="submit">
|
||||
@@ -60,25 +81,22 @@ async function submit() {
|
||||
type="tel"
|
||||
label="手机号"
|
||||
maxlength="11"
|
||||
placeholder="请输入手机号"
|
||||
placeholder="请输入 11 位手机号"
|
||||
:rules="[{ pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号' }]"
|
||||
/>
|
||||
<van-field
|
||||
v-model="form.password"
|
||||
type="password"
|
||||
label="密码"
|
||||
placeholder="至少 8 位"
|
||||
placeholder="至少 8 位密码"
|
||||
:rules="[{ required: true, message: '请输入至少 8 位密码' }]"
|
||||
/>
|
||||
<van-button block round color="#0c5045" native-type="submit" :loading="loading">
|
||||
{{ mode === 'login' ? '登录' : '注册并继续' }}
|
||||
{{ mode === 'login' ? '登 录' : '创建档案并继续' }}
|
||||
</van-button>
|
||||
</van-form>
|
||||
|
||||
<button class="text-button" type="button" @click="mode = mode === 'login' ? 'register' : 'login'">
|
||||
{{ mode === 'login' ? '还没有账户?立即注册' : '已有账户?返回登录' }}
|
||||
</button>
|
||||
<p class="privacy-note">继续即表示您同意仅将健康信息用于生成个人健康管理建议。</p>
|
||||
<p class="privacy-note">🔒 数据安全说明:所有健康数据仅用于为您生成生活方式干预建议。</p>
|
||||
</section>
|
||||
</main>
|
||||
</template>
|
||||
|
||||
Reference in New Issue
Block a user