]> acesimba.cloud Git - words.git/commitdiff
修改不可在页面复制内容
authorroot <root@localhost.localdomain>
Thu, 18 Jun 2026 00:09:02 +0000 (08:09 +0800)
committerroot <root@localhost.localdomain>
Thu, 18 Jun 2026 00:09:02 +0000 (08:09 +0800)
frontend/src/components/StudyMode.css
frontend/src/components/StudyMode.js
frontend/src/components/TestMode.css
frontend/src/components/TestMode.js

index af328dd6c8a906d89ad199d3bc73bbc8a1a2888f..5e03a461fdcc939d27444d3e33ed2c01262fe638 100644 (file)
@@ -7,6 +7,19 @@
     padding: 20px;
     background-color: #f0f7ff;
     min-height: 100vh;
+    /* 防止选中单词文本复制作弊 */
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+/* 输入框需要保持可选可编辑 */
+.study-container input {
+    -webkit-user-select: text;
+    -moz-user-select: text;
+    -ms-user-select: text;
+    user-select: text;
 }
 
 .study-card {
index ffc9a14474b8b8f0d49e827e90edfb8029f7d00b..e612ec5c4530628826e3d58eb2025d99c284a890 100644 (file)
@@ -99,8 +99,17 @@ function StudyMode() {
 
     if (!currentWord) return <div className="loading">加载中...</div>;
 
+    // 阻止复制/剪切/粘贴/右键,防止单词被复制后粘贴作弊
+    const blockClipboard = (e) => e.preventDefault();
+
     return (
-        <div className="study-container">
+        <div
+            className="study-container"
+            onCopy={blockClipboard}
+            onCut={blockClipboard}
+            onPaste={blockClipboard}
+            onContextMenu={blockClipboard}
+        >
             <div className="study-card">
                 {/* 只有在非闪记模式下显示图片 */}
                 {phase !== 'flashcard' && (
index 1802b83b38ce85632535904bec47a5d184719830..f1935d52de2d881c13d551397035aa3c8a8c05f1 100644 (file)
@@ -7,6 +7,19 @@
     padding: 20px;
     background-color: #fef9f0;
     min-height: 100vh;
+    /* 防止选中单词文本复制作弊 */
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+/* 输入框需要保持可选可编辑 */
+.test-container input {
+    -webkit-user-select: text;
+    -moz-user-select: text;
+    -ms-user-select: text;
+    user-select: text;
 }
 
 .test-card {
index 74e47416cb73f139372f1f058427a9612cf7b2c9..17de7141c58c15f8ac039e3ce3670f4b98ea3647 100644 (file)
@@ -147,12 +147,21 @@ function TestMode() {
         return () => window.removeEventListener('keydown', handleKeyDown);
     }, [handleKeyDown]);
 
+    // 阻止复制/剪切/粘贴/右键,防止单词被复制后粘贴作弊
+    const blockClipboard = (e) => e.preventDefault();
+
     // 准备阶段
     if (words.length === 0) return <div className="loading">加载中...</div>;
 
     if (phase === 'ready') {
         return (
-            <div className="test-container">
+            <div
+                className="test-container"
+                onCopy={blockClipboard}
+                onCut={blockClipboard}
+                onPaste={blockClipboard}
+                onContextMenu={blockClipboard}
+            >
                 <div className="test-card test-start-card">
                     <h1>单元测试 - Group {groupId}</h1>
                     <p className="test-info">共 {words.length} 个单词</p>
@@ -166,7 +175,13 @@ function TestMode() {
 
     if (phase === 'complete') {
         return (
-            <div className="test-container">
+            <div
+                className="test-container"
+                onCopy={blockClipboard}
+                onCut={blockClipboard}
+                onPaste={blockClipboard}
+                onContextMenu={blockClipboard}
+            >
                 <div className="test-card test-complete-card">
                     <h1>🎉 测试完成!</h1>
                     <p>Group {groupId} 全部通过!</p>
@@ -178,7 +193,13 @@ function TestMode() {
 
     if (phase === 'retest_info') {
         return (
-            <div className="test-container">
+            <div
+                className="test-container"
+                onCopy={blockClipboard}
+                onCut={blockClipboard}
+                onPaste={blockClipboard}
+                onContextMenu={blockClipboard}
+            >
                 <div className="test-card test-retest-card">
                     <h1>📝 开始重考</h1>
                     <p>还有 {wrongQueue.length} 个错题需要重考</p>
@@ -191,7 +212,13 @@ function TestMode() {
     if (!currentWord) return null;
 
     return (
-        <div className="test-container">
+        <div
+            className="test-container"
+            onCopy={blockClipboard}
+            onCut={blockClipboard}
+            onPaste={blockClipboard}
+            onContextMenu={blockClipboard}
+        >
             <div className="test-card">
                 {/* 状态栏 */}
                 <div className="test-header">