Files
PeojectTWT/UI.html
2025-10-11 10:47:07 +08:00

2242 lines
110 KiB
HTML

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>单词默写系统</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background: linear-gradient(135deg, #0a2a1a, #0c3a4a, #0d4b66);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
overflow-x: hidden;
position: relative;
}
/* 鼠标跟随小圈 - 更慢更滑溜 */
.cursor-follower {
position: fixed;
width: 20px;
height: 20px;
border: 2px solid rgba(100, 255, 200, 0.7);
border-radius: 50%;
pointer-events: none;
transform: translate(-50%, -50%);
z-index: 9999;
transition: width 0.5s, height 0.5s, border 0.5s, transform 0.1s;
mix-blend-mode: difference;
}
.cursor-follower.hover {
width: 40px;
height: 40px;
border: 2px solid rgba(100, 255, 200, 0.9);
background: rgba(100, 255, 200, 0.1);
}
.container {
width: 100%;
max-width: 1000px;
text-align: center;
position: relative;
z-index: 10;
}
.header {
margin-bottom: 40px;
animation: fadeInDown 1s ease-out;
position: relative;
}
.logo {
font-size: 4.5rem;
margin-bottom: 20px;
background: linear-gradient(45deg, #7cffcb, #00d2ff, #5de6ff);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
text-shadow: 0 0 20px rgba(100, 255, 200, 0.3);
animation: pulse 3s infinite;
}
.title {
font-size: 2.8rem;
font-weight: 700;
margin-bottom: 15px;
color: #fff;
text-shadow: 0 0 15px rgba(100, 255, 200, 0.5);
position: relative;
z-index: 20;
}
.subtitle {
font-size: 1.2rem;
color: #c0ffea;
max-width: 600px;
margin: 0 auto;
line-height: 1.6;
position: relative;
z-index: 20;
}
/* 模式选择按钮 */
.mode-selector {
display: flex;
justify-content: center;
gap: 30px;
margin: 40px 0;
animation: fadeInUp 1s ease-out 0.3s both;
}
.mode-btn {
padding: 20px 40px;
border-radius: 25px;
font-size: 1.2rem;
font-weight: 600;
cursor: pointer;
transition: all 0.4s ease;
position: relative;
overflow: hidden;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
border: none;
color: #0a2a1a;
min-width: 180px;
}
.teacher-btn {
background: linear-gradient(45deg, #7cffcb, #00d2ff, #5de6ff);
}
.student-btn {
background: linear-gradient(45deg, #5de6ff, #00d2ff, #7cffcb);
}
.mode-btn:hover {
transform: translateY(-5px) scale(1.05);
box-shadow: 0 15px 35px rgba(100, 255, 200, 0.4);
}
.mode-btn:active {
transform: scale(0.95);
}
.mode-btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent);
transition: 0.5s;
}
.mode-btn:hover::before {
left: 100%;
}
/* 主要内容区域 */
.main-content {
background: rgba(10, 42, 26, 0.7);
border-radius: 30px;
padding: 40px;
margin: 30px 0;
backdrop-filter: blur(15px);
border: 1px solid rgba(100, 255, 200, 0.3);
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.4);
animation: fadeInUp 1s ease-out 0.6s both;
}
/* 欢迎界面 */
.welcome-screen {
padding: 40px 20px;
}
.welcome-icon {
font-size: 5rem;
margin-bottom: 30px;
background: linear-gradient(45deg, #7cffcb, #00d2ff, #5de6ff);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.welcome-title {
font-size: 2.2rem;
color: #fff;
margin-bottom: 20px;
}
.welcome-text {
color: #c0ffea;
font-size: 1.1rem;
line-height: 1.8;
max-width: 600px;
margin: 0 auto 30px;
}
/* 老师端界面 */
.teacher-screen {
display: none;
}
/* 标签页 */
.tabs {
display: flex;
justify-content: center;
gap: 15px;
margin-bottom: 30px;
}
.tab-btn {
padding: 12px 25px;
border-radius: 20px;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(100, 255, 200, 0.3);
color: #c0ffea;
cursor: pointer;
transition: all 0.3s ease;
font-weight: 500;
}
.tab-btn.active {
background: linear-gradient(45deg, #7cffcb, #00d2ff, #5de6ff);
color: #0a2a1a;
font-weight: 600;
}
.tab-btn:hover:not(.active) {
background: rgba(255, 255, 255, 0.2);
}
/* 搜索框 */
.search-container {
display: flex;
gap: 15px;
margin: 25px 0;
max-width: 600px;
margin-left: auto;
margin-right: auto;
}
.search-input {
flex: 1;
padding: 15px 20px;
border-radius: 15px;
border: 1px solid rgba(100, 255, 200, 0.3);
background: rgba(0, 0, 0, 0.2);
color: #fff;
font-size: 1rem;
outline: none;
}
.search-input::placeholder {
color: #a0ffe0;
}
.search-input:focus {
border-color: #7cffcb;
box-shadow: 0 0 15px rgba(124, 255, 203, 0.3);
}
/* 按钮组 */
.button-group {
display: flex;
justify-content: center;
flex-wrap: wrap;
gap: 15px;
margin: 25px 0;
}
.action-btn {
padding: 12px 25px;
border-radius: 15px;
border: none;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.btn-primary {
background: linear-gradient(45deg, #7cffcb, #00d2ff, #5de6ff);
color: #0a2a1a;
}
.btn-secondary {
background: rgba(255, 255, 255, 0.1);
color: #c0ffea;
border: 1px solid rgba(100, 255, 200, 0.3);
}
.btn-success {
background: linear-gradient(45deg, #34C759, #7cffcb);
color: #0a2a1a;
}
.btn-warning {
background: linear-gradient(45deg, #FFCC00, #ffd93d);
color: #0a2a1a;
}
.btn-danger {
background: linear-gradient(45deg, #FF3B30, #ff6b6b);
color: white;
}
.action-btn:hover {
transform: translateY(-3px);
box-shadow: 0 8px 20px rgba(100, 255, 200, 0.3);
}
.action-btn:active {
transform: translateY(-1px);
}
.action-btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent);
transition: 0.5s;
}
.action-btn:hover::before {
left: 100%;
}
/* 统计信息 */
.stats-container {
display: flex;
justify-content: space-around;
margin: 30px 0;
flex-wrap: wrap;
gap: 20px;
}
.stat-card {
background: rgba(255, 255, 255, 0.1);
border-radius: 15px;
padding: 20px;
min-width: 120px;
border: 1px solid rgba(100, 255, 200, 0.2);
}
.stat-number {
font-size: 2rem;
font-weight: 700;
color: #7cffcb;
margin-bottom: 5px;
}
.stat-label {
color: #c0ffea;
font-size: 0.9rem;
}
/* 单词网格 */
.word-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
gap: 15px;
margin: 30px 0;
max-height: 300px;
overflow-y: auto;
padding: 10px;
}
.word-grid::-webkit-scrollbar {
width: 8px;
}
.word-grid::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
}
.word-grid::-webkit-scrollbar-thumb {
background: linear-gradient(45deg, #7cffcb, #00d2ff);
border-radius: 4px;
}
.word-item {
padding: 15px 10px;
border-radius: 10px;
background: rgba(255, 255, 255, 0.1);
color: #c0ffea;
cursor: pointer;
transition: all 0.3s ease;
border: 1px solid transparent;
font-weight: 500;
}
.word-item:hover {
background: rgba(255, 255, 255, 0.2);
transform: translateY(-2px);
}
.word-item.selected {
background: linear-gradient(45deg, #7cffcb, #00d2ff, #5de6ff);
color: #0a2a1a;
border: 1px solid rgba(255, 255, 255, 0.5);
font-weight: 600;
}
/* 添加单词提示 */
.add-word-suggestion {
background: linear-gradient(135deg, rgba(255, 204, 0, 0.2), rgba(255, 107, 107, 0.2));
border-radius: 15px;
padding: 20px;
margin: 20px 0;
border: 1px solid rgba(255, 204, 0, 0.3);
display: none;
}
.add-word-suggestion p {
color: #ffd93d;
margin-bottom: 15px;
}
/* 学生端界面 */
.student-screen {
display: none;
}
/* 文件上传区域 */
.file-upload-area {
border: 2px dashed rgba(100, 255, 200, 0.3);
border-radius: 20px;
padding: 50px 30px;
margin: 30px 0;
text-align: center;
transition: all 0.3s ease;
background: rgba(0, 0, 0, 0.2);
cursor: pointer;
}
.file-upload-area:hover {
border-color: #7cffcb;
background: rgba(124, 255, 203, 0.1);
}
.upload-icon {
font-size: 4rem;
color: #7cffcb;
margin-bottom: 20px;
}
.upload-text {
color: #c0ffea;
font-size: 1.2rem;
margin-bottom: 20px;
}
.upload-subtext {
color: #a0ffe0;
font-size: 0.9rem;
margin-bottom: 20px;
}
/* 导入信息卡片 */
.import-info {
background: linear-gradient(135deg, rgba(52, 199, 89, 0.2), rgba(124, 255, 203, 0.2));
border-radius: 20px;
padding: 30px;
margin: 30px 0;
border: 1px solid rgba(52, 199, 89, 0.3);
display: none;
}
.import-info h3 {
color: #7cffcb;
margin-bottom: 20px;
font-size: 1.5rem;
}
.import-details {
color: #c0ffea;
margin-bottom: 20px;
text-align: left;
}
.import-details p {
margin: 10px 0;
}
/* 默写区域 */
.dictation-area {
display: none;
padding: 30px 0;
}
.word-display {
font-size: 3rem;
font-weight: 300;
color: #fff;
margin: 40px 0;
text-shadow: 0 0 30px rgba(100, 255, 200, 0.5);
min-height: 150px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.word-blank {
display: inline-block;
min-width: 300px;
text-align: center;
margin: 10px 0;
font-family: 'Courier New', monospace;
letter-spacing: 5px;
font-size: 2.5rem;
}
.answer-input {
padding: 15px 20px;
border-radius: 15px;
border: 2px solid rgba(100, 255, 200, 0.3);
background: rgba(0, 0, 0, 0.2);
color: #fff;
font-size: 1.5rem;
text-align: center;
outline: none;
width: 300px;
margin: 20px 0;
}
.answer-input:focus {
border-color: #7cffcb;
box-shadow: 0 0 20px rgba(124, 255, 203, 0.5);
}
.input-indicator {
color: #7cffcb;
font-size: 1.2rem;
margin-bottom: 10px;
font-weight: 500;
}
.progress-info {
color: #c0ffea;
font-size: 1.2rem;
margin: 20px 0;
}
.progress-bar {
width: 100%;
height: 10px;
background: rgba(255, 255, 255, 0.1);
border-radius: 5px;
overflow: hidden;
margin: 20px 0;
}
.progress-fill {
height: 100%;
background: linear-gradient(45deg, #7cffcb, #00d2ff, #5de6ff);
border-radius: 5px;
width: 0%;
transition: width 0.5s ease;
}
.dictation-controls {
display: flex;
justify-content: center;
gap: 20px;
margin: 40px 0;
flex-wrap: wrap;
}
.control-btn {
padding: 15px 30px;
border-radius: 15px;
border: none;
font-size: 1.1rem;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
min-width: 150px;
}
.prev-btn {
background: linear-gradient(45deg, #5de6ff, #00d2ff);
color: #0a2a1a;
}
.next-btn {
background: linear-gradient(45deg, #7cffcb, #00d2ff);
color: #0a2a1a;
}
.end-btn {
background: linear-gradient(45deg, #FF3B30, #ff6b6b);
color: white;
}
.submit-btn {
background: linear-gradient(45deg, #34C759, #7cffcb);
color: #0a2a1a;
}
/* 成绩报告区域 */
.result-area {
display: none;
padding: 30px 0;
}
.result-header {
color: #fff;
margin-bottom: 30px;
}
.score-circle {
width: 200px;
height: 200px;
border-radius: 50%;
background: conic-gradient(#7cffcb 0% 70%, #5de6ff 70% 100%);
margin: 0 auto 30px;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.score-inner {
width: 160px;
height: 160px;
border-radius: 50%;
background: rgba(10, 42, 26, 0.9);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.score-number {
font-size: 3rem;
font-weight: 700;
color: #7cffcb;
margin-bottom: 5px;
}
.score-text {
color: #c0ffea;
font-size: 1.2rem;
}
.result-stats {
display: flex;
justify-content: space-around;
margin: 30px 0;
flex-wrap: wrap;
gap: 20px;
}
.result-stat-card {
background: rgba(255, 255, 255, 0.1);
border-radius: 15px;
padding: 20px;
min-width: 150px;
border: 1px solid rgba(100, 255, 200, 0.2);
}
.result-stat-number {
font-size: 2rem;
font-weight: 700;
color: #7cffcb;
margin-bottom: 5px;
}
.result-stat-label {
color: #c0ffea;
font-size: 0.9rem;
}
.grade-badge {
padding: 10px 20px;
border-radius: 20px;
font-weight: 600;
margin: 20px 0;
display: inline-block;
}
.grade-a {
background: linear-gradient(45deg, #34C759, #7cffcb);
color: #0a2a1a;
}
.grade-b {
background: linear-gradient(45deg, #FFCC00, #ffd93d);
color: #0a2a1a;
}
.grade-c {
background: linear-gradient(45deg, #FF9500, #ffcc80);
color: #0a2a1a;
}
.grade-d {
background: linear-gradient(45deg, #FF3B30, #ff6b6b);
color: white;
}
/* 错误详情列表 */
.error-details {
background: rgba(255, 255, 255, 0.1);
border-radius: 15px;
padding: 25px;
margin: 30px 0;
border: 1px solid rgba(255, 107, 107, 0.3);
}
.error-details h3 {
color: #ff6b6b;
margin-bottom: 20px;
text-align: center;
}
.error-list {
list-style: none;
text-align: left;
}
.error-item {
display: flex;
align-items: center;
padding: 15px;
margin: 10px 0;
background: rgba(255, 255, 255, 0.05);
border-radius: 10px;
border-left: 4px solid #ff6b6b;
}
.error-number {
font-weight: bold;
color: #ff6b6b;
margin-right: 15px;
min-width: 30px;
}
.error-content {
flex: 1;
}
.error-word {
font-weight: bold;
color: #fff;
margin-bottom: 5px;
}
.error-answer {
color: #ffd93d;
margin-bottom: 5px;
}
.error-correct {
color: #7cffcb;
display: flex;
align-items: center;
}
.error-arrow {
margin: 0 10px;
color: #ffd93d;
}
/* Particles background */
.particles {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
overflow: hidden;
}
.particle {
position: absolute;
border-radius: 50%;
background: rgba(100, 255, 200, 0.2);
animation: float 15s infinite linear;
}
@keyframes float {
0% {
transform: translateY(0) translateX(0) rotate(0deg);
opacity: 0;
}
10% {
opacity: 1;
}
90% {
opacity: 0.5;
}
100% {
transform: translateY(-100vh) translateX(100px) rotate(360deg);
opacity: 0;
}
}
/* 旋转立方体 */
.cube-container {
position: absolute;
top: 20%;
left: 50%;
transform: translate(-50%, -50%);
width: 150px;
height: 150px;
perspective: 1000px;
z-index: 5;
opacity: 0.7;
}
.cube {
width: 100%;
height: 100%;
position: relative;
transform-style: preserve-3d;
animation: rotate 20s infinite linear;
}
.cube-face {
position: absolute;
width: 150px;
height: 150px;
background: rgba(100, 255, 200, 0.1);
border: 2px solid rgba(100, 255, 200, 0.3);
display: flex;
justify-content: center;
align-items: center;
font-size: 2rem;
font-weight: bold;
color: rgba(100, 255, 200, 0.7);
backdrop-filter: blur(2px);
}
.cube-face-front { transform: rotateY(0deg) translateZ(75px); }
.cube-face-back { transform: rotateY(180deg) translateZ(75px); }
.cube-face-right { transform: rotateY(90deg) translateZ(75px); }
.cube-face-left { transform: rotateY(-90deg) translateZ(75px); }
.cube-face-top { transform: rotateX(90deg) translateZ(75px); }
.cube-face-bottom { transform: rotateX(-90deg) translateZ(75px); }
@keyframes rotate {
0% { transform: rotateX(0) rotateY(0) rotateZ(0); }
100% { transform: rotateX(360deg) rotateY(360deg) rotateZ(360deg); }
}
/* Animations */
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes fadeInDown {
from {
opacity: 0;
transform: translateY(-30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes pulse {
0% { text-shadow: 0 0 10px rgba(100, 255, 200, 0.3); }
50% { text-shadow: 0 0 30px rgba(100, 255, 200, 0.6); }
100% { text-shadow: 0 0 10px rgba(100, 255, 200, 0.3); }
}
/* 响应式设计 */
@media (max-width: 768px) {
.title {
font-size: 2.2rem;
}
.logo {
font-size: 3.5rem;
}
.mode-selector {
flex-direction: column;
align-items: center;
gap: 15px;
}
.mode-btn {
width: 100%;
max-width: 300px;
}
.main-content {
padding: 25px 20px;
}
.word-grid {
grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
gap: 10px;
}
.word-item {
padding: 12px 8px;
font-size: 0.9rem;
}
.word-display {
font-size: 2rem;
}
.word-blank {
font-size: 1.8rem;
min-width: 200px;
}
.answer-input {
width: 250px;
font-size: 1.2rem;
}
.dictation-controls {
flex-direction: column;
align-items: center;
}
.control-btn {
width: 100%;
max-width: 250px;
}
.cube-container {
width: 100px;
height: 100px;
top: 25%;
}
.cube-face {
width: 100px;
height: 100px;
font-size: 1.5rem;
}
.cube-face-front { transform: rotateY(0deg) translateZ(50px); }
.cube-face-back { transform: rotateY(180deg) translateZ(50px); }
.cube-face-right { transform: rotateY(90deg) translateZ(50px); }
.cube-face-left { transform: rotateY(-90deg) translateZ(50px); }
.cube-face-top { transform: rotateX(90deg) translateZ(50px); }
.cube-face-bottom { transform: rotateX(-90deg) translateZ(50px); }
}
@media (max-width: 480px) {
.title {
font-size: 1.8rem;
}
.subtitle {
font-size: 1rem;
}
.main-content {
padding: 20px 15px;
}
.word-grid {
grid-template-columns: repeat(auto-fill, minmax(70px, 1fr));
}
.word-display {
font-size: 1.5rem;
}
.word-blank {
font-size: 1.5rem;
min-width: 150px;
letter-spacing: 3px;
}
.answer-input {
width: 200px;
font-size: 1rem;
}
.stats-container {
flex-direction: column;
align-items: center;
}
.stat-card {
width: 100%;
max-width: 200px;
}
.score-circle {
width: 150px;
height: 150px;
}
.score-inner {
width: 120px;
height: 120px;
}
.score-number {
font-size: 2rem;
}
.error-item {
flex-direction: column;
align-items: flex-start;
text-align: left;
}
.error-number {
margin-bottom: 10px;
}
}
</style>
</head>
<body>
<!-- 鼠标跟随小圈 -->
<div class="cursor-follower"></div>
<!-- 背景粒子 -->
<div class="particles" id="particles"></div>
<!-- 旋转立方体 -->
<div class="cube-container">
<div class="cube">
<div class="cube-face cube-face-front"></div>
<div class="cube-face cube-face-back"></div>
<div class="cube-face cube-face-right"></div>
<div class="cube-face cube-face-left"></div>
<div class="cube-face cube-face-top"></div>
<div class="cube-face cube-face-bottom"></div>
</div>
</div>
<div class="container">
<div class="header">
<div class="logo">
<i class="fas fa-book"></i>
</div>
<h1 class="title">单词默写系统</h1>
<p class="subtitle">简单易用的单词默写工具</p>
</div>
<!-- 模式选择 -->
<div class="mode-selector">
<button class="mode-btn teacher-btn" onclick="switchMode('teacher')">
<i class="fas fa-chalkboard-teacher"></i> 教师端
</button>
<button class="mode-btn student-btn" onclick="switchMode('student')">
<i class="fas fa-user-graduate"></i> 学生端
</button>
</div>
<!-- 主要内容区域 -->
<div class="main-content">
<!-- 欢迎界面 -->
<div id="welcomeScreen" class="welcome-screen">
<div class="welcome-icon">
<i class="fas fa-book-open"></i>
</div>
<h2 class="welcome-title">欢迎使用单词默写系统</h2>
<p class="welcome-text">
这是一个便捷的单词默写工具,老师可以选择单词并导出配置文件,
学生可以导入配置文件进行单词默写练习。
</p>
<p class="welcome-text">
请先选择使用模式:老师端或学生端
</p>
</div>
<!-- 老师端界面 -->
<div id="teacherScreen" class="teacher-screen">
<!-- 标签页 -->
<div class="tabs">
<button class="tab-btn active" onclick="switchTab('selection')">单词选择</button>
</div>
<!-- 单词选择标签页 -->
<div id="selectionTab">
<h3 style="color: #fff; margin: 20px 0;">选择单词</h3>
<div class="search-container">
<input type="text" class="search-input" id="searchInput" placeholder="搜索单词..." oninput="filterWords()">
<button class="action-btn btn-secondary" onclick="clearSearch()">
<i class="fas fa-times"></i> 清除
</button>
</div>
<!-- 添加单词提示 -->
<div id="addWordSuggestion" class="add-word-suggestion">
<p><i class="fas fa-lightbulb"></i> 没有找到您要的单词?可以添加到词库中!</p>
<button class="action-btn btn-warning" onclick="addNewWord()">
<i class="fas fa-plus"></i> 添加单词 "<span id="newWordText"></span>"
</button>
</div>
<div class="button-group">
<button class="action-btn btn-primary" onclick="selectAllWords()">
<i class="fas fa-check-square"></i> 全选
</button>
<button class="action-btn btn-secondary" onclick="deselectAllWords()">
<i class="fas fa-square"></i> 取消全选
</button>
<button class="action-btn btn-warning" onclick="randomSelectWords()">
<i class="fas fa-dice"></i> 随机60个
</button>
<button class="action-btn btn-success" onclick="exportConfig()">
<i class="fas fa-download"></i> 导出配置
</button>
</div>
<div class="stats-container">
<div class="stat-card">
<div class="stat-number" id="totalWords">50</div>
<div class="stat-label">总单词</div>
</div>
<div class="stat-card">
<div class="stat-number" id="selectedCount">0</div>
<div class="stat-label">已选择</div>
</div>
<div class="stat-card">
<div class="stat-number" id="percentage">0%</div>
<div class="stat-label">完成度</div>
</div>
</div>
<div class="word-grid" id="wordGrid">
<!-- 单词项将通过JavaScript动态生成 -->
</div>
</div>
</div>
<!-- 学生端界面 -->
<div id="studentScreen" class="student-screen">
<h3 style="color: #fff; margin: 20px 0;">导入配置文件</h3>
<div class="file-upload-area" id="fileUploadArea" onclick="document.getElementById('configFile').click()">
<div class="upload-icon">
<i class="fas fa-cloud-upload-alt"></i>
</div>
<h3 class="upload-text">点击或拖拽文件到此处上传</h3>
<p class="upload-subtext">支持 .json 格式的配置文件</p>
<button class="action-btn btn-primary">
<i class="fas fa-folder-open"></i> 选择文件
</button>
<input type="file" id="configFile" accept=".json" style="display: none;" onchange="handleFileSelect(event)">
</div>
<div id="importInfo" class="import-info">
<h3><i class="fas fa-check-circle"></i> 配置导入成功</h3>
<div class="import-details">
<p><strong>单词数量:</strong><span id="importedWordCount">0</span></p>
<p><strong>创建时间:</strong><span id="importedTime">-</span></p>
</div>
<button class="action-btn btn-success" onclick="startDictation()">
<i class="fas fa-play"></i> 开始默写
</button>
</div>
<div id="dictationArea" class="dictation-area">
<h3 style="color: #fff; margin-bottom: 30px;">单词默写</h3>
<div class="word-display" id="wordDisplay">
<div class="input-indicator">请输入单词:</div>
<div class="word-blank" id="wordBlank">_ _ _ _ _</div>
</div>
<input type="text" class="answer-input" id="answerInput" placeholder="请输入单词..." onkeypress="handleKeyPress(event)">
<div class="progress-info" id="progressInfo">进度: 0/0</div>
<div class="progress-bar">
<div class="progress-fill" id="progressFill"></div>
</div>
<div class="dictation-controls">
<button class="control-btn prev-btn" onclick="showPrevWord()">
<i class="fas fa-arrow-left"></i> 上一个
</button>
<button class="control-btn submit-btn" onclick="submitAnswer()">
<i class="fas fa-check"></i> 提交答案
</button>
<button class="control-btn next-btn" onclick="showNextWord()">
下一个 <i class="fas fa-arrow-right"></i>
</button>
<button class="control-btn end-btn" onclick="endDictation()">
<i class="fas fa-stop"></i> 结束默写
</button>
</div>
</div>
<div id="resultArea" class="result-area">
<h2 class="result-header">默写成绩报告</h2>
<div class="score-circle">
<div class="score-inner">
<div class="score-number" id="finalScore">0</div>
<div class="score-text">正确率</div>
</div>
</div>
<div class="grade-badge" id="gradeBadge">等级: A</div>
<div class="result-stats">
<div class="result-stat-card">
<div class="result-stat-number" id="correctCount">0</div>
<div class="result-stat-label">正确</div>
</div>
<div class="result-stat-card">
<div class="result-stat-number" id="wrongCount">0</div>
<div class="result-stat-label">错误</div>
</div>
<div class="result-stat-card">
<div class="result-stat-number" id="totalCount">0</div>
<div class="result-stat-label">总计</div>
</div>
</div>
<div id="errorDetails" class="error-details">
<h3><i class="fas fa-times-circle"></i> 错误详情</h3>
<ul class="error-list" id="errorList">
<!-- 错误列表将通过JavaScript动态生成 -->
</ul>
</div>
<button class="action-btn btn-primary" onclick="restartDictation()">
<i class="fas fa-redo"></i> 重新开始
</button>
</div>
</div>
</div>
</div>
<script>
//单词库 - 扩展版
let toeflWords = [
"a", "a few", "a little", "a lot of", "a.m.", "abandon", "abandoned", "ability", "able", "abolish",
"abortion", "about", "above", "abroad", "absence", "absent", "absolute", "absorb", "abstain", "abstract",
"absurd", "abundance", "abundant", "abuse", "academic", "academy", "accelerate", "accent", "accept", "acceptable",
"acceptance", "access", "accessory", "accident", "accidental", "acclaim", "accommodate", "accommodation", "accompany", "accomplish",
"accord", "accordance", "according to", "accordingly", "account", "accountant", "accumulate", "accuracy", "accurate", "accusation",
"accuse", "achieve", "acid", "acknowledge", "acquaintance", "acquire", "acquisition", "acre", "across", "act",
"action", "active", "activist", "activity", "actor", "actress", "actual", "actually", "ad", "adapt",
"add", "addict", "addiction", "addition", "additional", "address", "adequate", "adjacent", "adjust", "administer",
"administration", "administrative", "admiration", "admire", "admission", "admit", "adolescent", "adopt", "adult", "advance",
"advanced", "advantage", "adventure", "adverse", "advertise", "advertisement", "advertising", "advice", "advise", "advocate",
"aesthetic", "affair", "affect", "affection", "afford", "afraid", "after", "afternoon", "afterwards", "again",
"against", "age", "aged", "agency", "agenda", "agent", "aggressive", "ago", "agree", "agreement",
"agricultural", "agriculture", "ahead", "aid", "aim", "air", "air conditioning", "air force", "aircraft", "airline",
"airport", "aisle", "alarm", "album", "alcohol", "alcoholic", "alert", "algebra", "alien", "alike",
"alive", "all", "allegation", "allege", "allegiance", "alliance", "allow", "allowance", "ally", "almost",
"alone", "along", "alongside", "aloud", "already", "also", "alter", "alternative", "although", "altogether",
"aluminium", "always", "amateur", "amaze", "ambassador", "ambiguous", "ambition", "ambitious", "ambulance", "amend",
"amendment", "amid", "among", "amount", "ample", "amuse", "analogy", "analyse", "analysis", "analyst",
"ancestor", "ancient", "and", "angel", "anger", "angle", "angry", "animal", "ankle", "anniversary",
"announce", "announcement", "annoy", "annual", "anonymous", "another", "answer", "anticipate", "anxiety", "anxious",
"any", "anybody", "anyone", "anything", "anyway", "anywhere", "apart", "apartment", "apologize", "apology",
"apparent", "appeal", "appear", "appearance", "appendix", "appetite", "applaud", "applause", "apple", "applicant",
"application", "apply", "appoint", "appointment", "appreciate", "approach", "appropriate", "approval", "approve", "approximate",
"April", "arbitrary", "arch", "archaeology", "architect", "architecture", "archive", "area", "arena", "argue",
"argument", "arise", "arm", "army", "around", "arrange", "arrangement", "arrest", "arrival", "arrive",
"arrow", "art", "article", "artificial", "artist", "artistic", "as", "ascend", "ash", "ashamed",
"aside", "ask", "asleep", "aspect", "aspiration", "assassination", "assault", "assemble", "assembly", "assert",
"assess", "assessment", "asset", "assign", "assignment", "assist", "assistance", "assistant", "associate", "association",
"assume", "assumption", "assurance", "assure", "astonish", "astronomer", "astronomy", "asylum", "at", "athlete",
"atmosphere", "atom", "attach", "attachment", "attack", "attempt", "attend", "attendance", "attention", "attitude",
"attorney", "attract", "attraction", "attractive", "attribute", "auction", "audience", "audit", "August", "aunt",
"author", "authority", "authorize", "automatic", "automobile", "autumn", "available", "avenue", "average", "avoid",
"await", "awake", "award", "aware", "awareness", "away", "awful", "awkward", "baby", "back",
"background", "backward", "bacteria", "bad", "badly", "bag", "bail", "bake", "balance", "ball",
"balloon", "ballot", "ban", "banana", "band", "bank", "bankruptcy", "bar", "bare", "barely",
"bargain", "barrel", "barrier", "base", "baseball", "basic", "basically", "basis", "basket", "basketball",
"bass", "bat", "bath", "bathroom", "battery", "battle", "bay", "be", "beach", "beam",
"bean", "bear", "beard", "beast", "beat", "beautiful", "beauty", "because", "become", "bed",
"bedroom", "bee", "beef", "beer", "before", "beg", "begin", "beginning", "behalf", "behave",
"behavior", "behind", "being", "belief", "believe", "bell", "belong", "beloved", "below", "belt",
"bench", "bend", "beneath", "beneficial", "beneficiary", "benefit", "bent", "beside", "besides", "best",
"bet", "betray", "better", "between", "beyond", "bias", "bicycle", "bid", "big", "bike",
"bill", "billion", "bin", "bind", "biography", "biological", "biology", "bird", "birth", "birthday",
"biscuit", "bishop", "bit", "bite", "bitter", "black", "blade", "blame", "blank", "blanket",
"blast", "bleed", "bless", "blind", "blink", "block", "blond", "blood", "blow", "blue",
"board", "boast", "boat", "body", "boil", "bold", "bomb", "bombing", "bond", "bone",
"book", "boom", "boost", "boot", "border", "bore", "bored", "boring", "born", "borrow",
"boss", "both", "bother", "bottle", "bottom", "bounce", "bound", "boundary", "bow", "bowl",
"box", "boy", "boyfriend", "brain", "brake", "branch", "brand", "brave", "bread", "break",
"breakfast", "breast", "breath", "breathe", "breed", "brick", "bride", "bridge", "brief", "bright",
"brilliant", "bring", "broad", "broadcast", "broadcaster", "brother", "brown", "brush", "brutal", "bubble",
"buck", "bucket", "budget", "bug", "build", "building", "bulb", "bulk", "bull", "bullet",
"bulletin", "bunch", "burden", "bureau", "burn", "burst", "bury", "bus", "bush", "business",
"businessman", "busy", "but", "butter", "butterfly", "button", "buy", "buyer", "by", "bye",
"cabin", "cabinet", "cable", "cafe", "cake", "calculate", "calculation", "calendar", "call", "calm",
"camera", "camp", "campaign", "campus", "can", "canal", "cancel", "cancer", "candidate", "candle",
"candy", "canvas", "cap", "capability", "capable", "capacity", "capital", "captain", "capture", "car",
"carbon", "card", "care", "career", "careful", "carefully", "carpet", "carriage", "carrier", "carrot",
"carry", "cart", "cartoon", "carve", "case", "cash", "casino", "cast", "castle", "casual",
"cat", "catalogue", "catch", "category", "cattle", "cause", "caution", "cautious", "cave", "cease",
"ceiling", "celebrate", "celebration", "celebrity", "cell", "cellar", "cemetery", "cent", "central", "centre",
"century", "ceremony", "certain", "certainly", "certainty", "certificate", "chain", "chair", "chairman", "chalk",
"challenge", "chamber", "champion", "championship", "chance", "change", "channel", "chaos", "chapter", "character",
"characteristic", "characterize", "charge", "charity", "charm", "chart", "charter", "chase", "chat", "cheap",
"cheat", "check", "cheek", "cheer", "cheerful", "cheese", "chef", "chemical", "chemistry", "chest",
"chew", "chicken", "chief", "child", "childhood", "chip", "chocolate", "choice", "choir", "choose",
"chop", "chronic", "chunk", "church", "cigarette", "cinema", "circle", "circuit", "circulate", "circulation",
"circumstance", "cite", "citizen", "citizenship", "city", "civil", "civilian", "civilization", "claim", "clarify",
"clarity", "clash", "class", "classic", "classical", "classification", "classify", "classroom", "clause", "clay",
"clean", "clear", "clearly", "clerk", "clever", "click", "client", "cliff", "climate", "climb",
"cling", "clinic", "clinical", "clip", "clock", "close", "closed", "closely", "closet", "closure",
"cloth", "clothes", "clothing", "cloud", "club", "clue", "cluster", "coach", "coal", "coalition",
"coast", "coastal", "coat", "cocaine", "code", "coffee", "cognitive", "coin", "coincide", "coincidence",
"cold", "collaborate", "collapse", "collar", "colleague", "collect", "collection", "collective", "college", "colonial",
"colony", "color", "column", "columnist", "combat", "combination", "combine", "come", "comedy", "comfort",
"comfortable", "comic", "command", "commander", "commence", "comment", "commentary", "commentator", "commerce", "commercial",
"commission", "commissioner", "commit", "commitment", "committee", "commodity", "common", "commonly", "communicate", "communication",
"communist", "community", "companion", "company", "comparable", "comparative", "compare", "comparison", "compartment", "compassion",
"compatible", "compel", "compensate", "compensation", "compete", "competence", "competent", "competition", "competitive", "competitor",
"compile", "complain", "complaint", "complement", "complete", "completely", "completion", "complex", "complexity", "compliance",
"complicate", "complicated", "comply", "component", "compose", "composer", "composition", "compound", "comprehensive", "comprise",
"compromise", "compulsory", "compute", "computer", "conceal", "concede", "conceive", "concentrate", "concentration", "concept",
"conception", "concern", "concerned", "concert", "concession", "conclude", "conclusion", "concrete", "condemn", "condition",
"conduct", "conductor", "conference", "confess", "confession", "confidence", "confident", "configuration", "confine", "confirm",
"conflict", "conform", "confront", "confrontation", "confuse", "confusion", "congratulate", "congregation", "congress", "conjunction",
"connect", "connection", "conscience", "conscious", "consciousness", "consensus", "consent", "consequence", "consequently", "conservation",
"conservative", "conserve", "consider", "considerable", "considerably", "consideration", "consist", "consistency", "consistent", "consistently",
"consolidate", "conspiracy", "constant", "constantly", "constituency", "constitute", "constitution", "constitutional", "constraint", "construct",
"construction", "consult", "consultant", "consume", "consumer", "consumption", "contact", "contain", "container", "contemplate",
"contemporary", "contempt", "contend", "content", "contention", "contest", "context", "continent", "continuation", "continue",
"continuous", "contract", "contractor", "contradiction", "contrary", "contrast", "contribute", "contribution", "control", "controversial",
"controversy", "convenience", "convenient", "convention", "conventional", "conversation", "conversion", "convert", "convey", "convict",
"conviction", "convince", "convincing", "cook", "cooker", "cookie", "cool", "cooperate", "cooperative", "coordinate",
"coordinator", "cop", "cope", "copper", "copy", "copyright", "cord", "core", "corn", "corner",
"corporate", "corporation", "correct", "correction", "correctly", "correlate", "correlation", "correspond", "correspondence", "correspondent",
"corresponding", "corridor", "corrupt", "corruption", "cost", "costly", "costume", "cottage", "cotton", "cough",
"could", "council", "councillor", "counsel", "counselling", "counselor", "count", "counter", "counterpart", "country",
"countryside", "county", "coup", "couple", "courage", "course", "court", "courtesy", "cousin", "cover",
"coverage", "cow", "crack", "craft", "crash", "crawl", "crazy", "cream", "create", "creation",
"creative", "creature", "credibility", "credible", "credit", "crew", "crime", "criminal", "crisis", "criterion",
"critic", "critical", "criticism", "criticize", "crop", "cross", "crowd", "crowded", "crown", "crucial",
"cruel", "cruise", "crush", "cry", "crystal", "cue", "cult", "cultivate", "cultural", "culture",
"cup", "cupboard", "cure", "curiosity", "curious", "curl", "currency", "current", "currently", "curriculum",
"curtain", "curve", "cushion", "custom", "customer", "cut", "cute", "cutting", "cycle", "cynical",
"dad", "daily", "dairy", "dam", "damage", "damn", "damp", "dance", "dancer", "dancing",
"danger", "dangerous", "dare", "dark", "darkness", "data", "database", "date", "daughter", "dawn",
"day", "daylight", "dead", "deadline", "deadly", "deaf", "deal", "dealer", "dear", "death",
"debate", "debris", "debt", "debut", "decade", "December", "decent", "decide", "decision", "decisive",
"deck", "declaration", "declare", "decline", "decorate", "decoration", "decrease", "dedicate", "dedicated", "deduction",
"deed", "deem", "deep", "deeply", "deer", "default", "defeat", "defect", "defence", "defend",
"defendant", "defender", "defensive", "deficiency", "deficit", "define", "definite", "definitely", "definition", "defy",
"degree", "delay", "delegate", "delegation", "delete", "deliberate", "deliberately", "delicate", "delicious", "delight",
"delighted", "deliver", "delivery", "demand", "democracy", "democratic", "demon", "demonstrate", "demonstration", "denial",
"denounce", "dense", "density", "dentist", "deny", "depart", "department", "departure", "depend", "dependence",
"dependent", "depict", "deploy", "deposit", "depress", "depression", "deprive", "depth", "deputy", "derive",
"descend", "descent", "describe", "description", "desert", "deserve", "design", "designate", "designer", "desirable",
"desire", "desk", "desktop", "despair", "desperate", "desperately", "despite", "destination", "destroy", "destruction",
"detail", "detailed", "detain", "detect", "detection", "detective", "detector", "deteriorate", "determination", "determine",
"determined", "devastate", "develop", "development", "device", "devil", "devise", "devote", "diagnose", "diagnosis",
"diagram", "dial", "dialogue", "diameter", "diamond", "diary", "dictate", "dictator", "dictionary", "die",
"diet", "differ", "difference", "different", "differential", "differentiate", "differently", "difficult", "difficulty", "dig",
"digital", "dignity", "dilemma", "dimension", "diminish", "dine", "dinner", "dioxide", "dip", "diplomat",
"diplomatic", "direct", "direction", "directly", "director", "directory", "dirt", "dirty", "disability", "disabled",
"disagree", "disagreement", "disappear", "disappoint", "disappointed", "disappointment", "disaster", "disastrous", "disc", "discard",
"discharge", "discipline", "disclose", "discount", "discourage", "discourse", "discover", "discovery", "discretion", "discrimination",
"discuss", "discussion", "disease", "dish", "disk", "dismiss", "dismissal", "disorder", "display", "disposal",
"dispose", "dispute", "disrupt", "dissolve", "distance", "distant", "distinct", "distinction", "distinctive", "distinguish",
"distort", "distract", "distress", "distribute", "distribution", "district", "disturb", "disturbance", "dive", "diverse",
"diversity", "divert", "divide", "divine", "division", "divorce", "do", "dock", "doctor", "doctrine",
"document", "documentary", "dog", "dollar", "domain", "domestic", "dominant", "dominate", "donate", "donation",
"donor", "door", "dose", "dot", "double", "doubt", "doubtful", "down", "downstairs", "downtown",
"dozen", "draft", "drag", "drain", "drama", "dramatic", "dramatically", "draw", "drawer", "drawing",
"dream", "dress", "dressed", "drift", "drink", "drive", "driver", "driving", "drop", "drought",
"drown", "drug", "drum", "drunk", "dry", "dual", "duck", "due", "dull", "dumb",
"dump", "duplicate", "duration", "during", "dust", "duty", "duo", "each", "eager", "ear",
"early", "earn", "earnings", "earth", "earthquake", "ease", "easily", "east", "eastern", "easy",
"eat", "echo", "ecological", "economic", "economics", "economist", "economy", "edge", "edit", "edition",
"editor", "educate", "education", "educational", "effect", "effective", "effectively", "effectiveness", "efficiency", "efficient",
"effort", "egg", "ego", "eight", "eighteen", "eighty", "either", "elaborate", "elbow", "elderly",
"elect", "election", "electoral", "electric", "electrical", "electricity", "electron", "electronic", "electronics", "elegant",
"element", "elementary", "elephant", "elevate", "eleven", "eligible", "eliminate", "elite", "else", "elsewhere",
"email", "embark", "embarrassed", "embassy", "embody", "embrace", "emerge", "emergency", "emerging", "emission",
"emotion", "emotional", "emphasis", "emphasize", "empire", "employ", "employee", "employer", "employment", "empty",
"enable", "enclose", "encounter", "encourage", "encouragement", "encouraging", "end", "ending", "endless", "endorse",
"endure", "enemy", "energy", "enforce", "enforcement", "engage", "engaged", "engagement", "engine", "engineer",
"engineering", "enhance", "enjoy", "enjoyable", "enjoyment", "enormous", "enough", "enquire", "enquiry", "enrich",
"enroll", "ensue", "ensure", "enter", "enterprise", "entertain", "entertainment", "enthusiasm", "enthusiastic", "entire",
"entirely", "entitle", "entity", "entrance", "entrepreneur", "entry", "envelope", "environment", "environmental", "epidemic",
"episode", "equal", "equality", "equally", "equation", "equip", "equipment", "equity", "equivalent", "era",
"erect", "error", "erupt", "escalate", "escape", "especially", "essay", "essence", "essential", "essentially",
"establish", "establishment", "estate", "estimate", "eternal", "ethic", "ethical", "ethnic", "euro", "evacuate",
"evaluate", "evaluation", "even", "evening", "event", "eventually", "ever", "every", "everybody", "everyday",
"everyone", "everything", "everywhere", "evidence", "evident", "evil", "evoke", "evolution", "evolve", "exact",
"exactly", "exaggerate", "exam", "examination", "examine", "example", "exceed", "excellence", "excellent", "except",
"exception", "exceptional", "excess", "excessive", "exchange", "excite", "excited", "excitement", "exciting", "exclude",
"exclusion", "exclusive", "exclusively", "excuse", "execute", "execution", "executive", "exercise", "exert", "exhaust",
"exhibit", "exhibition", "exile", "exist", "existence", "exit", "exotic", "expand", "expansion", "expect",
"expectation", "expedition", "expenditure", "expense", "expensive", "experience", "experienced", "experiment", "experimental", "expert",
"expertise", "expire", "explain", "explanation", "explicit", "explode", "exploit", "exploration", "explore", "explosion",
"export", "expose", "exposure", "express", "expression", "extend", "extension", "extensive", "extensively", "extent",
"external", "extra", "extract", "extraordinary", "extreme", "extremely", "extremist", "eye", "fabric", "face",
"facilitate", "facility", "fact", "faction", "factor", "factory", "faculty", "fade", "fail", "failure",
"fair", "fairly", "faith", "fake", "fall", "false", "fame", "familiar", "family", "famous",
"fan", "fancy", "fantastic", "fantasy", "far", "fare", "farm", "farmer", "farming", "fascinate",
"fascinating", "fashion", "fashionable", "fast", "fasten", "fat", "fatal", "fate", "father", "fault",
"favor", "favorable", "favorite", "favour", "favourite", "fear", "feat", "feather", "feature", "February",
"federal", "fee", "feed", "feedback", "feeding", "feel", "feeling", "fellow", "female", "fence",
"festival", "fever", "few", "fiber", "fiction", "field", "fierce", "fifteen", "fifth", "fifty",
"fight", "fighter", "fighting", "figure", "file", "fill", "film", "filter", "final", "finally",
"finance", "financial", "find", "finding", "fine", "finger", "finish", "fire", "firefighter", "firework",
"firm", "firmly", "first", "firstly", "fiscal", "fish", "fisherman", "fishing", "fit", "fitness",
"five", "fix", "fixed", "flag", "flame", "flash", "flat", "flavor", "flaw", "flee",
"fleet", "flesh", "flexibility", "flexible", "flight", "float", "flood", "floor", "flour", "flow",
"flower", "flu", "fluid", "fly", "focus", "fold", "folding", "folk", "follow", "following",
"fond", "food", "fool", "foot", "football", "for", "forbid", "force", "forecast", "foreign",
"foreigner", "forest", "forever", "forge", "forget", "forgive", "fork", "form", "formal", "format",
"formation", "former", "formerly", "formula", "forth", "forthcoming", "fortnight", "fortunate", "fortunately", "fortune",
"forty", "forum", "forward", "fossil", "foster", "found", "foundation", "founder", "four", "fourteen",
"fourth", "fraction", "fragile", "fragment", "frame", "framework", "franchise", "frankly", "fraud", "free",
"freedom", "freely", "freeze", "frequency", "frequent", "frequently", "fresh", "Friday", "fridge", "friend",
"friendly", "friendship", "frighten", "frightened", "frightening", "frog", "from", "front", "frozen", "fruit",
"frustrate", "frustration", "fry", "fuel", "fulfil", "full", "full-time", "fully", "fun", "function",
"functional", "fund", "fundamental", "fundamentally", "funding", "funeral", "funny", "fur", "furniture", "further",
"furthermore", "future", "gain", "gallery", "gallon", "game", "gang", "gap", "garage", "garden",
"gas", "gate", "gather", "gathering", "gay", "gaze", "gear", "gender", "gene", "general",
"generally", "generate", "generation", "generous", "genetic", "genius", "genre", "gentle", "gentleman", "gently",
"genuine", "genuinely", "geography", "gesture", "get", "ghost", "giant", "gift", "gig", "girl",
"girlfriend", "give", "glad", "glance", "glass", "glimpse", "global", "globally", "gloom", "glorious",
"glory", "glove", "go", "goal", "god", "gold", "golden", "golf", "good", "goodbye",
"goodness", "goods", "gorgeous", "govern", "governance", "government", "governor", "grab", "grace", "grade",
"gradually", "graduate", "grain", "grand", "grandfather", "grandmother", "grandparent", "grant", "graph", "graphics",
"grasp", "grass", "grateful", "grave", "gravity", "great", "greatly", "green", "greenhouse", "greet",
"grey", "grid", "grief", "grin", "grind", "grip", "grocery", "gross", "ground", "group",
"grow", "growth", "guarantee", "guard", "guardian", "guerrilla", "guess", "guest", "guidance", "guide",
"guideline", "guilt", "guilty", "guitar", "gun", "gut", "guy", "gym", "habit", "habitat",
"hail", "hair", "half", "halfway", "hall", "halt", "hand", "handful", "handle", "handsome",
"handy", "hang", "happen", "happily", "happiness", "happy", "harassment", "harbor", "harbour", "hard",
"hardly", "hardware", "harm", "harmful", "harmony", "harsh", "harvest", "haste", "hat", "hate",
"hatred", "haul", "have", "have to", "hay", "hazard", "he", "head", "headache", "headline",
"headquarters", "heal", "health", "healthcare", "healthy", "hear", "hearing", "heart", "heat", "heating",
"heaven", "heavily", "heavy", "heel", "height", "heighten", "helicopter", "hell", "hello", "helmet",
"help", "helpful", "hence", "her", "herb", "herd", "here", "heritage", "hero", "hers",
"herself", "hesitate", "hey", "hi", "hidden", "hide", "hierarchy", "high", "highlight", "highly",
"highway", "hilarious", "hill", "him", "himself", "hint", "hip", "hire", "his", "historian",
"historic", "historical", "history", "hit", "hobby", "hockey", "hold", "holder", "holding", "hole",
"holiday", "hollow", "holy", "home", "homeland", "homeless", "homework", "honest", "honestly", "honey",
"honor", "honour", "hook", "hope", "hopeful", "hopefully", "horizon", "horn", "horrible", "horror",
"horse", "hospital", "host", "hostage", "hostile", "hostility", "hot", "hotel", "hour", "house",
"household", "housewife", "housing", "how", "however", "huge", "human", "humanity", "humble", "humor",
"humour", "hundred", "hunger", "hungry", "hunt", "hunting", "hurry", "hurt", "husband", "hut",
"hypothesis", "ice", "ice cream", "icon", "idea", "ideal", "identical", "identification", "identify", "identity",
"ideological", "ideology", "idiot", "if", "ignore", "ill", "illegal", "illness", "illusion", "illustrate",
"illustration", "image", "imagery", "imaginary", "imagination", "imagine", "immediate", "immediately", "immense", "immigrant",
"immigration", "imminent", "immune", "impact", "impatient", "implement", "implementation", "implication", "imply", "import",
"importance", "important", "impose", "impossible", "impress", "impression", "impressive", "imprison", "imprisonment", "improve",
"improvement", "in", "inability", "inadequate", "incentive", "inch", "incidence", "incident", "inclined", "include",
"including", "inclusion", "income", "incorporate", "increase", "increasingly", "incredible", "incredibly", "incur", "indeed",
"independence", "independent", "index", "indicate", "indication", "indicator", "indigenous", "indirect", "individual", "indoor",
"indoors", "induce", "indulge", "industrial", "industry", "inequality", "inevitable", "inevitably", "infant", "infect",
"infection", "infinite", "inflation", "inflict", "influence", "influential", "info", "inform", "informal", "information",
"infrastructure", "ingredient", "inhabitant", "inherent", "inherit", "inhibit", "initial", "initially", "initiate", "initiative",
"inject", "injection", "injure", "injured", "injury", "inmate", "inner", "innocent", "innovation", "innovative",
"input", "inquest", "inquiry", "insect", "insert", "inside", "insider", "insight", "insist", "inspect",
"inspection", "inspector", "inspiration", "inspire", "install", "installation", "instance", "instant", "instantly", "instead",
"instinct", "institute", "institution", "institutional", "instruct", "instruction", "instructor", "instrument", "instrumental", "insufficient",
"insult", "insurance", "intact", "intake", "integral", "integrate", "integrated", "integration", "integrity", "intellectual",
"intelligence", "intelligent", "intend", "intense", "intensely", "intensify", "intensity", "intensive", "intent", "intention",
"interact", "interaction", "interactive", "interest", "interested", "interesting", "interface", "interfere", "interference", "interim",
"interior", "intermediate", "internal", "international", "internet", "interpret", "interpretation", "interrupt", "interval", "intervene",
"intervention", "interview", "intimate", "into", "intriguing", "introduce", "introduction", "invade", "invasion", "invent",
"invention", "invest", "investigate", "investigation", "investigator", "investment", "investor", "invisible", "invitation", "invite",
"invoke", "involve", "involved", "involvement", "iron", "ironically", "irony", "irrelevant", "island", "isolate",
"isolated", "isolation", "issue", "it", "item", "its", "itself", "jacket", "jail", "jam",
"January", "jazz", "jeans", "jet", "jewellery", "job", "join", "joint", "joke", "journal",
"journalism", "journalist", "journey", "joy", "judge", "judgement", "judgment", "judicial", "juice", "July",
"jump", "junction", "June", "junior", "jurisdiction", "jury", "just", "justice", "justification", "justify",
"keen", "keep", "key", "keyboard", "kick", "kid", "kidnap", "kidney", "kill", "killing",
"kilometer", "kilometre", "kind", "king", "kingdom", "kiss", "kit", "kitchen", "knee", "knife",
"knock", "know", "knowledge", "lab", "label", "laboratory", "labour", "lack", "lad", "ladder",
"lady", "lake", "lamp", "land", "landing", "landlord", "landmark", "landscape", "lane", "language",
"lap", "laptop", "large", "largely", "laser", "last", "late", "lately", "later", "latter",
"laugh", "laughter", "launch", "law", "lawn", "lawsuit", "lawyer", "lay", "layer", "layout",
"lazy", "lead", "leader", "leadership", "leading", "leaf", "leaflet", "league", "leak", "lean",
"leap", "learn", "learning", "least", "leather", "leave", "lecture", "left", "leg", "legacy",
"legal", "legally", "legend", "legendary", "legislation", "legislative", "legislator", "legislature", "legitimate", "leisure",
"lemon", "lend", "length", "lengthy", "lens", "lesbian", "less", "lesser", "lesson", "let",
"lethal", "letter", "level", "liability", "liable", "liaison", "liberal", "liberation", "liberty", "library",
"lie", "life", "lifelong", "lifestyle", "lifetime", "lift", "light", "lighting", "like", "likelihood",
"likely", "likewise", "limb", "limit", "limitation", "limited", "line", "linear", "linger", "link",
"lion", "lip", "liquid", "list", "listen", "listener", "listing", "literacy", "literal", "literally",
"literary", "literature", "litre", "litter", "little", "live", "lively", "liver", "living", "load",
"loan", "lobby", "local", "locate", "location", "lock", "log", "logic", "logical", "logo",
"lonely", "long", "long-term", "look", "loom", "loop", "loose", "lord", "lorry", "lose",
"loss", "lost", "lot", "lottery", "loud", "loudly", "love", "lovely", "lover", "low",
"lower", "loyal", "loyalty", "luck", "lucky", "lunch", "lung", "luxury", "lyric", "machine",
"machinery", "mad", "magazine", "magic", "magical", "magistrate", "magnetic", "magnificent", "magnitude", "mail",
"main", "mainland", "mainly", "mainstream", "maintain", "maintenance", "major", "majority", "make", "make-up",
"maker", "makeup", "male", "mall", "man", "manage", "management", "manager", "managerial", "mandate",
"mandatory", "manifest", "manipulate", "mankind", "manner", "manufacture", "manufacturer", "manufacturing", "manuscript", "many",
"map", "marathon", "marble", "march", "March", "margin", "marginal", "marine", "mark", "market",
"marketing", "marketplace", "marriage", "married", "marry", "martial", "mask", "mass", "massacre", "massive",
"master", "match", "matching", "mate", "material", "mathematical", "mathematics", "maths", "matter", "mature",
"maximize", "maximum", "may", "maybe", "mayor", "me", "meal", "mean", "meaning", "meaningful",
"means", "meantime", "meanwhile", "measure", "measurement", "meat", "mechanic", "mechanical", "mechanism", "medal",
"media", "medical", "medication", "medicine", "medieval", "medium", "meet", "meeting", "melody", "melt",
"member", "membership", "memo", "memoir", "memorable", "memorial", "memory", "mental", "mentality", "mention",
"mentor", "menu", "merchant", "mercy", "mere", "merely", "merge", "merger", "merit", "mess",
"message", "metal", "metaphor", "method", "methodology", "metre", "middle", "midnight", "midst", "might",
"migration", "mild", "mile", "military", "militia", "milk", "mill", "million", "mind", "mine",
"miner", "mineral", "minimal", "minimize", "minimum", "mining", "minister", "ministry", "minor", "minority",
"minute", "miracle", "mirror", "miserable", "misery", "mislead", "miss", "missile", "missing", "mission",
"mist", "mistake", "mix", "mixed", "mixture", "mob", "mobile", "mobility", "mobilize", "mode",
"model", "moderate", "modern", "modest", "modification", "modify", "moment", "momentum", "Monday", "money",
"monitor", "monk", "monkey", "monopoly", "monster", "month", "monthly", "monument", "mood", "moon",
"moral", "morality", "more", "moreover", "morning", "mortgage", "mosque", "most", "mostly", "mother",
"motion", "motivate", "motivation", "motive", "motor", "motorcycle", "motorist", "mount", "mountain", "mouse",
"mouth", "move", "movement", "movie", "moving", "much", "mud", "multiple", "multiply", "mom",
"municipal", "murder", "muscle", "museum", "music", "musical", "musician", "must", "mutual", "my",
"myself", "mysterious", "mystery", "myth", "nail", "naked", "name", "namely", "narrative", "narrow",
"nasty", "nation", "national", "nationwide", "native", "natural", "naturally", "nature", "naval", "navigation",
"near", "nearby", "nearly", "neat", "necessarily", "necessary", "necessity", "neck", "need", "needle",
"negative", "neglect", "negotiate", "negotiation", "neighbor", "neighborhood", "neighbour", "neighbourhood", "neither", "nerve",
"nervous", "nest", "net", "network", "neutral", "never", "nevertheless", "new", "newly", "news",
"newsletter", "newspaper", "next", "next to", "nice", "niche", "night", "nightmare", "nine", "nineteen",
"ninety", "no", "noble", "nobody", "nod", "noise", "noisy", "nominate", "nomination", "none",
"nonetheless", "nonsense", "noon", "nor", "norm", "normal", "normally", "north", "northern", "nose",
"not", "notable", "notably", "note", "notebook", "nothing", "notice", "notify", "notion", "notorious",
"novel", "novelist", "November", "now", "nowadays", "nowhere", "nuclear", "number", "numerous", "nurse",
"nursery", "nursing", "nut", "nutrition", "o'clock", "obesity", "obey", "object", "objection", "objective",
"obligation", "oblige", "observation", "observe", "observer", "obsess", "obsession", "obstacle", "obtain", "obvious",
"obviously", "occasion", "occasional", "occasionally", "occupation", "occupy", "occur", "occurrence", "ocean", "October",
"odd", "odds", "of", "off", "offence", "offend", "offender", "offensive", "offer", "offering",
"office", "officer", "official", "offspring", "often", "oh", "oil", "ok", "okay", "old",
"old-fashioned", "on", "once", "one", "ongoing", "onion", "online", "only", "onto", "open",
"opening", "openly", "opera", "operate", "operation", "operational", "operator", "opinion", "opponent", "opportunity",
"oppose", "opposed", "opposite", "opposition", "opt", "optical", "optimism", "optimistic", "option", "or",
"oral", "orange", "orchestra", "order", "ordinary", "organ", "organic", "organization", "organizational", "organize",
"organized", "organizer", "orientation", "origin", "original", "originally", "originate", "orthodox", "other", "otherwise",
"ought to", "our", "ours", "ourselves", "out", "outbreak", "outcome", "outdoor", "outdoors", "outer",
"outfit", "outing", "outlet", "outline", "outlook", "output", "outrage", "outside", "outsider", "outstanding",
"oven", "over", "overall", "overcome", "overlook", "overnight", "overseas", "oversee", "overturn", "overwhelm",
"overwhelming", "owe", "own", "owner", "ownership", "oxygen", "pace", "pack", "package", "packet",
"pad", "page", "pain", "painful", "paint", "painter", "painting", "pair", "palace", "pale",
"palm", "pan", "panel", "panic", "pant", "paper", "parade", "paragraph", "parallel", "parameter",
"parent", "parental", "parish", "park", "parking", "parliament", "parliamentary", "part", "partial", "partially",
"participant", "participate", "participation", "particle", "particular", "particularly", "partly", "partner", "partnership", "party",
"pass", "passage", "passenger", "passion", "passionate", "passive", "passport", "password", "past", "pasture",
"pat", "patch", "patent", "path", "patience", "patient", "patrol", "patron", "pattern", "pause",
"pay", "payment", "peace", "peaceful", "peak", "peasant", "peculiar", "peer", "pen", "penalty",
"pencil", "penny", "pension", "people", "pepper", "per", "perceive", "percent", "percentage", "perception",
"perfect", "perfectly", "perform", "performance", "performer", "perhaps", "period", "permanent", "permanently", "permission",
"permit", "persist", "persistent", "person", "personal", "personality", "personally", "personnel", "perspective", "persuade",
"pet", "petition", "gasoline", "petrol", "petty", "phase", "phenomenon", "philosopher", "philosophical", "philosophy",
"phone", "photo", "photograph", "photographer", "photography", "phrase", "physical", "physically", "physician", "physics",
"piano", "pick", "picture", "pie", "piece", "pig", "pile", "pill", "pillar", "pillow",
"pilot", "pin", "pink", "pioneer", "pipe", "pipeline", "pirate", "pit", "pitch", "pity",
"place", "placement", "plain", "plan", "plane", "planet", "planning", "plant", "plasma", "plastic",
"plate", "platform", "play", "player", "plea", "plead", "pleasant", "please", "pleased", "pleasure",
"pledge", "plenty", "plot", "plug", "plunge", "plus", "pocket", "poem", "poet", "poetry",
"point", "pointed", "poison", "poisonous", "pole", "police", "policeman", "policy", "polite", "political",
"politician", "politics", "poll", "pollution", "pond", "pool", "poor", "pop", "popular", "popularity",
"population", "port", "portfolio", "portion", "portrait", "portray", "pose", "position", "positive", "possess",
"possession", "possibility", "possible", "possibly", "post", "poster", "postpone", "pot", "potato", "potential",
"potentially", "pound", "pour", "poverty", "powder", "power", "powerful", "practical", "practically", "practice",
"practise", "practitioner", "praise", "pray", "prayer", "preach", "precaution", "precede", "precedent", "precious",
"precise", "precisely", "precision", "predator", "predecessor", "predict", "predictable", "prediction", "predominantly", "prefer",
"preference", "pregnancy", "pregnant", "prejudice", "preliminary", "premier", "premise", "premium", "preparation", "prepare",
"prepared", "prescribe", "prescription", "presence", "present", "presentation", "presently", "preserve", "presidency", "president",
"presidential", "press", "pressure", "prestigious", "presumably", "presume", "pretend", "pretty", "prevail", "prevalence",
"prevent", "prevention", "previous", "previously", "prey", "price", "pride", "priest", "primarily", "primary",
"prime", "prince", "princess", "principal", "principle", "print", "printer", "printing", "prior", "priority",
"prison", "prisoner", "privacy", "private", "privately", "privilege", "prize", "probability", "probable", "probably",
"probe", "problem", "procedure", "proceed", "proceeding", "process", "processing", "processor", "proclaim", "produce",
"producer", "product", "production", "productive", "productivity", "profession", "professional", "professor", "profile", "profit",
"profitable", "profound", "programming", "progress", "progressive", "prohibit", "project", "projection", "prominent", "promise",
"promising", "promote", "promotion", "prompt", "pronounce", "pronounced", "proof", "propaganda", "proper", "properly",
"property", "proportion", "proposal", "propose", "proposition", "prosecute", "prosecution", "prosecutor", "prospect", "prospective",
"prosperity", "protect", "protection", "protective", "protein", "protest", "protocol", "proud", "prove", "provide",
"province", "provincial", "provision", "provoke", "psychiatric", "psychological", "psychologist", "psychology", "pub", "public",
"publication", "publicity", "publicly", "publish", "publisher", "publishing", "pull", "pulse", "pump", "punch",
"punish", "punishment", "punk", "pupil", "purchase", "pure", "purely", "purple", "purpose", "purse",
"pursue", "pursuit", "push", "put", "puzzle", "qualification", "qualified", "qualify", "quality", "quantity",
"quarter", "queen", "query", "quest", "question", "questionnaire", "queue", "quick", "quickly", "quiet",
"quietly", "quit", "quite", "quota", "quotation", "quote", "rabbit", "race", "racial", "racing",
"racism", "racist", "radar", "radiation", "radical", "radio", "rage", "raid", "rail", "railway",
"rain", "raise", "rally", "random", "range", "rank", "ranking", "rape", "rapid", "rapidly",
"rare", "rarely", "rat", "rate", "rather", "rating", "ratio", "rational", "raw", "ray",
"reach", "react", "reaction", "read", "reader", "readily", "reading", "ready", "real", "realistic",
"reality", "realization", "realize", "really", "realm", "rear", "reason", "reasonable", "reasonably", "reasoning",
"reassure", "rebel", "rebellion", "rebuild", "recall", "receipt", "receive", "receiver", "recent", "recently",
"reception", "recession", "recipe", "recipient", "reckon", "recognition", "recognize", "recommend", "recommendation", "reconstruction",
"record", "recording", "recount", "recover", "recovery", "recruit", "recruitment", "recycle", "red", "reduce",
"reduction", "refer", "referee", "reference", "referendum", "reflect", "reflection", "reform", "refuge", "refugee",
"refusal", "refuse", "regain", "regard", "regardless", "regime", "region", "regional", "register", "registration",
"regret", "regular", "regularly", "regulate", "regulation", "regulator", "regulatory", "rehabilitation", "reign", "reinforce",
"reject", "rejection", "relate", "related", "relation", "relationship", "relative", "relatively", "relax", "relaxed",
"relaxing", "release", "relevance", "relevant", "reliability", "reliable", "relief", "relieve", "religion", "religious",
"reluctant", "rely", "remain", "remainder", "remains", "remark", "remarkable", "remarkably", "remedy", "remember",
"remind", "reminder", "remote", "removal", "remove", "renaissance", "render", "renew", "rent", "repair",
"repeat", "repeatedly", "replace", "replacement", "reply", "report", "reporter", "reporting", "represent", "representation",
"representative", "reproduce", "reproduction", "republic", "reputation", "request", "require", "requirement", "rescue", "research",
"researcher", "resemble", "reservation", "reserve", "reside", "residence", "resident", "residential", "residue", "resign",
"resignation", "resist", "resistance", "resolution", "resolve", "resort", "resource", "respect", "respective", "respectively",
"respond", "response", "responsibility", "responsible", "rest", "restaurant", "restoration", "restore", "restraint", "restrict",
"restriction", "result", "resume", "retail", "retain", "retire", "retired", "retirement", "retreat", "retrieve",
"return", "reveal", "revelation", "revenge", "revenue", "reverse", "review", "revise", "revision", "revival",
"revive", "revolution", "revolutionary", "reward", "rhetoric", "rhythm", "rice", "rich", "rid", "ride",
"ridiculous", "rifle", "right", "ring", "riot", "rip", "rise", "risk", "risky", "ritual",
"rival", "river", "road", "rob", "robbery", "robot", "robust", "rock", "rocket", "rod",
"role", "roll", "romance", "romantic", "roof", "room", "root", "rope", "rose", "rotate",
"rotation", "rough", "roughly", "round", "route", "routine", "row", "royal", "rub", "rubber",
"rubbish", "rude", "rugby", "ruin", "rule", "ruler", "ruling", "rumor", "rumour", "run",
"runner", "running", "rural", "rush", "sack", "sacred", "sacrifice", "sad", "sadly", "safe",
"safety", "sail", "sailor", "saint", "sake", "salad", "salary", "sale", "salt", "same",
"sample", "sanction", "sand", "sandwich", "satellite", "satisfaction", "satisfied", "satisfy", "sauce", "save",
"saving", "say", "scale", "scan", "scandal", "scare", "scared", "scary", "scattered", "scenario",
"scene", "skeptical", "schedule", "scheme", "scholar", "scholarship", "school", "science", "scientific", "scientist",
"scope", "score", "scratch", "scream", "screen", "screening", "screw", "script", "scrutiny", "sculpture",
"sea", "seal", "search", "season", "seat", "second", "secondary", "secondly", "secret", "secretary",
"section", "sector", "secular", "secure", "security", "see", "seed", "seek", "seem", "segment",
"seize", "seldom", "select", "selection", "selective", "self", "sell", "seminar", "senator", "send",
"senior", "sensation", "sense", "sensible", "sensitive", "sensitivity", "sentence", "sentiment", "separate", "separation",
"September", "sequence", "serial", "series", "serious", "seriously", "servant", "serve", "service", "session",
"set", "setting", "settle", "settlement", "settler", "seven", "seventeen", "seventy", "several", "severe",
"severely", "sex", "sexual", "sexuality", "sexy", "shade", "shadow", "shake", "shall", "shallow",
"shame", "shape", "share", "shareholder", "sharp", "shatter", "she", "shed", "sheep", "sheer",
"sheet", "shelf", "shell", "shelter", "shift", "shine", "shiny", "ship", "shipping", "shirt",
"shock", "shocked", "shocking", "shoe", "shoot", "shooting", "shop", "shopping", "shore", "short",
"short-term", "shortage", "shortly", "shot", "should", "shoulder", "shout", "show", "shower", "shrink",
"shrug", "shut", "shy", "sibling", "sick", "side", "sigh", "sight", "sign", "signal",
"signature", "significance", "significant", "significantly", "silence", "silent", "silk", "silly", "silver", "similar",
"similarity", "similarly", "simple", "simply", "simulate", "simulation", "simultaneously", "sin", "since", "sincere",
"sing", "singer", "single", "sink", "sir", "sister", "sit", "site", "situate", "situation",
"six", "sixteen", "sixty", "size", "sketch", "ski", "skiing", "skill", "skilled", "skin",
"skip", "skirt", "skull", "sky", "slam", "slap", "slash", "slave", "slavery", "sleep",
"slice", "slide", "slight", "slightly", "slip", "slogan", "slope", "slot", "slow", "slowly",
"small", "smart", "smash", "smell", "smile", "smoke", "smoking", "smooth", "snake", "snap",
"snow", "so", "so-called", "soak", "soap", "soar", "soccer", "social", "socialist", "society",
"sock", "soft", "software", "soil", "solar", "soldier", "sole", "solely", "solicitor", "solid",
"solidarity", "solo", "solution", "solve", "some", "somebody", "somehow", "someone", "something", "sometimes",
"somewhat", "somewhere", "son", "song", "soon", "sophisticated", "sorry", "sort", "soul", "sound",
"soup", "source", "south", "southern", "sovereignty", "space", "spare", "spark", "speak", "speaker",
"special", "specialist", "specialize", "specialized", "species", "specific", "specifically", "specification", "specify", "specimen",
"spectacle", "spectacular", "spectator", "spectrum", "speculate", "speculation", "speech", "speed", "spell", "spelling",
"spend", "spending", "sphere", "spice", "spider", "spill", "spin", "spine", "spirit", "spiritual",
"spit", "spite", "split", "spoil", "spoken", "spokesman", "spokesperson", "spokeswoman", "sponsor", "sponsorship",
"spoon", "sport", "sporting", "spot", "spotlight", "spouse", "spread", "spring", "spy", "squad",
"square", "squeeze", "stab", "stability", "stabilize", "stable", "stadium", "staff", "stage", "stagger",
"stair", "stake", "stall", "stamp", "stance", "stand", "standard", "standing", "star", "stare",
"stark", "start", "starve", "state", "statement", "station", "statistical", "statistics", "statue", "status",
"statute", "stay", "steadily", "steady", "steal", "steam", "steel", "steep", "steer", "stem",
"step", "stereotype", "stick", "sticky", "stiff", "still", "stimulate", "stimulus", "stir", "stock",
"stomach", "stone", "stool", "stop", "storage", "store", "storm", "story", "straight", "straightforward",
"strain", "strand", "strange", "stranger", "strategic", "strategy", "straw", "stream", "street", "strength",
"strengthen", "stress", "stretch", "strict", "strictly", "strike", "striking", "string", "strip", "strive",
"stroke", "strong", "strongly", "structural", "structure", "struggle", "student", "studio", "study", "stuff",
"stumble", "stun", "stunning", "stupid", "style", "subject", "submission", "submit", "subscriber", "subscription",
"subsequent", "subsequently", "subsidiary", "subsidy", "substance", "substantial", "substantially", "substitute", "substitution", "subtle",
"suburb", "suburban", "succeed", "success", "successful", "successfully", "succession", "successive", "successor", "such",
"suck", "sudden", "suddenly", "sue", "suffer", "suffering", "sufficient", "sufficiently", "sugar", "suggest",
"suggestion", "suicide", "suit", "suitable", "suite", "sum", "summarize", "summary", "summer", "summit",
"sun", "Sunday", "super", "superb", "superior", "supermarket", "supervise", "supervision", "supervisor", "supplement",
"supply", "support", "supporter", "supportive", "suppose", "supposedly", "suppress", "supreme", "sure", "surely",
"surface", "surge", "surgeon", "surgery", "surgical", "surplus", "surprise", "surprised", "surprising", "surprisingly",
"surrender", "surround", "surrounding", "surveillance", "survey", "survival", "survive", "survivor", "suspect", "suspend",
"suspension", "suspicion", "suspicious", "sustain", "sustainable", "swallow", "swear", "sweat", "sweater", "sweep",
"sweet", "swell", "swim", "swimming", "swing", "switch", "sword", "symbol", "symbolic", "sympathetic",
"sympathy", "symptom", "syndrome", "synthesis", "system", "systematic", "table", "tablet", "tackle", "tactic",
"tag", "tail", "take", "tale", "talent", "talented", "talk", "tall", "tank", "tap",
"tape", "target", "task", "taste", "tax", "taxi", "taxpayer", "tea", "teach", "teacher",
"teaching", "team", "tear", "technical", "technique", "technological", "technology", "teenage", "teenager", "telecommunications",
"telephone", "telescope", "television", "tell", "temperature", "temple", "temporarily", "temporary", "tempt", "ten",
"tenant", "tend", "tendency", "tender", "tennis", "tension", "tent", "tenure", "term", "terminal",
"terminate", "terms", "terrain", "terrible", "terribly", "terrific", "terrify", "territory", "terror", "terrorism",
"terrorist", "test", "testify", "testimony", "testing", "text", "textbook", "texture", "than", "thank",
"thanks", "that", "the", "theatre", "theatrical", "their", "theirs", "them", "theme", "themselves",
"then", "theology", "theoretical", "theory", "therapist", "therapy", "there", "thereafter", "thereby", "therefore",
"thesis", "they", "thick", "thief", "thin", "thing", "think", "thinking", "third", "thirsty",
"thirteen", "thirty", "this", "thorough", "thoroughly", "though", "thought", "thousand", "thread", "threat",
"threaten", "three", "threshold", "thrive", "throat", "through", "throughout", "throw", "thumb", "Thursday",
"thus", "ticket", "tide", "tidy", "tie", "tight", "tighten", "till", "timber", "time",
"timely", "timing", "tin", "tiny", "tip", "tired", "tissue", "title", "to", "tobacco",
"today", "toe", "together", "toilet", "tolerance", "tolerate", "toll", "tomato", "tomorrow", "ton",
"tone", "tongue", "tonight", "tonne", "too", "tool", "tooth", "top", "topic", "torture",
"toss", "total", "totally", "touch", "tough", "tour", "tourism", "tourist", "tournament", "toward",
"towards", "tower", "town", "toxic", "toy", "trace", "track", "trade", "trademark", "trading",
"tradition", "traditional", "traffic", "tragedy", "tragic", "trail", "trailer", "train", "trainer", "training",
"trait", "transaction", "transcript", "transfer", "transform", "transformation", "transit", "transition", "translate", "translation",
"transmission", "transmit", "transport", "transportation", "trap", "trauma", "travel", "traveler", "traveller", "treasure",
"treat", "treatment", "treaty", "tree", "tremendous", "trend", "trial", "triangle", "tribal", "tribe",
"tribunal", "tribute", "trick", "trigger", "trillion", "trio", "trip", "triumph", "troop", "trophy",
"tropical", "trouble", "troubled", "trousers", "truck", "true", "truly", "trust", "trustee", "truth",
"try", "tsunami", "tube", "Tuesday", "tuition", "tune", "tunnel", "turn", "turnout", "turnover",
"tv", "twelve", "twenty", "twice", "twin", "twist", "two", "type", "typical", "typically",
"tyre", "ugly", "ultimate", "ultimately", "umbrella", "unable", "unacceptable", "uncertainty", "uncle", "uncomfortable",
"unconscious", "under", "undergo", "undergraduate", "underground", "underlying", "undermine", "understand", "understanding", "undertake",
"underwear", "undoubtedly", "uneasy", "unemployed", "unemployment", "unexpected", "unfair", "unfold", "unfortunate", "unfortunately",
"unhappy", "uniform", "unify", "union", "unique", "unit", "unite", "united", "unity", "universal",
"universe", "university", "unknown", "unless", "unlike", "unlikely", "unprecedented", "until", "unusual", "unveil",
"up", "upcoming", "update", "upgrade", "uphold", "upon", "upper", "upset", "upstairs", "upwards",
"urban", "urge", "urgent", "us", "usage", "use", "used", "used to", "useful", "useless",
"user", "usual", "usually", "utility", "utilize", "utterly", "vacation", "vacuum", "vague", "valid",
"validity", "valley", "valuable", "value", "van", "vanish", "variable", "variation", "varied", "variety",
"various", "vary", "vast", "vegetable", "vehicle", "vein", "venture", "venue", "verb", "verbal",
"verdict", "verify", "verse", "version", "versus", "vertical", "very", "vessel", "veteran", "via",
"viable", "vibrant", "vice", "vicious", "victim", "victory", "video", "view", "viewer", "viewpoint",
"village", "villager", "violate", "violation", "violence", "violent", "virtual", "virtually", "virtue", "virus",
"visa", "visible", "vision", "visit", "visitor", "visual", "vital", "vitamin", "vocal", "voice",
"volume", "voluntary", "volunteer", "vote", "voting", "vow", "vulnerability", "vulnerable", "wage", "wait",
"waiter", "waiting", "wake", "walk", "wall", "wander", "want", "war", "ward", "warehouse",
"warfare", "warm", "warmth", "warn", "warning", "warrant", "warrior", "wash", "washing", "waste",
"watch", "water", "wave", "way", "we", "weak", "weaken", "weakness", "wealth", "wealthy",
"weapon", "wear", "weather", "weave", "web", "website", "wedding", "Wednesday", "weed", "week",
"weekend", "weekly", "weigh", "weight", "weird", "welcome", "welfare", "well", "well-being", "well-known",
"west", "western", "wet", "what", "whatever", "whatsoever", "wheat", "wheel", "when", "whenever",
"where", "whereas", "whereby", "wherever", "whether", "which", "while", "whilst", "whip", "whisper",
"white", "who", "whoever", "whole", "wholly", "whom", "whose", "why", "wide", "widely",
"widen", "widespread", "widow", "width", "wife", "wild", "wildlife", "will", "willing", "willingness",
"win", "wind", "window", "wine", "wing", "winner", "winter", "wipe", "wire", "wisdom",
"wise", "wish", "wit", "witch", "with", "withdraw", "withdrawal", "within", "without", "witness",
"woman", "wonder", "wonderful", "wood", "wooden", "wool", "word", "work", "worker", "workforce",
"working", "workout", "workplace", "works", "workshop", "world", "worldwide", "worm", "worried", "worry",
"worse", "worship", "worst", "worth", "worthwhile", "worthy", "would", "wound", "wow", "wrap",
"wrist", "write", "writer", "writing", "written", "wrong", "yard", "yeah", "year", "yell",
"yellow", "yes", "yesterday", "yet", "yield", "you", "young", "youngster", "your", "yours",
"yourself", "youth", "zero", "zone", "zoo"
];
// 全局变量
let selectedWords = [];
let importedWords = [];
let currentWordIndex = 0;
let dictationStarted = false;
let userAnswers = []; // 存储用户答案
let correctAnswers = []; // 存储正确答案
// 页面加载时初始化
document.addEventListener('DOMContentLoaded', function() {
renderWordGrid();
updateStats();
createParticles();
initCursorFollower();
});
// 创建背景粒子
function createParticles() {
const particlesContainer = document.getElementById('particles');
const particleCount = 30;
for (let i = 0; i < particleCount; i++) {
const particle = document.createElement('div');
particle.classList.add('particle');
// 随机大小
const size = Math.random() * 20 + 5;
particle.style.width = `${size}px`;
particle.style.height = `${size}px`;
// 随机位置
particle.style.left = `${Math.random() * 100}%`;
particle.style.top = `${Math.random() * 100}%`;
// 随机动画延迟和时长
const delay = Math.random() * 15;
const duration = 15 + Math.random() * 10;
particle.style.animationDelay = `${delay}s`;
particle.style.animationDuration = `${duration}s`;
// 随机颜色
const colors = ['rgba(100, 255, 200, 0.2)', 'rgba(0, 210, 255, 0.2)', 'rgba(93, 230, 255, 0.2)'];
particle.style.background = colors[Math.floor(Math.random() * colors.length)];
particlesContainer.appendChild(particle);
}
}
// 鼠标跟随效果
function initCursorFollower() {
const cursor = document.querySelector('.cursor-follower');
const buttons = document.querySelectorAll('button, .feature-card');
let mouseX = 0;
let mouseY = 0;
let cursorX = 0;
let cursorY = 0;
const speed = 0.1;
document.addEventListener('mousemove', e => {
mouseX = e.clientX;
mouseY = e.clientY;
});
function animateCursor() {
const distX = mouseX - cursorX;
const distY = mouseY - cursorY;
cursorX += distX * speed;
cursorY += distY * speed;
cursor.style.left = cursorX + 'px';
cursor.style.top = cursorY + 'px';
requestAnimationFrame(animateCursor);
}
animateCursor();
buttons.forEach(button => {
button.addEventListener('mouseenter', () => {
cursor.classList.add('hover');
});
button.addEventListener('mouseleave', () => {
cursor.classList.remove('hover');
});
});
}
// 模式切换
function switchMode(mode) {
document.getElementById('welcomeScreen').style.display = 'none';
document.getElementById('teacherScreen').style.display = 'none';
document.getElementById('studentScreen').style.display = 'none';
if (mode === 'teacher') {
document.getElementById('teacherScreen').style.display = 'block';
} else {
document.getElementById('studentScreen').style.display = 'block';
}
}
// 标签页切换(老师端只有一个标签页)
function switchTab(tabId) {
// 移除所有标签的active状态
document.querySelectorAll('.tab-btn').forEach(tab => {
tab.classList.remove('active');
});
// 设置当前标签为active
event.target.classList.add('active');
// 切换显示内容
if (tabId === 'selection') {
document.getElementById('selectionTab').style.display = 'block';
}
}
// 渲染单词网格
function renderWordGrid(filteredWords = toeflWords) {
const wordGrid = document.getElementById('wordGrid');
wordGrid.innerHTML = '';
filteredWords.forEach(word => {
const wordItem = document.createElement('div');
wordItem.className = `word-item ${selectedWords.includes(word) ? 'selected' : ''}`;
wordItem.textContent = word;
wordItem.onclick = () => toggleWordSelection(word);
wordGrid.appendChild(wordItem);
});
}
// 切换单词选择状态
function toggleWordSelection(word) {
const index = selectedWords.indexOf(word);
if (index > -1) {
selectedWords.splice(index, 1);
} else {
selectedWords.push(word);
}
renderWordGrid();
updateStats();
}
// 更新统计信息
function updateStats() {
const total = toeflWords.length;
const selected = selectedWords.length;
const percentage = total > 0 ? Math.round((selected / total) * 100) : 0;
document.getElementById('selectedCount').textContent = selected;
document.getElementById('totalWords').textContent = total;
document.getElementById('percentage').textContent = percentage + '%';
}
// 全选单词
function selectAllWords() {
selectedWords = [...toeflWords];
renderWordGrid();
updateStats();
}
// 取消全选
function deselectAllWords() {
selectedWords = [];
renderWordGrid();
updateStats();
}
// 随机选择60个单词
function randomSelectWords() {
selectedWords = [];
const shuffled = [...toeflWords].sort(() => 0.5 - Math.random());
selectedWords = shuffled.slice(0, 60);
renderWordGrid();
updateStats();
}
// 搜索单词
function filterWords() {
const searchTerm = document.getElementById('searchInput').value.toLowerCase();
if (searchTerm === '') {
renderWordGrid();
document.getElementById('addWordSuggestion').style.display = 'none';
} else {
const filtered = toeflWords.filter(word =>
word.toLowerCase().includes(searchTerm)
);
renderWordGrid(filtered);
// 如果没有找到匹配的单词,显示添加单词提示
if (filtered.length === 0) {
document.getElementById('addWordSuggestion').style.display = 'block';
document.getElementById('newWordText').textContent = searchTerm;
} else {
document.getElementById('addWordSuggestion').style.display = 'none';
}
}
}
// 添加新单词
function addNewWord() {
const newWord = document.getElementById('searchInput').value.trim().toLowerCase();
if (newWord && !toeflWords.includes(newWord)) {
toeflWords.push(newWord);
toeflWords.sort();
renderWordGrid();
updateStats();
document.getElementById('addWordSuggestion').style.display = 'none';
document.getElementById('searchInput').value = '';
// 显示添加成功提示
alert(`单词 "${newWord}" 已成功添加到词库中!`);
}
}
// 清除搜索
function clearSearch() {
document.getElementById('searchInput').value = '';
document.getElementById('addWordSuggestion').style.display = 'none';
renderWordGrid();
}
// 导出配置文件 - 修复下载问题
function exportConfig() {
if (selectedWords.length === 0) {
alert('请先选择单词!');
return;
}
const config = {
words: selectedWords,
createdTime: new Date().toISOString(),
version: '1.0'
};
// 创建Blob对象
const blob = new Blob([JSON.stringify(config, null, 2)], {type: 'application/json'});
// 创建下载链接
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'toefl_words_config.json';
document.body.appendChild(a);
a.click();
// 清理
setTimeout(() => {
document.body.removeChild(a);
URL.revokeObjectURL(url);
}, 100);
// 添加成功动画
const exportBtn = event.target.closest('.action-btn');
const originalText = exportBtn.innerHTML;
exportBtn.innerHTML = '<i class="fas fa-check"></i> 已导出';
exportBtn.classList.add('btn-success');
setTimeout(() => {
exportBtn.innerHTML = originalText;
exportBtn.classList.remove('btn-success');
}, 2000);
}
// 处理文件选择
function handleFileSelect(event) {
const file = event.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = function(e) {
try {
const config = JSON.parse(e.target.result);
importedWords = config.words || [];
const createdTime = new Date(config.createdTime);
document.getElementById('importedWordCount').textContent = importedWords.length;
document.getElementById('importedTime').textContent = createdTime.toLocaleString();
document.getElementById('importInfo').style.display = 'block';
} catch (error) {
alert('配置文件格式错误!');
}
};
reader.readAsText(file);
}
}
// 开始默写
function startDictation() {
if (importedWords.length === 0) {
alert('请先导入配置文件!');
return;
}
document.getElementById('importInfo').style.display = 'none';
document.getElementById('dictationArea').style.display = 'block';
// 初始化用户答案和正确答案数组
userAnswers = new Array(importedWords.length).fill('');
correctAnswers = [...importedWords];
currentWordIndex = 0;
dictationStarted = true;
showCurrentWord();
// 聚焦到输入框
document.getElementById('answerInput').focus();
}
// 显示当前单词(横杠形式)
function showCurrentWord() {
if (currentWordIndex >= 0 && currentWordIndex < importedWords.length) {
const currentWord = importedWords[currentWordIndex];
const wordLength = currentWord.length;
// 显示横杠(每个字母一个横杠)
const blanks = '_ '.repeat(wordLength).trim();
document.getElementById('wordBlank').textContent = blanks;
// 显示进度
document.getElementById('progressInfo').textContent =
`进度: ${currentWordIndex + 1}/${importedWords.length}`;
const progress = importedWords.length > 0 ?
Math.round(((currentWordIndex + 1) / importedWords.length) * 100) : 0;
document.getElementById('progressFill').style.width = progress + '%';
// 显示之前输入的答案(如果有的话)
document.getElementById('answerInput').value = userAnswers[currentWordIndex] || '';
document.getElementById('answerInput').focus();
}
}
// 处理键盘按键
function handleKeyPress(event) {
if (event.key === 'Enter') {
submitAnswer();
}
}
// 提交答案
function submitAnswer() {
const answerInput = document.getElementById('answerInput');
const userAnswer = answerInput.value.trim().toLowerCase();
if (userAnswer) {
// 保存用户答案
userAnswers[currentWordIndex] = userAnswer;
// 如果是最后一个单词,自动结束
if (currentWordIndex === importedWords.length - 1) {
endDictation();
} else {
// 自动跳到下一个单词
showNextWord();
}
} else {
alert('请输入答案!');
}
}
// 下一个单词
function showNextWord() {
if (currentWordIndex < importedWords.length - 1) {
currentWordIndex++;
showCurrentWord();
}
}
// 上一个单词
function showPrevWord() {
if (currentWordIndex > 0) {
currentWordIndex--;
showCurrentWord();
}
}
// 结束默写并显示成绩
function endDictation() {
dictationStarted = false;
// 计算成绩
let correctCount = 0;
const errorDetails = [];
for (let i = 0; i < importedWords.length; i++) {
if (userAnswers[i] === correctAnswers[i]) {
correctCount++;
} else {
// 记录错误详情
errorDetails.push({
number: i + 1,
word: correctAnswers[i],
userAnswer: userAnswers[i] || '(未作答)'
});
}
}
const totalCount = importedWords.length;
const accuracy = totalCount > 0 ? Math.round((correctCount / totalCount) * 100) : 0;
// 显示成绩报告
document.getElementById('dictationArea').style.display = 'none';
document.getElementById('resultArea').style.display = 'block';
// 更新成绩显示
document.getElementById('finalScore').textContent = accuracy + '%';
document.getElementById('correctCount').textContent = correctCount;
document.getElementById('wrongCount').textContent = totalCount - correctCount;
document.getElementById('totalCount').textContent = totalCount;
// 根据正确率显示等级
let gradeClass = '';
let gradeText = '';
if (accuracy >= 90) {
gradeClass = 'grade-a';
gradeText = 'A (优秀)';
} else if (accuracy >= 80) {
gradeClass = 'grade-b';
gradeText = 'B (良好)';
} else if (accuracy >= 70) {
gradeClass = 'grade-c';
gradeText = 'C (及格)';
} else {
gradeClass = 'grade-d';
gradeText = 'D (需要努力)';
}
const gradeBadge = document.getElementById('gradeBadge');
gradeBadge.textContent = '等级: ' + gradeText;
gradeBadge.className = 'grade-badge ' + gradeClass;
// 更新圆形进度条
const scoreCircle = document.querySelector('.score-circle');
const gradientDegree = (accuracy / 100) * 360;
scoreCircle.style.background = `conic-gradient(#7cffcb 0deg ${gradientDegree}deg, #5de6ff ${gradientDegree}deg 360deg)`;
// 显示错误详情
const errorList = document.getElementById('errorList');
errorList.innerHTML = '';
if (errorDetails.length > 0) {
errorDetails.forEach(error => {
const li = document.createElement('li');
li.className = 'error-item';
li.innerHTML = `
<div class="error-number">${error.number}.</div>
<div class="error-content">
<div class="error-word">${error.word}</div>
<div class="error-answer">您的答案: ${error.userAnswer}</div>
<div class="error-correct">
<i class="fas fa-times" style="color: #ff6b6b;"></i>
<span class="error-arrow">→</span>
<i class="fas fa-check" style="color: #7cffcb;"></i>
<span style="margin-left: 10px;">正确答案: ${error.word}</span>
</div>
</div>
`;
errorList.appendChild(li);
});
} else {
const li = document.createElement('li');
li.innerHTML = '<div style="color: #7cffcb; text-align: center; padding: 20px;"><i class="fas fa-check-circle"></i> 恭喜!全部正确!</div>';
errorList.appendChild(li);
}
}
// 重新开始默写
function restartDictation() {
document.getElementById('resultArea').style.display = 'none';
document.getElementById('dictationArea').style.display = 'block';
// 重置状态
userAnswers = new Array(importedWords.length).fill('');
currentWordIndex = 0;
dictationStarted = true;
showCurrentWord();
}
// 拖拽上传功能
document.addEventListener('DOMContentLoaded', function() {
const uploadArea = document.getElementById('fileUploadArea');
uploadArea.addEventListener('dragover', function(e) {
e.preventDefault();
uploadArea.style.borderColor = '#7cffcb';
uploadArea.style.backgroundColor = 'rgba(124, 255, 203, 0.1)';
});
uploadArea.addEventListener('dragleave', function(e) {
e.preventDefault();
uploadArea.style.borderColor = '';
uploadArea.style.backgroundColor = '';
});
uploadArea.addEventListener('drop', function(e) {
e.preventDefault();
uploadArea.style.borderColor = '';
uploadArea.style.backgroundColor = '';
if (e.dataTransfer.files.length) {
document.getElementById('configFile').files = e.dataTransfer.files;
const event = new Event('change');
document.getElementById('configFile').dispatchEvent(event);
}
});
});
</script>
</body>
</html>