fix: 各種

This commit is contained in:
skytek_xinliang
2026-09-15 10:27:09 +08:00
parent 2ccb073f16
commit 043d924322
6 changed files with 116 additions and 76 deletions
@@ -49,7 +49,7 @@
</v-btn> </v-btn>
</v-alert> </v-alert>
<v-row density="comfortable"> <v-row density="compact">
<v-col <v-col
v-for="item in displayItems" v-for="item in displayItems"
:key="item.fitnessCode" :key="item.fitnessCode"
@@ -58,7 +58,7 @@
md="4" md="4"
> >
<div <div
class="test-item d-flex align-center justify-space-between rounded-lg pa-3" class="test-item d-flex align-center justify-space-between rounded-lg px-3"
> >
<div class="mr-3"> <div class="mr-3">
<div class="text-body-2 font-weight-bold"> <div class="text-body-2 font-weight-bold">
@@ -129,7 +129,7 @@ const completedCount = computed(
<style scoped> <style scoped>
.test-item { .test-item {
min-height: 72px; min-height: 48px;
border: 1px solid rgba(0, 0, 0, 0.08); border: 1px solid rgba(0, 0, 0, 0.08);
background: rgba(var(--v-theme-primary), 0.03); background: rgba(var(--v-theme-primary), 0.03);
} }
@@ -117,6 +117,7 @@
/> />
<v-list-item <v-list-item
v-if="SELF_ASSESSMENT_ENABLED"
color="primary" color="primary"
prepend-icon="mdi-clipboard-text-search" prepend-icon="mdi-clipboard-text-search"
title="線上健康自評" title="線上健康自評"
@@ -198,7 +199,9 @@
<!-- 底部導航欄 (Mobile First 核心) --> <!-- 底部導航欄 (Mobile First 核心) -->
<v-bottom-navigation <v-bottom-navigation
v-if="BOTTOM_NAVIGATION_ENABLED"
v-model="activeTab" v-model="activeTab"
density="compact"
bg-color="background" bg-color="background"
color="primary-darken-1" color="primary-darken-1"
grow grow
@@ -211,7 +214,11 @@
<span class="bottom-nav-text">首頁</span> <span class="bottom-nav-text">首頁</span>
</v-btn> </v-btn>
<v-btn to="/self-assessment" value="self-assessment"> <v-btn
v-if="SELF_ASSESSMENT_ENABLED"
to="/self-assessment"
value="self-assessment"
>
<v-icon :color="getBottomNavIconColor('self-assessment')"> <v-icon :color="getBottomNavIconColor('self-assessment')">
mdi-clipboard-text-search mdi-clipboard-text-search
</v-icon> </v-icon>
@@ -259,7 +266,7 @@
<ul class="pl-4 mb-3"> <ul class="pl-4 mb-3">
<li>提供個人化的運動與健康改善建議。</li> <li>提供個人化的運動與健康改善建議。</li>
<li>於普測活動現場合對您的身分。</li> <li>於活動現場合對您的身分。</li>
<li>在去識別化的安全機制下,作為高齡健康促進的政策分析參考。</li> <li>在去識別化的安全機制下,作為高齡健康促進的政策分析參考。</li>
</ul> </ul>
@@ -287,7 +294,12 @@
import { ref, watch } from "vue"; import { ref, watch } from "vue";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
import { useDisplayUserName } from "@/composables/useDisplayUserName"; import { useDisplayUserName } from "@/composables/useDisplayUserName";
import { APPOINTMENT_ENABLED, CHECKIN_ENABLED } from "@/config/features"; import {
APPOINTMENT_ENABLED,
BOTTOM_NAVIGATION_ENABLED,
CHECKIN_ENABLED,
SELF_ASSESSMENT_ENABLED,
} from "@/config/features";
import { useAppStore } from "@/stores/app"; import { useAppStore } from "@/stores/app";
import { useCourseStore } from "@/stores/course"; import { useCourseStore } from "@/stores/course";
@@ -1,3 +1,5 @@
export const APPOINTMENT_ENABLED = false; export const APPOINTMENT_ENABLED = false;
export const BOTTOM_NAVIGATION_ENABLED = false;
export const CHECKIN_ENABLED = false; export const CHECKIN_ENABLED = false;
export const RADAR_ENABLED = false; export const RADAR_ENABLED = false;
export const SELF_ASSESSMENT_ENABLED = false;
+51 -22
View File
@@ -4,7 +4,7 @@
<template v-if="store.isLoggedIn"> <template v-if="store.isLoggedIn">
<!-- 頂部:我的健康力護照卡片 (Taipei Masters Hub) --> <!-- 頂部:我的健康力護照卡片 (Taipei Masters Hub) -->
<v-card class="border-primary border-xl rounded-xl" variant="flat"> <v-card class="border-primary border-xl rounded-xl" variant="flat">
<v-row class="mt-4" no-gutters> <v-row class="mt-4 pa-2" no-gutters>
<v-col cols="8"> <v-col cols="8">
<v-card-title> <v-card-title>
{{ displayUserName }} {{ displayUserName }}
@@ -39,7 +39,7 @@
{{ courseStore.groupMeta.label }} {{ courseStore.groupMeta.label }}
</span> </span>
<span v-else-if="courseStore.groupMissing" class="group-label"> <span v-else-if="courseStore.groupMissing" class="group-label">
未取得體適能分組 未完成體適能測試
</span> </span>
<span v-else class="group-label">無資料</span> <span v-else class="group-label">無資料</span>
</div> </div>
@@ -93,6 +93,18 @@
</div> </div>
</v-col> </v-col>
</v-row> </v-row>
<div class="px-2">
<ModuleRouterCard
clickable
description="依目前 11 項測驗成績重新計算體適能分組。"
icon="mdi-refresh-circle"
icon-color="secondary"
:disabled="generatePhysicalFitnessLoading"
:loading="generatePhysicalFitnessLoading"
title="重新計算體適能評級"
@click="openGenerateDialog"
/>
</div>
<!-- 課程建議入口 --> <!-- 課程建議入口 -->
@@ -134,17 +146,6 @@
@refresh="loadPhysicalFitness" @refresh="loadPhysicalFitness"
/> />
<ModuleRouterCard
clickable
description="依目前 11 項測驗成績重新計算體適能分組。"
icon="mdi-refresh-circle"
icon-color="secondary"
:disabled="generatePhysicalFitnessLoading"
:loading="generatePhysicalFitnessLoading"
title="重新計算體適能評級"
@click="openGenerateDialog"
/>
<ModuleRouterCard <ModuleRouterCard
description="了解公益普測計畫、研究依據與平台流程。" description="了解公益普測計畫、研究依據與平台流程。"
icon="mdi-information-outline" icon="mdi-information-outline"
@@ -154,6 +155,7 @@
/> />
<ModuleRouterCard <ModuleRouterCard
v-if="SELF_ASSESSMENT_ENABLED"
description="完成線上自評,取得初步風險分級。" description="完成線上自評,取得初步風險分級。"
icon="mdi-clipboard-text-search" icon="mdi-clipboard-text-search"
icon-color="accent" icon-color="accent"
@@ -187,6 +189,7 @@
<v-card class="rounded-xl elevation-2 mb-4 py-4" color="surface"> <v-card class="rounded-xl elevation-2 mb-4 py-4" color="surface">
<v-card-text> <v-card-text>
<template v-if="SELF_ASSESSMENT_ENABLED">
<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">
<v-icon icon="mdi-clipboard-text-outline" /> <v-icon icon="mdi-clipboard-text-outline" />
@@ -213,7 +216,10 @@
> >
開始自評 開始自評
</v-btn> </v-btn>
</template>
<v-row density="compact">
<v-col cols="12" md="6">
<v-btn <v-btn
block block
class="rounded-lg font-weight-bold" class="rounded-lg font-weight-bold"
@@ -224,8 +230,23 @@
> >
登入平台 登入平台
</v-btn> </v-btn>
</v-col>
<div class="d-flex align-center mt-4"> <v-col cols="12" md="6">
<v-btn
block
class="rounded-lg font-weight-bold"
color="primary"
prepend-icon="mdi-account-plus-outline"
to="/register"
variant="text"
>
建立帳號
</v-btn>
</v-col>
</v-row>
</v-card-text>
<div class="d-flex align-center mt-4 px-4">
<v-icon <v-icon
class="mr-3" class="mr-3"
color="primary" color="primary"
@@ -237,13 +258,8 @@
<div class="font-weight-bold text-grey-darken-4"> <div class="font-weight-bold text-grey-darken-4">
登入後可使用完整功能 登入後可使用完整功能
</div> </div>
<div class="text-title-small text-grey">
普測預約、現場報到、量測紀錄與運動建議
</div> </div>
</div> </div>
</div>
</v-card-text>
</v-card> </v-card>
<ModuleRouterCard <ModuleRouterCard
@@ -324,7 +340,11 @@
</v-card> </v-card>
</v-dialog> </v-dialog>
<v-dialog v-model="missingGroupDialog" max-width="400"> <v-dialog
v-if="APPOINTMENT_ENABLED"
v-model="missingGroupDialog"
max-width="400"
>
<v-card class="rounded-xl overflow-hidden text-center"> <v-card class="rounded-xl overflow-hidden text-center">
<v-card-title class="bg-primary text-white font-weight-bold py-3"> <v-card-title class="bg-primary text-white font-weight-bold py-3">
尚未取得體適能分組 尚未取得體適能分組
@@ -387,6 +407,7 @@ import {
APPOINTMENT_ENABLED, APPOINTMENT_ENABLED,
CHECKIN_ENABLED, CHECKIN_ENABLED,
RADAR_ENABLED, RADAR_ENABLED,
SELF_ASSESSMENT_ENABLED,
} from "@/config/features"; } from "@/config/features";
import { useAppStore } from "@/stores/app"; import { useAppStore } from "@/stores/app";
import { useCourseStore } from "@/stores/course"; import { useCourseStore } from "@/stores/course";
@@ -498,6 +519,7 @@ async function loadPhysicalFitness() {
try { try {
physicalFitnessItems.value = await fetchPhysicalFitness(userID); physicalFitnessItems.value = await fetchPhysicalFitness(userID);
updateTodayTimeString();
} catch (error) { } catch (error) {
physicalFitnessError.value = getApiErrorMessage( physicalFitnessError.value = getApiErrorMessage(
error, error,
@@ -539,6 +561,7 @@ async function handleGeneratePhysicalFitness() {
try { try {
const response = await generatePhysicalFitness(userID); const response = await generatePhysicalFitness(userID);
generateResult.value = response.message; generateResult.value = response.message;
updateTodayTimeString();
if (response.message === "評級完成") { if (response.message === "評級完成") {
await courseStore.loadGroup(true); await courseStore.loadGroup(true);
@@ -560,7 +583,7 @@ watch([() => store.isLoggedIn, () => store.userID], loadPhysicalFitness, {
immediate: true, immediate: true,
}); });
const todayTimeString = computed(() => { function formatCurrentDateTime() {
const now = new Date(); const now = new Date();
const date = [ const date = [
String(now.getMonth() + 1).padStart(2, "0"), String(now.getMonth() + 1).padStart(2, "0"),
@@ -569,7 +592,13 @@ const todayTimeString = computed(() => {
const time = `${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`; const time = `${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`;
return `${date} ${time}`; return `${date} ${time}`;
}); }
const todayTimeString = ref(formatCurrentDateTime());
function updateTodayTimeString() {
todayTimeString.value = formatCurrentDateTime();
}
</script> </script>
<style scoped> <style scoped>
+2 -1
View File
@@ -50,7 +50,6 @@
color="primary" color="primary"
hide-details="auto" hide-details="auto"
label="登入密碼" label="登入密碼"
placeholder="例如: 00000000"
prepend-inner-icon="mdi-lock-outline" prepend-inner-icon="mdi-lock-outline"
required required
rounded="lg" rounded="lg"
@@ -79,6 +78,7 @@
</v-btn> </v-btn>
<v-btn <v-btn
v-if="SELF_ASSESSMENT_ENABLED"
block block
class="rounded-lg font-weight-bold" class="rounded-lg font-weight-bold"
color="primary" color="primary"
@@ -143,6 +143,7 @@ import {
isUnregisteredPhoneError, isUnregisteredPhoneError,
} from "@/utils/api-error"; } from "@/utils/api-error";
import { readGuestSelfAssessmentDraft } from "@/utils/guest-self-assessment"; import { readGuestSelfAssessmentDraft } from "@/utils/guest-self-assessment";
import { SELF_ASSESSMENT_ENABLED } from "@/config/features";
const store = useAppStore(); const store = useAppStore();
const router = useRouter(); const router = useRouter();
@@ -9,9 +9,6 @@
<v-card-title class="text-primary font-weight-bold"> <v-card-title class="text-primary font-weight-bold">
建立帳號 建立帳號
</v-card-title> </v-card-title>
<v-card-subtitle class="text-primary">
完成註冊後即可保存自評並進行預約
</v-card-subtitle>
</div> </div>
</v-card> </v-card>
@@ -36,7 +33,6 @@
hint="手機門號註冊後不可由個人資料修改" hint="手機門號註冊後不可由個人資料修改"
label="手機號碼" label="手機號碼"
persistent-hint persistent-hint
:readonly="Boolean(form.phone)"
type="tel" type="tel"
variant="outlined" variant="outlined"
/> />