Browse Source

merge: with others

0235702 1 day ago
parent
commit
8190661114
26 changed files with 4947 additions and 204 deletions
  1. 35 2
      README.md
  2. 2942 0
      demo/h2.html
  3. 1 1
      interview-web/package-lock.json
  4. 7 5
      interview-web/src/app/app.config.ts
  5. 2 0
      interview-web/src/main.ts
  6. 13 0
      interview-web/src/modules/interview/mobile/mobile.routes.ts
  7. 0 1
      interview-web/src/modules/interview/mobile/nav-mobile-tabs/nav-mobile-tabs.html
  8. 82 0
      interview-web/src/modules/interview/mobile/page-ability-analysis/page-ability-analysis.html
  9. 212 0
      interview-web/src/modules/interview/mobile/page-ability-analysis/page-ability-analysis.scss
  10. 23 0
      interview-web/src/modules/interview/mobile/page-ability-analysis/page-ability-analysis.spec.ts
  11. 160 0
      interview-web/src/modules/interview/mobile/page-ability-analysis/page-ability-analysis.ts
  12. 4 4
      interview-web/src/modules/interview/mobile/page-home/page-home.html
  13. 32 20
      interview-web/src/modules/interview/mobile/page-home/page-home.ts
  14. 58 10
      interview-web/src/modules/interview/mobile/page-interview/page-interview.html
  15. 13 0
      interview-web/src/modules/interview/mobile/page-interview/page-interview.scss
  16. 232 161
      interview-web/src/modules/interview/mobile/page-interview/page-interview.ts
  17. 61 0
      interview-web/src/modules/interview/mobile/page-job-detail/page-job-detail.html
  18. 164 0
      interview-web/src/modules/interview/mobile/page-job-detail/page-job-detail.scss
  19. 23 0
      interview-web/src/modules/interview/mobile/page-job-detail/page-job-detail.spec.ts
  20. 109 0
      interview-web/src/modules/interview/mobile/page-job-detail/page-job-detail.ts
  21. 158 0
      interview-web/src/modules/interview/mobile/page-question-bank/page-question-bank.html
  22. 282 0
      interview-web/src/modules/interview/mobile/page-question-bank/page-question-bank.scss
  23. 23 0
      interview-web/src/modules/interview/mobile/page-question-bank/page-question-bank.spec.ts
  24. 126 0
      interview-web/src/modules/interview/mobile/page-question-bank/page-question-bank.ts
  25. 179 0
      package-lock.json
  26. 6 0
      package.json

+ 35 - 2
README.md

@@ -1,9 +1,42 @@
 # 项目:AI人事面试项目
 
 # 目录结构
-- docs/ 项目的文档、ppt、报告等
-- cloth-color-web/ Angular项目
+src/
+├── modules/
+│   └── interview/
+│       └── mobile/
+│           │   │
+│           │   ├── page-home/
+│           │   │   ├── page-home.ts
+│           │   │   ├──page-home.html
+│           │   │   └── page-home.scss
+│           │   ├── nav-mobile-tabs/
+│           │   │  ├──nav-mobile-tabs.ts
+│           │   │  ├── nav-mobile-tabs.html
+│           │   │  └── nav-mobile-tabs.scss
+│           │   ├── page-interview
+│           │   │  ├──page-interview.html
+│           │   │  ├──page-interview.scss
+│           │   │  └──page-interview.ts
+│           │   ├── page-job-hhunting
+│           │   │  ├──page-job-hhunting.html
+│           │   │  ├──page-job-hhunting.scss
+│           │   │  └──page-job-hhunting.ts
+│           │   ├── page-mine
+│           │   │  ├──page-mine.html
+│           │   │  ├──page-mine.scss
+│           │   │  └──page-mine.ts
+│           │   ├── page-applicatios/
+│           │   │   ├── page-applicatios.ts
+│           │   │   ├──page-applicatios.html
+│           │   │   └── page-applicatios.scss
+│           │   ├── page-resume/
+│           │   │   ├── page-resume.ts
+│           │   │   ├──page-resume.html
+│           │   │   └── page-resume.scss
+│           │   ├── mobile.routes.ts
 
+        http://git.fmode.cn:3000/0235713/intelligent-interview.git
 # 项目成员
 - 姓名:朱子翔  0235713 17870588597
 - 姓名:赖昊诚  0235712 15907091437

+ 2942 - 0
demo/h2.html

@@ -0,0 +1,2942 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>智能招聘系统</title>
+    <!-- 国内CDN引入 -->
+    <link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
+    <link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
+    <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.4.3/echarts.min.js"></script>
+    <style>
+        :root {
+            --primary: #2563eb;
+            --secondary: #f59e0b;
+            --dark: #1e293b;
+            --light: #f8fafc;
+            --success: #10b981;
+            --danger: #ef4444;
+            --warning: #f97316;
+        }
+        
+        * {
+            margin: 0;
+            padding: 0;
+            box-sizing: border-box;
+            font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
+        }
+        
+        body {
+            background-color: #f1f5f9;
+            color: var(--dark);
+            line-height: 1.6;
+        }
+        
+        /* 登录页面样式 */
+        .login-container {
+            display: flex;
+            min-height: 100vh;
+            align-items: center;
+            justify-content: center;
+            background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);
+        }
+        
+        .login-box {
+            width: 400px;
+            background: white;
+            border-radius: 12px;
+            padding: 40px;
+            box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
+            text-align: center;
+        }
+        
+        .login-logo {
+            font-size: 28px;
+            font-weight: bold;
+            color: var(--primary);
+            margin-bottom: 30px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            gap: 10px;
+        }
+        
+        .login-tabs {
+            display: flex;
+            margin-bottom: 20px;
+            border-bottom: 1px solid #e2e8f0;
+        }
+        
+        .login-tab {
+            flex: 1;
+            padding: 12px;
+            cursor: pointer;
+            font-weight: 500;
+            transition: all 0.2s;
+        }
+        
+        .login-tab.active {
+            color: var(--primary);
+            border-bottom: 2px solid var(--primary);
+        }
+        
+        .login-form {
+            display: none;
+        }
+        
+        .login-form.active {
+            display: block;
+        }
+        
+        .form-group {
+            margin-bottom: 20px;
+            text-align: left;
+        }
+        
+        .form-group label {
+            display: block;
+            margin-bottom: 8px;
+            font-weight: 500;
+        }
+        
+        .form-control {
+            width: 100%;
+            padding: 12px 16px;
+            border: 1px solid #e2e8f0;
+            border-radius: 8px;
+            font-size: 16px;
+            transition: all 0.2s;
+        }
+        
+        .form-control:focus {
+            border-color: var(--primary);
+            box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
+            outline: none;
+        }
+        
+        .btn {
+            padding: 12px;
+            border: none;
+            border-radius: 8px;
+            font-size: 16px;
+            font-weight: 500;
+            cursor: pointer;
+            transition: all 0.2s;
+        }
+        
+        .btn-block {
+            width: 100%;
+        }
+        
+        .btn-primary {
+            background: var(--primary);
+            color: white;
+        }
+        
+        .btn-primary:hover {
+            background: #1d4ed8;
+        }
+        
+        .btn-secondary {
+            background: var(--secondary);
+            color: white;
+        }
+        
+        .btn-secondary:hover {
+            background: #d97706;
+        }
+        
+        .btn-success {
+            background: var(--success);
+            color: white;
+        }
+        
+        .btn-success:hover {
+            background: #059669;
+        }
+        
+        .btn-danger {
+            background: var(--danger);
+            color: white;
+        }
+        
+        .btn-danger:hover {
+            background: #dc2626;
+        }
+        
+        .login-links {
+            margin-top: 20px;
+            display: flex;
+            justify-content: space-between;
+        }
+        
+        .login-link {
+            color: var(--primary);
+            font-size: 14px;
+            cursor: pointer;
+        }
+        
+        /* 主界面样式 */
+        .container {
+            display: flex;
+            min-height: 100vh;
+            padding: 20px;
+            gap: 20px;
+            max-width: 1400px;
+            margin: 0 auto;
+            display: none;
+        }
+        
+        /* 左侧导航 */
+        .sidebar {
+            width: 240px;
+            background: white;
+            border-radius: 12px;
+            padding: 20px;
+            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
+            display: flex;
+            flex-direction: column;
+        }
+        
+        .logo {
+            font-size: 20px;
+            font-weight: bold;
+            color: var(--primary);
+            margin-bottom: 30px;
+            display: flex;
+            align-items: center;
+            gap: 10px;
+        }
+        
+        .nav-menu {
+            flex: 1;
+            display: flex;
+            flex-direction: column;
+            gap: 8px;
+        }
+        
+        .nav-item {
+            padding: 12px 16px;
+            border-radius: 8px;
+            display: flex;
+            align-items: center;
+            gap: 12px;
+            cursor: pointer;
+            transition: all 0.2s;
+        }
+        
+        .nav-item:hover {
+            background-color: #f1f5f9;
+        }
+        
+        .nav-item.active {
+            background-color: #eff6ff;
+            color: var(--primary);
+            font-weight: 500;
+        }
+        
+        .nav-item i {
+            width: 20px;
+            text-align: center;
+        }
+        
+        /* 主内容区 */
+        .main-content {
+            flex: 1;
+            display: flex;
+            flex-direction: column;
+            gap: 20px;
+        }
+        
+        /* 顶部信息栏 */
+        .header {
+            background: white;
+            border-radius: 12px;
+            padding: 18px 24px;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
+        }
+        
+        .user-info {
+            display: flex;
+            align-items: center;
+            gap: 12px;
+        }
+        
+        .avatar {
+            width: 40px;
+            height: 40px;
+            border-radius: 50%;
+            background-color: #e0f2fe;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            color: var(--primary);
+            font-weight: bold;
+            cursor: pointer;
+        }
+        
+        .user-dropdown {
+            position: relative;
+        }
+        
+        .dropdown-menu {
+            position: absolute;
+            top: 50px;
+            right: 0;
+            width: 200px;
+            background: white;
+            border-radius: 8px;
+            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+            padding: 10px 0;
+            z-index: 100;
+            display: none;
+        }
+        
+        .dropdown-item {
+            padding: 10px 16px;
+            cursor: pointer;
+            transition: all 0.2s;
+            display: flex;
+            align-items: center;
+            gap: 10px;
+        }
+        
+        .dropdown-item:hover {
+            background: #f1f5f9;
+        }
+        
+        .dropdown-divider {
+            height: 1px;
+            background: #e2e8f0;
+            margin: 5px 0;
+        }
+        
+        /* 搜索栏 */
+        .search-bar {
+            display: flex;
+            gap: 10px;
+            align-items: center;
+            flex: 1;
+            max-width: 500px;
+        }
+        
+        .search-input {
+            flex: 1;
+            padding: 10px 16px;
+            border: 1px solid #e2e8f0;
+            border-radius: 8px;
+            font-size: 14px;
+        }
+        
+        .search-btn {
+            padding: 10px 16px;
+            background: var(--primary);
+            color: white;
+            border: none;
+            border-radius: 8px;
+            cursor: pointer;
+        }
+        
+        .search-advanced {
+            color: var(--primary);
+            font-size: 14px;
+            cursor: pointer;
+            white-space: nowrap;
+        }
+        
+        .search-filters {
+            display: none;
+            background: white;
+            border-radius: 8px;
+            padding: 16px;
+            margin-top: 10px;
+            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
+        }
+        
+        .search-filters.active {
+            display: block;
+        }
+        
+        .filter-row {
+            display: flex;
+            gap: 16px;
+            margin-bottom: 16px;
+        }
+        
+        .filter-group {
+            flex: 1;
+        }
+        
+        .filter-group label {
+            display: block;
+            margin-bottom: 8px;
+            font-size: 14px;
+            color: #64748b;
+        }
+        
+        .filter-select {
+            width: 100%;
+            padding: 8px 12px;
+            border: 1px solid #e2e8f0;
+            border-radius: 6px;
+            font-size: 14px;
+        }
+        
+        .filter-actions {
+            display: flex;
+            justify-content: flex-end;
+            gap: 10px;
+        }
+        
+        /* 内容区域样式 */
+        .content-area {
+            flex: 1;
+            background: white;
+            border-radius: 12px;
+            padding: 24px;
+            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
+            overflow-y: auto;
+        }
+        
+        .content-title {
+            font-size: 20px;
+            font-weight: 600;
+            margin-bottom: 24px;
+            color: var(--primary);
+            display: flex;
+            align-items: center;
+            gap: 10px;
+        }
+        
+        /* 工作/简历卡片样式 */
+        .card-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+            gap: 20px;
+            margin-top: 20px;
+        }
+        
+        .card {
+            background: white;
+            border-radius: 8px;
+            padding: 16px;
+            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
+            border: 1px solid #e2e8f0;
+            transition: all 0.2s;
+            cursor: pointer;
+        }
+        
+        .card:hover {
+            transform: translateY(-4px);
+            box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
+        }
+        
+        .card-header {
+            display: flex;
+            align-items: center;
+            gap: 12px;
+            margin-bottom: 12px;
+        }
+        
+        .card-avatar {
+            width: 48px;
+            height: 48px;
+            border-radius: 50%;
+            background-color: #e0f2fe;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            color: var(--primary);
+            font-weight: bold;
+        }
+        
+        .card-title {
+            font-weight: 600;
+            margin-bottom: 4px;
+        }
+        
+        .card-subtitle {
+            font-size: 14px;
+            color: #64748b;
+        }
+        
+        .card-tags {
+            display: flex;
+            flex-wrap: wrap;
+            gap: 8px;
+            margin-top: 12px;
+        }
+        
+        .card-tag {
+            background: #f1f5f9;
+            padding: 4px 10px;
+            border-radius: 12px;
+            font-size: 12px;
+            color: #64748b;
+        }
+        
+        .card-footer {
+            margin-top: 16px;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+        }
+        
+        .card-match {
+            background: #dcfce7;
+            color: #166534;
+            padding: 4px 10px;
+            border-radius: 12px;
+            font-size: 12px;
+        }
+        
+        .card-btn {
+            padding: 6px 12px;
+            background: var(--primary);
+            color: white;
+            border: none;
+            border-radius: 6px;
+            font-size: 12px;
+            cursor: pointer;
+        }
+        
+        /* 简历分析表单 */
+        .resume-form {
+            max-width: 800px;
+            margin: 0 auto;
+        }
+        
+        .form-section {
+            margin-bottom: 24px;
+            padding: 16px;
+            background: #f8fafc;
+            border-radius: 8px;
+        }
+        
+        .form-section-title {
+            font-size: 18px;
+            font-weight: 600;
+            margin-bottom: 16px;
+            color: var(--primary);
+            display: flex;
+            align-items: center;
+            gap: 8px;
+        }
+        
+        .form-row {
+            display: flex;
+            gap: 16px;
+            margin-bottom: 16px;
+        }
+        
+        .form-col {
+            flex: 1;
+        }
+        
+        textarea.form-control {
+            min-height: 100px;
+            resize: vertical;
+        }
+        
+        .form-actions {
+            display: flex;
+            justify-content: flex-end;
+            gap: 12px;
+            margin-top: 24px;
+        }
+        
+        /* 职业匹配结果 */
+        .match-result {
+            margin-top: 24px;
+            padding: 16px;
+            background: #f8fafc;
+            border-radius: 8px;
+        }
+        
+        .match-title {
+            font-size: 18px;
+            font-weight: 600;
+            margin-bottom: 16px;
+            color: var(--primary);
+        }
+        
+        .match-item {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            padding: 12px 0;
+            border-bottom: 1px solid #e2e8f0;
+        }
+        
+        .match-item:last-child {
+            border-bottom: none;
+        }
+        
+        .match-job {
+            font-weight: 500;
+        }
+        
+        .match-score {
+            font-weight: 600;
+            color: var(--primary);
+        }
+        
+        /* 个人中心样式 */
+        .profile-container {
+            display: flex;
+            gap: 24px;
+        }
+        
+        .profile-sidebar {
+            width: 240px;
+            background: #f8fafc;
+            border-radius: 8px;
+            padding: 16px;
+        }
+        
+        .profile-menu {
+            display: flex;
+            flex-direction: column;
+            gap: 8px;
+        }
+        
+        .profile-menu-item {
+            padding: 12px 16px;
+            border-radius: 6px;
+            cursor: pointer;
+            transition: all 0.2s;
+        }
+        
+        .profile-menu-item:hover {
+            background: #e2e8f0;
+        }
+        
+        .profile-menu-item.active {
+            background: #e0f2fe;
+            color: var(--primary);
+            font-weight: 500;
+        }
+        
+        .profile-content {
+            flex: 1;
+            background: #f8fafc;
+            border-radius: 8px;
+            padding: 24px;
+        }
+        
+        .profile-section {
+            display: none;
+        }
+        
+        .profile-section.active {
+            display: block;
+        }
+        
+        .profile-header {
+            display: flex;
+            align-items: center;
+            gap: 20px;
+            margin-bottom: 24px;
+        }
+        
+        .profile-avatar {
+            width: 80px;
+            height: 80px;
+            border-radius: 50%;
+            background-color: #e0f2fe;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            color: var(--primary);
+            font-size: 32px;
+            font-weight: bold;
+        }
+        
+        .profile-info h2 {
+            margin-bottom: 8px;
+        }
+        
+        .profile-info p {
+            color: #64748b;
+        }
+        
+        .profile-form {
+            max-width: 600px;
+        }
+        
+        /* 设置页面样式 */
+        .settings-container {
+            display: flex;
+            gap: 24px;
+        }
+        
+        .settings-sidebar {
+            width: 240px;
+            background: #f8fafc;
+            border-radius: 8px;
+            padding: 16px;
+        }
+        
+        .settings-menu {
+            display: flex;
+            flex-direction: column;
+            gap: 8px;
+        }
+        
+        .settings-menu-item {
+            padding: 12px 16px;
+            border-radius: 6px;
+            cursor: pointer;
+            transition: all 0.2s;
+        }
+        
+        .settings-menu-item:hover {
+            background: #e2e8f0;
+        }
+        
+        .settings-menu-item.active {
+            background: #e0f2fe;
+            color: var(--primary);
+            font-weight: 500;
+        }
+        
+        .settings-content {
+            flex: 1;
+            background: #f8fafc;
+            border-radius: 8px;
+            padding: 24px;
+        }
+        
+        .settings-section {
+            display: none;
+        }
+        
+        .settings-section.active {
+            display: block;
+        }
+        
+        .settings-item {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            padding: 16px 0;
+            border-bottom: 1px solid #e2e8f0;
+        }
+        
+        .settings-item:last-child {
+            border-bottom: none;
+        }
+        
+        .settings-item-info h3 {
+            margin-bottom: 4px;
+        }
+        
+        .settings-item-info p {
+            color: #64748b;
+            font-size: 14px;
+        }
+        
+        .settings-item-action .switch {
+            position: relative;
+            display: inline-block;
+            width: 50px;
+            height: 24px;
+        }
+        
+        .settings-item-action .switch input {
+            opacity: 0;
+            width: 0;
+            height: 0;
+        }
+        
+        .settings-item-action .slider {
+            position: absolute;
+            cursor: pointer;
+            top: 0;
+            left: 0;
+            right: 0;
+            bottom: 0;
+            background-color: #ccc;
+            transition: .4s;
+            border-radius: 24px;
+        }
+        
+        .settings-item-action .slider:before {
+            position: absolute;
+            content: "";
+            height: 16px;
+            width: 16px;
+            left: 4px;
+            bottom: 4px;
+            background-color: white;
+            transition: .4s;
+            border-radius: 50%;
+        }
+        
+        .settings-item-action input:checked + .slider {
+            background-color: var(--primary);
+        }
+        
+        .settings-item-action input:checked + .slider:before {
+            transform: translateX(26px);
+        }
+        
+        /* 图表容器 */
+        .chart-container {
+            width: 100%;
+            height: 400px;
+            margin-top: 24px;
+        }
+        
+        /* 模态框样式 */
+        .modal-overlay {
+            position: fixed;
+            top: 0;
+            left: 0;
+            right: 0;
+            bottom: 0;
+            background: rgba(0, 0, 0, 0.5);
+            display: none;
+            justify-content: center;
+            align-items: center;
+            z-index: 1000;
+        }
+
+        .modal-content {
+            background: white;
+            padding: 24px;
+            border-radius: 12px;
+            max-width: 600px;
+            width: 90%;
+            box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
+            max-height: 90vh;
+            overflow-y: auto;
+        }
+
+        .modal-title {
+            font-size: 18px;
+            font-weight: 600;
+            margin-bottom: 16px;
+            display: flex;
+            align-items: center;
+            gap: 10px;
+        }
+
+        .modal-buttons {
+            display: flex;
+            gap: 12px;
+            margin-top: 24px;
+        }
+
+        .modal-btn {
+            flex: 1;
+            padding: 10px;
+            border-radius: 8px;
+            border: none;
+            font-weight: 500;
+            cursor: pointer;
+            transition: all 0.2s;
+        }
+
+        .modal-btn-cancel {
+            background: #f1f5f9;
+            color: var(--dark);
+        }
+
+        .modal-btn-confirm {
+            background: var(--success);
+            color: white;
+        }
+
+        .modal-btn:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
+        }
+        
+        /* 日历样式 */
+        .calendar {
+            width: 100%;
+            border-collapse: collapse;
+            margin-top: 20px;
+        }
+        
+        .calendar th {
+            padding: 12px;
+            text-align: center;
+            background: #f1f5f9;
+            font-weight: 500;
+        }
+        
+        .calendar td {
+            padding: 12px;
+            height: 100px;
+            vertical-align: top;
+            border: 1px solid #e2e8f0;
+        }
+        
+        .calendar-day {
+            font-weight: 500;
+            margin-bottom: 6px;
+        }
+        
+        .calendar-event {
+            background: #e0f2fe;
+            color: var(--primary);
+            padding: 4px 8px;
+            border-radius: 4px;
+            font-size: 12px;
+            margin-bottom: 4px;
+            cursor: pointer;
+        }
+        
+        /* 搜索历史 */
+        .search-history {
+            margin-top: 20px;
+        }
+        
+        .history-title {
+            font-size: 16px;
+            font-weight: 500;
+            margin-bottom: 12px;
+            color: var(--dark);
+        }
+        
+        .history-tags {
+            display: flex;
+            flex-wrap: wrap;
+            gap: 8px;
+        }
+        
+        .history-tag {
+            background: #f1f5f9;
+            padding: 6px 12px;
+            border-radius: 16px;
+            font-size: 14px;
+            cursor: pointer;
+            transition: all 0.2s;
+        }
+        
+        .history-tag:hover {
+            background: #e2e8f0;
+        }
+        
+        /* 热门搜索 */
+        .hot-search {
+            margin-top: 24px;
+        }
+        
+        .hot-item {
+            display: flex;
+            align-items: center;
+            padding: 10px 0;
+            border-bottom: 1px solid #e2e8f0;
+        }
+        
+        .hot-rank {
+            width: 24px;
+            height: 24px;
+            background: #f1f5f9;
+            border-radius: 4px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            margin-right: 12px;
+            font-size: 14px;
+        }
+        
+        .hot-item:nth-child(1) .hot-rank {
+            background: #fee2e2;
+            color: #b91c1c;
+        }
+        
+        .hot-item:nth-child(2) .hot-rank {
+            background: #ffedd5;
+            color: #c2410c;
+        }
+        
+        .hot-item:nth-child(3) .hot-rank {
+            background: #fef3c7;
+            color: #b45309;
+        }
+        
+        .hot-content {
+            flex: 1;
+        }
+        
+        .hot-count {
+            color: #64748b;
+            font-size: 14px;
+        }
+        
+        /* 响应式设计 */
+        @media (max-width: 768px) {
+            .login-box {
+                width: 90%;
+                padding: 30px 20px;
+            }
+            
+            .container {
+                flex-direction: column;
+                padding: 10px;
+            }
+            
+            .sidebar {
+                width: 100%;
+                flex-direction: row;
+                align-items: center;
+            }
+            
+            .logo {
+                margin-bottom: 0;
+                margin-right: 30px;
+            }
+            
+            .nav-menu {
+                flex-direction: row;
+                overflow-x: auto;
+                padding-bottom: 10px;
+            }
+            
+            .card-grid {
+                grid-template-columns: 1fr;
+            }
+            
+            .form-row {
+                flex-direction: column;
+                gap: 16px;
+            }
+            
+            .profile-container, .settings-container {
+                flex-direction: column;
+            }
+            
+            .profile-sidebar, .settings-sidebar {
+                width: 100%;
+            }
+            
+            .profile-header {
+                flex-direction: column;
+                text-align: center;
+            }
+            
+            .filter-row {
+                flex-direction: column;
+                gap: 16px;
+            }
+        }
+    </style>
+</head>
+<body>
+    <!-- 登录页面 -->
+    <div class="login-container" id="loginPage">
+        <div class="login-box">
+            <div class="login-logo">
+                <i class="fas fa-briefcase"></i>
+                <span>智能招聘系统</span>
+            </div>
+            
+            <div class="login-tabs">
+                <div class="login-tab active" data-tab="candidate">应聘者登录</div>
+                <div class="login-tab" data-tab="recruiter">招聘者登录</div>
+            </div>
+            
+            <!-- 应聘者登录表单 -->
+            <div class="login-form active" id="candidateLogin">
+                <div class="form-group">
+                    <label for="candidateUsername">用户名</label>
+                    <input type="text" id="candidateUsername" class="form-control" placeholder="请输入用户名">
+                </div>
+                <div class="form-group">
+                    <label for="candidatePassword">密码</label>
+                    <input type="password" id="candidatePassword" class="form-control" placeholder="请输入密码">
+                </div>
+                <button class="btn btn-primary btn-block" id="candidateLoginBtn">登录</button>
+                <div class="login-links">
+                    <span class="login-link" id="showRegister">注册账号</span>
+                    <span class="login-link" id="showForgot">忘记密码</span>
+                </div>
+            </div>
+            
+            <!-- 招聘者登录表单 -->
+            <div class="login-form" id="recruiterLogin">
+                <div class="form-group">
+                    <label for="recruiterUsername">用户名</label>
+                    <input type="text" id="recruiterUsername" class="form-control" placeholder="请输入用户名">
+                </div>
+                <div class="form-group">
+                    <label for="recruiterPassword">密码</label>
+                    <input type="password" id="recruiterPassword" class="form-control" placeholder="请输入密码">
+                </div>
+                <button class="btn btn-primary btn-block" id="recruiterLoginBtn">登录</button>
+                <div class="login-links">
+                    <span class="login-link" id="showRegister2">注册账号</span>
+                    <span class="login-link" id="showForgot2">忘记密码</span>
+                </div>
+            </div>
+        </div>
+    </div>
+    
+    <!-- 注册页面 -->
+    <div class="login-container" id="registerPage" style="display: none;">
+        <div class="login-box">
+            <div class="login-logo">
+                <i class="fas fa-user-plus"></i>
+                <span>注册账号</span>
+            </div>
+            
+            <div class="login-tabs">
+                <div class="login-tab active" data-tab="candidateReg">应聘者注册</div>
+                <div class="login-tab" data-tab="recruiterReg">招聘者注册</div>
+            </div>
+            
+            <!-- 应聘者注册表单 -->
+            <div class="login-form active" id="candidateRegister">
+                <div class="form-group">
+                    <label for="regCandidateUsername">用户名</label>
+                    <input type="text" id="regCandidateUsername" class="form-control" placeholder="请输入用户名">
+                </div>
+                <div class="form-group">
+                    <label for="regCandidatePassword">密码</label>
+                    <input type="password" id="regCandidatePassword" class="form-control" placeholder="请输入密码">
+                </div>
+                <div class="form-group">
+                    <label for="regCandidateConfirm">确认密码</label>
+                    <input type="password" id="regCandidateConfirm" class="form-control" placeholder="请再次输入密码">
+                </div>
+                <div class="form-group">
+                    <label for="regCandidateEmail">电子邮箱</label>
+                    <input type="email" id="regCandidateEmail" class="form-control" placeholder="请输入电子邮箱">
+                </div>
+                <button class="btn btn-primary btn-block" id="candidateRegisterBtn">注册</button>
+                <div class="login-links">
+                    <span class="login-link" id="backToLogin">返回登录</span>
+                </div>
+            </div>
+            
+            <!-- 招聘者注册表单 -->
+            <div class="login-form" id="recruiterRegister">
+                <div class="form-group">
+                    <label for="regRecruiterUsername">用户名</label>
+                    <input type="text" id="regRecruiterUsername" class="form-control" placeholder="请输入用户名">
+                </div>
+                <div class="form-group">
+                    <label for="regRecruiterPassword">密码</label>
+                    <input type="password" id="regRecruiterPassword" class="form-control" placeholder="请输入密码">
+                </div>
+                <div class="form-group">
+                    <label for="regRecruiterConfirm">确认密码</label>
+                    <input type="password" id="regRecruiterConfirm" class="form-control" placeholder="请再次输入密码">
+                </div>
+                <div class="form-group">
+                    <label for="regRecruiterEmail">电子邮箱</label>
+                    <input type="email" id="regRecruiterEmail" class="form-control" placeholder="请输入电子邮箱">
+                </div>
+                <div class="form-group">
+                    <label for="regCompany">公司名称</label>
+                    <input type="text" id="regCompany" class="form-control" placeholder="请输入公司名称">
+                </div>
+                <button class="btn btn-primary btn-block" id="recruiterRegisterBtn">注册</button>
+                <div class="login-links">
+                    <span class="login-link" id="backToLogin2">返回登录</span>
+                </div>
+            </div>
+        </div>
+    </div>
+    
+    <!-- 忘记密码页面 -->
+    <div class="login-container" id="forgotPage" style="display: none;">
+        <div class="login-box">
+            <div class="login-logo">
+                <i class="fas fa-key"></i>
+                <span>找回密码</span>
+            </div>
+            
+            <div class="form-group">
+                <label for="forgotEmail">电子邮箱</label>
+                <input type="email" id="forgotEmail" class="form-control" placeholder="请输入注册时使用的电子邮箱">
+            </div>
+            <button class="btn btn-primary btn-block" id="forgotBtn">发送重置链接</button>
+            <div class="login-links">
+                <span class="login-link" id="backToLogin3">返回登录</span>
+            </div>
+        </div>
+    </div>
+    
+    <!-- 主界面 - 应聘者 -->
+    <div class="container" id="candidateContainer">
+        <!-- 左侧导航 -->
+        <div class="sidebar">
+            <div class="logo">
+                <i class="fas fa-user-tie"></i>
+                <span>应聘者中心</span>
+            </div>
+            <div class="nav-menu">
+                <div class="nav-item active" id="navCandidateJobs">
+                    <i class="fas fa-briefcase"></i>
+                    <span>工作机会</span>
+                </div>
+                <div class="nav-item" id="navCandidateResume">
+                    <i class="fas fa-file-alt"></i>
+                    <span>简历分析</span>
+                </div>
+                <div class="nav-item" id="navCandidateInterview">
+                    <i class="fas fa-video"></i>
+                    <span>视频面试</span>
+                </div>
+                <div class="nav-item" id="navCandidateRecords">
+                    <i class="fas fa-history"></i>
+                    <span>面试记录</span>
+                </div>
+                <div class="nav-item" id="navCandidateProfile">
+                    <i class="fas fa-user"></i>
+                    <span>个人中心</span>
+                </div>
+                <div class="nav-item" id="navCandidateSettings">
+                    <i class="fas fa-cog"></i>
+                    <span>系统设置</span>
+                </div>
+            </div>
+        </div>
+        
+        <!-- 主内容区 -->
+        <div class="main-content">
+            <!-- 顶部信息栏 -->
+            <div class="header">
+                <div class="search-bar">
+                    <input type="text" class="search-input" placeholder="搜索工作职位、公司..." id="candidateSearchInput">
+                    <button class="search-btn" id="candidateSearchBtn">
+                        <i class="fas fa-search"></i>
+                    </button>
+                    <span class="search-advanced" id="candidateAdvancedSearch">高级筛选</span>
+                </div>
+                <div class="search-filters" id="candidateSearchFilters">
+                    <div class="filter-row">
+                        <div class="filter-group">
+                            <label for="jobTypeFilter">职位类型</label>
+                            <select id="jobTypeFilter" class="filter-select">
+                                <option value="">全部</option>
+                                <option value="fulltime">全职</option>
+                                <option value="parttime">兼职</option>
+                                <option value="intern">实习</option>
+                            </select>
+                        </div>
+                        <div class="filter-group">
+                            <label for="jobLocationFilter">工作地点</label>
+                            <select id="jobLocationFilter" class="filter-select">
+                                <option value="">全部</option>
+                                <option value="beijing">北京</option>
+                                <option value="shanghai">上海</option>
+                                <option value="guangzhou">广州</option>
+                                <option value="shenzhen">深圳</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="filter-row">
+                        <div class="filter-group">
+                            <label for="jobSalaryFilter">薪资范围</label>
+                            <select id="jobSalaryFilter" class="filter-select">
+                                <option value="">全部</option>
+                                <option value="10k">10k以下</option>
+                                <option value="10-20k">10-20k</option>
+                                <option value="20-30k">20-30k</option>
+                                <option value="30k+">30k以上</option>
+                            </select>
+                        </div>
+                        <div class="filter-group">
+                            <label for="jobExperienceFilter">经验要求</label>
+                            <select id="jobExperienceFilter" class="filter-select">
+                                <option value="">全部</option>
+                                <option value="1">1年以下</option>
+                                <option value="1-3">1-3年</option>
+                                <option value="3-5">3-5年</option>
+                                <option value="5+">5年以上</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="filter-actions">
+                        <button class="btn" id="resetFilters">重置</button>
+                        <button class="btn btn-primary" id="applyFilters">应用筛选</button>
+                    </div>
+                </div>
+                <div class="user-info">
+                    <div class="user-dropdown">
+                        <div class="avatar" id="userAvatar">张</div>
+                        <div class="dropdown-menu" id="userDropdown">
+                            <div class="dropdown-item" id="dropdownProfile">
+                                <i class="fas fa-user"></i> 个人中心
+                            </div>
+                            <div class="dropdown-item" id="dropdownSettings">
+                                <i class="fas fa-cog"></i> 系统设置
+                            </div>
+                            <div class="dropdown-divider"></div>
+                            <div class="dropdown-item" id="dropdownLogout">
+                                <i class="fas fa-sign-out-alt"></i> 退出登录
+                            </div>
+                        </div>
+                    </div>
+                    <div>
+                        <div style="font-weight: 500;">张伟</div>
+                        <div style="font-size: 12px; color: #64748b;">应聘者</div>
+                    </div>
+                </div>
+            </div>
+            
+            <!-- 工作机会页面 -->
+            <div class="content-area" id="candidateJobsPage">
+                <div class="content-title">
+                    <i class="fas fa-briefcase"></i>
+                    <span>推荐工作机会</span>
+                </div>
+                
+                <!-- 搜索历史 -->
+                <div class="search-history">
+                    <div class="history-title">搜索历史</div>
+                    <div class="history-tags" id="searchHistoryTags">
+                        <span class="history-tag">前端开发</span>
+                        <span class="history-tag">北京</span>
+                        <span class="history-tag">20k以上</span>
+                        <span class="history-tag">互联网</span>
+                    </div>
+                </div>
+                
+                <!-- 热门搜索 -->
+                <div class="hot-search">
+                    <div class="history-title">热门搜索</div>
+                    <div id="hotSearchList">
+                        <div class="hot-item">
+                            <div class="hot-rank">1</div>
+                            <div class="hot-content">Java开发工程师</div>
+                            <div class="hot-count">1.2万次</div>
+                        </div>
+                        <div class="hot-item">
+                            <div class="hot-rank">2</div>
+                            <div class="hot-content">产品经理</div>
+                            <div class="hot-count">9800次</div>
+                        </div>
+                        <div class="hot-item">
+                            <div class="hot-rank">3</div>
+                            <div class="hot-content">UI设计师</div>
+                            <div class="hot-count">8500次</div>
+                        </div>
+                        <div class="hot-item">
+                            <div class="hot-rank">4</div>
+                            <div class="hot-content">数据分析师</div>
+                            <div class="hot-count">7200次</div>
+                        </div>
+                    </div>
+                </div>
+                
+                <div class="card-grid" id="jobGrid">
+                    <!-- 工作卡片将通过JS动态生成 -->
+                </div>
+            </div>
+            
+            <!-- 简历分析页面 -->
+            <div class="content-area" id="candidateResumePage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-file-alt"></i>
+                    <span>我的简历</span>
+                </div>
+                
+                <div class="resume-form">
+                    <div class="form-section">
+                        <div class="form-section-title">
+                            <i class="fas fa-user"></i>
+                            <span>基本信息</span>
+                        </div>
+                        <div class="form-row">
+                            <div class="form-col">
+                                <label for="resumeName">姓名</label>
+                                <input type="text" id="resumeName" class="form-control" placeholder="请输入您的姓名" value="张伟">
+                            </div>
+                            <div class="form-col">
+                                <label for="resumeGender">性别</label>
+                                <select id="resumeGender" class="form-control">
+                                    <option value="male" selected>男</option>
+                                    <option value="female">女</option>
+                                    <option value="other">其他</option>
+                                </select>
+                            </div>
+                        </div>
+                        <div class="form-row">
+                            <div class="form-col">
+                                <label for="resumeBirth">出生日期</label>
+                                <input type="date" id="resumeBirth" class="form-control" value="1990-05-15">
+                            </div>
+                            <div class="form-col">
+                                <label for="resumePhone">联系电话</label>
+                                <input type="tel" id="resumePhone" class="form-control" placeholder="请输入联系电话" value="13800138000">
+                            </div>
+                        </div>
+                        <div class="form-row">
+                            <div class="form-col">
+                                <label for="resumeEmail">电子邮箱</label>
+                                <input type="email" id="resumeEmail" class="form-control" placeholder="请输入电子邮箱" value="zhangwei@example.com">
+                            </div>
+                            <div class="form-col">
+                                <label for="resumeLocation">居住地</label>
+                                <input type="text" id="resumeLocation" class="form-control" placeholder="请输入居住城市" value="北京">
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div class="form-section">
+                        <div class="form-section-title">
+                            <i class="fas fa-graduation-cap"></i>
+                            <span>教育背景</span>
+                        </div>
+                        <div class="form-row">
+                            <div class="form-col">
+                                <label for="resumeSchool">学校名称</label>
+                                <input type="text" id="resumeSchool" class="form-control" placeholder="请输入学校名称" value="北京大学">
+                            </div>
+                            <div class="form-col">
+                                <label for="resumeDegree">学历</label>
+                                <select id="resumeDegree" class="form-control">
+                                    <option value="bachelor" selected>本科</option>
+                                    <option value="master">硕士</option>
+                                    <option value="phd">博士</option>
+                                    <option value="college">大专</option>
+                                </select>
+                            </div>
+                        </div>
+                        <div class="form-row">
+                            <div class="form-col">
+                                <label for="resumeMajor">专业</label>
+                                <input type="text" id="resumeMajor" class="form-control" placeholder="请输入所学专业" value="计算机科学与技术">
+                            </div>
+                            <div class="form-col">
+                                <label for="resumeGraduation">毕业时间</label>
+                                <input type="date" id="resumeGraduation" class="form-control" value="2012-06-30">
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div class="form-section">
+                        <div class="form-section-title">
+                            <i class="fas fa-briefcase"></i>
+                            <span>工作经历</span>
+                        </div>
+                        <div id="workExperienceContainer">
+                            <!-- 工作经历将通过JS动态添加 -->
+                        </div>
+                        <button class="btn" id="addWorkExperience" style="margin-top: 10px;">
+                            <i class="fas fa-plus"></i> 添加工作经历
+                        </button>
+                    </div>
+                    
+                    <div class="form-section">
+                        <div class="form-section-title">
+                            <i class="fas fa-project-diagram"></i>
+                            <span>项目经验</span>
+                        </div>
+                        <div id="projectExperienceContainer">
+                            <!-- 项目经验将通过JS动态添加 -->
+                        </div>
+                        <button class="btn" id="addProjectExperience" style="margin-top: 10px;">
+                            <i class="fas fa-plus"></i> 添加项目经验
+                        </button>
+                    </div>
+                    
+                    <div class="form-section">
+                        <div class="form-section-title">
+                            <i class="fas fa-star"></i>
+                            <span>技能专长</span>
+                        </div>
+                        <div class="form-group">
+                            <label for="resumeSkills">技能 (用逗号分隔)</label>
+                            <input type="text" id="resumeSkills" class="form-control" placeholder="例如: JavaScript, Python, 项目管理" value="JavaScript, HTML5, CSS3, Vue.js, React, Node.js, 项目管理">
+                        </div>
+                    </div>
+                    
+                    <div class="form-section">
+                        <div class="form-section-title">
+                            <i class="fas fa-certificate"></i>
+                            <span>证书资质</span>
+                        </div>
+                        <div id="certificateContainer">
+                            <!-- 证书将通过JS动态添加 -->
+                        </div>
+                        <button class="btn" id="addCertificate" style="margin-top: 10px;">
+                            <i class="fas fa-plus"></i> 添加证书
+                        </button>
+                    </div>
+                    
+                    <div class="form-actions">
+                        <button class="btn" id="cancelResume">
+                            取消
+                        </button>
+                        <button class="btn btn-primary" id="saveResume">
+                            <i class="fas fa-save"></i> 保存简历
+                        </button>
+                        <button class="btn btn-primary" id="analyzeResume">
+                            <i class="fas fa-chart-bar"></i> 分析匹配度
+                        </button>
+                    </div>
+                </div>
+                
+                <!-- 职业匹配结果 -->
+                <div class="match-result" id="matchResult" style="display: none;">
+                    <div class="match-title">
+                        <i class="fas fa-chart-pie"></i>
+                        <span>职业匹配分析</span>
+                    </div>
+                    <div id="matchList">
+                        <!-- 匹配结果将通过JS动态生成 -->
+                    </div>
+                    <div class="chart-container" id="matchChart"></div>
+                </div>
+            </div>
+            
+            <!-- 视频面试页面 -->
+            <div class="content-area" id="candidateInterviewPage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-video"></i>
+                    <span>视频面试</span>
+                </div>
+                
+                <div class="calendar-container">
+                    <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px;">
+                        <h3>2023年11月</h3>
+                        <div>
+                            <button class="btn" id="prevMonth">
+                                <i class="fas fa-chevron-left"></i>
+                            </button>
+                            <button class="btn" id="nextMonth">
+                                <i class="fas fa-chevron-right"></i>
+                            </button>
+                        </div>
+                    </div>
+                    
+                    <table class="calendar">
+                        <thead>
+                            <tr>
+                                <th>日</th>
+                                <th>一</th>
+                                <th>二</th>
+                                <th>三</th>
+                                <th>四</th>
+                                <th>五</th>
+                                <th>六</th>
+                            </tr>
+                        </thead>
+                        <tbody id="calendarBody">
+                            <!-- 日历内容将通过JS动态生成 -->
+                        </tbody>
+                    </table>
+                </div>
+                
+                <div style="margin-top: 30px;">
+                    <h3 style="margin-bottom: 16px;">面试安排</h3>
+                    <div class="card">
+                        <div class="card-header">
+                            <div class="card-avatar">X</div>
+                            <div>
+                                <div class="card-title">前端开发工程师面试</div>
+                                <div class="card-subtitle">XX科技公司 · 2023-11-15 14:00</div>
+                            </div>
+                        </div>
+                        <div class="card-tags">
+                            <span class="card-tag">视频面试</span>
+                            <span class="card-tag">技术面试</span>
+                        </div>
+                        <div class="card-footer">
+                            <span>面试官: 李经理</span>
+                            <button class="card-btn">进入面试</button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            
+            <!-- 面试记录页面 -->
+            <div class="content-area" id="candidateRecordsPage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-history"></i>
+                    <span>面试记录</span>
+                </div>
+                
+                <div class="card-grid">
+                    <div class="card">
+                        <div class="card-header">
+                            <div class="card-avatar">X</div>
+                            <div>
+                                <div class="card-title">前端开发工程师</div>
+                                <div class="card-subtitle">XX科技公司 · 2023-10-20</div>
+                            </div>
+                        </div>
+                        <div class="card-tags">
+                            <span class="card-tag">技术面试</span>
+                            <span class="card-tag">通过</span>
+                        </div>
+                        <div class="card-footer">
+                            <span>面试官: 王总监</span>
+                            <button class="card-btn">查看反馈</button>
+                        </div>
+                    </div>
+                    
+                    <div class="card">
+                        <div class="card-header">
+                            <div class="card-avatar">Y</div>
+                            <div>
+                                <div class="card-title">高级前端开发</div>
+                                <div class="card-subtitle">YY互联网公司 · 2023-09-15</div>
+                            </div>
+                        </div>
+                        <div class="card-tags">
+                            <span class="card-tag">技术面试</span>
+                            <span class="card-tag">未通过</span>
+                        </div>
+                        <div class="card-footer">
+                            <span>评分: 4.5/5</span>
+                            <button class="card-btn">查看反馈</button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            
+            <!-- 个人中心页面 -->
+            <div class="content-area" id="candidateProfilePage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-user"></i>
+                    <span>个人中心</span>
+                </div>
+                
+                <div class="profile-container">
+                    <div class="profile-sidebar">
+                        <div class="profile-menu">
+                            <div class="profile-menu-item active" data-section="basicInfo">基本信息</div>
+                            <div class="profile-menu-item" data-section="education">教育背景</div>
+                            <div class="profile-menu-item" data-section="experience">工作经历</div>
+                            <div class="profile-menu-item" data-section="security">账户安全</div>
+                        </div>
+                    </div>
+                    
+                    <div class="profile-content">
+                        <!-- 基本信息 -->
+                        <div class="profile-section active" id="basicInfoSection">
+                            <div class="profile-header">
+                                <div class="profile-avatar">张</div>
+                                <div class="profile-info">
+                                    <h2>张伟</h2>
+                                    <p>前端开发工程师 | 5年经验</p>
+                                    <button class="btn" style="margin-top: 10px;">
+                                        <i class="fas fa-camera"></i> 更换头像
+                                    </button>
+                                </div>
+                            </div>
+                            
+                            <div class="profile-form">
+                                <div class="form-group">
+                                    <label for="profileName">姓名</label>
+                                    <input type="text" id="profileName" class="form-control" value="张伟">
+                                </div>
+                                
+                                <div class="form-row">
+                                    <div class="form-col">
+                                        <label for="profileGender">性别</label>
+                                        <select id="profileGender" class="form-control">
+                                            <option value="male" selected>男</option>
+                                            <option value="female">女</option>
+                                            <option value="other">其他</option>
+                                        </select>
+                                    </div>
+                                    <div class="form-col">
+                                        <label for="profileBirth">出生日期</label>
+                                        <input type="date" id="profileBirth" class="form-control" value="1990-05-15">
+                                    </div>
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="profilePhone">联系电话</label>
+                                    <input type="tel" id="profilePhone" class="form-control" value="13800138000">
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="profileEmail">电子邮箱</label>
+                                    <input type="email" id="profileEmail" class="form-control" value="zhangwei@example.com">
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="profileLocation">居住地</label>
+                                    <input type="text" id="profileLocation" class="form-control" value="北京市朝阳区">
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="profileBio">个人简介</label>
+                                    <textarea id="profileBio" class="form-control" rows="4">5年前端开发经验,精通Vue.js和React框架,有丰富的项目管理和团队协作经验。</textarea>
+                                </div>
+                                
+                                <div class="form-actions">
+                                    <button class="btn">取消</button>
+                                    <button class="btn btn-primary">保存更改</button>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <!-- 教育背景 -->
+                        <div class="profile-section" id="educationSection">
+                            <h2 style="margin-bottom: 20px;">教育背景</h2>
+                            
+                            <div class="form-section">
+                                <div class="form-row">
+                                    <div class="form-col">
+                                        <label for="eduSchool">学校名称</label>
+                                        <input type="text" id="eduSchool" class="form-control" value="北京大学">
+                                    </div>
+                                    <div class="form-col">
+                                        <label for="eduDegree">学历</label>
+                                        <select id="eduDegree" class="form-control">
+                                            <option value="bachelor" selected>本科</option>
+                                            <option value="master">硕士</option>
+                                            <option value="phd">博士</option>
+                                        </select>
+                                    </div>
+                                </div>
+                                
+                                <div class="form-row">
+                                    <div class="form-col">
+                                        <label for="eduMajor">专业</label>
+                                        <input type="text" id="eduMajor" class="form-control" value="计算机科学与技术">
+                                    </div>
+                                    <div class="form-col">
+                                        <label for="eduGraduation">毕业时间</label>
+                                        <input type="date" id="eduGraduation" class="form-control" value="2012-06-30">
+                                    </div>
+                                </div>
+                                
+                                <div class="form-actions">
+                                    <button class="btn">取消</button>
+                                    <button class="btn btn-primary">保存更改</button>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <!-- 工作经历 -->
+                        <div class="profile-section" id="experienceSection">
+                            <h2 style="margin-bottom: 20px;">工作经历</h2>
+                            
+                            <div class="form-section">
+                                <div class="form-row">
+                                    <div class="form-col">
+                                        <label for="expCompany">公司名称</label>
+                                        <input type="text" id="expCompany" class="form-control" value="AA科技有限公司">
+                                    </div>
+                                    <div class="form-col">
+                                        <label for="expPosition">职位</label>
+                                        <input type="text" id="expPosition" class="form-control" value="高级前端开发工程师">
+                                    </div>
+                                </div>
+                                
+                                <div class="form-row">
+                                    <div class="form-col">
+                                        <label for="expStart">开始时间</label>
+                                        <input type="date" id="expStart" class="form-control" value="2018-03-01">
+                                    </div>
+                                    <div class="form-col">
+                                        <label for="expEnd">结束时间</label>
+                                        <input type="date" id="expEnd" class="form-control" value="2023-05-31">
+                                    </div>
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="expDescription">工作描述</label>
+                                    <textarea id="expDescription" class="form-control" rows="4">负责公司核心产品的前端架构设计和开发,带领3人前端团队,使用Vue.js和React技术栈。</textarea>
+                                </div>
+                                
+                                <button class="btn" style="margin-top: 10px;">
+                                    <i class="fas fa-plus"></i> 添加工作经历
+                                </button>
+                                
+                                <div class="form-actions">
+                                    <button class="btn">取消</button>
+                                    <button class="btn btn-primary">保存更改</button>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <!-- 账户安全 -->
+                        <div class="profile-section" id="securitySection">
+                            <h2 style="margin-bottom: 20px;">账户安全</h2>
+                            
+                            <div class="form-section">
+                                <div class="form-group">
+                                    <label for="currentPassword">当前密码</label>
+                                    <input type="password" id="currentPassword" class="form-control" placeholder="请输入当前密码">
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="newPassword">新密码</label>
+                                    <input type="password" id="newPassword" class="form-control" placeholder="请输入新密码">
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="confirmPassword">确认新密码</label>
+                                    <input type="password" id="confirmPassword" class="form-control" placeholder="请再次输入新密码">
+                                </div>
+                                
+                                <div class="form-actions">
+                                    <button class="btn">取消</button>
+                                    <button class="btn btn-primary">更改密码</button>
+                                </div>
+                            </div>
+                            
+                            <div class="form-section" style="margin-top: 30px;">
+                                <div class="form-section-title">
+                                    <i class="fas fa-shield-alt"></i>
+                                    <span>安全设置</span>
+                                </div>
+                                
+                                <div class="settings-item">
+                                    <div class="settings-item-info">
+                                        <h3>双重验证</h3>
+                                        <p>为您的账户增加额外的安全层</p>
+                                    </div>
+                                    <div class="settings-item-action">
+                                        <label class="switch">
+                                            <input type="checkbox">
+                                            <span class="slider"></span>
+                                        </label>
+                                    </div>
+                                </div>
+                                
+                                <div class="settings-item">
+                                    <div class="settings-item-info">
+                                        <h3>登录提醒</h3>
+                                        <p>当账户在新设备登录时发送通知</p>
+                                    </div>
+                                    <div class="settings-item-action">
+                                        <label class="switch">
+                                            <input type="checkbox" checked>
+                                            <span class="slider"></span>
+                                        </label>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            
+            <!-- 系统设置页面 -->
+            <div class="content-area" id="candidateSettingsPage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-cog"></i>
+                    <span>系统设置</span>
+                </div>
+                
+                <div class="settings-container">
+                    <div class="settings-sidebar">
+                        <div class="settings-menu">
+                            <div class="settings-menu-item active" data-section="notificationSettings">通知设置</div>
+                            <div class="settings-menu-item" data-section="privacySettings">隐私设置</div>
+                            <div class="settings-menu-item" data-section="appearanceSettings">外观设置</div>
+                        </div>
+                    </div>
+                    
+                    <div class="settings-content">
+                        <!-- 通知设置 -->
+                        <div class="settings-section active" id="notificationSettings">
+                            <h2 style="margin-bottom: 20px;">通知设置</h2>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>职位推荐</h3>
+                                    <p>接收系统推荐的匹配职位通知</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox" checked>
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>面试邀请</h3>
+                                    <p>接收企业发送的面试邀请通知</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox" checked>
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>系统消息</h3>
+                                    <p>接收系统更新和维护通知</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox" checked>
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>营销信息</h3>
+                                    <p>接收合作伙伴的优惠和活动信息</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox">
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="form-group" style="margin-top: 30px;">
+                                <label for="notificationEmail">通知邮箱</label>
+                                <input type="email" id="notificationEmail" class="form-control" value="zhangwei@example.com">
+                            </div>
+                            
+                            <div class="form-actions">
+                                <button class="btn">取消</button>
+                                <button class="btn btn-primary">保存设置</button>
+                            </div>
+                        </div>
+                        
+                        <!-- 隐私设置 -->
+                        <div class="settings-section" id="privacySettings">
+                            <h2 style="margin-bottom: 20px;">隐私设置</h2>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>公开简历</h3>
+                                    <p>允许企业搜索和查看您的简历</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox" checked>
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>联系方式可见</h3>
+                                    <p>允许企业查看您的联系方式</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox">
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>个性化推荐</h3>
+                                    <p>根据您的浏览记录推荐职位</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox" checked>
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="form-group" style="margin-top: 30px;">
+                                <label for="privacyLevel">隐私级别</label>
+                                <select id="privacyLevel" class="form-control">
+                                    <option value="high">高 - 仅对申请的企业可见</option>
+                                    <option value="medium" selected>中 - 对所有认证企业可见</option>
+                                    <option value="low">低 - 对所有用户可见</option>
+                                </select>
+                            </div>
+                            
+                            <div class="form-actions">
+                                <button class="btn">取消</button>
+                                <button class="btn btn-primary">保存设置</button>
+                            </div>
+                        </div>
+                        
+                        <!-- 外观设置 -->
+                        <div class="settings-section" id="appearanceSettings">
+                            <h2 style="margin-bottom: 20px;">外观设置</h2>
+                            
+                            <div class="form-group">
+                                <label for="themeSelect">主题颜色</label>
+                                <select id="themeSelect" class="form-control">
+                                    <option value="light" selected>浅色主题</option>
+                                    <option value="dark">深色主题</option>
+                                    <option value="system">跟随系统</option>
+                                </select>
+                            </div>
+                            
+                            <div class="form-group">
+                                <label for="fontSize">字体大小</label>
+                                <select id="fontSize" class="form-control">
+                                    <option value="small">小</option>
+                                    <option value="medium" selected>中</option>
+                                    <option value="large">大</option>
+                                </select>
+                            </div>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>动画效果</h3>
+                                    <p>启用界面过渡动画</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox" checked>
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="form-actions">
+                                <button class="btn">取消</button>
+                                <button class="btn btn-primary">保存设置</button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    
+    <!-- 主界面 - 招聘者 -->
+    <div class="container" id="recruiterContainer">
+        <!-- 左侧导航 -->
+        <div class="sidebar">
+            <div class="logo">
+                <i class="fas fa-building"></i>
+                <span>招聘者中心</span>
+            </div>
+            <div class="nav-menu">
+                <div class="nav-item active" id="navRecruiterCandidates">
+                    <i class="fas fa-users"></i>
+                    <span>候选人</span>
+                </div>
+                <div class="nav-item" id="navRecruiterJobs">
+                    <i class="fas fa-briefcase"></i>
+                    <span>职位管理</span>
+                </div>
+                <div class="nav-item" id="navRecruiterResume">
+                    <i class="fas fa-file-alt"></i>
+                    <span>简历分析</span>
+                </div>
+                <div class="nav-item" id="navRecruiterInterview">
+                    <i class="fas fa-video"></i>
+                    <span>视频面试</span>
+                </div>
+                <div class="nav-item" id="navRecruiterRecords">
+                    <i class="fas fa-history"></i>
+                    <span>面试记录</span>
+                </div>
+                <div class="nav-item" id="navRecruiterAnalysis">
+                    <i class="fas fa-chart-bar"></i>
+                    <span>数据分析</span>
+                </div>
+                <div class="nav-item" id="navRecruiterProfile">
+                    <i class="fas fa-user"></i>
+                    <span>个人中心</span>
+                </div>
+                <div class="nav-item" id="navRecruiterSettings">
+                    <i class="fas fa-cog"></i>
+                    <span>系统设置</span>
+                </div>
+            </div>
+        </div>
+        
+        <!-- 主内容区 -->
+        <div class="main-content">
+            <!-- 顶部信息栏 -->
+            <div class="header">
+                <div class="search-bar">
+                    <input type="text" class="search-input" placeholder="搜索候选人姓名、技能..." id="recruiterSearchInput">
+                    <button class="search-btn" id="recruiterSearchBtn">
+                        <i class="fas fa-search"></i>
+                    </button>
+                    <span class="search-advanced" id="recruiterAdvancedSearch">高级筛选</span>
+                </div>
+                <div class="search-filters" id="recruiterSearchFilters">
+                    <div class="filter-row">
+                        <div class="filter-group">
+                            <label for="candidateLocationFilter">期望地点</label>
+                            <select id="candidateLocationFilter" class="filter-select">
+                                <option value="">全部</option>
+                                <option value="beijing">北京</option>
+                                <option value="shanghai">上海</option>
+                                <option value="guangzhou">广州</option>
+                                <option value="shenzhen">深圳</option>
+                                <option value="remote">远程</option>
+                            </select>
+                        </div>
+                        <div class="filter-group">
+                            <label for="candidateExperienceFilter">工作经验</label>
+                            <select id="candidateExperienceFilter" class="filter-select">
+                                <option value="">全部</option>
+                                <option value="1">1年以下</option>
+                                <option value="1-3">1-3年</option>
+                                <option value="3-5">3-5年</option>
+                                <option value="5+">5年以上</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="filter-row">
+                        <div class="filter-group">
+                            <label for="candidateEducationFilter">学历要求</label>
+                            <select id="candidateEducationFilter" class="filter-select">
+                                <option value="">全部</option>
+                                <option value="college">大专</option>
+                                <option value="bachelor">本科</option>
+                                <option value="master">硕士</option>
+                                <option value="phd">博士</option>
+                            </select>
+                        </div>
+                        <div class="filter-group">
+                            <label for="candidateSalaryFilter">期望薪资</label>
+                            <select id="candidateSalaryFilter" class="filter-select">
+                                <option value="">全部</option>
+                                <option value="10k">10k以下</option>
+                                <option value="10-20k">10-20k</option>
+                                <option value="20-30k">20-30k</option>
+                                <option value="30k+">30k以上</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="filter-actions">
+                        <button class="btn" id="resetRecruiterFilters">重置</button>
+                        <button class="btn btn-primary" id="applyRecruiterFilters">应用筛选</button>
+                    </div>
+                </div>
+                <div class="user-info">
+                    <div class="user-dropdown">
+                        <div class="avatar" id="recruiterAvatar">李</div>
+                        <div class="dropdown-menu" id="recruiterDropdown">
+                            <div class="dropdown-item" id="dropdownRecruiterProfile">
+                                <i class="fas fa-user"></i> 个人中心
+                            </div>
+                            <div class="dropdown-item" id="dropdownRecruiterSettings">
+                                <i class="fas fa-cog"></i> 系统设置
+                            </div>
+                            <div class="dropdown-divider"></div>
+                            <div class="dropdown-item" id="dropdownRecruiterLogout">
+                                <i class="fas fa-sign-out-alt"></i> 退出登录
+                            </div>
+                        </div>
+                    </div>
+                    <div>
+                        <div style="font-weight: 500;">李明</div>
+                        <div style="font-size: 12px; color: #64748b;">XX公司招聘经理</div>
+                    </div>
+                </div>
+            </div>
+            
+            <!-- 候选人页面 -->
+            <div class="content-area" id="recruiterCandidatesPage">
+                <div class="content-title">
+                    <i class="fas fa-users"></i>
+                    <span>候选人列表</span>
+                </div>
+                
+                <!-- 搜索历史 -->
+                <div class="search-history">
+                    <div class="history-title">搜索历史</div>
+                    <div class="history-tags" id="recruiterSearchHistoryTags">
+                        <span class="history-tag">前端开发</span>
+                        <span class="history-tag">3-5年经验</span>
+                        <span class="history-tag">本科</span>
+                        <span class="history-tag">北京</span>
+                    </div>
+                </div>
+                
+                <div class="card-grid" id="candidateGrid">
+                    <!-- 候选人卡片将通过JS动态生成 -->
+                </div>
+            </div>
+            
+            <!-- 职位管理页面 -->
+            <div class="content-area" id="recruiterJobsPage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-briefcase"></i>
+                    <span>职位管理</span>
+                </div>
+                <div style="text-align: right; margin-bottom: 20px;">
+                    <button class="btn btn-primary" id="addJobBtn">
+                        <i class="fas fa-plus"></i> 发布新职位
+                    </button>
+                </div>
+                <div class="card-grid" id="jobManageGrid">
+                    <!-- 职位管理卡片将通过JS动态生成 -->
+                </div>
+            </div>
+            
+            <!-- 简历分析页面 -->
+            <div class="content-area" id="recruiterResumePage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-file-alt"></i>
+                    <span>简历分析</span>
+                </div>
+                
+                <div style="display: flex; gap: 20px;">
+                    <div style="flex: 1;">
+                        <div class="card">
+                            <div class="card-header">
+                                <div class="card-avatar">张</div>
+                                <div>
+                                    <div class="card-title">张伟</div>
+                                    <div class="card-subtitle">前端开发工程师 · 5年经验</div>
+                                </div>
+                            </div>
+                            <div class="card-tags">
+                                <span class="card-tag">JavaScript</span>
+                                <span class="card-tag">Vue.js</span>
+                                <span class="card-tag">React</span>
+                                <span class="card-tag">+5</span>
+                            </div>
+                            <div class="card-footer">
+                                <span class="card-match">匹配度: 88%</span>
+                                <button class="card-btn">邀请面试</button>
+                            </div>
+                        </div>
+                        
+                        <div class="form-section" style="margin-top: 20px;">
+                            <div class="form-section-title">
+                                <i class="fas fa-star"></i>
+                                <span>AI分析评价</span>
+                            </div>
+                            <div style="padding: 12px; background: #f8fafc; border-radius: 8px;">
+                                <p>候选人技术栈与职位要求高度匹配,尤其在Vue.js和React方面有丰富经验。具备5年开发经验,主导过多个大型项目,团队协作能力强。教育背景优秀,毕业于北京大学计算机专业。建议重点关注。</p>
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div style="flex: 2;">
+                        <div class="form-section">
+                            <div class="form-section-title">
+                                <i class="fas fa-user"></i>
+                                <span>基本信息</span>
+                            </div>
+                            <div style="display: flex; gap: 20px; margin-bottom: 16px;">
+                                <div>
+                                    <div style="font-size: 14px; color: #64748b;">姓名</div>
+                                    <div style="font-weight: 500;">张伟</div>
+                                </div>
+                                <div>
+                                    <div style="font-size: 14px; color: #64748b;">性别</div>
+                                    <div style="font-weight: 500;">男</div>
+                                </div>
+                                <div>
+                                    <div style="font-size: 14px; color: #64748b;">年龄</div>
+                                    <div style="font-weight: 500;">33</div>
+                                </div>
+                                <div>
+                                    <div style="font-size: 14px; color: #64748b;">电话</div>
+                                    <div style="font-weight: 500;">138****8000</div>
+                                </div>
+                                <div>
+                                    <div style="font-size: 14px; color: #64748b;">邮箱</div>
+                                    <div style="font-weight: 500;">zhangwei@example.com</div>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <div class="form-section">
+                            <div class="form-section-title">
+                                <i class="fas fa-graduation-cap"></i>
+                                <span>教育背景</span>
+                            </div>
+                            <div style="margin-bottom: 16px;">
+                                <div style="font-weight: 500; margin-bottom: 4px;">北京大学</div>
+                                <div style="color: #64748b; margin-bottom: 4px;">计算机科学与技术 · 本科 · 2008-2012</div>
+                            </div>
+                        </div>
+                        
+                        <div class="form-section">
+                            <div class="form-section-title">
+                                <i class="fas fa-briefcase"></i>
+                                <span>工作经历</span>
+                            </div>
+                            <div style="margin-bottom: 16px;">
+                                <div style="font-weight: 500; margin-bottom: 4px;">AA科技有限公司 · 高级前端开发工程师</div>
+                                <div style="color: #64748b; margin-bottom: 4px;">2018-2023 · 5年</div>
+                                <div style="margin-top: 8px;">
+                                    <p>负责公司核心产品的规划与设计,主导产品从0到1的开发...</p>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <div class="form-section">
+                            <div class="form-section-title">
+                                <i class="fas fa-project-diagram"></i>
+                                <span>项目经验</span>
+                            </div>
+                            <div style="margin-bottom: 16px;">
+                                <div style="font-weight: 500; margin-bottom: 4px;">XX电商平台重构</div>
+                                <div style="color: #64748b; margin-bottom: 4px;">2021-2022 · 项目负责人</div>
+                                <div style="margin-top: 8px;">
+                                    <p>主导公司电商平台前端重构,采用Vue3 + TypeScript技术栈,实现组件化开发,页面加载速度提升35%。</p>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <div class="form-section">
+                            <div class="form-section-title">
+                                <i class="fas fa-star"></i>
+                                <span>技能专长</span>
+                            </div>
+                            <div class="card-tags" style="margin-top: 12px;">
+                                <span class="card-tag">JavaScript</span>
+                                <span class="card-tag">HTML5</span>
+                                <span class="card-tag">CSS3</span>
+                                <span class="card-tag">Vue.js</span>
+                                <span class="card-tag">React</span>
+                                <span class="card-tag">Node.js</span>
+                                <span class="card-tag">Webpack</span>
+                                <span class="card-tag">Git</span>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            
+            <!-- 视频面试页面 -->
+            <div class="content-area" id="recruiterInterviewPage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-video"></i>
+                    <span>视频面试</span>
+                </div>
+                
+                <div style="display: flex; gap: 20px;">
+                    <div style="flex: 1;">
+                        <div class="card">
+                            <div class="card-header">
+                                <div class="card-avatar">张</div>
+                                <div>
+                                    <div class="card-title">张伟</div>
+                                    <div class="card-subtitle">前端开发工程师 · 5年经验</div>
+                                </div>
+                            </div>
+                            <div class="card-tags">
+                                <span class="card-tag">JavaScript</span>
+                                <span class="card-tag">Vue.js</span>
+                                <span class="card-tag">React</span>
+                            </div>
+                            <div class="card-footer">
+                                <span>匹配度: 88%</span>
+                                <button class="card-btn">查看简历</button>
+                            </div>
+                        </div>
+                        
+                        <div style="margin-top: 20px;">
+                            <h3 style="margin-bottom: 16px;">面试信息</h3>
+                            <div class="form-group">
+                                <label for="interviewDate">面试日期</label>
+                                <input type="date" id="interviewDate" class="form-control" value="2023-11-15">
+                            </div>
+                            <div class="form-group">
+                                <label for="interviewTime">面试时间</label>
+                                <input type="time" id="interviewTime" class="form-control" value="14:00">
+                            </div>
+                            <div class="form-group">
+                                <label for="interviewDuration">持续时间</label>
+                                <select id="interviewDuration" class="form-control">
+                                    <option value="30">30分钟</option>
+                                    <option value="60" selected>60分钟</option>
+                                    <option value="90">90分钟</option>
+                                </select>
+                            </div>
+                            <div class="form-group">
+                                <label for="interviewType">面试类型</label>
+                                <select id="interviewType" class="form-control">
+                                    <option value="technical" selected>技术面试</option>
+                                    <option value="hr">HR面试</option>
+                                    <option value="manager">经理面试</option>
+                                </select>
+                            </div>
+                            <div class="form-group">
+                                <label for="interviewer">面试官</label>
+                                <input type="text" id="interviewer" class="form-control" value="李明">
+                            </div>
+                        </div>
+                    </div>
+                    
+                    <div style="flex: 2;">
+                        <div style="background: #f8fafc; border-radius: 8px; padding: 20px; height: 100%;">
+                            <div style="text-align: center; margin-bottom: 20px;">
+                                <h3>视频面试预览</h3>
+                                <p style="color: #64748b;">面试开始后将显示视频画面</p>
+                            </div>
+                            
+                            <div style="background: #e2e8f0; height: 300px; border-radius: 8px; display: flex; align-items: center; justify-content: center; margin-bottom: 20px;">
+                                <i class="fas fa-video" style="font-size: 60px; color: #94a3b8;"></i>
+                            </div>
+                            
+                            <div style="display: flex; justify-content: center; gap: 20px;">
+                                <button class="btn btn-primary" id="startInterviewBtn">
+                                    <i class="fas fa-video"></i> 开始面试
+                                </button>
+                                <button class="btn">
+                                    <i class="fas fa-comment"></i> 发送消息
+                                </button>
+                                <button class="btn btn-danger">
+                                    <i class="fas fa-phone-slash"></i> 结束面试
+                                </button>
+                            </div>
+                            
+                            <div style="margin-top: 30px;">
+                                <h3 style="margin-bottom: 16px;">面试评价</h3>
+                                <div class="form-group">
+                                    <label for="interviewScore">综合评分</label>
+                                    <select id="interviewScore" class="form-control">
+                                        <option value="">请选择评分</option>
+                                        <option value="5">5分 - 非常优秀</option>
+                                        <option value="4">4分 - 良好</option>
+                                        <option value="3">3分 - 一般</option>
+                                        <option value="2">2分 - 较差</option>
+                                        <option value="1">1分 - 不符合</option>
+                                    </select>
+                                </div>
+                                <div class="form-group">
+                                    <label for="interviewNotes">面试记录</label>
+                                    <textarea id="interviewNotes" class="form-control" rows="5" placeholder="记录面试过程中的关键点和评价"></textarea>
+                                </div>
+                                <div class="form-actions">
+                                    <button class="btn">取消</button>
+                                    <button class="btn btn-primary">保存评价</button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            
+            <!-- 面试记录页面 -->
+            <div class="content-area" id="recruiterRecordsPage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-history"></i>
+                    <span>面试记录</span>
+                </div>
+                
+                <div style="display: flex; gap: 20px; margin-bottom: 20px;">
+                    <div style="flex: 1;">
+                        <div class="form-group">
+                            <label for="recordCandidate">候选人</label>
+                            <select id="recordCandidate" class="form-control">
+                                <option value="">全部候选人</option>
+                                <option value="1">张伟</option>
+                                <option value="2">李娜</option>
+                                <option value="3">王强</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div style="flex: 1;">
+                        <div class="form-group">
+                            <label for="recordJob">职位</label>
+                            <select id="recordJob" class="form-control">
+                                <option value="">全部职位</option>
+                                <option value="1">前端开发工程师</option>
+                                <option value="2">UI设计师</option>
+                                <option value="3">产品经理</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div style="flex: 1;">
+                        <div class="form-group">
+                            <label for="recordStatus">状态</label>
+                            <select id="recordStatus" class="form-control">
+                                <option value="">全部状态</option>
+                                <option value="passed">通过</option>
+                                <option value="failed">未通过</option>
+                                <option value="pending">待定</option>
+                            </select>
+                        </div>
+                    </div>
+                    <div style="flex: 1; display: flex; align-items: flex-end;">
+                        <button class="btn btn-primary" style="width: 100%;">
+                            <i class="fas fa-filter"></i> 筛选
+                        </button>
+                    </div>
+                </div>
+                
+                <div class="card-grid">
+                    <div class="card">
+                        <div class="card-header">
+                            <div class="card-avatar">张</div>
+                            <div>
+                                <div class="card-title">张伟</div>
+                                <div class="card-subtitle">前端开发工程师 · 技术面试</div>
+                            </div>
+                        </div>
+                        <div class="card-tags">
+                            <span class="card-tag">2023-10-20</span>
+                            <span class="card-tag">通过</span>
+                        </div>
+                        <div class="card-footer">
+                            <span>评分: 4.5/5</span>
+                            <button class="card-btn">查看详情</button>
+                        </div>
+                    </div>
+                    
+                    <div class="card">
+                        <div class="card-header">
+                            <div class="card-avatar">李</div>
+                            <div>
+                                <div class="card-title">李娜</div>
+                                <div class="card-subtitle">UI设计师 · 技术面试</div>
+                            </div>
+                        </div>
+                        <div class="card-tags">
+                            <span class="card-tag">2023-10-18</span>
+                            <span class="card-tag">待定</span>
+                        </div>
+                        <div class="card-footer">
+                            <span>评分: 3.8/5</span>
+                            <button class="card-btn">查看详情</button>
+                        </div>
+                    </div>
+                    
+                    <div class="card">
+                        <div class="card-header">
+                            <div class="card-avatar">王</div>
+                            <div>
+                                <div class="card-title">王强</div>
+                                <div class="card-subtitle">前端开发工程师 · 技术面试</div>
+                            </div>
+                        </div>
+                        <div class="card-tags">
+                            <span class="card-tag">2023-10-15</span>
+                            <span class="card-tag">未通过</span>
+                        </div>
+                        <div class="card-footer">
+                            <span>评分: 2.5/5</span>
+                            <button class="card-btn">查看详情</button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            
+            <!-- 数据分析页面 -->
+            <div class="content-area" id="recruiterAnalysisPage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-chart-bar"></i>
+                    <span>数据分析</span>
+                </div>
+                
+                <div style="display: flex; gap: 20px; margin-bottom: 20px;">
+                    <div style="flex: 1; background: #f8fafc; border-radius: 8px; padding: 16px;">
+                        <div style="font-size: 14px; color: #64748b; margin-bottom: 8px;">候选人总数</div>
+                        <div style="font-size: 24px; font-weight: 600;">128</div>
+                        <div style="font-size: 14px; color: #10b981; margin-top: 4px;">
+                            <i class="fas fa-arrow-up"></i> 12% 月增长
+                        </div>
+                    </div>
+                    
+                    <div style="flex: 1; background: #f8fafc; border-radius: 8px; padding: 16px;">
+                        <div style="font-size: 14px; color: #64748b; margin-bottom: 8px;">面试通过率</div>
+                        <div style="font-size: 24px; font-weight: 600;">38%</div>
+                        <div style="font-size: 14px; color: #10b981; margin-top: 4px;">
+                            <i class="fas fa-arrow-up"></i> 5% 月增长
+                        </div>
+                    </div>
+                    
+                    <div style="flex: 1; background: #f8fafc; border-radius: 8px; padding: 16px;">
+                        <div style="font-size: 14px; color: #64748b; margin-bottom: 8px;">平均招聘周期</div>
+                        <div style="font-size: 24px; font-weight: 600;">23天</div>
+                        <div style="font-size: 14px; color: #ef4444; margin-top: 4px;">
+                            <i class="fas fa-arrow-down"></i> 2天 月减少
+                        </div>
+                    </div>
+                    
+                    <div style="flex: 1; background: #f8fafc; border-radius: 8px; padding: 16px;">
+                        <div style="font-size: 14px; color: #64748b; margin-bottom: 8px;">职位空缺</div>
+                        <div style="font-size: 24px; font-weight: 600;">15</div>
+                        <div style="font-size: 14px; color: #ef4444; margin-top: 4px;">
+                            <i class="fas fa-arrow-up"></i> 3个 月增长
+                        </div>
+                    </div>
+                </div>
+                
+                <div style="display: flex; gap: 20px; margin-bottom: 20px;">
+                    <div style="flex: 1; background: white; border-radius: 8px; padding: 16px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);">
+                        <div style="font-weight: 500; margin-bottom: 16px;">候选人来源</div>
+                        <div class="chart-container" id="candidateSourceChart"></div>
+                    </div>
+                    
+                    <div style="flex: 1; background: white; border-radius: 8px; padding: 16px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);">
+                        <div style="font-weight: 500; margin-bottom: 16px;">职位申请趋势</div>
+                        <div class="chart-container" id="applicationTrendChart"></div>
+                    </div>
+                </div>
+                
+                <div style="background: white; border-radius: 8px; padding: 16px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);">
+                    <div style="font-weight: 500; margin-bottom: 16px;">技能分布</div>
+                    <div class="chart-container" id="skillDistributionChart"></div>
+                </div>
+            </div>
+            
+            <!-- 个人中心页面 -->
+            <div class="content-area" id="recruiterProfilePage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-user"></i>
+                    <span>个人中心</span>
+                </div>
+                
+                <div class="profile-container">
+                    <div class="profile-sidebar">
+                        <div class="profile-menu">
+                            <div class="profile-menu-item active" data-section="recruiterBasicInfo">基本信息</div>
+                            <div class="profile-menu-item" data-section="recruiterCompany">公司信息</div>
+                            <div class="profile-menu-item" data-section="recruiterSecurity">账户安全</div>
+                        </div>
+                    </div>
+                    
+                    <div class="profile-content">
+                        <!-- 基本信息 -->
+                        <div class="profile-section active" id="recruiterBasicInfoSection">
+                            <div class="profile-header">
+                                <div class="profile-avatar">李</div>
+                                <div class="profile-info">
+                                    <h2>李明</h2>
+                                    <p>招聘经理 | XX科技公司</p>
+                                    <button class="btn" style="margin-top: 10px;">
+                                        <i class="fas fa-camera"></i> 更换头像
+                                    </button>
+                                </div>
+                            </div>
+                            
+                            <div class="profile-form">
+                                <div class="form-group">
+                                    <label for="recruiterName">姓名</label>
+                                    <input type="text" id="recruiterName" class="form-control" value="李明">
+                                </div>
+                                
+                                <div class="form-row">
+                                    <div class="form-col">
+                                        <label for="recruiterGender">性别</label>
+                                        <select id="recruiterGender" class="form-control">
+                                            <option value="male" selected>男</option>
+                                            <option value="female">女</option>
+                                            <option value="other">其他</option>
+                                        </select>
+                                    </div>
+                                    <div class="form-col">
+                                        <label for="recruiterBirth">出生日期</label>
+                                        <input type="date" id="recruiterBirth" class="form-control" value="1985-08-20">
+                                    </div>
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="recruiterPhone">联系电话</label>
+                                    <input type="tel" id="recruiterPhone" class="form-control" value="13900139000">
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="recruiterEmail">电子邮箱</label>
+                                    <input type="email" id="recruiterEmail" class="form-control" value="liming@xxtech.com">
+                                </div>
+                                
+                                <div class="form-actions">
+                                    <button class="btn">取消</button>
+                                    <button class="btn btn-primary">保存更改</button>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <!-- 公司信息 -->
+                        <div class="profile-section" id="recruiterCompanySection">
+                            <h2 style="margin-bottom: 20px;">公司信息</h2>
+                            
+                            <div class="form-section">
+                                <div class="form-group">
+                                    <label for="companyName">公司名称</label>
+                                    <input type="text" id="companyName" class="form-control" value="XX科技有限公司">
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="companyIndustry">所属行业</label>
+                                    <select id="companyIndustry" class="form-control">
+                                        <option value="internet" selected>互联网</option>
+                                        <option value="finance">金融</option>
+                                        <option value="education">教育</option>
+                                        <option value="manufacturing">制造业</option>
+                                    </select>
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="companySize">公司规模</label>
+                                    <select id="companySize" class="form-control">
+                                        <option value="1-50">1-50人</option>
+                                        <option value="50-200">50-200人</option>
+                                        <option value="200-500" selected>200-500人</option>
+                                        <option value="500+">500人以上</option>
+                                    </select>
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="companyLocation">公司地址</label>
+                                    <input type="text" id="companyLocation" class="form-control" value="北京市海淀区中关村软件园">
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="companyWebsite">公司官网</label>
+                                    <input type="url" id="companyWebsite" class="form-control" value="https://www.xxtech.com">
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="companyDescription">公司简介</label>
+                                    <textarea id="companyDescription" class="form-control" rows="4">XX科技有限公司成立于2010年,是一家专注于企业级软件开发的互联网公司,拥有多项自主知识产权和专利技术。</textarea>
+                                </div>
+                                
+                                <div class="form-actions">
+                                    <button class="btn">取消</button>
+                                    <button class="btn btn-primary">保存更改</button>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <!-- 账户安全 -->
+                        <div class="profile-section" id="recruiterSecuritySection">
+                            <h2 style="margin-bottom: 20px;">账户安全</h2>
+                            
+                            <div class="form-section">
+                                <div class="form-group">
+                                    <label for="recruiterCurrentPassword">当前密码</label>
+                                    <input type="password" id="recruiterCurrentPassword" class="form-control" placeholder="请输入当前密码">
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="recruiterNewPassword">新密码</label>
+                                    <input type="password" id="recruiterNewPassword" class="form-control" placeholder="请输入新密码">
+                                </div>
+                                
+                                <div class="form-group">
+                                    <label for="recruiterConfirmPassword">确认新密码</label>
+                                    <input type="password" id="recruiterConfirmPassword" class="form-control" placeholder="请再次输入新密码">
+                                </div>
+                                
+                                <div class="form-actions">
+                                    <button class="btn">取消</button>
+                                    <button class="btn btn-primary">更改密码</button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            
+            <!-- 系统设置页面 -->
+            <div class="content-area" id="recruiterSettingsPage" style="display: none;">
+                <div class="content-title">
+                    <i class="fas fa-cog"></i>
+                    <span>系统设置</span>
+                </div>
+                
+                <div class="settings-container">
+                    <div class="settings-sidebar">
+                        <div class="settings-menu">
+                            <div class="settings-menu-item active" data-section="recruiterNotificationSettings">通知设置</div>
+                            <div class="settings-menu-item" data-section="recruiterPrivacySettings">隐私设置</div>
+                            <div class="settings-menu-item" data-section="recruiterAppearanceSettings">外观设置</div>
+                        </div>
+                    </div>
+                    
+                    <div class="settings-content">
+                        <!-- 通知设置 -->
+                        <div class="settings-section active" id="recruiterNotificationSettings">
+                            <h2 style="margin-bottom: 20px;">通知设置</h2>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>新候选人</h3>
+                                    <p>当有新的候选人申请职位时通知</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox" checked>
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>面试提醒</h3>
+                                    <p>在面试开始前提醒</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox" checked>
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>系统消息</h3>
+                                    <p>接收系统更新和维护通知</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox" checked>
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="form-group" style="margin-top: 30px;">
+                                <label for="recruiterNotificationEmail">通知邮箱</label>
+                                <input type="email" id="recruiterNotificationEmail" class="form-control" value="liming@xxtech.com">
+                            </div>
+                            
+                            <div class="form-actions">
+                                <button class="btn">取消</button>
+                                <button class="btn btn-primary">保存设置</button>
+                            </div>
+                        </div>
+                        
+                        <!-- 隐私设置 -->
+                        <div class="settings-section" id="recruiterPrivacySettings">
+                            <h2 style="margin-bottom: 20px;">隐私设置</h2>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>公开联系方式</h3>
+                                    <p>允许候选人查看您的联系方式</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox">
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>数据分析共享</h3>
+                                    <p>允许系统使用您的招聘数据进行分析</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox" checked>
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="form-group" style="margin-top: 30px;">
+                                <label for="recruiterPrivacyLevel">隐私级别</label>
+                                <select id="recruiterPrivacyLevel" class="form-control">
+                                    <option value="high">高 - 仅对候选人可见</option>
+                                    <option value="medium" selected>中 - 对所有认证用户可见</option>
+                                    <option value="low">低 - 公开可见</option>
+                                </select>
+                            </div>
+                            
+                            <div class="form-actions">
+                                <button class="btn">取消</button>
+                                <button class="btn btn-primary">保存设置</button>
+                            </div>
+                        </div>
+                        
+                        <!-- 外观设置 -->
+                        <div class="settings-section" id="recruiterAppearanceSettings">
+                            <h2 style="margin-bottom: 20px;">外观设置</h2>
+                            
+                            <div class="form-group">
+                                <label for="recruiterThemeSelect">主题颜色</label>
+                                <select id="recruiterThemeSelect" class="form-control">
+                                    <option value="light" selected>浅色主题</option>
+                                    <option value="dark">深色主题</option>
+                                    <option value="system">跟随系统</option>
+                                </select>
+                            </div>
+                            
+                            <div class="form-group">
+                                <label for="recruiterFontSize">字体大小</label>
+                                <select id="recruiterFontSize" class="form-control">
+                                    <option value="small">小</option>
+                                    <option value="medium" selected>中</option>
+                                    <option value="large">大</option>
+                                </select>
+                            </div>
+                            
+                            <div class="settings-item">
+                                <div class="settings-item-info">
+                                    <h3>动画效果</h3>
+                                    <p>启用界面过渡动画</p>
+                                </div>
+                                <div class="settings-item-action">
+                                    <label class="switch">
+                                        <input type="checkbox" checked>
+                                        <span class="slider"></span>
+                                    </label>
+                                </div>
+                            </div>
+                            
+                            <div class="form-actions">
+                                <button class="btn">取消</button>
+                                <button class="btn btn-primary">保存设置</button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    
+    <!-- 发布职位模态框 -->
+    <div class="modal-overlay" id="jobModal">
+        <div class="modal-content">
+            <div class="modal-title">
+                <i class="fas fa-briefcase"></i>
+                <span>发布新职位</span>
+            </div>
+            
+            <div class="form-group">
+                <label for="jobTitle">职位名称</label>
+                <input type="text" id="jobTitle" class="form-control" placeholder="例如: 高级产品经理">
+            </div>
+            
+            <div class="form-group">
+                <label for="jobType">职位类型</label>
+                <select id="jobType" class="form-control">
+                    <option value="fulltime">全职</option>
+                    <option value="parttime">兼职</option>
+                    <option value="intern">实习</option>
+                </select>
+            </div>
+            
+            <div class="form-group">
+                <label for="jobDepartment">所属部门</label>
+                <input type="text" id="jobDepartment" class="form-control" placeholder="例如: 产品部">
+            </div>
+            
+            <div class="form-group">
+                <label for="jobLocation">工作地点</label>
+                <input type="text" id="jobLocation" class="form-control" placeholder="例如: 北京">
+            </div>
+            
+            <div class="form-group">
+                <label for="jobSalary">薪资范围</label>
+                <input type="text" id="jobSalary" class="form-control" placeholder="例如: 15k-30k">
+            </div>
+            
+            <div class="form-group">
+                <label for="jobDescription">职位描述</label>
+                <textarea id="jobDescription" class="form-control" rows="5" placeholder="请输入职位描述和工作内容"></textarea>
+            </div>
+            
+            <div class="form-group">
+                <label for="jobRequirements">任职要求</label>
+                <textarea id="jobRequirements" class="form-control" rows="5" placeholder="请输入任职要求和技能要求"></textarea>
+            </div>
+            
+            <div class

+ 1 - 1
interview-web/package-lock.json

@@ -4397,7 +4397,7 @@
     },
     "node_modules/echarts": {
       "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz",
+      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz",
       "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
       "license": "Apache-2.0",
       "dependencies": {

+ 7 - 5
interview-web/src/app/app.config.ts

@@ -1,12 +1,14 @@
-import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core';
+import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';
 import { provideRouter } from '@angular/router';
-
+import { provideClientHydration } from '@angular/platform-browser';
 import { routes } from './app.routes';
+import { provideCharts } from 'ng2-charts';
 
 export const appConfig: ApplicationConfig = {
   providers: [
-    provideBrowserGlobalErrorListeners(),
     provideZoneChangeDetection({ eventCoalescing: true }),
-    provideRouter(routes)
+    provideRouter(routes),
+    provideClientHydration(),
+    
   ]
-};
+};

+ 2 - 0
interview-web/src/main.ts

@@ -2,5 +2,7 @@ import { bootstrapApplication } from '@angular/platform-browser';
 import { appConfig } from './app/app.config';
 import { App } from './app/app';
 
+
 bootstrapApplication(App, appConfig)
   .catch((err) => console.error(err));
+  

+ 13 - 0
interview-web/src/modules/interview/mobile/mobile.routes.ts

@@ -35,4 +35,17 @@ export const MOBILE_ROUTES: Routes = [
     path: 'interview/mobile/page-job-hunting',
     loadComponent: () => import('./page-job-hunting/page-job-hunting').then(m => m.PageJobHunting)
   },
+  {
+  path: 'interview/mobile/page-question-bank',
+  loadComponent: () => import('./page-question-bank/page-question-bank').then(m => m.PageQuestionBank)
+  },
+  {
+  path: 'interview/mobile/page-job-detail/:id',
+  loadComponent: () => import('./page-job-detail/page-job-detail').then(m => m.PageJobDetail)
+  },
+  {
+  path: 'interview/mobile/page-ability-analysis',
+  loadComponent: () => import('./page-ability-analysis/page-ability-analysis').then(m => m.PageAbilityAnalysis)
+  }
+
 ];

+ 0 - 1
interview-web/src/modules/interview/mobile/nav-mobile-tabs/nav-mobile-tabs.html

@@ -1,4 +1,3 @@
-
 <nav class="bottom-nav">
   <div class="nav-container">
     <div 

+ 82 - 0
interview-web/src/modules/interview/mobile/page-ability-analysis/page-ability-analysis.html

@@ -0,0 +1,82 @@
+<div class="ability-container">
+  <!-- 头部 -->
+  <div class="header">
+    <button class="back-btn" (click)="goBack()">
+      <fa-icon [icon]="icons.arrowLeft"></fa-icon>
+    </button>
+    <h1 class="title">个人能力分析</h1>
+    <div class="placeholder"></div>
+  </div>
+
+  <!-- 能力雷达图 -->
+  <div class="chart-section">
+    <h2 class="section-title">能力雷达图</h2>
+    <div class="chart-container">
+      <canvas baseChart
+        [data]="radarChartData"
+        [options]="radarChartOptions"
+        [labels]="radarChartLabels"
+        chartType="radar">
+      </canvas>
+    </div>
+    <div class="chart-legend">
+      <div class="legend-item">
+        <span class="legend-color" style="background-color: #2A5CAA;"></span>
+        <span>当前能力</span>
+      </div>
+      <div class="legend-item">
+        <span class="legend-color" style="background-color: #FF6B35;"></span>
+        <span>岗位要求</span>
+      </div>
+    </div>
+  </div>
+
+  <!-- 能力详情 -->
+  <div class="details-section">
+    <h2 class="section-title">能力详情</h2>
+    <div class="ability-cards">
+      <div class="ability-card" *ngFor="let ability of abilityDetails">
+        <div class="ability-header">
+          <div class="ability-icon" [style.background]="'rgba(42, 92, 170, 0.1)'">
+            <fa-icon [icon]="ability.icon"></fa-icon>
+          </div>
+          <h3 class="ability-title">{{ability.title}}</h3>
+        </div>
+        <div class="ability-score">
+          <span class="score-value">{{ability.score}}</span>
+          <span class="score-label">分</span>
+        </div>
+        <p class="ability-desc">{{ability.description}}</p>
+        <div class="progress-bar">
+          <div class="progress-fill" [style.width.%]="ability.score"></div>
+        </div>
+      </div>
+    </div>
+  </div>
+
+  <!-- 历史趋势 -->
+  <div class="history-section">
+    <h2 class="section-title">能力成长趋势</h2>
+    <div class="history-chart">
+      <canvas baseChart
+        [data]="historyChartData"
+        [options]="historyChartOptions"
+        [labels]="historyChartLabels"
+        chartType="line">
+      </canvas>
+    </div>
+  </div>
+
+  <!-- 改进建议 -->
+  <div class="suggestions-section">
+    <h2 class="section-title">改进建议</h2>
+    <div class="suggestion-card">
+      <h3 class="suggestion-title">提升编码能力</h3>
+      <ul class="suggestion-list">
+        <li>每周完成3道LeetCode中等难度算法题</li>
+        <li>阅读《重构:改善既有代码的设计》</li>
+        <li>参与开源项目,学习优秀代码风格</li>
+      </ul>
+    </div>
+  </div>
+</div>

+ 212 - 0
interview-web/src/modules/interview/mobile/page-ability-analysis/page-ability-analysis.scss

@@ -0,0 +1,212 @@
+.ability-container {
+  padding: 20px;
+  background-color: #f5f7fa;
+  min-height: 100vh;
+}
+
+.header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 25px;
+  
+  .back-btn {
+    background: none;
+    border: none;
+    font-size: 20px;
+    color: #2A5CAA;
+    cursor: pointer;
+  }
+  
+  .title {
+    font-size: 20px;
+    font-weight: 600;
+    color: #2D3748;
+  }
+  
+  .placeholder {
+    width: 24px; // 保持对称
+  }
+}
+
+.section-title {
+  font-size: 18px;
+  font-weight: 600;
+  color: #2D3748;
+  margin-bottom: 15px;
+  padding-left: 10px;
+  position: relative;
+  
+  &::before {
+    content: '';
+    position: absolute;
+    left: 0;
+    top: 5px;
+    height: 16px;
+    width: 4px;
+    background: #2A5CAA;
+    border-radius: 2px;
+  }
+}
+
+.chart-section {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  margin-bottom: 15px;
+  box-shadow: 0 4px 12px rgba(0,0,0,0.05);
+  
+  .chart-container {
+    height: 300px;
+    margin-bottom: 15px;
+  }
+  
+  .chart-legend {
+    display: flex;
+    justify-content: center;
+    gap: 20px;
+    
+    .legend-item {
+      display: flex;
+      align-items: center;
+      font-size: 14px;
+      color: #4A5568;
+      
+      .legend-color {
+        display: inline-block;
+        width: 12px;
+        height: 12px;
+        border-radius: 50%;
+        margin-right: 6px;
+      }
+    }
+  }
+}
+
+.details-section {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  margin-bottom: 15px;
+  box-shadow: 0 4px 12px rgba(0,0,0,0.05);
+  
+  .ability-cards {
+    display: grid;
+    grid-template-columns: 1fr;
+    gap: 15px;
+    
+    @media (min-width: 600px) {
+      grid-template-columns: repeat(2, 1fr);
+    }
+  }
+  
+  .ability-card {
+    border: 1px solid #EDF2F7;
+    border-radius: 10px;
+    padding: 15px;
+    
+    .ability-header {
+      display: flex;
+      align-items: center;
+      margin-bottom: 10px;
+      
+      .ability-icon {
+        width: 36px;
+        height: 36px;
+        border-radius: 50%;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        margin-right: 12px;
+        color: #2A5CAA;
+        font-size: 16px;
+      }
+      
+      .ability-title {
+        font-size: 16px;
+        font-weight: 500;
+        color: #2D3748;
+      }
+    }
+    
+    .ability-score {
+      margin-bottom: 10px;
+      
+      .score-value {
+        font-size: 24px;
+        font-weight: 600;
+        color: #2A5CAA;
+      }
+      
+      .score-label {
+        font-size: 14px;
+        color: #718096;
+        margin-left: 2px;
+      }
+    }
+    
+    .ability-desc {
+      font-size: 13px;
+      color: #718096;
+      margin-bottom: 15px;
+      line-height: 1.5;
+    }
+    
+    .progress-bar {
+      height: 6px;
+      background: #EDF2F7;
+      border-radius: 3px;
+      overflow: hidden;
+      
+      .progress-fill {
+        height: 100%;
+        background: linear-gradient(to right, #2A5CAA, #3A7BD5);
+        border-radius: 3px;
+      }
+    }
+  }
+}
+
+.history-section {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  margin-bottom: 15px;
+  box-shadow: 0 4px 12px rgba(0,0,0,0.05);
+  
+  .history-chart {
+    height: 250px;
+  }
+}
+
+.suggestions-section {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  margin-bottom: 30px;
+  box-shadow: 0 4px 12px rgba(0,0,0,0.05);
+  
+  .suggestion-card {
+    background: #F0F9FF;
+    border-radius: 10px;
+    padding: 15px;
+    
+    .suggestion-title {
+      font-size: 16px;
+      font-weight: 500;
+      color: #2A5CAA;
+      margin-bottom: 10px;
+    }
+    
+    .suggestion-list {
+      padding-left: 20px;
+      color: #4A5568;
+      font-size: 14px;
+      line-height: 1.6;
+      
+      li {
+        margin-bottom: 8px;
+      }
+    }
+  }
+}

+ 23 - 0
interview-web/src/modules/interview/mobile/page-ability-analysis/page-ability-analysis.spec.ts

@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PageAbilityAnalysis } from './page-ability-analysis';
+
+describe('PageAbilityAnalysis', () => {
+  let component: PageAbilityAnalysis;
+  let fixture: ComponentFixture<PageAbilityAnalysis>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [PageAbilityAnalysis]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(PageAbilityAnalysis);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 160 - 0
interview-web/src/modules/interview/mobile/page-ability-analysis/page-ability-analysis.ts

@@ -0,0 +1,160 @@
+import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { RouterModule } from '@angular/router';
+import { FaIconComponent } from '@fortawesome/angular-fontawesome';
+import { 
+  faArrowLeft,
+  faChartLine,
+  faLightbulb,
+  faCode,
+  faComments,
+  faUsers,
+  faClock
+} from '@fortawesome/free-solid-svg-icons';
+import { ChartConfiguration, ChartType } from 'chart.js';
+import { BaseChartDirective } from 'ng2-charts';
+import { Location } from '@angular/common';
+
+@Component({
+  selector: 'app-page-ability-analysis',
+  standalone: true,
+  imports: [CommonModule, FaIconComponent, RouterModule , BaseChartDirective],
+  templateUrl: './page-ability-analysis.html',
+  styleUrls: ['./page-ability-analysis.scss'],
+  
+})
+export class PageAbilityAnalysis {
+  
+
+  icons = {
+    arrowLeft: faArrowLeft,
+    chart: faChartLine,
+    knowledge: faLightbulb,
+    coding: faCode,
+    communication: faComments,
+    teamwork: faUsers,
+    efficiency: faClock
+  };
+
+  constructor(private location: Location) {}
+
+  goBack() {
+    this.location.back();
+  }
+
+  public radarChartOptions: ChartConfiguration<'radar'>['options'] = {
+  responsive: true,
+  scales: {
+    r: {
+      angleLines: { display: true },
+      suggestedMin: 0,
+      suggestedMax: 100,
+      ticks: { stepSize: 20 }
+    }
+  }
+};
+
+public radarChartLabels = ['专业知识', '编码能力', '沟通表达', '团队协作', '工作效率', '学习能力'];
+
+public radarChartData: ChartConfiguration<'radar'>['data'] = {
+  labels: this.radarChartLabels,
+  datasets: [
+    {
+      label: '当前能力',
+      data: [85, 78, 90, 82, 88, 92],
+      backgroundColor: 'rgba(42, 92, 170, 0.2)',
+      borderColor: 'rgba(42, 92, 170, 1)',
+      pointBackgroundColor: 'rgba(42, 92, 170, 1)',
+      pointBorderColor: '#fff',
+      pointHoverBackgroundColor: '#fff',
+      pointHoverBorderColor: 'rgba(42, 92, 170, 1)'
+    },
+    {
+      label: '岗位要求',
+      data: [90, 85, 85, 80, 85, 88],
+      backgroundColor: 'rgba(255, 107, 53, 0.2)',
+      borderColor: 'rgba(255, 107, 53, 1)',
+      pointBackgroundColor: 'rgba(255, 107, 53, 1)',
+      pointBorderColor: '#fff',
+      pointHoverBackgroundColor: '#fff',
+      pointHoverBorderColor: 'rgba(255, 107, 53, 1)'
+    }
+  ]
+};
+
+  // 能力详情
+  abilityDetails = [
+    {
+      title: '专业知识',
+      icon: this.icons.knowledge,
+      score: 85,
+      description: '掌握前端开发核心知识体系'
+    },
+    {
+      title: '编码能力',
+      icon: this.icons.coding,
+      score: 78,
+      description: '熟练使用多种编程语言和框架'
+    },
+    {
+      title: '沟通表达',
+      icon: this.icons.communication,
+      score: 90,
+      description: '能够清晰表达技术观点'
+    },
+    {
+      title: '团队协作',
+      icon: this.icons.teamwork,
+      score: 82,
+      description: '良好的团队合作意识'
+    },
+    {
+      title: '工作效率',
+      icon: this.icons.efficiency,
+      score: 88,
+      description: '高效完成任务的能力'
+    },
+    {
+      title: '学习能力',
+      icon: this.icons.chart,
+      score: 92,
+      description: '快速学习新技术的能力'
+    }
+  ];
+
+  // 历史趋势图数据
+  historyChartLabels = ['2023-01', '2023-04', '2023-07'];
+  historyChartOptions = {
+    responsive: true,
+    scales: {
+      y: {
+        min: 60,
+        max: 100
+      }
+    }
+  };
+  
+  historyChartData = {
+    labels: this.historyChartLabels,
+    datasets: [
+      {
+        label: '专业知识',
+        data: [70, 75, 80],
+        borderColor: '#4BC0C0',
+        backgroundColor: 'rgba(75, 192, 192, 0.2)'
+      },
+      {
+        label: '编码能力',
+        data: [65, 70, 75],
+        borderColor: '#FF9F40',
+        backgroundColor: 'rgba(255, 159, 64, 0.2)'
+      },
+      {
+        label: '沟通表达',
+        data: [75, 80, 85],
+        borderColor: '#9966FF',
+        backgroundColor: 'rgba(153, 102, 255, 0.2)'
+      }
+    ]
+  };
+}

+ 4 - 4
interview-web/src/modules/interview/mobile/page-home/page-home.html

@@ -12,9 +12,9 @@
     <div class="welcome-card">
       <h1 class="welcome-title">{{greeting}},{{user.name}}</h1>
       <p class="welcome-subtitle">您有{{user.pendingInterviews}}个匹配的岗位待面试,准备好了吗?</p>
-      <button class="start-btn" (click)="handleCardClick()">
-        开始模拟面试 <fa-icon [icon]="icons.arrowRight"></fa-icon>
-      </button>
+      <button class="start-btn" (click)="startInterview()">
+  开始模拟面试 <fa-icon [icon]="icons.arrowRight"></fa-icon>
+</button>
     </div>
   </div>
   
@@ -26,7 +26,7 @@
     </h2>
      <swiper-container [init]="false" [config]="swiperConfig" class="mySwiper">
       <swiper-slide *ngFor="let job of jobs">
-        <div class="job-card" (click)="handleCardClick()">
+        <div class="job-card" (click)="handleCardClick(job)">
           <div class="job-header">
             <h3 class="job-title">{{job.title}}</h3>
             <div class="job-salary">{{job.salary}}</div>

+ 32 - 20
interview-web/src/modules/interview/mobile/page-home/page-home.ts

@@ -47,6 +47,13 @@ export class PageHome {
     pendingInterviews: 3
   };
 
+  constructor(private router: Router) {} // 注入Router
+
+  // 添加开始面试方法
+  startInterview() {
+    this.router.navigate(['/interview/mobile/page-interview']);
+  }
+
   // 岗位数据
   jobs = [
     {
@@ -92,19 +99,21 @@ export class PageHome {
       RouterLink:'/interview/mobile/page-job-hunting'
     },
     {
-      icon: this.icons.book,
-      title: '面试题库',
-      description: '海量真题练习',
-      gradient: 'linear-gradient(135deg, #F6AD55, #DD6B20)',
-      RouterLink:'/interview/mobile/page-mine'
+    icon: this.icons.book,
+    title: '面试题库',
+    description: '海量真题练习',
+    gradient: 'linear-gradient(135deg, #F6AD55, #DD6B20)',
+    RouterLink: '/interview/mobile/page-question-bank'
     },
+    
     {
-      icon: this.icons.chartLine,
-      title: '成长报告',
-      description: '查看历史表现',
-      gradient: 'linear-gradient(135deg, #48BB78, #38A169)',
-      RouterLink:'/interview/mobile/page-mine'
+    icon: this.icons.chartLine,
+    title: '成长报告',
+    description: '查看历史表现',
+    gradient: 'linear-gradient(135deg, #48BB78, #38A169)',
+    RouterLink: '/interview/mobile/page-ability-analysis'
     }
+    
   ];
 
   // Swiper配置
@@ -120,16 +129,19 @@ export class PageHome {
     }
   };
 
-  // 处理卡片点击
-  handleCardClick() {
-    alert('即将跳转到对应功能页面');
+    // 处理卡片点击
+  handleCardClick(job: any) {
+    // 在实际应用中,这里应该使用job.id
+    // 现在我们使用数组索引+1作为ID模拟
+    const jobId = (this.jobs.indexOf(job) + 1).toString();
+    this.router.navigate(['/interview/mobile/page-job-detail', jobId]);
   }
 
-  // 获取问候语
-  get greeting() {
-    const hour = new Date().getHours();
-    if (hour < 12) return '上午好';
-    if (hour < 18) return '下午好';
-    return '晚上好';
-  }
+    // 获取问候语
+    get greeting() {
+      const hour = new Date().getHours();
+      if (hour < 12) return '上午好';
+      if (hour < 18) return '下午好';
+      return '晚上好';
+    }
 }

+ 58 - 10
interview-web/src/modules/interview/mobile/page-interview/page-interview.html

@@ -11,7 +11,7 @@
     <div class="avatar-section">
         <div class="avatar-container">
             <img [src]="avatarImage" alt="AI头像" class="avatar-img" 
-            (error)="avatarImage = 'assets/default-avatar.svg'">
+                 (error)="avatarImage = 'assets/default-avatar.svg'">
             <div class="voice-wave" [style.animation]="isListening ? 'wave 2s infinite' : 'none'"></div>
         </div>
         <div class="avatar-expression">
@@ -20,9 +20,9 @@
         </div>
     </div>
     
-    <!-- 对话区域 -->
+    <!-- 修改后的对话区域 -->
     <div class="dialog-container" #dialogContainer>
-        @for (message of messages; track message) {
+        @for (message of messages; track $index) {
         <div class="message" [ngClass]="{'message-ai': message.sender === 'ai', 'message-user': message.sender === 'user'}">
             <div class="message-bubble" [ngClass]="{'ai-bubble': message.sender === 'ai', 'user-bubble': message.sender === 'user'}">
                 {{ message.text }}
@@ -31,11 +31,29 @@
                 <i [class]="message.sender === 'ai' ? 'fas fa-robot' : 'fas fa-user'"></i> 
                 {{ message.sender === 'ai' ? 'AI面试官' : '您' }}
             </div>
-        </div>}
+        </div>
+        }
+
+        <!-- 实时语音转文字显示 -->
+        @if (isListening && interimTranscript) {
+        <div class="message message-user">
+            <div class="message-bubble user-bubble">
+                {{ interimTranscript }}
+                <div class="recording-indicator">
+                    <span class="dot"></span>
+                    <span class="dot"></span>
+                    <span class="dot"></span>
+                </div>
+            </div>
+            <div class="message-meta user-meta">
+                <i class="fas fa-user"></i> 您 (正在说话)
+            </div>
+        </div>
+        }
     </div>
     
     <!-- 问题卡片 -->
-    @if (showQuestionCard) {
+    @if (showQuestionCard && !interviewEnded) {
     <div class="question-card">
         <div class="question-text">
             {{ currentQuestion }}
@@ -47,24 +65,33 @@
             </div>
             <span>{{ progress }}%</span>
         </div>
-    </div>}
+    </div>
+    }
     
     <!-- 语音输入区域 -->
     <div class="voice-input-section">
+        @if (!interviewEnded) {
         <div class="voice-controls">
+            <!-- 麦克风按钮 -->
             <button class="voice-btn" 
                     (mousedown)="startVoiceInput()" 
                     (mouseup)="stopVoiceInput()"
-                    [class.active]="isListening">
+                    [class.active]="isListening"
+                    [disabled]="isSpeaking || isAnalyzing">
                 <i class="fas fa-microphone"></i>
                 <div class="voice-wave"></div>
             </button>
+            
+            <!-- 播放问题按钮 -->
             <button class="voice-btn" 
                     (click)="playQuestion()"
+                    [disabled]="isListening || isAnalyzing"
                     style="background: linear-gradient(135deg, #48BB78, #38A169);">
                 <i class="fas fa-play"></i>
             </button>
         </div>
+        
+        <!-- 确认/取消按钮 -->
         @if (showSubmitButton || showCancelButton) {
         <div class="answer-confirm-buttons">
             <button class="submit-btn" (click)="submitAnswer()" [disabled]="isAnalyzing">
@@ -79,13 +106,33 @@
             </button>
         </div>
         }
+        
+        <!-- 操作提示 -->
         <div class="voice-hint">
-            点击播放按钮可重复听取问题<br>
-            按住麦克风按钮开始回答
+            @if (isListening) {
+            正在聆听,请回答问题...
+            } @else if (isSpeaking) {
+            正在播报问题...
+            } @else if (isAnalyzing) {
+            正在分析您的回答...
+            } @else {
+            按住麦克风按钮开始回答,点击播放按钮重复听取问题
+            }
         </div>
+        } @else {
+        <!-- 面试结束状态 -->
+        <div class="interview-ended">
+            <h3>面试已结束</h3>
+            <p>感谢您参与本次AI面试</p>
+            <button class="restart-btn" (click)="restartInterview()">
+                <i class="fas fa-redo"></i> 重新开始面试
+            </button>
+        </div>
+        }
     </div>
     
     <!-- 分析仪表盘 -->
+    @if (!interviewEnded) {
     <div class="dashboard-section">
         <div class="dashboard-title">
             <h3>实时分析面板</h3>
@@ -132,4 +179,5 @@
         <div id="radarChart" class="radar-chart"></div>
         }
     </div>
-</div>
+    }
+</div>

+ 13 - 0
interview-web/src/modules/interview/mobile/page-interview/page-interview.scss

@@ -44,6 +44,18 @@ body {
   box-shadow: 0 2px 10px rgba(0,0,0,0.1);
   font-weight: bold;
   color: var(--primary-blue);
+  
+  .time-warning {
+    color: #E53E3E;
+    font-weight: bold;
+    animation: blink 1s infinite;
+  }
+}
+
+@keyframes blink {
+  0% { opacity: 1; }
+  50% { opacity: 0.5; }
+  100% { opacity: 1; }
 }
 
 /* 数字人区域 */
@@ -386,6 +398,7 @@ body {
     max-width: 90%;
   }
 }
+
 /* 提交按钮样式 */
 .submit-btn {
   background: linear-gradient(135deg, var(--primary-blue), var(--accent-orange));

+ 232 - 161
interview-web/src/modules/interview/mobile/page-interview/page-interview.ts

@@ -11,97 +11,148 @@ import { AiApiService } from '../../../../lib/ai-api.service';
   styleUrl: './page-interview.scss'
 })
 export class PageInterview implements OnInit, AfterViewInit {
-  remainingTime = '04:32';
+  // 计时相关
+  remainingTime = '10:00'; 
+  progress = 0;
+  
+  // 面试状态控制
+  interviewEnded = false;
   isAnalyzing = false;
   showSubmitButton = false;
-  showCancelButton = false; // 添加缺失的属性
-  userAnswer = '';
-  isFollowUpQuestion = false; // 添加缺失的属性
+  showCancelButton = false;
+  isFollowUpQuestion = false;
+  showQuestionCard = true;
+  showRadarChart = false;
   
-  // 面试问题相关
+  // 语音相关
+  isListening = false;
+  isSpeaking = false;
+  userAnswer = '';
+  recognition: any;
+  interimTranscript = '';
+  // 问题列表
   mainQuestions = [
-    "欢迎参加本次AI面试,我是您的面试官AI助手。",
+    "欢迎参加本次AI面试我是您的面试官AI助手。",
     "首先,请简单介绍一下您自己。",
     "您在过去工作中遇到的最大技术挑战是什么?您是如何解决的?",
     "请描述一个您与团队意见不合时,您是如何处理的案例。"
   ];
   
-  followUpQuestions = [
-    "", // 第一个问题不需要追问
-    "您能详细说明一下您最擅长的技术领域吗?",
-    "在这个解决方案中,您学到了什么重要的经验?",
-    "这次经历如何影响了您后续的团队协作方式?"
-  ];
-  
   currentQuestionIndex = 0;
   currentQuestion = this.mainQuestions[0];
-  showQuestionCard = false;
-  progress = 30;
   
-  // 对话相关
+  // 对话记录
   messages: {sender: 'ai' | 'user', text: string}[] = [];
   
-  // 语音相关
-  isListening = false;
-  isSpeaking = false;
-  
-  // 头像和表情相关
-  avatarImage = "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f913.svg";
-  expressionText = "正在聆听您的回答...";
+  // 头像状态
+  avatarImage = "assets/default-avatar.svg";
+  expressionText = "等待开始...";
   
-  // 仪表盘相关
-  showRadarChart = false;
+  // 评估指标
   metrics = {
-    expressiveness: 82,
-    professionalism: 65,
-    relevance: 73
+    expressiveness: 0,
+    professionalism: 0,
+    relevance: 0
   };
-  
+
   @ViewChild('dialogContainer') dialogContainer!: ElementRef;
   private radarChart: any;
 
-  constructor(private aiService: AiApiService) {}
+  constructor(private aiService: AiApiService) {
+    // 初始化语音识别
+    this.initSpeechRecognition();
+  }
 
   ngOnInit(): void {
     this.initConversation();
-    this.startProgressTimer();
+    this.initProgressTimer();
   }
-  
+
   ngAfterViewInit(): void {
     this.initRadarChart();
   }
-  
-  // 添加缺失的方法
-  updateAvatarState(state: "speaking" | "listening" | "waiting" | "analyzing"): void {
-    switch(state) {
-      case "speaking":
-        this.avatarImage = "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f5e3.svg";
-        this.expressionText = "正在播报问题...";
-        break;
-      case "listening":
-        this.avatarImage = "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f4ac.svg";
-        this.expressionText = "正在聆听您的回答...";
-        break;
-      case "waiting":
-        this.avatarImage = "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f914.svg";
-        this.expressionText = "请确认您的回答";
-        break;
-      case "analyzing":
-        this.avatarImage = "https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/svg/1f9d0.svg";
-        this.expressionText = "正在分析您的回答...";
-        break;
+
+
+
+  private initSpeechRecognition() {
+    const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;
+    if (SpeechRecognition) {
+      this.recognition = new SpeechRecognition();
+      this.recognition.lang = 'zh-CN';
+      this.recognition.interimResults = true; // 启用临时结果
+      this.recognition.continuous = true;
+
+      this.recognition.onresult = (event: any) => {
+        let finalTranscript = '';
+        let interimTranscript = '';
+
+        for (let i = event.resultIndex; i < event.results.length; i++) {
+          const transcript = event.results[i][0].transcript;
+          if (event.results[i].isFinal) {
+            finalTranscript += transcript;
+          } else {
+            interimTranscript += transcript;
+          }
+        }
+
+        if (finalTranscript) {
+          this.userAnswer = finalTranscript;
+          this.showSubmitButton = true;
+          this.showCancelButton = true;
+        }
+        this.interimTranscript = interimTranscript;
+      };
+
+      this.recognition.onerror = (event: any) => {
+        console.error('语音识别错误:', event.error);
+        this.updateAvatarState('listening');
+      };
+
+      this.recognition.onend = () => {
+        if (this.isListening) {
+          this.stopVoiceInput();
+        }
+      };
     }
   }
-  
+
+  private initProgressTimer(): void {
+    const totalSeconds = 10 * 60; // 10分钟 = 600秒
+    let elapsedSeconds = 0;
+    
+    const timer = setInterval(() => {
+      if (this.interviewEnded) {
+        clearInterval(timer);
+        return;
+      }
+      
+      elapsedSeconds++;
+      this.progress = Math.min((elapsedSeconds / totalSeconds) * 100, 100);
+      
+      // 更新时间显示
+      const remainingSeconds = totalSeconds - elapsedSeconds;
+      const minutes = Math.floor(remainingSeconds / 60);
+      const seconds = remainingSeconds % 60;
+      this.remainingTime = `${minutes}:${seconds < 10 ? '0' + seconds : seconds}`;
+      
+      // 时间到自动结束
+      if (elapsedSeconds >= totalSeconds) {
+        clearInterval(timer);
+        this.addAIMessage("时间到,本次面试结束");
+        this.interviewEnded = true;
+      }
+    }, 1000); // 改为每秒更新一次
+  }
+
   initConversation(): void {
     this.addAIMessage(this.mainQuestions[0]);
     setTimeout(() => {
       this.askQuestion(1);
     }, 1500);
   }
-  
+
   askQuestion(index: number): void {
-    if (index >= this.mainQuestions.length) {
+    if (index >= this.mainQuestions.length || this.interviewEnded) {
       this.endInterview();
       return;
     }
@@ -111,119 +162,140 @@ export class PageInterview implements OnInit, AfterViewInit {
     this.currentQuestion = this.mainQuestions[index];
     
     this.addAIMessage(this.currentQuestion);
-    this.updateAvatarState("speaking");
+    this.updateAvatarState('speaking');
+    this.speakText(this.currentQuestion); // 自动语音播放问题
   }
-  
-  askFollowUpQuestion(): void {
-    if (this.currentQuestionIndex >= this.followUpQuestions.length || 
-        !this.followUpQuestions[this.currentQuestionIndex]) {
-      this.askQuestion(this.currentQuestionIndex + 1);
-      return;
-    }
+
+  async askFollowUpQuestion(followUpText: string): Promise<void> {
+    if (this.interviewEnded) return;
     
     this.isFollowUpQuestion = true;
-    this.currentQuestion = this.followUpQuestions[this.currentQuestionIndex];
+    this.currentQuestion = followUpText;
     
-    this.addAIMessage(this.currentQuestion);
-    this.updateAvatarState("speaking");
+    this.addAIMessage("关于您刚才的回答,我有一个跟进问题...");
+    setTimeout(() => {
+      this.addAIMessage(this.currentQuestion);
+      this.updateAvatarState('speaking');
+    }, 1000);
   }
-  
+
   endInterview(): void {
-    this.addAIMessage("感谢您的回答,面试即将结束,正在生成最终报告...");
-    this.updateAvatarState("analyzing");
+    this.interviewEnded = true;
+    this.addAIMessage("感谢您参与本次面试,祝您有美好的一天!");
+    this.updateAvatarState('default');
   }
-  
+
+  restartInterview(): void {
+    this.interviewEnded = false;
+    this.currentQuestionIndex = 0;
+    this.currentQuestion = this.mainQuestions[0];
+    this.messages = [];
+    this.metrics = { expressiveness: 0, professionalism: 0, relevance: 0 };
+    this.progress = 0;
+    this.initConversation();
+  }
+
   addAIMessage(text: string): void {
     this.messages.push({
       sender: 'ai',
       text: text
     });
-    
-    setTimeout(() => {
-      this.dialogContainer.nativeElement.scrollTop = this.dialogContainer.nativeElement.scrollHeight;
-    }, 0);
-    
-    this.speakText(text);
+    this.scrollToBottom();
   }
-  
+
   addUserMessage(text: string): void {
     this.messages.push({
       sender: 'user',
       text: text
     });
-    
+    this.scrollToBottom();
+  }
+
+  private scrollToBottom(): void {
     setTimeout(() => {
       this.dialogContainer.nativeElement.scrollTop = this.dialogContainer.nativeElement.scrollHeight;
     }, 0);
   }
-  
+
   speakText(text: string): void {
-    if (this.isSpeaking) return;
+    if (this.isSpeaking || !text) return;
     
     this.isSpeaking = true;
-    this.updateAvatarState("speaking");
-    
+    this.updateAvatarState('speaking');
+
     const utterance = new SpeechSynthesisUtterance(text);
     utterance.lang = 'zh-CN';
     utterance.rate = 0.9;
     utterance.pitch = 1;
-    
+
     utterance.onend = () => {
       this.isSpeaking = false;
-      this.updateAvatarState("listening");
+      if (!this.interviewEnded) {
+        this.updateAvatarState('listening');
+      }
     };
-    
+
     speechSynthesis.speak(utterance);
   }
-  
+
   startVoiceInput(): void {
+    if (!this.recognition || this.isSpeaking || this.isAnalyzing) return;
+    
     this.isListening = true;
-    this.updateAvatarState("listening");
-    console.log('语音输入开始');
+    this.userAnswer = '';
+    this.updateAvatarState('listening');
+    this.recognition.start();
   }
-  
+
   stopVoiceInput(): void {
     this.isListening = false;
-    
-    // 模拟语音识别结果
-    this.userAnswer = "这是我的回答...";
-    this.showSubmitButton = true;
-    this.showCancelButton = true;
-    
-    this.updateAvatarState("waiting");
+    if (this.recognition) {
+      this.recognition.stop();
+    }
+    this.updateAvatarState('waiting');
   }
-  
+
   async submitAnswer(): Promise<void> {
+    if (!this.userAnswer || this.isAnalyzing) return;
+    
     this.showSubmitButton = false;
     this.showCancelButton = false;
     this.addUserMessage(this.userAnswer);
     
     this.isAnalyzing = true;
-    this.updateAvatarState("analyzing");
-    
+    this.updateAvatarState('analyzing');
+
     try {
       const evaluation = await this.aiService.evaluateInterviewAnswer(
         this.currentQuestion,
-        this.userAnswer,
-        (content) => console.log('分析进度:', content)
+        this.userAnswer
       );
-      
+
+      // 更新评估指标
       this.metrics = {
         expressiveness: evaluation.metrics.expressiveness,
         professionalism: evaluation.metrics.professionalism,
         relevance: evaluation.metrics.relevance
       };
-      
+
+      // 添加AI反馈
       this.addAIMessage(evaluation.feedback);
-      
-      if (!this.isFollowUpQuestion) {
-        this.addAIMessage("接下来,我有一个跟进问题...");
+
+      // 检查回答相关性
+      if (evaluation.metrics.relevance < 30) {
+        this.addAIMessage("您的回答与问题相关性较低,本次面试结束。");
+        this.interviewEnded = true;
+        return;
+      }
+
+      // 处理问题流程
+      if (!this.isFollowUpQuestion && this.currentQuestionIndex !== 1) {
+        // 主问题(非自我介绍)需要追问
         setTimeout(() => {
-          this.currentQuestion = evaluation.followUpQuestion;
-          this.isFollowUpQuestion = true;
-          this.addAIMessage(this.currentQuestion);
+          this.askFollowUpQuestion(evaluation.followUpQuestion);
         }, 1500);
       } else {
+        // 进入下一个问题
         setTimeout(() => {
           this.askQuestion(this.currentQuestionIndex + 1);
         }, 1500);
@@ -237,20 +309,44 @@ export class PageInterview implements OnInit, AfterViewInit {
       this.userAnswer = '';
     }
   }
-  
+
   cancelAnswer(): void {
     this.showSubmitButton = false;
     this.showCancelButton = false;
     this.userAnswer = '';
-    this.updateAvatarState("listening");
+    this.updateAvatarState('listening');
   }
-  
+
   playQuestion(): void {
-    if (!this.isSpeaking) {
+    if (!this.isListening && !this.isSpeaking) {
       this.speakText(this.currentQuestion);
     }
   }
-  
+
+  updateAvatarState(state: 'speaking' | 'listening' | 'waiting' | 'analyzing' | 'default'): void {
+    switch(state) {
+      case 'speaking':
+        this.avatarImage = "assets/ai-speaking.svg";
+        this.expressionText = "正在提问...";
+        break;
+      case 'listening':
+        this.avatarImage = "assets/ai-listening.svg";
+        this.expressionText = "正在聆听...";
+        break;
+      case 'waiting':
+        this.avatarImage = "assets/ai-waiting.svg";
+        this.expressionText = "等待确认...";
+        break;
+      case 'analyzing':
+        this.avatarImage = "assets/ai-analyzing.svg";
+        this.expressionText = "分析回答中...";
+        break;
+      default:
+        this.avatarImage = "assets/default-avatar.svg";
+        this.expressionText = "AI面试官";
+    }
+  }
+
   toggleRadarChart(): void {
     this.showRadarChart = !this.showRadarChart;
     if (this.showRadarChart) {
@@ -259,9 +355,9 @@ export class PageInterview implements OnInit, AfterViewInit {
       }, 0);
     }
   }
-  
-  initRadarChart(): void {
-    if (!this.showRadarChart) return;
+
+  private initRadarChart(): void {
+    if (!this.showRadarChart || this.interviewEnded) return;
     
     const chartDom = document.getElementById('radarChart');
     if (!chartDom) return;
@@ -286,55 +382,34 @@ export class PageInterview implements OnInit, AfterViewInit {
           { name: '知识广度', max: 100 }
         ],
         radius: '65%',
-        axisName: {
-          color: '#4A5568'
-        },
-        splitArea: {
-          areaStyle: {
-            color: ['rgba(42, 92, 170, 0.1)']
-          }
-        },
-        axisLine: {
-          lineStyle: {
-            color: 'rgba(42, 92, 170, 0.3)'
-          }
-        },
-        splitLine: {
-          lineStyle: {
-            color: 'rgba(42, 92, 170, 0.3)'
-          }
-        }
+        axisName: { color: '#4A5568' },
+        splitArea: { areaStyle: { color: ['rgba(42, 92, 170, 0.1)'] } },
+        axisLine: { lineStyle: { color: 'rgba(42, 92, 170, 0.3)' } },
+        splitLine: { lineStyle: { color: 'rgba(42, 92, 170, 0.3)' } }
       },
       series: [{
         type: 'radar',
         data: [
           {
-            value: [82, 65, 73, 68, 75, 60],
+            value: [
+              this.metrics.expressiveness,
+              this.metrics.professionalism,
+              this.metrics.relevance,
+              (this.metrics.expressiveness + this.metrics.professionalism) / 2,
+              this.metrics.expressiveness,
+              this.metrics.professionalism
+            ],
             name: '当前表现',
-            areaStyle: {
-              color: 'rgba(42, 92, 170, 0.4)'
-            },
-            lineStyle: {
-              width: 2,
-              color: 'rgba(42, 92, 170, 0.8)'
-            },
-            itemStyle: {
-              color: '#2A5CAA'
-            }
+            areaStyle: { color: 'rgba(42, 92, 170, 0.4)' },
+            lineStyle: { width: 2, color: 'rgba(42, 92, 170, 0.8)' },
+            itemStyle: { color: '#2A5CAA' }
           },
           {
             value: [70, 80, 85, 75, 65, 70],
             name: '岗位要求',
-            areaStyle: {
-              color: 'rgba(255, 107, 53, 0.2)'
-            },
-            lineStyle: {
-              width: 2,
-              color: 'rgba(255, 107, 53, 0.8)'
-            },
-            itemStyle: {
-              color: '#FF6B35'
-            }
+            areaStyle: { color: 'rgba(255, 107, 53, 0.2)' },
+            lineStyle: { width: 2, color: 'rgba(255, 107, 53, 0.8)' },
+            itemStyle: { color: '#FF6B35' }
           }
         ]
       }]
@@ -346,10 +421,6 @@ export class PageInterview implements OnInit, AfterViewInit {
       this.radarChart?.resize();
     });
   }
+
   
-  startProgressTimer(): void {
-    setInterval(() => {
-      this.progress = Math.min(this.progress + 10, 100);
-    }, 5000);
-  }
 }

+ 61 - 0
interview-web/src/modules/interview/mobile/page-job-detail/page-job-detail.html

@@ -0,0 +1,61 @@
+<div class="job-detail-container">
+  <!-- 头部 -->
+  <div class="job-header">
+    <button class="back-btn" (click)="goBack()">
+      <fa-icon [icon]="icons.arrowLeft"></fa-icon>
+    </button>
+    <div class="action-buttons">
+      <button class="icon-btn">
+        <fa-icon [icon]="icons.bookmark"></fa-icon>
+      </button>
+      <button class="icon-btn">
+        <fa-icon [icon]="icons.share"></fa-icon>
+      </button>
+    </div>
+  </div>
+
+  <!-- 职位基本信息 -->
+  <div class="job-basic-info">
+    <h1 class="job-title">{{job.title}}</h1>
+    <div class="job-salary">{{job.salary}}</div>
+    
+    <div class="job-meta">
+      <span>{{job.companyName}}</span>
+      <span>{{job.location}}</span>
+      <span>{{job.experience}}</span>
+      <span>{{job.education}}</span>
+    </div>
+    
+    <div class="job-tags">
+      <span class="tag" *ngFor="let tag of job.tags">{{tag}}</span>
+    </div>
+    
+    <div class="match-info">
+      <span>匹配度 {{job.match}}%</span>
+      <div class="progress-bar">
+        <div class="progress-fill" [style.width.%]="job.match"></div>
+      </div>
+    </div>
+  </div>
+
+  <!-- 职位详情 -->
+  <div class="job-content">
+    <h2>职位描述</h2>
+    <pre class="job-description">{{job.description}}</pre>
+    
+    <h2>公司福利</h2>
+    <div class="benefits">
+      <div class="benefit-item" *ngFor="let benefit of job.benefits">
+        {{benefit}}
+      </div>
+    </div>
+  </div>
+
+  <!-- 底部操作栏 -->
+  <div class="job-actions">
+    <button class="apply-btn" (click)="applyJob()">
+      <fa-icon [icon]="icons.apply"></fa-icon>
+      <span>立即申请</span>
+    </button>
+  </div>
+</div>

+ 164 - 0
interview-web/src/modules/interview/mobile/page-job-detail/page-job-detail.scss

@@ -0,0 +1,164 @@
+.job-detail-container {
+  padding: 20px;
+  padding-bottom: 80px;
+  background-color: #f5f7fa;
+  min-height: 100vh;
+}
+
+.job-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+  
+  .back-btn {
+    background: none;
+    border: none;
+    font-size: 20px;
+    color: #2A5CAA;
+    cursor: pointer;
+  }
+  
+  .action-buttons {
+    display: flex;
+    gap: 15px;
+    
+    .icon-btn {
+      background: none;
+      border: none;
+      font-size: 18px;
+      color: #4A5568;
+      cursor: pointer;
+    }
+  }
+}
+
+.job-basic-info {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  margin-bottom: 15px;
+  box-shadow: 0 4px 12px rgba(0,0,0,0.05);
+  
+  .job-title {
+    font-size: 22px;
+    margin-bottom: 5px;
+    color: #2D3748;
+  }
+  
+  .job-salary {
+    color: #FF6B35;
+    font-size: 18px;
+    font-weight: bold;
+    margin-bottom: 15px;
+  }
+  
+  .job-meta {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10px;
+    margin-bottom: 15px;
+    color: #718096;
+    font-size: 14px;
+  }
+  
+  .job-tags {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 8px;
+    margin-bottom: 15px;
+    
+    .tag {
+      background: #EDF2F7;
+      padding: 4px 10px;
+      border-radius: 20px;
+      font-size: 12px;
+      color: #4A5568;
+    }
+  }
+  
+  .match-info {
+    font-size: 14px;
+    color: #4A5568;
+    
+    .progress-bar {
+      height: 6px;
+      background: #EDF2F7;
+      border-radius: 3px;
+      margin-top: 5px;
+      overflow: hidden;
+      
+      .progress-fill {
+        height: 100%;
+        background: linear-gradient(to right, #2A5CAA, #3A7BD5);
+        border-radius: 3px;
+      }
+    }
+  }
+}
+
+.job-content {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  margin-bottom: 15px;
+  box-shadow: 0 4px 12px rgba(0,0,0,0.05);
+  
+  h2 {
+    font-size: 18px;
+    margin-bottom: 15px;
+    color: #2D3748;
+  }
+  
+  .job-description {
+    white-space: pre-wrap;
+    font-size: 14px;
+    line-height: 1.6;
+    color: #4A5568;
+    margin-bottom: 20px;
+  }
+  
+  .benefits {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10px;
+    
+    .benefit-item {
+      background: #F0FFF4;
+      color: #38A169;
+      padding: 6px 12px;
+      border-radius: 20px;
+      font-size: 13px;
+    }
+  }
+}
+
+.job-actions {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  background: white;
+  padding: 15px 20px;
+  box-shadow: 0 -2px 10px rgba(0,0,0,0.1);
+  
+  .apply-btn {
+    background: linear-gradient(to right, #2A5CAA, #3A7BD5);
+    color: white;
+    border: none;
+    width: 100%;
+    padding: 12px;
+    border-radius: 30px;
+    font-size: 16px;
+    font-weight: 500;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    gap: 8px;
+    cursor: pointer;
+    
+    &:hover {
+      opacity: 0.9;
+    }
+  }
+}

+ 23 - 0
interview-web/src/modules/interview/mobile/page-job-detail/page-job-detail.spec.ts

@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PageJobDetail } from './page-job-detail';
+
+describe('PageJobDetail', () => {
+  let component: PageJobDetail;
+  let fixture: ComponentFixture<PageJobDetail>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [PageJobDetail]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(PageJobDetail);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 109 - 0
interview-web/src/modules/interview/mobile/page-job-detail/page-job-detail.ts

@@ -0,0 +1,109 @@
+import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { ActivatedRoute } from '@angular/router';
+import { FaIconComponent } from '@fortawesome/angular-fontawesome';
+import { 
+  faArrowLeft,
+  faBookmark,
+  faShareNodes,
+  faPaperPlane
+} from '@fortawesome/free-solid-svg-icons';
+
+// 定义职位详情接口
+interface JobDetail {
+  id: string;
+  title: string;
+  salary: string;
+  companyLogo: string;
+  companyName: string;
+  location: string;
+  experience: string;
+  education: string;
+  tags: string[];
+  match: number;
+  description: string;
+  benefits: string[];
+}
+
+@Component({
+  selector: 'app-page-job-detail',
+  standalone: true,
+  imports: [CommonModule, FaIconComponent],
+  templateUrl: './page-job-detail.html',
+  styleUrls: ['./page-job-detail.scss']
+})
+export class PageJobDetail {
+  icons = {
+    arrowLeft: faArrowLeft,
+    bookmark: faBookmark,
+    share: faShareNodes,
+    apply: faPaperPlane
+  };
+
+  job!: JobDetail;
+  
+  constructor(private route: ActivatedRoute) {
+    // 使用非空断言操作符(!)告诉TypeScript我们知道这个值不会是null
+    const jobId = this.route.snapshot.paramMap.get('id')!;
+    this.loadJobDetail(jobId);
+  }
+
+  loadJobDetail(jobId: string) {
+    // 定义更完整的模拟数据类型
+    const mockJobs: Record<string, JobDetail> = {
+      '1': {
+        id: '1',
+        title: '前端开发工程师',
+        salary: '25-40K·15薪',
+        companyLogo: 'TX',
+        companyName: '腾讯科技',
+        location: '深圳',
+        experience: '3-5年',
+        education: '本科及以上',
+        tags: ['Vue.js', 'React', 'TypeScript'],
+        match: 87,
+        description: '岗位职责:\n1. 负责公司前端项目开发与维护\n2. 参与产品需求讨论和技术方案设计\n3. 优化前端性能,提升用户体验\n\n任职要求:\n1. 精通HTML/CSS/JavaScript\n2. 熟练掌握Vue.js/React框架\n3. 有大型项目开发经验者优先',
+        benefits: ['五险一金', '年度体检', '带薪年假', '弹性工作制']
+      },
+      '2': {
+        id: '2',
+        title: 'Java高级工程师',
+        salary: '30-50K·16薪',
+        companyLogo: 'AL',
+        companyName: '阿里巴巴',
+        location: '杭州',
+        experience: '5-8年',
+        education: '本科及以上',
+        tags: ['Spring Cloud', '分布式', 'MySQL'],
+        match: 76,
+        description: '岗位职责:\n1. 负责核心系统架构设计与开发\n2. 解决高并发场景下的技术难题\n3. 参与技术方案评审\n\n任职要求:\n1. 精通Java及常用框架\n2. 熟悉分布式系统设计\n3. 有性能优化经验',
+        benefits: ['六险一金', '股票期权', '免费三餐', '年度旅游']
+      },
+      '3': {
+        id: '3',
+        title: '产品经理',
+        salary: '20-35K·14薪',
+        companyLogo: 'BD',
+        companyName: '百度',
+        location: '北京',
+        experience: '3-5年',
+        education: '本科及以上',
+        tags: ['Axure', '用户研究', 'PRD'],
+        match: 92,
+        description: '岗位职责:\n1. 负责产品规划与设计\n2. 进行市场调研和竞品分析\n3. 协调研发团队推进产品落地\n\n任职要求:\n1. 熟悉产品设计流程\n2. 优秀的沟通协调能力\n3. 有成功产品案例',
+        benefits: ['五险一金', '弹性工作', '学习基金', '健身房']
+      }
+    };
+    
+    // 使用类型断言确保jobId是mockJobs的合法键
+    this.job = mockJobs[jobId as keyof typeof mockJobs] || mockJobs['1'];
+  }
+
+  goBack() {
+    window.history.back();
+  }
+
+  applyJob() {
+    alert(`已申请 ${this.job.title} 职位`);
+  }
+}

+ 158 - 0
interview-web/src/modules/interview/mobile/page-question-bank/page-question-bank.html

@@ -0,0 +1,158 @@
+<div class="question-bank-container">
+  <!-- 分类列表视图 -->
+  <div class="categories-view" *ngIf="!selectedCategory && !showAnalysis">
+    <div class="search-box">
+      <input 
+        type="text" 
+        [(ngModel)]="searchTerm" 
+        placeholder="搜索面试问题...">
+      <fa-icon [icon]="icons.search"></fa-icon>
+    </div>
+    
+    <div class="categories-list">
+      <div 
+        class="category-card" 
+        *ngFor="let category of filteredCategories"
+        (click)="selectCategory(category)">
+        <div class="category-header">
+          <fa-icon [icon]="icons.book"></fa-icon>
+          <h3>{{category.name}}</h3>
+        </div>
+        <div class="question-count">
+          {{category.questions.length}}个问题
+        </div>
+        <fa-icon [icon]="icons.arrowRight"></fa-icon>
+      </div>
+    </div>
+  </div>
+  
+  <!-- 问题列表视图 -->
+  <div class="questions-view" *ngIf="selectedCategory && !showAnalysis">
+    <div class="back-btn" (click)="backToCategories()">
+      <fa-icon [icon]="icons.arrowRight" class="back-icon"></fa-icon>
+      返回分类
+    </div>
+    
+    <h2>{{selectedCategory.name}}问题</h2>
+    
+    <div class="questions-list">
+      <div 
+        class="question-item" 
+        *ngFor="let question of selectedCategory.questions"
+        (click)="currentQuestion = question">
+        {{question}}
+      </div>
+    </div>
+  </div>
+  
+  <!-- 问题回答视图 -->
+  <div class="answer-view" *ngIf="currentQuestion && !showAnalysis">
+    <div class="back-btn" (click)="currentQuestion = ''">
+      <fa-icon [icon]="icons.arrowRight" class="back-icon"></fa-icon>
+      返回问题列表
+    </div>
+    
+    <div class="question-card">
+      <h3>问题:</h3>
+      <p>{{currentQuestion}}</p>
+    </div>
+    
+    <div class="answer-section">
+      <h3>您的回答:</h3>
+      <textarea [(ngModel)]="userAnswer" placeholder="输入或录制您的回答..."></textarea>
+      
+      <div class="voice-controls">
+        <button 
+          class="voice-btn" 
+          (mousedown)="startRecording()" 
+          (mouseup)="isRecording = false"
+          [class.active]="isRecording">
+          <fa-icon [icon]="icons.mic"></fa-icon>
+          按住录音
+        </button>
+        
+        <button class="play-btn" (click)="speakQuestion()">
+          <fa-icon [icon]="icons.play"></fa-icon>
+          播放问题
+        </button>
+      </div>
+      
+      <button class="submit-btn" (click)="submitAnswer()">
+        <fa-icon [icon]="icons.check"></fa-icon>
+        提交分析
+      </button>
+    </div>
+  </div>
+  
+  <!-- 分析报告视图 -->
+  <div class="analysis-view" *ngIf="showAnalysis">
+    <div class="back-btn" (click)="showAnalysis = false">
+      <fa-icon [icon]="icons.arrowRight" class="back-icon"></fa-icon>
+      返回
+    </div>
+    
+    <h2>回答分析报告</h2>
+    
+    <div class="analysis-card">
+      <div class="question-section">
+        <h3>问题:</h3>
+        <p>{{analysisResult.question}}</p>
+      </div>
+      
+      <div class="answer-section">
+        <h3>您的回答:</h3>
+        <p>{{analysisResult.answer}}</p>
+      </div>
+      
+      <div class="score-section">
+        <h3>评估分数:</h3>
+        <div class="score-metrics">
+          <div class="metric">
+            <div class="metric-name">相关性</div>
+            <div class="metric-bar">
+              <div 
+                class="metric-fill" 
+                [style.width.%]="analysisResult.scores.relevance">
+                {{analysisResult.scores.relevance}}%
+              </div>
+            </div>
+          </div>
+          
+          <div class="metric">
+            <div class="metric-name">清晰度</div>
+            <div class="metric-bar">
+              <div 
+                class="metric-fill" 
+                [style.width.%]="analysisResult.scores.clarity">
+                {{analysisResult.scores.clarity}}%
+              </div>
+            </div>
+          </div>
+          
+          <div class="metric">
+            <div class="metric-name">深度</div>
+            <div class="metric-bar">
+              <div 
+                class="metric-fill" 
+                [style.width.%]="analysisResult.scores.depth">
+                {{analysisResult.scores.depth}}%
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      
+      <div class="feedback-section">
+        <h3>反馈建议:</h3>
+        <p>{{analysisResult.feedback}}</p>
+        
+        <div class="suggestions">
+          <h4>改进建议:</h4>
+          <ul>
+            <li *ngFor="let suggestion of analysisResult.suggestions">{{suggestion}}</li>
+          </ul>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>

+ 282 - 0
interview-web/src/modules/interview/mobile/page-question-bank/page-question-bank.scss

@@ -0,0 +1,282 @@
+.question-bank-container {
+  max-width: 800px;
+  margin: 0 auto;
+  padding: 20px;
+  min-height: 100vh;
+  background-color: #f5f7fa;
+}
+
+.search-box {
+  position: relative;
+  margin-bottom: 20px;
+  
+  input {
+    width: 100%;
+    padding: 12px 15px;
+    padding-left: 40px;
+    border-radius: 8px;
+    border: 1px solid #e2e8f0;
+    font-size: 16px;
+    
+    &:focus {
+      outline: none;
+      border-color: #2A5CAA;
+    }
+  }
+  
+  fa-icon {
+    position: absolute;
+    left: 15px;
+    top: 50%;
+    transform: translateY(-50%);
+    color: #718096;
+  }
+}
+
+.categories-list {
+  display: grid;
+  gap: 15px;
+}
+
+.category-card {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  box-shadow: 0 2px 10px rgba(0,0,0,0.05);
+  cursor: pointer;
+  transition: all 0.3s ease;
+  
+  &:hover {
+    transform: translateY(-3px);
+    box-shadow: 0 5px 15px rgba(0,0,0,0.1);
+  }
+  
+  .category-header {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    
+    h3 {
+      font-size: 18px;
+      color: #2D3748;
+      margin: 0;
+    }
+    
+    fa-icon {
+      color: #2A5CAA;
+      font-size: 20px;
+    }
+  }
+  
+  .question-count {
+    font-size: 14px;
+    color: #718096;
+  }
+}
+
+.back-btn {
+  display: flex;
+  align-items: center;
+  gap: 5px;
+  margin-bottom: 20px;
+  color: #2A5CAA;
+  cursor: pointer;
+  
+  .back-icon {
+    transform: rotate(180deg);
+  }
+}
+
+.questions-list {
+  background: white;
+  border-radius: 12px;
+  overflow: hidden;
+  box-shadow: 0 2px 10px rgba(0,0,0,0.05);
+}
+
+.question-item {
+  padding: 15px 20px;
+  border-bottom: 1px solid #edf2f7;
+  cursor: pointer;
+  transition: background-color 0.3s;
+  
+  &:hover {
+    background-color: #f8fafc;
+  }
+  
+  &:last-child {
+    border-bottom: none;
+  }
+}
+
+.question-card {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  margin-bottom: 20px;
+  box-shadow: 0 2px 10px rgba(0,0,0,0.05);
+  
+  h3 {
+    color: #2A5CAA;
+    margin-top: 0;
+  }
+}
+
+.answer-section {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  box-shadow: 0 2px 10px rgba(0,0,0,0.05);
+  
+  textarea {
+    width: 100%;
+    min-height: 150px;
+    padding: 15px;
+    border: 1px solid #e2e8f0;
+    border-radius: 8px;
+    font-size: 16px;
+    margin-bottom: 15px;
+    
+    &:focus {
+      outline: none;
+      border-color: #2A5CAA;
+    }
+  }
+}
+
+.voice-controls {
+  display: flex;
+  gap: 15px;
+  margin-bottom: 20px;
+}
+
+.voice-btn, .play-btn, .submit-btn {
+  padding: 12px 20px;
+  border-radius: 8px;
+  border: none;
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  font-size: 16px;
+  cursor: pointer;
+  transition: all 0.3s;
+}
+
+.voice-btn {
+  background-color: #2A5CAA;
+  color: white;
+  
+  &.active {
+    background-color: #E53E3E;
+    animation: pulse 1.5s infinite;
+  }
+}
+
+.play-btn {
+  background-color: #38B2AC;
+  color: white;
+}
+
+.submit-btn {
+  background-color: #48BB78;
+  color: white;
+  margin-top: 10px;
+}
+
+@keyframes pulse {
+  0% { transform: scale(1); }
+  50% { transform: scale(1.05); }
+  100% { transform: scale(1); }
+}
+
+.analysis-card {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  box-shadow: 0 2px 10px rgba(0,0,0,0.05);
+  
+  .question-section, .answer-section, .score-section, .feedback-section {
+    margin-bottom: 25px;
+    padding-bottom: 15px;
+    border-bottom: 1px solid #edf2f7;
+    
+    &:last-child {
+      margin-bottom: 0;
+      padding-bottom: 0;
+      border-bottom: none;
+    }
+  }
+  
+  h3 {
+    color: #2A5CAA;
+    margin-top: 0;
+  }
+}
+
+.score-metrics {
+  display: grid;
+  gap: 15px;
+}
+
+.metric {
+  .metric-name {
+    font-weight: 500;
+    margin-bottom: 5px;
+  }
+  
+  .metric-bar {
+    height: 10px;
+    background-color: #edf2f7;
+    border-radius: 5px;
+    overflow: hidden;
+  }
+  
+  .metric-fill {
+    height: 100%;
+    background: linear-gradient(to right, #2A5CAA, #3A7BD5);
+    border-radius: 5px;
+    color: white;
+    font-size: 10px;
+    text-align: right;
+    padding-right: 5px;
+    line-height: 10px;
+  }
+}
+
+.suggestions {
+  background-color: #f8fafc;
+  padding: 15px;
+  border-radius: 8px;
+  margin-top: 15px;
+  
+  h4 {
+    margin-top: 0;
+    color: #4A5568;
+  }
+  
+  ul {
+    padding-left: 20px;
+    margin-bottom: 0;
+  }
+  
+  li {
+    margin-bottom: 8px;
+    
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+}
+
+@media (max-width: 600px) {
+  .question-bank-container {
+    padding: 15px;
+  }
+  
+  .voice-controls {
+    flex-direction: column;
+  }
+}

+ 23 - 0
interview-web/src/modules/interview/mobile/page-question-bank/page-question-bank.spec.ts

@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { PageQuestionBank } from './page-question-bank';
+
+describe('PageQuestionBank', () => {
+  let component: PageQuestionBank;
+  let fixture: ComponentFixture<PageQuestionBank>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [PageQuestionBank]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(PageQuestionBank);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 126 - 0
interview-web/src/modules/interview/mobile/page-question-bank/page-question-bank.ts

@@ -0,0 +1,126 @@
+import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { Router } from '@angular/router';
+import { FaIconComponent } from '@fortawesome/angular-fontawesome';
+import { 
+  faBook, faSearch, faChevronRight, 
+  faMicrophone, faPlay, faCheck
+} from '@fortawesome/free-solid-svg-icons';
+
+@Component({
+  selector: 'app-page-question-bank',
+  standalone: true,
+  imports: [CommonModule, FormsModule, FaIconComponent],
+  templateUrl: './page-question-bank.html',
+  styleUrls: ['./page-question-bank.scss']
+})
+export class PageQuestionBank {
+  icons = {
+    book: faBook,
+    search: faSearch,
+    arrowRight: faChevronRight,
+    mic: faMicrophone,
+    play: faPlay,
+    check: faCheck
+  };
+
+  categories = [
+    {
+      id: 1,
+      name: '技术类',
+      questions: [
+        "请解释一下闭包的概念及其应用场景",
+        "谈谈你对React/Vue框架的理解",
+        "如何优化前端性能",
+        "解释一下HTTP和HTTPS的区别"
+      ]
+    },
+    {
+      id: 2,
+      name: '行为类',
+      questions: [
+        "请描述一个你遇到的技术难题及解决方法",
+        "你如何与意见不合的同事合作",
+        "描述一个你领导项目的经历"
+      ]
+    },
+    {
+      id: 3,
+      name: '情景类',
+      questions: [
+        "如果项目截止日期提前,你会如何处理",
+        "当客户需求频繁变更时你会怎么做"
+      ]
+    }
+  ];
+
+  selectedCategory: any = null;
+  searchTerm = '';
+  currentQuestion = '';
+  userAnswer = '';
+  isRecording = false;
+  showAnalysis = false;
+  analysisResult: any = null;
+
+  constructor(private router: Router) {}
+
+  selectCategory(category: any) {
+    this.selectedCategory = category;
+    this.showAnalysis = false;
+  }
+
+  backToCategories() {
+    this.selectedCategory = null;
+    this.showAnalysis = false;
+  }
+
+  startRecording() {
+    this.isRecording = true;
+    // 实际项目中这里会调用语音识别API
+    setTimeout(() => {
+      this.userAnswer = "这是我的模拟回答...";
+      this.isRecording = false;
+    }, 2000);
+  }
+
+  speakQuestion() {
+    // 使用浏览器语音合成API朗读问题
+    if ('speechSynthesis' in window) {
+      const utterance = new SpeechSynthesisUtterance(this.currentQuestion);
+      window.speechSynthesis.speak(utterance);
+    } else {
+      console.warn('您的浏览器不支持语音合成功能');
+    }
+  }
+
+  submitAnswer() {
+    // 模拟分析过程
+    this.analysisResult = {
+      question: this.currentQuestion,
+      answer: this.userAnswer,
+      scores: {
+        relevance: Math.floor(Math.random() * 30) + 70,
+        clarity: Math.floor(Math.random() * 30) + 70,
+        depth: Math.floor(Math.random() * 30) + 70
+      },
+      feedback: "您的回答结构清晰,但可以增加更多具体案例来增强说服力。",
+      suggestions: [
+        "尝试使用STAR法则(Situation, Task, Action, Result)来组织回答",
+        "加入具体数据或成果来量化您的工作",
+        "保持回答在1-2分钟内"
+      ]
+    };
+    this.showAnalysis = true;
+  }
+
+  get filteredCategories() {
+    if (!this.searchTerm) return this.categories;
+    
+    return this.categories.map(category => ({
+      ...category,
+      questions: category.questions.filter(q => 
+        q.toLowerCase().includes(this.searchTerm.toLowerCase()))
+    })).filter(category => category.questions.length > 0);
+  }
+}

+ 179 - 0
package-lock.json

@@ -0,0 +1,179 @@
+{
+  "name": "Works",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "chart.js": "^4.5.0",
+        "ng2-charts": "^8.0.0"
+      }
+    },
+    "node_modules/@angular/cdk": {
+      "version": "20.0.5",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-20.0.5.tgz",
+      "integrity": "sha512-WhJ1I/ib/Za0qjWkSzMYV0gM8NOWrtOcZ2TYZ4aYFsjd8E13rGhxOez0DWt2sN3vfjAc1iWMmGGbNZrkp98adg==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "parse5": "^7.1.2",
+        "tslib": "^2.3.0"
+      },
+      "peerDependencies": {
+        "@angular/common": "^20.0.0 || ^21.0.0",
+        "@angular/core": "^20.0.0 || ^21.0.0",
+        "rxjs": "^6.5.3 || ^7.4.0"
+      }
+    },
+    "node_modules/@angular/common": {
+      "version": "20.0.6",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.0.6.tgz",
+      "integrity": "sha512-NRsq2gI4CH8nEy8yEZFySEmZ4U+1Y1yGzdIFubrKmtE2NXxR4KFGvQCkBLCLh6hNQXQx+Soe126bqByA6oIaFw==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "tslib": "^2.3.0"
+      },
+      "engines": {
+        "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
+      },
+      "peerDependencies": {
+        "@angular/core": "20.0.6",
+        "rxjs": "^6.5.3 || ^7.4.0"
+      }
+    },
+    "node_modules/@angular/core": {
+      "version": "20.0.6",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.6.tgz",
+      "integrity": "sha512-PLSRl8vM8I+HOlAJFiTcRMNbRj2Clb7lpQqUfkeBSk8bBWOy9fLlscoY3JOk0tXoUTnW6lbRB1LmAFuYAQZzAA==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "tslib": "^2.3.0"
+      },
+      "engines": {
+        "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
+      },
+      "peerDependencies": {
+        "@angular/compiler": "20.0.6",
+        "rxjs": "^6.5.3 || ^7.4.0",
+        "zone.js": "~0.15.0"
+      },
+      "peerDependenciesMeta": {
+        "@angular/compiler": {
+          "optional": true
+        },
+        "zone.js": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@angular/platform-browser": {
+      "version": "20.0.6",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.0.6.tgz",
+      "integrity": "sha512-EZC6ILD0nXOddNuwqQqwTzvRgXs/1kZoRGzdG8zpHhRREBf6VFMZ+g7IN3EKnYN4hDL5EMxIKIsIcQjmCDsu2A==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "tslib": "^2.3.0"
+      },
+      "engines": {
+        "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
+      },
+      "peerDependencies": {
+        "@angular/animations": "20.0.6",
+        "@angular/common": "20.0.6",
+        "@angular/core": "20.0.6"
+      },
+      "peerDependenciesMeta": {
+        "@angular/animations": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@kurkle/color": {
+      "version": "0.3.4",
+      "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz",
+      "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==",
+      "license": "MIT"
+    },
+    "node_modules/chart.js": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz",
+      "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@kurkle/color": "^0.3.0"
+      },
+      "engines": {
+        "pnpm": ">=8"
+      }
+    },
+    "node_modules/entities": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+      "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+      "license": "BSD-2-Clause",
+      "peer": true,
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+      "license": "MIT"
+    },
+    "node_modules/ng2-charts": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-8.0.0.tgz",
+      "integrity": "sha512-nofsNHI2Zt+EAwT+BJBVg0kgOhNo9ukO4CxULlaIi7VwZSr7I1km38kWSoU41Oq6os6qqIh5srnL+CcV+RFPFA==",
+      "license": "MIT",
+      "dependencies": {
+        "lodash-es": "^4.17.15",
+        "tslib": "^2.3.0"
+      },
+      "peerDependencies": {
+        "@angular/cdk": ">=19.0.0",
+        "@angular/common": ">=19.0.0",
+        "@angular/core": ">=19.0.0",
+        "@angular/platform-browser": ">=19.0.0",
+        "chart.js": "^3.4.0 || ^4.0.0",
+        "rxjs": "^6.5.3 || ^7.4.0"
+      }
+    },
+    "node_modules/parse5": {
+      "version": "7.3.0",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+      "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "entities": "^6.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/inikulin/parse5?sponsor=1"
+      }
+    },
+    "node_modules/rxjs": {
+      "version": "7.8.2",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+      "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+      "license": "Apache-2.0",
+      "peer": true,
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "license": "0BSD"
+    }
+  }
+}

+ 6 - 0
package.json

@@ -0,0 +1,6 @@
+{
+  "dependencies": {
+    "chart.js": "^4.5.0",
+    "ng2-charts": "^8.0.0"
+  }
+}