HTML历理 智慧考试系统

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>在线考试系统 - 试卷页面</title>
  <script src="https://cdn.tailwindcss.com"></script>
  <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" rel="stylesheet">
  <link rel="stylesheet" href="https://cdn.staticfile.org/layui/2.8.15/css/layui.min.css">
  <script src="https://cdn.staticfile.org/layui/2.8.15/layui.min.js"></script>
  
  <!-- 自定义Tailwind配置 -->
  <script>
    tailwind.config = {
      theme: {
        extend: {
          colors: {
            primary: '#1E40AF', // 深蓝色作为主色调,代表专业和信任
            secondary: '#3B82F6', // 中蓝色作为辅助色
            accent: '#2563EB', // 亮蓝色作为强调色
            neutral: '#F1F5F9', // 浅灰色作为中性背景色
            dark: '#0F172A', // 深色文本
          },
          fontFamily: {
            sans: ['Inter', 'system-ui', 'sans-serif'],
          },
        },
      }
    }
  </script>
  
  <!-- 自定义工具类 -->
  <style type="text/tailwindcss">
    @layer utilities {
      .content-auto {
        content-visibility: auto;
      }
      .question-card {
        @apply bg-white rounded-xl shadow-md p-6 mb-6 transition-all duration-300 hover:shadow-lg;
      }
      .btn-primary {
        @apply bg-primary hover:bg-primary/90 text-white font-medium py-2 px-6 rounded-lg transition-all duration-200 transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-primary/50;
      }
      .btn-secondary {
        @apply bg-white border border-gray-300 hover:bg-gray-50 text-dark font-medium py-2 px-6 rounded-lg transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-gray-200;
      }
      .option-item {
        @apply p-3 rounded-lg border border-gray-200 mb-2 hover:bg-gray-50 transition-colors duration-200 cursor-pointer;
      }
      .option-item-selected {
        @apply bg-primary/10 border-primary;
      }
      .timer {
        @apply bg-primary/10 text-primary font-semibold px-4 py-2 rounded-lg;
      }
      .progress-bar {
        @apply h-2 bg-gray-200 rounded-full overflow-hidden;
      }
      .progress-value {
        @apply h-full bg-primary transition-all duration-500 ease-out;
      }
    }
  </style>
</head>
<body class="bg-gray-50 min-h-screen">
  <!-- 顶部导航栏 -->
  <header class="bg-white shadow-sm sticky top-0 z-50">
    <div class="container mx-auto px-4 py-3 flex justify-between items-center">
      <div class="flex items-center space-x-2">
        <i class="fa-solid fa-graduation-cap text-primary text-2xl"></i>
        <h1 class="text-xl font-bold text-dark">智慧考试系统</h1>
      </div>
      
      <div class="flex items-center space-x-6">
        <div class="hidden md:flex items-center space-x-2">
          <i class="fa-regular fa-user-circle text-gray-500"></i>
          <span class="text-sm">张同学</span>
        </div>
        
        <div class="timer flex items-center">
          <i class="fa-regular fa-clock mr-2"></i>
          <span id="countdown">01:59:59</span>
        </div>
        
        <button class="btn-secondary hidden md:block">
          <i class="fa-solid fa-question-circle mr-2"></i>帮助
        </button>
      </div>
    </div>
  </header>

  <main class="container mx-auto px-4 py-6 flex flex-col md:flex-row gap-6">
    <!-- 左侧题目导航 -->
    <div class="w-full md:w-64 order-2 md:order-1">
      <div class="bg-white rounded-xl shadow-sm p-4 sticky top-24">
        <h2 class="text-lg font-semibold mb-4 flex items-center">
          <i class="fa-solid fa-list-ul text-primary mr-2"></i>题目导航
        </h2>
        
        <div class="mb-4">
          <div class="flex justify-between text-sm mb-2">
            <span>考试进度</span>
            <span id="progress-text">0/20</span>
          </div>
          <div class="progress-bar">
            <div id="progress-bar" class="progress-value" style="width: 0%"></div>
          </div>
        </div>
        
        <div class="grid grid-cols-5 gap-2 mb-4">
          <div class="flex items-center justify-center col-span-5 text-sm text-gray-500 mb-1">题目状态</div>
          <div class="w-4 h-4 rounded-full bg-gray-200"></div>
          <div class="text-xs">未答</div>
          <div class="w-4 h-4 rounded-full bg-primary"></div>
          <div class="text-xs">已答</div>
          <div class="w-4 h-4 rounded-full bg-yellow-500"></div>
          <div class="text-xs">标记</div>
        </div>
        
        <div class="grid grid-cols-5 gap-2">
          <div id="question-nav-1" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">1</div>
          <div id="question-nav-2" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">2</div>
          <div id="question-nav-3" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">3</div>
          <div id="question-nav-4" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">4</div>
          <div id="question-nav-5" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">5</div>
          <div id="question-nav-6" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">6</div>
          <div id="question-nav-7" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">7</div>
          <div id="question-nav-8" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">8</div>
          <div id="question-nav-9" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">9</div>
          <div id="question-nav-10" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">10</div>
          <div id="question-nav-11" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">11</div>
          <div id="question-nav-12" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">12</div>
          <div id="question-nav-13" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">13</div>
          <div id="question-nav-14" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">14</div>
          <div id="question-nav-15" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">15</div>
          <div id="question-nav-16" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">16</div>
          <div id="question-nav-17" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">17</div>
          <div id="question-nav-18" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">18</div>
          <div id="question-nav-19" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">19</div>
          <div id="question-nav-20" class="flex items-center justify-center w-8 h-8 rounded-lg bg-gray-200 cursor-pointer hover:bg-gray-300 transition-colors">20</div>
        </div>
        
        <div class="mt-6">
          <h3 class="text-sm font-medium text-gray-500 mb-2">题型分布</h3>
          <ul class="text-sm space-y-1">
            <li class="flex justify-between">
              <span>单选题</span>
              <span>1-10</span>
            </li>
            <li class="flex justify-between">
              <span>多选题</span>
              <span>11-15</span>
            </li>
            <li class="flex justify-between">
              <span>判断题</span>
              <span>16-18</span>
            </li>
            <li class="flex justify-between">
              <span>填空题</span>
              <span>19</span>
            </li>
            <li class="flex justify-between">
              <span>作文题</span>
              <span>20</span>
            </li>
          </ul>
        </div>
      </div>
    </div>
    
    <!-- 右侧题目区域 -->
    <div class="w-full md:flex-1 order-1 md:order-2">
      <div class="bg-white rounded-xl shadow-sm p-6 mb-6">
        <div class="flex justify-between items-center mb-4">
          <h2 class="text-xl font-bold text-dark">2025年春季学期期末考试</h2>
          <span class="text-sm text-gray-500">总分: 100分</span>
        </div>
        <p class="text-gray-600 mb-4">考试时间:120分钟 &nbsp;&nbsp; 出题人:教务处</p>
        <div class="bg-blue-50 border-l-4 border-primary p-4 rounded-r-lg">
          <p class="text-sm text-gray-700">
            <i class="fa-solid fa-info-circle text-primary mr-2"></i>
            请认真阅读题目,在规定时间内完成答题。考试过程中请勿刷新页面,否则可能导致答案丢失。
          </p>
        </div>
      </div>
      
      <!-- 题目容器 -->
      <div id="questions-container">
        <!-- 单选题 -->
        <div class="question-card">
          <div class="flex justify-between items-start mb-4">
            <div class="flex items-start">
              <span class="bg-primary text-white w-6 h-6 rounded-full flex items-center justify-center mr-2 mt-0.5">1</span>
              <h3 class="font-semibold">单选题 <span class="text-sm text-gray-500 font-normal ml-2">(本题5分)</span></h3>
            </div>
            <button class="text-gray-400 hover:text-yellow-500 transition-colors" onclick="markQuestion(1)">
              <i class="fa-regular fa-bookmark text-lg"></i>
            </button>
          </div>
          
          <p class="mb-4">以下哪种编程语言是面向对象的编程语言?</p>
          
          <div class="ml-6 space-y-2">
            <div class="option-item" onclick="selectSingleOption(1, 'A')">
              <label class="flex items-center cursor-pointer">
                <input type="radio" name="question1" value="A" class="form-radio h-4 w-4 text-primary">
                <span class="ml-2">A. C</span>
              </label>
            </div>
            
            <div class="option-item" onclick="selectSingleOption(1, 'B')">
              <label class="flex items-center cursor-pointer">
                <input type="radio" name="question1" value="B" class="form-radio h-4 w-4 text-primary">
                <span class="ml-2">B. Java</span>
              </label>
            </div>
            
            <div class="option-item" onclick="selectSingleOption(1, 'C')">
              <label class="flex items-center cursor-pointer">
                <input type="radio" name="question1" value="C" class="form-radio h-4 w-4 text-primary">
                <span class="ml-2">C. Python</span>
              </label>
            </div>
            
            <div class="option-item" onclick="selectSingleOption(1, 'D')">
              <label class="flex items-center cursor-pointer">
                <input type="radio" name="question1" value="D" class="form-radio h-4 w-4 text-primary">
                <span class="ml-2">D. 以上都是</span>
              </label>
            </div>
          </div>
        </div>
        
        <!-- 单选题 -->
        <div class="question-card">
          <div class="flex justify-between items-start mb-4">
            <div class="flex items-start">
              <span class="bg-primary text-white w-6 h-6 rounded-full flex items-center justify-center mr-2 mt-0.5">2</span>
              <h3 class="font-semibold">单选题 <span class="text-sm text-gray-500 font-normal ml-2">(本题5分)</span></h3>
            </div>
            <button class="text-gray-400 hover:text-yellow-500 transition-colors" onclick="markQuestion(2)">
              <i class="fa-regular fa-bookmark text-lg"></i>
            </button>
          </div>
          
          <p class="mb-4">在HTML中,以下哪个标签用于定义文档的主体?</p>
          
          <div class="ml-6 space-y-2">
            <div class="option-item" onclick="selectSingleOption(2, 'A')">
              <label class="flex items-center cursor-pointer">
                <input type="radio" name="question2" value="A" class="form-radio h-4 w-4 text-primary">
                <span class="ml-2">A. &lt;header&gt;</span>
              </label>
            </div>
            
            <div class="option-item" onclick="selectSingleOption(2, 'B')">
              <label class="flex items-center cursor-pointer">
                <input type="radio" name="question2" value="B" class="form-radio h-4 w-4 text-primary">
                <span class="ml-2">B. &lt;body&gt;</span>
              </label>
            </div>
            
            <div class="option-item" onclick="selectSingleOption(2, 'C')">
              <label class="flex items-center cursor-pointer">
                <input type="radio" name="question2" value="C" class="form-radio h-4 w-4 text-primary">
                <span class="ml-2">C. &lt;main&gt;</span>
              </label>
            </div>
            
            <div class="option-item" onclick="selectSingleOption(2, 'D')">
              <label class="flex items-center cursor-pointer">
                <input type="radio" name="question2" value="D" class="form-radio h-4 w-4 text-primary">
                <span class="ml-2">D. &lt;section&gt;</span>
              </label>
            </div>
          </div>
        </div>
        
        <!-- 多选题 -->
        <div class="question-card">
          <div class="flex justify-between items-start mb-4">
            <div class="flex items-start">
              <span class="bg-primary text-white w-6 h-6 rounded-full flex items-center justify-center mr-2 mt-0.5">11</span>
              <h3 class="font-semibold">多选题 <span class="text-sm text-gray-500 font-normal ml-2">(本题8分)</span></h3>
            </div>
            <button class="text-gray-400 hover:text-yellow-500 transition-colors" onclick="markQuestion(11)">
              <i class="fa-regular fa-bookmark text-lg"></i>
            </button>
          </div>
          
          <p class="mb-4">以下哪些属于前端开发技术栈?</p>
          
          <div class="ml-6 space-y-2">
            <div class="option-item" onclick="selectMultiOption(11, 'A')">
              <label class="flex items-center cursor-pointer">
                <input type="checkbox" name="question11" value="A" class="form-checkbox h-4 w-4 text-primary">
                <span class="ml-2">A. HTML</span>
              </label>
            </div>
            
            <div class="option-item" onclick="selectMultiOption(11, 'B')">
              <label class="flex items-center cursor-pointer">
                <input type="checkbox" name="question11" value="B" class="form-checkbox h-4 w-4 text-primary">
                <span class="ml-2">B. CSS</span>
              </label>
            </div>
            
            <div class="option-item" onclick="selectMultiOption(11, 'C')">
              <label class="flex items-center cursor-pointer">
                <input type="checkbox" name="question11" value="C" class="form-checkbox h-4 w-4 text-primary">
                <span class="ml-2">C. JavaScript</span>
              </label>
            </div>
            
            <div class="option-item" onclick="selectMultiOption(11, 'D')">
              <label class="flex items-center cursor-pointer">
                <input type="checkbox" name="question11" value="D" class="form-checkbox h-4 w-4 text-primary">
                <span class="ml-2">D. Node.js</span>
              </label>
            </div>
          </div>
        </div>
        
        <!-- 判断题 -->
        <div class="question-card">
          <div class="flex justify-between items-start mb-4">
            <div class="flex items-start">
              <span class="bg-primary text-white w-6 h-6 rounded-full flex items-center justify-center mr-2 mt-0.5">16</span>
              <h3 class="font-semibold">判断题 <span class="text-sm text-gray-500 font-normal ml-2">(本题5分)</span></h3>
            </div>
            <button class="text-gray-400 hover:text-yellow-500 transition-colors" onclick="markQuestion(16)">
              <i class="fa-regular fa-bookmark text-lg"></i>
            </button>
          </div>
          
          <p class="mb-4">CSS用于描述HTML文档的结构。</p>
          
          <div class="ml-6 space-y-2">
            <div class="option-item" onclick="selectTrueFalse(16, 'true')">
              <label class="flex items-center cursor-pointer">
                <input type="radio" name="question16" value="true" class="form-radio h-4 w-4 text-primary">
                <span class="ml-2">A. 正确</span>
              </label>
            </div>
            
            <div class="option-item" onclick="selectTrueFalse(16, 'false')">
              <label class="flex items-center cursor-pointer">
                <input type="radio" name="question16" value="false" class="form-radio h-4 w-4 text-primary">
                <span class="ml-2">B. 错误</span>
              </label>
            </div>
          </div>
        </div>
        
        <!-- 案例题 -->
        <div class="question-card">
          <div class="flex justify-between items-start mb-4">
            <div class="flex items-start">
              <span class="bg-primary text-white w-6 h-6 rounded-full flex items-center justify-center mr-2 mt-0.5">3</span>
              <h3 class="font-semibold">案例分析题 <span class="text-sm text-gray-500 font-normal ml-2">(本题10分)</span></h3>
            </div>
            <button class="text-gray-400 hover:text-yellow-500 transition-colors" onclick="markQuestion(3)">
              <i class="fa-regular fa-bookmark text-lg"></i>
            </button>
          </div>
          
          <div class="bg-gray-50 p-4 rounded-lg mb-4">
            <p class="font-medium mb-2">阅读以下案例,回答问题:</p>
            <p class="text-sm">
              某公司开发了一个在线购物平台,用户可以浏览商品、添加到购物车并完成支付。最近,该平台的用户数量急剧增加,但同时也出现了一些性能问题,如页面加载缓慢、支付失败率上升等。作为前端开发工程师,请分析可能的原因并提出解决方案。
            </p>
          </div>
          
          <p class="mb-2">请分析可能的原因并提出解决方案:</p>
          <textarea class="w-full border border-gray-300 rounded-lg p-3 focus:outline-none focus:ring-2 focus:ring-primary/50 resize-none" rows="6" placeholder="请输入你的分析和解决方案..." oninput="answerText(3, this.value)"></textarea>
        </div>
        
        <!-- 填空题 -->
        <div class="question-card">
          <div class="flex justify-between items-start mb-4">
            <div class="flex items-start">
              <span class="bg-primary text-white w-6 h-6 rounded-full flex items-center justify-center mr-2 mt-0.5">19</span>
              <h3 class="font-semibold">填空题 <span class="text-sm text-gray-500 font-normal ml-2">(每空5分,共10分)</span></h3>
            </div>
            <button class="text-gray-400 hover:text-yellow-500 transition-colors" onclick="markQuestion(19)">
              <i class="fa-regular fa-bookmark text-lg"></i>
            </button>
          </div>
          
          <p class="mb-4">
            在JavaScript中,<input type="text" class="border-b-2 border-gray-300 px-2 focus:outline-none focus:border-primary w-24" placeholder="填空1" oninput="answerText(19, this.value, 1)"> 
            用于声明常量,而 <input type="text" class="border-b-2 border-gray-300 px-2 focus:outline-none focus:border-primary w-24" placeholder="填空2" oninput="answerText(19, this.value, 2)"> 
            用于声明变量,且具有块级作用域。
          </p>
        </div>
        
        <!-- 作文题 -->
        <div class="question-card">
          <div class="flex justify-between items-start mb-4">
            <div class="flex items-start">
              <span class="bg-primary text-white w-6 h-6 rounded-full flex items-center justify-center mr-2 mt-0.5">20</span>
              <h3 class="font-semibold">作文题 <span class="text-sm text-gray-500 font-normal ml-2">(本题20分)</span></h3>
            </div>
            <button class="text-gray-400 hover:text-yellow-500 transition-colors" onclick="markQuestion(20)">
              <i class="fa-regular fa-bookmark text-lg"></i>
            </button>
          </div>
          
          <p class="mb-4">请以"人工智能对未来社会的影响"为题,撰写一篇不少于500字的论述文。</p>
          
          <div class="layui-form">
            <div class="layui-form-item layui-form-text">
              <div class="layui-input-block">
                <textarea id="editor" class="layui-textarea" placeholder="请输入作文内容..." style="height: 300px;" oninput="answerText(20, this.value)"></textarea>
              </div>
            </div>
            <div class="flex justify-between items-center text-sm text-gray-500 mt-2">
              <span>作文要求:观点明确,论据充分,逻辑清晰,语言流畅。</span>
              <span id="word-count">0/1000 字</span>
            </div>
          </div>
        </div>
      </div>
      
      <!-- 底部导航 -->
      <div class="flex justify-between items-center mt-8">
        <button class="btn-secondary">
          <i class="fa-solid fa-arrow-left mr-2"></i>上一题
        </button>
        
        <div class="flex space-x-2">
          <button class="btn-secondary">
            <i class="fa-regular fa-save mr-2"></i>保存答案
          </button>
          <button class="btn-primary">
            <i class="fa-solid fa-arrow-right mr-2"></i>下一题
          </button>
        </div>
        
        <button class="btn-primary bg-red-600 hover:bg-red-700" onclick="submitExam()">
          <i class="fa-solid fa-paper-plane mr-2"></i>交卷
        </button>
      </div>
    </div>
  </main>

  <!-- 交卷确认模态框 -->
  <div id="submit-modal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 hidden">
    <div class="bg-white rounded-xl shadow-xl w-full max-w-md p-6 transform transition-all duration-300 scale-95 opacity-0" id="modal-content">
      <div class="text-center mb-4">
        <div class="inline-flex items-center justify-center w-16 h-16 rounded-full bg-red-100 mb-4">
          <i class="fa-solid fa-exclamation-triangle text-red-500 text-2xl"></i>
        </div>
        <h3 class="text-xl font-bold text-dark">确认交卷</h3>
        <p class="text-gray-600 mt-2">你确定要提交试卷吗?提交后将无法修改答案。</p>
      </div>
      
      <div class="flex justify-center space-x-4 mt-6">
        <button class="btn-secondary" onclick="closeModal()">
          返回考试
        </button>
        <button class="btn-primary bg-red-600 hover:bg-red-700" onclick="confirmSubmit()">
          确认交卷
        </button>
      </div>
    </div>
  </div>

  <script>
    // 模拟考试数据
    const examData = {
      totalQuestions: 20,
      answeredQuestions: new Set(),
      markedQuestions: new Set(),
      answers: {},
      startTime: new Date(),
      duration: 120 * 60 * 1000, // 120分钟
      endTime: null
    };
    
    // 初始化计时器
    function initTimer() {
      const endTime = new Date(examData.startTime.getTime() + examData.duration);
      examData.endTime = endTime;
      
      updateTimer();
      setInterval(updateTimer, 1000);
    }
    
    // 更新计时器显示
    function updateTimer() {
      const now = new Date();
      const diff = examData.endTime - now;
      
      if (diff <= 0) {
        document.getElementById('countdown').textContent = "00:00:00";
        submitExam(); // 时间到自动提交
        return;
      }
      
      const hours = Math.floor(diff / 3600000);
      const minutes = Math.floor((diff % 3600000) / 60000);
      const seconds = Math.floor((diff % 60000) / 1000);
      
      document.getElementById('countdown').textContent = 
        `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
      
      // 当剩余时间少于15分钟时,显示为红色
      if (diff < 15 * 60 * 1000) {
        document.getElementById('countdown').classList.add('text-red-500');
      }
    }
    
    // 单选题选择
    function selectSingleOption(questionNum, option) {
      examData.answers[questionNum] = option;
      examData.answeredQuestions.add(questionNum);
      updateQuestionStatus(questionNum);
      
      // 更新UI显示
      const options = document.querySelectorAll(`input[name="question${questionNum}"]`);
      options.forEach(opt => {
        const parentDiv = opt.closest('.option-item');
        if (opt.value === option) {
          parentDiv.classList.add('option-item-selected');
        } else {
          parentDiv.classList.remove('option-item-selected');
        }
      });
    }
    
    // 多选题选择
    function selectMultiOption(questionNum, option) {
      if (!examData.answers[questionNum]) {
        examData.answers[questionNum] = new Set();
      }
      
      const checkbox = document.querySelector(`input[name="question${questionNum}"][value="${option}"]`);
      const parentDiv = checkbox.closest('.option-item');
      
      if (checkbox.checked) {
        examData.answers[questionNum].add(option);
        parentDiv.classList.add('option-item-selected');
      } else {
        examData.answers[questionNum].delete(option);
        parentDiv.classList.remove('option-item-selected');
      }
      
      // 如果至少选择了一个选项,则标记为已答
      if (examData.answers[questionNum].size > 0) {
        examData.answeredQuestions.add(questionNum);
      } else {
        examData.answeredQuestions.delete(questionNum);
      }
      
      updateQuestionStatus(questionNum);
    }
    
    // 判断题选择
    function selectTrueFalse(questionNum, value) {
      examData.answers[questionNum] = value;
      examData.answeredQuestions.add(questionNum);
      updateQuestionStatus(questionNum);
      
      // 更新UI显示
      const options = document.querySelectorAll(`input[name="question${questionNum}"]`);
      options.forEach(opt => {
        const parentDiv = opt.closest('.option-item');
        if (opt.value === value) {
          parentDiv.classList.add('option-item-selected');
        } else {
          parentDiv.classList.remove('option-item-selected');
        }
      });
    }
    
    // 文本类答案(案例分析、填空题、作文)
    function answerText(questionNum, value, subQuestion = null) {
      if (subQuestion) {
        // 处理填空题的多个空
        if (!examData.answers[questionNum]) {
          examData.answers[questionNum] = {};
        }
        examData.answers[questionNum][subQuestion] = value;
        
        // 检查是否所有空都已填写
        let allFilled = true;
        const inputs = document.querySelectorAll(`input[type="text"][oninput="answerText(${questionNum}, this.value, \\d+)"]`);
        inputs.forEach(input => {
          if (!input.value.trim()) {
            allFilled = false;
          }
        });
        
        if (allFilled) {
          examData.answeredQuestions.add(questionNum);
        } else {
          examData.answeredQuestions.delete(questionNum);
        }
      } else {
        // 处理普通文本答案
        examData.answers[questionNum] = value;
        
        if (value.trim()) {
          examData.answeredQuestions.add(questionNum);
        } else {
          examData.answeredQuestions.delete(questionNum);
        }
      }
      
      updateQuestionStatus(questionNum);
      
      // 更新作文字数统计
      if (questionNum === 20) {
        document.getElementById('word-count').textContent = `${value.length}/1000 字`;
      }
    }
    
    // 标记题目
    function markQuestion(questionNum) {
      const markButton = document.querySelector(`.question-card:nth-child(${questionNum}) button`);
      
      if (examData.markedQuestions.has(questionNum)) {
        examData.markedQuestions.delete(questionNum);
        markButton.innerHTML = '<i class="fa-regular fa-bookmark text-lg"></i>';
        markButton.classList.remove('text-yellow-500');
        markButton.classList.add('text-gray-400');
      } else {
        examData.markedQuestions.add(questionNum);
        markButton.innerHTML = '<i class="fa-solid fa-bookmark text-lg"></i>';
        markButton.classList.remove('text-gray-400');
        markButton.classList.add('text-yellow-500');
      }
      
      updateQuestionStatus(questionNum);
    }
    
    // 更新题目状态
    function updateQuestionStatus(questionNum) {
      const navItem = document.getElementById(`question-nav-${questionNum}`);
      
      if (examData.markedQuestions.has(questionNum)) {
        navItem.classList.remove('bg-gray-200', 'bg-primary');
        navItem.classList.add('bg-yellow-500', 'text-white');
      } else if (examData.answeredQuestions.has(questionNum)) {
        navItem.classList.remove('bg-gray-200', 'bg-yellow-500');
        navItem.classList.add('bg-primary', 'text-white');
      } else {
        navItem.classList.remove('bg-primary', 'bg-yellow-500', 'text-white');
        navItem.classList.add('bg-gray-200');
      }
      
      // 更新进度条
      const answeredCount = examData.answeredQuestions.size;
      document.getElementById('progress-text').textContent = `${answeredCount}/${examData.totalQuestions}`;
      document.getElementById('progress-bar').style.width = `${(answeredCount / examData.totalQuestions) * 100}%`;
    }
    
    // 打开交卷确认模态框
    function submitExam() {
      document.getElementById('submit-modal').classList.remove('hidden');
      setTimeout(() => {
        document.getElementById('modal-content').classList.remove('scale-95', 'opacity-0');
        document.getElementById('modal-content').classList.add('scale-100', 'opacity-100');
      }, 10);
    }
    
    // 关闭模态框
    function closeModal() {
      document.getElementById('modal-content').classList.remove('scale-100', 'opacity-100');
      document.getElementById('modal-content').classList.add('scale-95', 'opacity-0');
      setTimeout(() => {
        document.getElementById('submit-modal').classList.add('hidden');
      }, 300);
    }
    
    // 确认交卷
    function confirmSubmit() {
      // 模拟提交答案到服务器
      console.log('提交的答案:', examData.answers);
      
      // 显示提交成功消息
      document.getElementById('modal-content').innerHTML = `
        <div class="text-center mb-4">
          <div class="inline-flex items-center justify-center w-16 h-16 rounded-full bg-green-100 mb-4">
            <i class="fa-solid fa-check text-green-500 text-2xl"></i>
          </div>
          <h3 class="text-xl font-bold text-dark">交卷成功</h3>
          <p class="text-gray-600 mt-2">你的试卷已成功提交,感谢参与考试!</p>
        </div>
        <div class="flex justify-center mt-6">
          <button class="btn-primary" onclick="window.location.reload()">
            返回首页
          </button>
        </div>
      `;
    }
    
    // 初始化编辑器(作文题)
    function initEditor() {
      const editor = document.getElementById('editor');
      editor.addEventListener('input', function() {
        answerText(20, this.value);
      });
    }
    
    // 初始化页面
    document.addEventListener('DOMContentLoaded', function() {
      initTimer();
      initEditor();
      
      // 为所有选项添加点击事件
      document.querySelectorAll('.option-item').forEach(item => {
        item.addEventListener('click', function() {
          this.classList.add('option-item-selected');
        });
      });
    });
  </script>
</body>
</html>
    

效果图:

posted @ 2025-05-22 14:14  onestopweb  阅读(45)  评论(0)    收藏  举报