From 87aa5c9e3324b7bee22decf273f10a07e439fa58 Mon Sep 17 00:00:00 2001 From: skytek_xinliang Date: Mon, 14 Sep 2026 12:03:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/api/physical-fitness.ts | 23 +++ app/citizen-frontend/src/api/types.ts | 12 ++ .../src/components/ModuleRouterCard.vue | 32 ++- .../src/components/PhysicalFitnessSummary.vue | 125 +++++++++++ app/citizen-frontend/src/pages/index.vue | 194 ++++++++++++++++++ 5 files changed, 379 insertions(+), 7 deletions(-) create mode 100644 app/citizen-frontend/src/api/physical-fitness.ts create mode 100644 app/citizen-frontend/src/components/PhysicalFitnessSummary.vue diff --git a/app/citizen-frontend/src/api/physical-fitness.ts b/app/citizen-frontend/src/api/physical-fitness.ts new file mode 100644 index 0000000..ebbbd52 --- /dev/null +++ b/app/citizen-frontend/src/api/physical-fitness.ts @@ -0,0 +1,23 @@ +import type { + GeneratePhysicalFitnessResponse, + PhysicalFitnessItem, +} from "./types"; +import { api } from "./client"; + +/** 取得指定使用者的 11 項最新體適能測驗成績。 */ +export function fetchPhysicalFitness( + userID: string, +): Promise { + return api + .get(`v1/physical-fitness/${encodeURIComponent(userID)}`) + .json(); +} + +/** 產生指定使用者的體適能評級。 */ +export function generatePhysicalFitness( + userID: string, +): Promise { + return api + .post(`v1/physical-fitness/generate/${encodeURIComponent(userID)}`) + .json(); +} diff --git a/app/citizen-frontend/src/api/types.ts b/app/citizen-frontend/src/api/types.ts index 684c224..047e455 100644 --- a/app/citizen-frontend/src/api/types.ts +++ b/app/citizen-frontend/src/api/types.ts @@ -5,6 +5,18 @@ export type ConsentVersion = typeof CONSENT_VERSION; /** 體適能組別 */ export type FitnessGroup = "low" | "medium" | "high"; +/** PhysicalFitnessController 回傳的單項測驗成績。 */ +export interface PhysicalFitnessItem { + fitnessCode: string; + fitnessName: string; + fitnessScore: string | null; +} + +/** PhysicalFitnessController 產生評級的回應。 */ +export interface GeneratePhysicalFitnessResponse { + message: string; +} + /** 性別 */ export type Gender = "male" | "female"; diff --git a/app/citizen-frontend/src/components/ModuleRouterCard.vue b/app/citizen-frontend/src/components/ModuleRouterCard.vue index d6b6d18..0db2926 100644 --- a/app/citizen-frontend/src/components/ModuleRouterCard.vue +++ b/app/citizen-frontend/src/components/ModuleRouterCard.vue @@ -2,7 +2,11 @@
- +
diff --git a/app/citizen-frontend/src/components/PhysicalFitnessSummary.vue b/app/citizen-frontend/src/components/PhysicalFitnessSummary.vue new file mode 100644 index 0000000..323b426 --- /dev/null +++ b/app/citizen-frontend/src/components/PhysicalFitnessSummary.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/app/citizen-frontend/src/pages/index.vue b/app/citizen-frontend/src/pages/index.vue index cd625d2..e6b01d5 100644 --- a/app/citizen-frontend/src/pages/index.vue +++ b/app/citizen-frontend/src/pages/index.vue @@ -127,6 +127,24 @@ + + + + + + + + 重新計算體適能評級 + + + + + + + {{ generateResult }} + + + {{ generateError }} + + + + + + + + {{ generateResult || generateError ? "關閉" : "取消" }} + + + 確認重新計算 + + + 重試 + + + + + @@ -285,10 +372,16 @@