Compare commits

...
2 Commits
Author SHA1 Message Date
fuenmao 8ce6bec02d Merge branch 'main' of https://gitea.cnzhyx.cn/yuanlin/Evergreen-Health-Mobile 2026-09-21 16:12:51 +08:00
fuenmao 2769773667 1111 2026-09-21 16:12:48 +08:00
2 changed files with 89 additions and 23 deletions
+55 -7
View File
@@ -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
View File
@@ -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>