Ver código fonte

feat(header): 添加全局页面头部组件及样式

17846405080 1 mês atrás
pai
commit
00c67ed4b0
30 arquivos alterados com 132 adições e 278 exclusões
  1. 3 7
      campus_health_app/frontend/campus-health-app/src/app/modules/dashboard/dashboard.component.html
  2. 1 4
      campus_health_app/frontend/campus-health-app/src/app/modules/diet/add-meal/add-meal.component.html
  3. 1 28
      campus_health_app/frontend/campus-health-app/src/app/modules/diet/add-meal/add-meal.component.scss
  4. 2 1
      campus_health_app/frontend/campus-health-app/src/app/modules/diet/add-meal/add-meal.component.ts
  5. 1 4
      campus_health_app/frontend/campus-health-app/src/app/modules/diet/diet.component.html
  6. 1 35
      campus_health_app/frontend/campus-health-app/src/app/modules/diet/diet.component.scss
  7. 2 1
      campus_health_app/frontend/campus-health-app/src/app/modules/diet/diet.component.ts
  8. 1 4
      campus_health_app/frontend/campus-health-app/src/app/modules/exercise/add-exercise/add-exercise.component.html
  9. 1 29
      campus_health_app/frontend/campus-health-app/src/app/modules/exercise/add-exercise/add-exercise.component.scss
  10. 2 1
      campus_health_app/frontend/campus-health-app/src/app/modules/exercise/add-exercise/add-exercise.component.ts
  11. 1 4
      campus_health_app/frontend/campus-health-app/src/app/modules/exercise/exercise.component.html
  12. 1 36
      campus_health_app/frontend/campus-health-app/src/app/modules/exercise/exercise.component.scss
  13. 2 1
      campus_health_app/frontend/campus-health-app/src/app/modules/exercise/exercise.component.ts
  14. 3 4
      campus_health_app/frontend/campus-health-app/src/app/modules/knowledge/knowledge.component.html
  15. 1 28
      campus_health_app/frontend/campus-health-app/src/app/modules/knowledge/knowledge.component.scss
  16. 2 1
      campus_health_app/frontend/campus-health-app/src/app/modules/knowledge/knowledge.component.ts
  17. 1 4
      campus_health_app/frontend/campus-health-app/src/app/modules/monitoring/monitoring.component.html
  18. 0 0
      campus_health_app/frontend/campus-health-app/src/app/modules/monitoring/monitoring.component.scss
  19. 2 1
      campus_health_app/frontend/campus-health-app/src/app/modules/monitoring/monitoring.component.ts
  20. 1 4
      campus_health_app/frontend/campus-health-app/src/app/modules/school-services/school-services.component.html
  21. 2 1
      campus_health_app/frontend/campus-health-app/src/app/modules/school-services/school-services.component.ts
  22. 1 4
      campus_health_app/frontend/campus-health-app/src/app/modules/user-center/user-center.component.html
  23. 1 28
      campus_health_app/frontend/campus-health-app/src/app/modules/user-center/user-center.component.scss
  24. 2 1
      campus_health_app/frontend/campus-health-app/src/app/modules/user-center/user-center.component.ts
  25. 3 5
      campus_health_app/frontend/campus-health-app/src/app/modules/weight/weight.component.html
  26. 0 41
      campus_health_app/frontend/campus-health-app/src/app/modules/weight/weight.component.scss
  27. 3 1
      campus_health_app/frontend/campus-health-app/src/app/modules/weight/weight.component.ts
  28. 12 0
      campus_health_app/frontend/campus-health-app/src/app/shared/page-header/page-header.component.html
  29. 59 0
      campus_health_app/frontend/campus-health-app/src/app/shared/page-header/page-header.component.scss
  30. 20 0
      campus_health_app/frontend/campus-health-app/src/app/shared/page-header/page-header.component.ts

+ 3 - 7
campus_health_app/frontend/campus-health-app/src/app/modules/dashboard/dashboard.component.html

@@ -1,11 +1,7 @@
 <div class="dashboard-container">
   <!-- 顶部导航栏 -->
-  <header class="dashboard-header">
-    <div class="header-left">
-      <h1>数智健调系统</h1>
-      <span class="header-subtitle">健康管理平台</span>
-    </div>
-    <div class="header-right">
+  <app-page-header [title]="'数智健调系统'" [subtitle]="'健康管理平台'">
+    <div header-actions>
       <div class="user-info">
         <span class="welcome-text">欢迎回来!</span>
         <div class="user-avatar">👤</div>
@@ -13,7 +9,7 @@
       <button class="nav-button" (click)="navigateTo('user-center')">个人中心</button>
       <button class="logout-button" (click)="logout()">退出登录</button>
     </div>
-  </header>
+  </app-page-header>
 
   <!-- 主体内容区域 -->
   <div class="dashboard-content-wrapper">

+ 1 - 4
campus_health_app/frontend/campus-health-app/src/app/modules/diet/add-meal/add-meal.component.html

@@ -1,8 +1,5 @@
 <div class="add-meal-container">
-  <header class="add-meal-header">
-    <button class="back-button" (click)="backToDiet()">← 返回</button>
-    <h1>添加饮食记录</h1>
-  </header>
+  <app-page-header [title]="'添加饮食记录'" (back)="backToDiet()"></app-page-header>
 
   <main class="add-meal-main">
     <!-- 饮食类型和时间选择 -->

+ 1 - 28
campus_health_app/frontend/campus-health-app/src/app/modules/diet/add-meal/add-meal.component.scss

@@ -8,34 +8,7 @@
   color: #333;
 }
 
-// 头部导航
-.add-meal-header {
-  display: flex;
-  align-items: center;
-  padding: 1rem 2rem;
-  background-color: #fff;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.back-button {
-  background: none;
-  border: none;
-  font-size: 1.2rem;
-  cursor: pointer;
-  margin-right: 1rem;
-  color: #5f6368;
-  transition: color 0.2s ease;
-}
-
-.back-button:hover {
-  color: #202124;
-}
-
-.add-meal-header h1 {
-  margin: 0;
-  font-size: 1.5rem;
-  color: #202124;
-}
+/* header now provided by shared PageHeaderComponent */
 
 // 主内容区域
 .add-meal-main {

+ 2 - 1
campus_health_app/frontend/campus-health-app/src/app/modules/diet/add-meal/add-meal.component.ts

@@ -2,6 +2,7 @@ import { Component } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { FormsModule } from '@angular/forms';
 import { Router, RouterModule } from '@angular/router';
+import { PageHeaderComponent } from '../../../shared/page-header/page-header.component';
 
 // 食物项接口定义
 interface FoodItem {
@@ -23,7 +24,7 @@ interface MealType {
 @Component({
   selector: 'app-add-meal',
   standalone: true,
-  imports: [CommonModule, FormsModule, RouterModule],
+  imports: [CommonModule, FormsModule, RouterModule, PageHeaderComponent],
   templateUrl: './add-meal.component.html',
   styleUrl: './add-meal.component.scss'
 })

+ 1 - 4
campus_health_app/frontend/campus-health-app/src/app/modules/diet/diet.component.html

@@ -1,8 +1,5 @@
 <div class="diet-container">
-  <header class="diet-header">
-    <button class="back-button" (click)="backToDashboard()">← 返回</button>
-    <h1>饮食管理</h1>
-  </header>
+  <app-page-header [title]="'饮食管理'" (back)="backToDashboard()"></app-page-header>
 
   <main class="diet-main">
     <!-- 今日饮食概览 -->

+ 1 - 35
campus_health_app/frontend/campus-health-app/src/app/modules/diet/diet.component.scss

@@ -8,41 +8,7 @@
   color: #333;
 }
 
-// 头部导航
-.diet-header {
-  display: flex;
-  align-items: center;
-  padding: 1.5rem 2rem;
-  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-  color: white;
-  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
-}
-
-.back-button {
-  background: rgba(255, 255, 255, 0.1);
-  border: 1px solid rgba(255, 255, 255, 0.2);
-  border-radius: 12px;
-  padding: 0.75rem 1rem;
-  font-size: 1rem;
-  cursor: pointer;
-  margin-right: 1.5rem;
-  color: white;
-  transition: all 0.3s ease;
-  backdrop-filter: blur(10px);
-
-  &:hover {
-    background: rgba(255, 255, 255, 0.2);
-    transform: translateY(-2px);
-    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
-  }
-}
-
-.diet-header h1 {
-  margin: 0;
-  font-size: 1.8rem;
-  color: white;
-  font-weight: 700;
-}
+/* header now provided by shared PageHeaderComponent */
 
 // 主内容区域
 .diet-main {

+ 2 - 1
campus_health_app/frontend/campus-health-app/src/app/modules/diet/diet.component.ts

@@ -1,11 +1,12 @@
 import { Component } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { Router, RouterModule } from '@angular/router';
+import { PageHeaderComponent } from '../../shared/page-header/page-header.component';
 
 @Component({
   selector: 'app-diet',
   standalone: true,
-  imports: [CommonModule, RouterModule],
+  imports: [CommonModule, RouterModule, PageHeaderComponent],
   templateUrl: './diet.component.html',
   styleUrl: './diet.component.scss'
 })

+ 1 - 4
campus_health_app/frontend/campus-health-app/src/app/modules/exercise/add-exercise/add-exercise.component.html

@@ -1,8 +1,5 @@
 <div class="add-exercise-container">
-  <header class="add-exercise-header">
-    <button class="back-button" (click)="backToExerciseList()">← 返回</button>
-    <h1>添加运动记录</h1>
-  </header>
+  <app-page-header [title]="'添加运动记录'" (back)="backToExerciseList()"></app-page-header>
 
   <main class="add-exercise-main">
     <form class="exercise-form" [formGroup]="exerciseForm" (ngSubmit)="onSubmit()">

+ 1 - 29
campus_health_app/frontend/campus-health-app/src/app/modules/exercise/add-exercise/add-exercise.component.scss

@@ -6,35 +6,7 @@
   flex-direction: column;
 }
 
-/* 头部样式 */
-.add-exercise-header {
-  background-color: #ffffff;
-  padding: 16px 24px;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-  display: flex;
-  align-items: center;
-  gap: 16px;
-}
-
-.back-button {
-  background: none;
-  border: none;
-  font-size: 18px;
-  cursor: pointer;
-  padding: 8px;
-  border-radius: 4px;
-  transition: background-color 0.2s;
-}
-
-.back-button:hover {
-  background-color: #f0f0f0;
-}
-
-.add-exercise-header h1 {
-  font-size: 24px;
-  font-weight: 600;
-  color: #333333;
-}
+/* header now provided by shared PageHeaderComponent */
 
 /* 主内容区域样式 */
 .add-exercise-main {

+ 2 - 1
campus_health_app/frontend/campus-health-app/src/app/modules/exercise/add-exercise/add-exercise.component.ts

@@ -2,6 +2,7 @@ import { Component } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { Router, RouterModule } from '@angular/router';
 import { ReactiveFormsModule, FormBuilder, FormGroup, Validators, FormsModule } from '@angular/forms';
+import { PageHeaderComponent } from '../../../shared/page-header/page-header.component';
 
 // 运动方式类型
 interface ExerciseType {
@@ -20,7 +21,7 @@ interface ExerciseEquipment {
 @Component({
   selector: 'app-add-exercise',
   standalone: true,
-  imports: [CommonModule, RouterModule, ReactiveFormsModule, FormsModule],
+  imports: [CommonModule, RouterModule, ReactiveFormsModule, FormsModule, PageHeaderComponent],
   templateUrl: './add-exercise.component.html',
   styleUrl: './add-exercise.component.scss'
 })

+ 1 - 4
campus_health_app/frontend/campus-health-app/src/app/modules/exercise/exercise.component.html

@@ -1,8 +1,5 @@
 <div class="exercise-container">
-  <header class="exercise-header">
-    <button class="back-button" (click)="backToDashboard()">← 返回</button>
-    <h1>运动记录</h1>
-  </header>
+  <app-page-header [title]="'运动记录'" (back)="backToDashboard()"></app-page-header>
 
   <main class="exercise-main">
     <!-- 今日运动记录列表 -->

+ 1 - 36
campus_health_app/frontend/campus-health-app/src/app/modules/exercise/exercise.component.scss

@@ -8,42 +8,7 @@
   color: #333;
 }
 
-// 头部导航
-.exercise-container > .exercise-header {
-  display: flex;
-  align-items: center;
-  padding: 1.5rem 2rem;
-  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-  color: white;
-  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
-  margin-bottom: 0;
-}
-
-.exercise-container > .exercise-header .back-button {
-  background: rgba(255, 255, 255, 0.1);
-  border: 1px solid rgba(255, 255, 255, 0.2);
-  border-radius: 12px;
-  padding: 0.75rem 1rem;
-  font-size: 1rem;
-  cursor: pointer;
-  margin-right: 1.5rem;
-  color: white;
-  transition: all 0.3s ease;
-  backdrop-filter: blur(10px);
-
-  &:hover {
-    background: rgba(255, 255, 255, 0.2);
-    transform: translateY(-2px);
-    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
-  }
-}
-
-.exercise-container > .exercise-header h1 {
-  margin: 0;
-  font-size: 1.8rem;
-  color: white;
-  font-weight: 700;
-}
+/* header now provided by shared PageHeaderComponent */
 
 // 主内容区域
 .exercise-main {

+ 2 - 1
campus_health_app/frontend/campus-health-app/src/app/modules/exercise/exercise.component.ts

@@ -1,11 +1,12 @@
 import { Component } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { Router, RouterModule } from '@angular/router';
+import { PageHeaderComponent } from '../../shared/page-header/page-header.component';
 
 @Component({
   selector: 'app-exercise',
   standalone: true,
-  imports: [CommonModule, RouterModule],
+  imports: [CommonModule, RouterModule, PageHeaderComponent],
   templateUrl: './exercise.component.html',
   styleUrl: './exercise.component.scss'
 })

+ 3 - 4
campus_health_app/frontend/campus-health-app/src/app/modules/knowledge/knowledge.component.html

@@ -1,8 +1,7 @@
 <div class="knowledge-container">
-  <header class="knowledge-header">
-    <button class="back-button" (click)="backToDashboard()">← 返回</button>
-    <h1>健康知识</h1>
-  </header>
+  <app-page-header [title]="'健康知识'" (back)="backToDashboard()">
+    <div header-actions><!-- 占位以保持标题居中,与主导航统一样式 --></div>
+  </app-page-header>
 
   <main class="knowledge-main">
     <!-- 搜索框 -->

+ 1 - 28
campus_health_app/frontend/campus-health-app/src/app/modules/knowledge/knowledge.component.scss

@@ -8,34 +8,7 @@
   color: #333;
 }
 
-// 头部导航
-.knowledge-header {
-  display: flex;
-  align-items: center;
-  padding: 1rem 2rem;
-  background-color: #fff;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.back-button {
-  background: none;
-  border: none;
-  font-size: 1.2rem;
-  cursor: pointer;
-  margin-right: 1rem;
-  color: #5f6368;
-  transition: color 0.2s ease;
-}
-
-.back-button:hover {
-  color: #202124;
-}
-
-.knowledge-header h1 {
-  margin: 0;
-  font-size: 1.5rem;
-  color: #202124;
-}
+/* header now provided by shared PageHeaderComponent */
 
 // 主内容区域
 .knowledge-main {

+ 2 - 1
campus_health_app/frontend/campus-health-app/src/app/modules/knowledge/knowledge.component.ts

@@ -1,6 +1,7 @@
 import { Component, OnInit } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { Router, RouterModule } from '@angular/router';
+import { PageHeaderComponent } from '../../shared/page-header/page-header.component';
 
 // 健康知识分类接口
 export interface KnowledgeCategory {
@@ -26,7 +27,7 @@ export interface KnowledgeArticle {
 @Component({
   selector: 'app-knowledge',
   standalone: true,
-  imports: [CommonModule, RouterModule],
+  imports: [CommonModule, RouterModule, PageHeaderComponent],
   templateUrl: './knowledge.component.html',
   styleUrl: './knowledge.component.scss'
 })

+ 1 - 4
campus_health_app/frontend/campus-health-app/src/app/modules/monitoring/monitoring.component.html

@@ -1,8 +1,5 @@
 <div class="monitoring-container">
-  <header class="page-header">
-    <button class="back-button" (click)="backToDashboard()">← 返回</button>
-    <h1>健康监测</h1>
-  </header>
+  <app-page-header [title]="'健康监测'" (back)="backToDashboard()"></app-page-header>
 
   <main class="main-content">
     <div class="monitoring-content">

Diferenças do arquivo suprimidas por serem muito extensas
+ 0 - 0
campus_health_app/frontend/campus-health-app/src/app/modules/monitoring/monitoring.component.scss


+ 2 - 1
campus_health_app/frontend/campus-health-app/src/app/modules/monitoring/monitoring.component.ts

@@ -3,6 +3,7 @@ import { CommonModule } from '@angular/common';
 import { Router, RouterModule } from '@angular/router';
 import { FormsModule } from '@angular/forms';
 import { ModalComponent } from '../../shared/components/modal/modal.component';
+import { PageHeaderComponent } from '../../shared/page-header/page-header.component';
 
 // 声明 ECharts 全局类型
 declare const echarts: any;
@@ -68,7 +69,7 @@ export interface ChronicCondition {
 @Component({
   selector: 'app-monitoring',
   standalone: true,
-  imports: [CommonModule, RouterModule, FormsModule, ModalComponent],
+  imports: [CommonModule, RouterModule, FormsModule, ModalComponent, PageHeaderComponent],
   templateUrl: './monitoring.component.html',
   styleUrl: './monitoring.component.scss'
 })

+ 1 - 4
campus_health_app/frontend/campus-health-app/src/app/modules/school-services/school-services.component.html

@@ -1,8 +1,5 @@
 <div class="school-services-container">
-  <header class="school-services-header">
-    <button class="back-button" (click)="backToDashboard()">← 返回</button>
-    <h1>校园服务</h1>
-  </header>
+  <app-page-header [title]="'校园服务'" (back)="backToDashboard()"></app-page-header>
 
   <main class="school-services-main">
     <div class="school-services-content">

+ 2 - 1
campus_health_app/frontend/campus-health-app/src/app/modules/school-services/school-services.component.ts

@@ -2,6 +2,7 @@ import { Component } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { Router, RouterModule } from '@angular/router';
 import { FormsModule } from '@angular/forms';
+import { PageHeaderComponent } from '../../shared/page-header/page-header.component';
 
 // 定义校园饮食推荐接口
 interface DiningOption {
@@ -41,7 +42,7 @@ interface ExerciseTeam {
 @Component({
   selector: 'app-school-services',
   standalone: true,
-  imports: [CommonModule, RouterModule, FormsModule],
+  imports: [CommonModule, RouterModule, FormsModule, PageHeaderComponent],
   templateUrl: './school-services.component.html',
   styleUrl: './school-services.component.scss'
 })

+ 1 - 4
campus_health_app/frontend/campus-health-app/src/app/modules/user-center/user-center.component.html

@@ -1,8 +1,5 @@
 <div class="user-center-container">
-  <header class="user-center-header">
-    <button class="back-button" (click)="backToDashboard()">← 返回</button>
-    <h1>个人中心</h1>
-  </header>
+  <app-page-header [title]="'个人中心'" (back)="backToDashboard()"></app-page-header>
 
   <main class="user-center-main">
     <!-- 用户头像和基本信息 -->

+ 1 - 28
campus_health_app/frontend/campus-health-app/src/app/modules/user-center/user-center.component.scss

@@ -8,34 +8,7 @@
   color: #333;
 }
 
-// 头部导航
-.user-center-header {
-  display: flex;
-  align-items: center;
-  padding: 1rem 2rem;
-  background-color: #fff;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.back-button {
-  background: none;
-  border: none;
-  font-size: 1.2rem;
-  cursor: pointer;
-  margin-right: 1rem;
-  color: #5f6368;
-  transition: color 0.2s ease;
-}
-
-.back-button:hover {
-  color: #202124;
-}
-
-.user-center-header h1 {
-  margin: 0;
-  font-size: 1.5rem;
-  color: #202124;
-}
+/* header now provided by shared PageHeaderComponent */
 
 // 主内容区域
 .user-center-main {

+ 2 - 1
campus_health_app/frontend/campus-health-app/src/app/modules/user-center/user-center.component.ts

@@ -2,11 +2,12 @@ import { Component } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { Router, RouterModule } from '@angular/router';
 import { ThemeService } from '../../core/services/theme.service';
+import { PageHeaderComponent } from '../../shared/page-header/page-header.component';
 
 @Component({
   selector: 'app-user-center',
   standalone: true,
-  imports: [CommonModule, RouterModule],
+  imports: [CommonModule, RouterModule, PageHeaderComponent],
   templateUrl: './user-center.component.html',
   styleUrl: './user-center.component.scss'
 })

+ 3 - 5
campus_health_app/frontend/campus-health-app/src/app/modules/weight/weight.component.html

@@ -1,12 +1,10 @@
 <div class="weight-container">
-  <header class="header">
-    <button class="back-btn" (click)="backToDashboard()">← 返回</button>
-    <h1>体重管理</h1>
-    <div class="header-actions">
+  <app-page-header [title]="'体重管理'" (back)="backToDashboard()">
+    <div header-actions>
       <button class="btn btn-primary" (click)="openAddRecordDialog()">+ 录入体重</button>
       <button class="btn btn-secondary" (click)="openGoalDialog()">目标设置</button>
     </div>
-  </header>
+  </app-page-header>
 
   <div class="stats-cards" *ngIf="stats">
     <div class="stat-card">

+ 0 - 41
campus_health_app/frontend/campus-health-app/src/app/modules/weight/weight.component.scss

@@ -4,47 +4,6 @@
   padding-bottom: 30px;
 }
 
-.header {
-  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-  padding: 20px 24px;
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
-  position: sticky;
-  top: 0;
-  z-index: 10;
-
-  h1 {
-    font-size: 22px;
-    font-weight: 700;
-    margin: 0;
-    color: #fff;
-  }
-
-  .back-btn {
-    background: rgba(255, 255, 255, 0.1);
-    border: 1px solid rgba(255, 255, 255, 0.2);
-    border-radius: 12px;
-    padding: 10px 16px;
-    font-size: 15px;
-    cursor: pointer;
-    color: #fff;
-    transition: all 0.3s ease;
-    backdrop-filter: blur(10px);
-    
-    &:hover {
-      background: rgba(255, 255, 255, 0.2);
-      transform: translateY(-2px);
-    }
-  }
-
-  .header-actions {
-    display: flex;
-    gap: 12px;
-  }
-}
-
 .btn {
   padding: 10px 20px;
   border: none;

+ 3 - 1
campus_health_app/frontend/campus-health-app/src/app/modules/weight/weight.component.ts

@@ -17,10 +17,12 @@ import {
   AnomalyAlert
 } from './models/weight.models';
 
+import { PageHeaderComponent } from '../../shared/page-header/page-header.component';
+
 @Component({
   selector: 'app-weight',
   standalone: true,
-  imports: [CommonModule, FormsModule, RouterModule, ModalComponent],
+  imports: [CommonModule, FormsModule, RouterModule, ModalComponent, PageHeaderComponent],
   templateUrl: './weight.component.html',
   styleUrl: './weight.component.scss'
 })

+ 12 - 0
campus_health_app/frontend/campus-health-app/src/app/shared/page-header/page-header.component.html

@@ -0,0 +1,12 @@
+<header class="app-header">
+  <div class="header-left">
+    <button *ngIf="showBack" class="back-button" (click)="onBack()">← 返回</button>
+    <div class="title-block">
+      <h1>{{ title }}</h1>
+      <div class="subtitle" *ngIf="subtitle">{{ subtitle }}</div>
+    </div>
+  </div>
+  <div class="header-actions">
+    <ng-content select="[header-actions]"></ng-content>
+  </div>
+</header>

+ 59 - 0
campus_health_app/frontend/campus-health-app/src/app/shared/page-header/page-header.component.scss

@@ -0,0 +1,59 @@
+/* Global page header styles - match existing gradient theme */
+.app-header {
+  background: linear-gradient(135deg, var(--primary-color) 0%, var(--primary-light) 100%);
+  padding: 20px 24px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  box-shadow: var(--shadow-md);
+  position: sticky;
+  top: 0;
+  z-index: 10;
+
+  h1 {
+    margin: 0;
+    font-size: 22px;
+    font-weight: 700;
+    color: #fff;
+  }
+
+  .header-left {
+    display: flex;
+    align-items: center;
+    gap: 12px;
+  }
+
+  .title-block {
+    display: flex;
+    flex-direction: column;
+  }
+
+  .subtitle {
+    font-size: 12px;
+    color: rgba(255,255,255,0.85);
+    margin-top: 4px;
+  }
+
+  .back-button {
+    background: rgba(255, 255, 255, 0.12);
+    border: 1px solid rgba(255, 255, 255, 0.2);
+    border-radius: 12px;
+    padding: 10px 16px;
+    font-size: 15px;
+    cursor: pointer;
+    color: #fff;
+    transition: all 0.3s ease;
+    backdrop-filter: blur(6px);
+
+    &:hover {
+      background: rgba(255, 255, 255, 0.18);
+      transform: translateY(-2px);
+    }
+  }
+
+  .header-actions {
+    display: flex;
+    gap: 12px;
+    align-items: center;
+  }
+}

+ 20 - 0
campus_health_app/frontend/campus-health-app/src/app/shared/page-header/page-header.component.ts

@@ -0,0 +1,20 @@
+import { Component, EventEmitter, Input, Output } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+@Component({
+  selector: 'app-page-header',
+  standalone: true,
+  imports: [CommonModule],
+  templateUrl: './page-header.component.html',
+  styleUrls: ['./page-header.component.scss']
+})
+export class PageHeaderComponent {
+  @Input() title = '';
+  @Input() subtitle?: string;
+  @Input() showBack = true;
+  @Output() back = new EventEmitter<void>();
+
+  onBack() {
+    this.back.emit();
+  }
+}

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff