feat: introduction

This commit is contained in:
skytek_xinliang
2026-06-25 10:07:46 +08:00
parent 6fed299c56
commit b56c59dd42
12 changed files with 146 additions and 10 deletions
+2
View File
@@ -7,3 +7,5 @@ opencode.json
node_modules node_modules
dist dist
*:Zone.Identifier
Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

@@ -88,6 +88,13 @@
to="/" to="/"
/> />
<v-list-item
color="primary"
prepend-icon="mdi-information-outline"
title="計畫簡介"
to="/introduction"
/>
<v-list-item <v-list-item
color="primary" color="primary"
prepend-icon="mdi-clipboard-text-search" prepend-icon="mdi-clipboard-text-search"
+25 -7
View File
@@ -79,6 +79,14 @@
<HealthRadarChart :radar-data="store.radarData" /> <HealthRadarChart :radar-data="store.radarData" />
</v-card> </v-card>
<ModuleRouterCard
description="了解公益普測計畫、研究依據與平台流程。"
icon="mdi-information-outline"
icon-color="primary"
title="簡介"
to="/introduction"
/>
<ModuleRouterCard <ModuleRouterCard
description="完成線上自評,取得初步風險分級。" description="完成線上自評,取得初步風險分級。"
icon="mdi-clipboard-text-search" icon="mdi-clipboard-text-search"
@@ -172,7 +180,9 @@
color="primary" color="primary"
variant="flat" variant="flat"
@click="prescriptionDialog = false" @click="prescriptionDialog = false"
>確認關閉</v-btn> >
確認關閉
</v-btn>
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-dialog> </v-dialog>
@@ -183,7 +193,7 @@
<BrandAvatar class="elevation-2" :icon-size="42" :size="72" /> <BrandAvatar class="elevation-2" :icon-size="42" :size="72" />
</div> </div>
<v-card class="rounded-xl elevation-2 mb-12 py-4" color="surface"> <v-card class="rounded-xl elevation-2 mb-4 py-4" color="surface">
<v-card-text> <v-card-text>
<div class="d-flex align-center mb-4"> <div class="d-flex align-center mb-4">
<v-avatar class="mr-4 text-white" color="accent" size="36"> <v-avatar class="mr-4 text-white" color="accent" size="36">
@@ -222,20 +232,28 @@
> >
登入平台 登入平台
</v-btn> </v-btn>
</v-card-text>
</v-card>
<v-card color="surface" variant="flat"> <div class="d-flex align-center mt-4">
<v-card-text class="pa-4 d-flex align-center text-left">
<v-icon class="mr-3" color="primary" icon="mdi-lock-outline" size="28" /> <v-icon class="mr-3" color="primary" icon="mdi-lock-outline" size="28" />
<div> <div>
<div class="font-weight-bold text-grey-darken-4">登入後可使用完整功能</div> <div class="font-weight-bold text-grey-darken-4">登入後可使用完整功能</div>
<div class="text-title-small text-grey">普測預約現場報到量測紀錄與運動處方</div> <div class="text-title-small text-grey">
普測預約現場報到量測紀錄與運動處方
</div>
</div>
</div> </div>
</v-card-text> </v-card-text>
</v-card> </v-card>
<ModuleRouterCard
description="了解公益普測計畫、研究依據與平台流程。"
icon="mdi-information-outline"
icon-color="primary"
title="簡介"
to="/introduction"
/>
</template> </template>
</template> </template>
</Layout> </Layout>
@@ -0,0 +1,87 @@
<script setup lang="ts">
import Layout from '@/components/layout/DefaultLayout.vue'
const slides = [
{
title: '公益普測計畫',
src: new URL('../assets/introduction/公益普測計畫.jpg', import.meta.url).href,
},
{
title: '全齡功能性體適能衰退之研究',
src: new URL(
'../assets/introduction/全齡功能性體適能衰退之研究/0- 全齡功能性體適能衰退之研究.jpg',
import.meta.url,
).href,
},
{
title: '研究總覽',
src: new URL(
'../assets/introduction/全齡功能性體適能衰退之研究/1 - 研究總覽.jpg',
import.meta.url,
).href,
},
{
title: '方法與指標',
src: new URL(
'../assets/introduction/全齡功能性體適能衰退之研究/2 - 方法與指標.jpg',
import.meta.url,
).href,
},
{
title: '主要結果',
src: new URL(
'../assets/introduction/全齡功能性體適能衰退之研究/3 - 主要結果.jpg',
import.meta.url,
).href,
},
{
title: '研究總覽',
src: new URL(
'../assets/introduction/全齡功能性體適能衰退之研究/4 - 研究總覽.jpg',
import.meta.url,
).href,
},
]
</script>
<template>
<Layout>
<template #main>
<v-card variant="flat">
<v-card-title class="font-weight-bold text-primary d-flex align-center">
<v-icon class="mr-4" color="accent" icon="mdi-information-outline" />
計畫簡介
</v-card-title>
<v-carousel class="introduction-carousel" hide-delimiters show-arrows="hover">
<v-carousel-item
v-for="slide in slides"
:key="slide.src"
:alt="slide.title"
:src="slide.src"
/>
</v-carousel>
</v-card>
</template>
</Layout>
</template>
<style scoped>
.introduction-carousel {
background: #f5f7f8;
height: min(58vh, 440px);
min-height: 220px;
}
.introduction-carousel :deep(.v-window__container),
.introduction-carousel :deep(.v-window-item),
.introduction-carousel :deep(.v-responsive),
.introduction-carousel :deep(.v-img) {
height: 100%;
}
.introduction-carousel :deep(.v-img__img) {
object-fit: contain;
object-position: center;
}
</style>
@@ -61,6 +61,19 @@
/> />
</v-col> </v-col>
<v-col cols="12" sm="6">
<v-text-field
v-model="profileForm.phone"
class="mb-3"
color="primary"
density="comfortable"
hide-details="auto"
label="手機號碼"
type="tel"
variant="outlined"
/>
</v-col>
<v-col cols="12" sm="6"> <v-col cols="12" sm="6">
<v-select <v-select
v-model="profileForm.gender" v-model="profileForm.gender"
@@ -361,6 +374,7 @@ const stepNames = ['基本資料', '功能狀態', '健康限制', '自評結果
const profileForm = reactive({ const profileForm = reactive({
name: store.userProfile.name, name: store.userProfile.name,
phone: store.userProfile.phone,
birthday: store.userProfile.birthday, birthday: store.userProfile.birthday,
gender: store.userProfile.gender, gender: store.userProfile.gender,
height: store.userProfile.height, height: store.userProfile.height,
@@ -462,6 +476,7 @@ function handleSubmit () {
// 儲存至 store // 儲存至 store
store.updateProfile({ store.updateProfile({
name: profileForm.name, name: profileForm.name,
phone: profileForm.phone,
birthday: profileForm.birthday, birthday: profileForm.birthday,
gender: profileForm.gender, gender: profileForm.gender,
height: profileForm.height, height: profileForm.height,
+7
View File
@@ -3,6 +3,7 @@ import Appointment from '@/pages/appointment.vue'
import Checkin from '@/pages/checkin.vue' import Checkin from '@/pages/checkin.vue'
import CheckinDetail from '@/pages/checkinDetail.vue' import CheckinDetail from '@/pages/checkinDetail.vue'
import Index from '@/pages/index.vue' import Index from '@/pages/index.vue'
import Introduction from '@/pages/introduction.vue'
import Login from '@/pages/login.vue' import Login from '@/pages/login.vue'
import SelfAssessment from '@/pages/self-assessment.vue' import SelfAssessment from '@/pages/self-assessment.vue'
import { useAppStore } from '@/stores/app' import { useAppStore } from '@/stores/app'
@@ -18,6 +19,12 @@ const router = createRouter({
name: 'home', name: 'home',
component: Index, component: Index,
}, },
{
path: '/introduction',
name: 'introduction',
component: Introduction,
meta: { title: '計畫簡介|運動玩轉健康力' },
},
{ {
path: '/login', path: '/login',
name: 'login', name: 'login',