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' && (
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>
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>
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>
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">