diff --git a/VERSION b/VERSION index c9c156a3..bbd0034c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.7.3 +v2.7.4 diff --git a/docs/init-dev-mac.md b/docs/init-dev-mac.md index 73919d4d..680c20d7 100644 --- a/docs/init-dev-mac.md +++ b/docs/init-dev-mac.md @@ -15,6 +15,7 @@ docker run \ --name=hznuoj \ --restart=always \ -p 8877:80 \ + -p 11434:11434 \ -v /var/hznuoj/data:/var/hznuoj/data \ -v "$PROJECT_DIR/hznuoj/web:/var/www/web" \ hznuoj/hznuoj:latest diff --git a/web/OJ/chat.php b/web/OJ/chat.php new file mode 100644 index 00000000..e457a393 --- /dev/null +++ b/web/OJ/chat.php @@ -0,0 +1,65 @@ + date('Y-m-d H:i:s'), 'content' => '']) . PHP_EOL . PHP_EOL; +flush(); + +$question = urldecode($_GET['q'] ?? ''); +if (empty($question)) { + echo "event: close" . PHP_EOL; + echo "data: Connection closed" . PHP_EOL . PHP_EOL; + flush(); + exit(); +} +$question = str_ireplace('{[$add$]}', '+', $question); + +// api 和 模型选择 +$chat = new OllamaChat( + "http://$DB_HOST:11434/api/generate", + "$AI_MODEL" +); + +$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT']; +$dfa = new DFA([ + 'words_file' => "$DOCUMENT_ROOT/OJ/plugins/code-helper/dict.txt", +]); +$chat->set_dfa($dfa); + + +// 开始提问 +$chat->qa([ + 'system' => '你是HznuOnlineJudge的智能代码助手,只负责和代码相关的问题', + 'question' => $question, +]); diff --git a/web/OJ/class/Class.ChatGPT.php b/web/OJ/class/Class.ChatGPT.php new file mode 100644 index 00000000..91b4b6ea --- /dev/null +++ b/web/OJ/class/Class.ChatGPT.php @@ -0,0 +1,104 @@ +api_url = $url; + $this->model = $model; + } + + public function set_dfa(&$dfa) + { + $this->dfa = $dfa; + if (!empty($this->dfa) && $this->dfa->is_available()) { + $this->check_sensitive = TRUE; + } + } + + public function qa($params) + { + + $this->question = $params['question']; + $this->streamHandler = new StreamHandler([ + 'qmd5' => md5($this->question . '' . time()) + ]); + if ($this->check_sensitive) { + $this->streamHandler->set_dfa($this->dfa); + } + + // 开启检测且提问包含敏感词 + if ($this->check_sensitive && $this->dfa->containsSensitiveWords($this->question)) { + $this->streamHandler->end('您的问题不合适,AI暂时无法回答'); + return; + } + + // 根据Ollama API的要求构建请求正文 + $json = json_encode([ + 'prompt' => $this->question, + 'model' => $this->model, + ]); + + $headers = array( + "Content-Type: application/json", + ); + + $this->ollamaApiCall($json, $headers); + } + + private function buildCurlCommand($json, $headers) + { + $command = "curl"; + + // 添加 URL + $command .= " '" . $this->api_url . "'"; + + // 添加请求头 + foreach ($headers as $header) { + $command .= " -H '" . str_replace("'", "\'", $header) . "'"; + } + + // 添加 POST 数据 + if ($json) { + $command .= " -d '" . str_replace("'", "\'", $json) . "'"; + } + + // 你可以继续添加其他 cURL 选项,如需要 + + return $command; + } + + private function ollamaApiCall($json, $headers) + { // 修改后的方法名 + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $this->api_url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HEADER, false); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 如果不是HTTPS请求,可以注释或删除此行 + // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 如果不是HTTPS请求,可以注释或删除此行 + curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $json); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + + curl_setopt($ch, CURLOPT_WRITEFUNCTION, [$this->streamHandler, 'callback']); + + // $curlCommand = $this->buildCurlCommand($json, $headers); + // echo $curlCommand . PHP_EOL; + + $response = curl_exec($ch); + + if (curl_errno($ch)) { + file_put_contents('./log/curl.error.log', curl_error($ch) . PHP_EOL . PHP_EOL, FILE_APPEND); + } + + curl_close($ch); + } +} diff --git a/web/OJ/class/Class.DFA.php b/web/OJ/class/Class.DFA.php new file mode 100644 index 00000000..706224a7 --- /dev/null +++ b/web/OJ/class/Class.DFA.php @@ -0,0 +1,127 @@ + +words_file = $params['words_file'] ?? ''; + + $this->root = new DFA_Node(); + + $this->load_words_file(); + } + + private function load_words_file(){ + if(!file_exists($this->words_file)){ + echo "words file not found: $this->words_file\n"; + return; + } + $lines = file($this->words_file); + foreach ($lines as $line) { + $words = preg_split('/\s+/', trim($line)); + foreach ($words as $word) { + $word = trim($word); + if (empty($word)) { + continue; + } + $this->words_count += 1; + $this->addWord($word); + } + } + } + + public function is_available(){ + return $this->words_count>0; + } + + public function addWord($word) + { + $node = $this->root; + for ($i = 0; $i < strlen($word); $i++) { + $char = $word[$i]; + if (!isset($node->children[$char])) { + $node->children[$char] = new DFA_Node(); + } + $node = $node->children[$char]; + } + $node->isEndOfWord = true; + } + + public function replaceWords($text) + { + $result = ''; + $length = strlen($text); + for ($i = 0; $i < $length;) { + $node = $this->root; + $j = $i; + $lastMatched = -1; + while ($j < $length && isset($node->children[$text[$j]])) { + $node = $node->children[$text[$j]]; + if ($node->isEndOfWord) { + $lastMatched = $j; + } + $j++; + } + + if ($lastMatched >= 0) { + $result .= '\*\*\*'; + $i = $lastMatched + 1; + } else { + $result .= $text[$i]; + $i++; + } + } + return $result; + } + + public function containsSensitiveWords($text) + { + $length = strlen($text); + for ($i = 0; $i < $length;) { + $node = $this->root; + $j = $i; + while ($j < $length && isset($node->children[$text[$j]])) { + $node = $node->children[$text[$j]]; + if ($node->isEndOfWord) { + return true; + } + $j++; + } + $i++; + } + return false; + } +} + +class DFA_Node +{ + public $isEndOfWord; + public $children; + + public function __construct() + { + $this->isEndOfWord = false; + $this->children = []; + } +} + + + +/* +$inputText = "需要检测的句子"; +$isContain = $dfa->containsSensitiveWords($inputText); + +echo "Original Text: \n" . $inputText . "\n"; +echo "isContain: " . json_encode($isContain) . "\n"; + + +$outputText = $dfa->replaceWords($inputText); + +echo "Original Text: \n" . $inputText . "\n"; +echo "Replaced Text: \n" . $outputText . "\n"; +*/ diff --git a/web/OJ/class/Class.StreamHandler.php b/web/OJ/class/Class.StreamHandler.php new file mode 100644 index 00000000..b096b88e --- /dev/null +++ b/web/OJ/class/Class.StreamHandler.php @@ -0,0 +1,140 @@ +data_buffer = ''; + $this->counter = 0; + $this->qmd5 = $params['qmd5'] ?? time(); + $this->chars = []; + $this->punctuation = [',', '。', ';', '?', '!', '……']; + } + + public function set_dfa(&$dfa) + { + $this->dfa = $dfa; + if (!empty($this->dfa) && $this->dfa->is_available()) { + $this->check_sensitive = TRUE; + } + } + + public function callback($ch, $data) + { + $this->counter += 1; + file_put_contents('./log/data.' . $this->qmd5 . '.log', $this->counter . '==' . $data . PHP_EOL . '--------------------' . PHP_EOL, FILE_APPEND); + + echo $data; + + $result = json_decode($data, TRUE); + + // if (is_array($result)) { + // $this->end('openai 请求错误:' . json_encode($result)); + // return strlen($data); + // } + + // 0、把上次缓冲区内数据拼接上本次的data + $buffer = $this->data_buffer . "\n" . $data; + $this->data_buffer = ''; + + $lines = explode("\n", $buffer); + $lines = array_filter($lines, function ($line) { + return trim($line) !== ''; + }); + + foreach ($lines as $li => $line) { + // $this->data_buffer = $buffer; + + $line_data = json_decode($line, TRUE); + + if ($line_data['done'] == true) { + //数据传输结束 + $this->data_buffer = ''; + $this->counter = 0; + $this->sensitive_check(); + $this->end(); + break; + } + + $this->sensitive_check($line_data['response']); + } + + return strlen($data); + } + + private function sensitive_check($content = NULL) + { + // 如果不检测敏感词,则直接返回给前端 + if (!$this->check_sensitive) { + $this->write($content); + return; + } + //每个 content 都检测是否包含换行或者停顿符号,如有,则成为一个新行 + if (!$this->has_pause($content)) { + $this->chars[] = $content; + return; + } + $this->chars[] = $content; + $content = implode('', $this->chars); + if ($this->dfa->containsSensitiveWords($content)) { + $content = $this->dfa->replaceWords($content); + $this->write($content); + } else { + foreach ($this->chars as $char) { + $this->write($char); + } + } + $this->chars = []; + } + + private function has_pause($content) + { + if ($content == NULL) { + return TRUE; + } + $has_p = false; + if (is_numeric(strripos(json_encode($content), '\n'))) { + $has_p = true; + } else { + foreach ($this->punctuation as $p) { + if (is_numeric(strripos($content, $p))) { + $has_p = true; + break; + } + } + } + return $has_p; + } + + private function write($content = NULL, $flush = TRUE) + { + if ($content != NULL) { + echo 'data: ' . json_encode(['time' => date('Y-m-d H:i:s'), 'content' => $content], JSON_UNESCAPED_UNICODE) . PHP_EOL . PHP_EOL; + } + + if ($flush) { + flush(); + } + } + + public function end($content = NULL) + { + if (!empty($content)) { + $this->write($content, FALSE); + } + + echo 'retry: 86400000' . PHP_EOL; + echo 'event: close' . PHP_EOL; + echo 'data: Connection closed' . PHP_EOL . PHP_EOL; + flush(); + } +} diff --git a/web/OJ/plugins/code-helper/chat.js b/web/OJ/plugins/code-helper/chat.js new file mode 100644 index 00000000..7bef6cda --- /dev/null +++ b/web/OJ/plugins/code-helper/chat.js @@ -0,0 +1,255 @@ +const msgDiv = document.getElementById('chat-messages'); +const input = document.getElementById('chat-input'); +const chatButton = document.getElementById('chat-btn'); +let eventSource = null; +let qaIdx = 0, answers = {}, answerContent = '', answerWords = []; +let codeStart = false, inlineCodeStart = false, lastWord = '', lastLastWord = ''; +let typingTimer = null, typing = false, typingIdx = 0, contentIdx = 0, contentEnd = false; +let isStop = false; + +const md = markdownit({ + html: true, // 不仅会解析普通文本,同样解析 HTML 标签 + highlight: function (str, lang) { + if (lang && hljs.getLanguage(lang)) { + try { + return '
' +
+                    hljs.highlight(lang, str, true).value +
+                    '
'; + } catch (__) { console.error(__); } + } + return '
' + md.utils.escapeHtml(str) + '
'; + } +}).use(markdownitIncrementalDOM); + +// 节流函数 +function throttle(func, delay) { + let lastCall = new Date().getTime(); + return function (...args) { + const now = new Date().getTime(); + if (now - lastCall < delay) { + return; + } + lastCall = now; + return func.apply(this, args); + }; +} + +// 设置节流延迟(例如200毫秒) +const throttledScrollToBottom = throttle((isBottom) => { + if (isBottom) { + msgDiv.scrollTop = msgDiv.scrollHeight; + } +}, 49); + +function patchMd(node, content) { + IncrementalDOM.patch( + node, + md.renderToIncrementalDOM(content) + ); + // console.log(content); + // Token 流 + // console.log(md.parse(content)); +} + +swapToSend(); + +function swapToStop() { + // TODO:切换时的动画、闲置时动画 + isStop = false; + chatButton.classList.remove('am-icon-paper-plane'); + chatButton.classList.add('am-icon-stop'); + chatButton.onclick = sendStop; +} + +function swapToSend() { + isStop = true; + chatButton.classList.add('am-icon-paper-plane'); + chatButton.classList.remove('am-icon-stop'); + chatButton.onclick = sendMessage; +} + +//在输入时和获取焦点后自动调整输入框高度 +input.addEventListener('input', adjustInputHeight); +input.addEventListener('keydown', (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + sendMessage(); + } +}) + +// 自动调整输入框高度 +function adjustInputHeight() { + input.style.height = 'auto'; // 将高度重置为 auto + input.style.height = (input.scrollHeight) + 'px'; +} + +function sendMessage() { + const inputValue = input.value; + if (!inputValue) { + return; + } + if (inputValue.length > 1000) { + alert('输入内容过长,请控制在1000字以内'); + input.value = ''; + return; + } + + const question = document.createElement('div'); + question.setAttribute('class', 'message question'); + question.setAttribute('id', 'question-' + qaIdx); + patchMd(question, inputValue); + msgDiv.appendChild(question); + + const answer = document.createElement('div'); + answer.setAttribute('class', 'message answer'); + answer.setAttribute('id', 'answer-' + qaIdx); + patchMd(answer, 'AI思考中……'); + msgDiv.appendChild(answer); + + answers[qaIdx] = document.getElementById('answer-' + qaIdx); + + input.value = ''; + input.disabled = true; + chatButton.disabled = true; + adjustInputHeight(); + throttledScrollToBottom(true); + + // 每 50ms 轮询一次,打印答案数组 + typingTimer = setInterval(typingWords, 50); + + swapToStop(); + getAnswer(inputValue); +} + +function sendStop() { + isStop = true; + swapToSend(); +} + +function getAnswer(inputValue) { + isStop = false; + inputValue = encodeURIComponent(inputValue.replace(/\+/g, '{[$add$]}')); + const url = "./chat.php?q=" + inputValue; + eventSource = new EventSource(url); + + let connectionTimeout = null; + + eventSource.addEventListener("open", (event) => { + clearTimeout(connectionTimeout); + isStop = false; + connectionTimeout = setTimeout(() => { + console.error("连接超时"); + isStop = true; + eventSource.close(); + }, 20000); + console.log("连接已建立", JSON.stringify(event)); + }); + + eventSource.addEventListener("message", (event) => { + try { + // 获取服务端推送的数据,并放到答案数组中(待打印) + let result = JSON.parse(event.data); + if (result.time && result.content) { + answerWords.push(result.content); + contentIdx += 1; + } + } catch (error) { + console.log(error); + } + }); + + eventSource.addEventListener("error", (event) => { + console.error("发生错误:", JSON.stringify(event)); + isStop = true; + }); + + eventSource.addEventListener("close", (event) => { + console.log("连接已关闭", JSON.stringify(event.data)); + eventSource.close(); + contentEnd = true; + clearTimeout(connectionTimeout); + connectionTimeout = null; + console.log((new Date().getTime()), 'answer end'); + }); +} + +function typingWords() { + if (contentEnd && contentIdx == typingIdx || isStop) { + isStop = false; + clearInterval(typingTimer); + answerContent = ''; + answerWords = []; + answers = []; + qaIdx += 1; + typingIdx = 0; + contentIdx = 0; + contentEnd = false; + lastWord = ''; + lastLastWord = ''; + input.disabled = false; + chatButton.disabled = false; + eventSource && eventSource.close(); + eventSource = null; + codeStart = false; + swapToSend(); + console.log((new Date().getTime()), 'typing end'); + return; + } + // 如果输出完成或者正在输出,typing->锁 + if (contentIdx <= typingIdx || typing) { + return; + } + typing = true; + + if (!answers[qaIdx]) { + answers[qaIdx] = document.getElementById('answer-' + qaIdx); + } + + // 输出代码块的时候,在未输出完时需要判断是否需要补齐,需要补上末尾的代码块结束符 + const content = answerWords[typingIdx]; + if (content.indexOf('`') != -1) { + if (content.indexOf('```') != -1) { + codeStart = !codeStart; + } else if (content.indexOf('``') != -1 && (lastWord + content).indexOf('```') != -1) { + codeStart = !codeStart; + } else if (content.indexOf('`') != -1 && (lastLastWord + lastWord + content).indexOf('```') != -1) { + codeStart = !codeStart; + } + } + + let isCodeTag = content === '```' || content === '``' || content === '`'; + + if (codeStart || inlineCodeStart || isCodeTag) { + // console.log(codeStart, inlineCodeStart, isCodeTag); + answerContent += content; + } else { + let parts = content.split(/(\r?\n)/g); + // 遍历分割后的数组,处理每个部分 + parts.forEach((part, index) => { + if (part === '\n' || part === '\r\n' || part.indexOf('`') != -1) { + // 如果是换行符,直接添加到answerContent中 + answerContent += part; + } else { + // 如果不是换行符,用span包裹后添加到answerContent中 + if (part.trim().length > 0) { + answerContent += `${part}`; + } + } + }); + } + + patchMd(answers[qaIdx], answerContent + (codeStart ? '\n\n```' : '')); + + if (content.indexOf('`') != -1 && (lastWord + content).indexOf('``') === -1) { + inlineCodeStart = !inlineCodeStart; + } + lastLastWord = lastWord; + lastWord = content; + // TODO:代码段中字符出现的淡入动画 + + let isBottom = ((msgDiv.scrollHeight - msgDiv.clientHeight) - msgDiv.scrollTop) < 50; + // console.log((msgDiv.scrollHeight - msgDiv.clientHeight) - msgDiv.scrollTop); + throttledScrollToBottom(isBottom); + + typingIdx += 1; + typing = false; +} diff --git a/web/OJ/plugins/code-helper/dict.txt b/web/OJ/plugins/code-helper/dict.txt new file mode 100644 index 00000000..205b76ca --- /dev/null +++ b/web/OJ/plugins/code-helper/dict.txt @@ -0,0 +1,1910 @@ +政治 习近平 +政治 习仲勋 +政治 贺国强 +政治 贺子珍 +政治 周永康 +政治 李德生 +政治 王岐山 +政治 姚依林 +政治 回良玉 +政治 李源潮 +政治 李干成 +政治 戴秉国 +政治 黄镇 +政治 刘延东 +政治 刘瑞龙 +政治 俞正声 +政治 黄敬 +政治 薄熙来 +政治 薄一波 +政治 周小川 +政治 周建南 +政治 温云松 +政治 徐明 +政治 江绵康 +政治 李小鹏 +政治 李小琳 +政治 朱云来 +政治 二代身份证 +政治 文化大革命 +政治 胡海峰 +政治 六四 +政治 陈良宇 +政治 老丁 +政治 莱仕德事件 +政治 地下的先烈们 +政治 大纪元 +政治 新唐人 +色情 淫靡 +色情 迷昏药 +色情 迷魂药 +社会 窃听器 +赌博 六合彩 +暴恐 买卖枪支 +暴恐 三唑仑 +暴恐 麻醉药 +暴恐 麻醉乙醚 +社会 短信群发器 +政治 帝国之梦 +政治 毛一鲜 +政治 黎阳平 +政治 对日强硬 +暴恐 出售枪支 +毒品 摇头丸 +政治 西藏天葬 +政治 军长发威 +社会 PK黑社会 +其他 枪决女犯 +暴恐 投毒杀人 +政治 强硬发言 +社会 出售假币 +社会 监听王 +暴恐 昏药 +社会 侦探设备 +暴恐 麻醉钢枪 +反动 反华 +社会 官商勾结 +社会 升达毕业证 +社会 手机复制 +其他 戴海静 +暴恐 自杀指南 +暴恐 自杀手册 +其他 张小平 +暴恐 佳静安定片 +暴恐 蒙汗药粉 +暴恐 古方迷香 +暴恐 强效失意药 +暴恐 迷奸药 +社会 透视眼镜 +社会 远程偷拍 +暴恐 自制手枪 +色情 激情小电影 +色情 黄色小电影 +其他 天鹅之旅 +其他 盘古乐队 +反动 高校暴乱 +反动 高校群体事件 +反动 大学骚乱 +反动 高校骚乱 +色情 催情药 +暴恐 拍肩神药 +色情 春药 +社会 身份证生成器 +其他 枪决现场 +暴恐 出售手枪 +暴恐 麻醉枪 +社会 办理证件 +社会 办理文凭 +其他 高干子弟 +其他 高干子女 +暴恐 枪支弹药 +暴恐 血腥图片 +反动 反政府 +色情 禁书 +其他 特码 +色情 成人 +政治 国民党 +政治 贪污 +色情 骚妇 +暴恐 法论功 +色情 江湖淫娘 +色情 骆冰淫传 +色情 夫妇乐园 +色情 阿里布达年代记 +色情 爱神之传奇 +色情 不良少女日记 +色情 沧澜曲 +色情 创世之子猎艳之旅 +色情 东北风情熟女之惑 +色情 风骚侍女 +色情 海盗的悠闲生活 +色情 黑天使 +色情 黑星女侠 +色情 混蛋神风流史 +色情 狡猾的风水相师 +色情 俪影蝎心 +色情 秦青的幸福生活 +色情 四海龙女 +色情 逃亡艳旅 +色情 性启蒙 +色情 现代艳帝传奇 +色情 星光伴我淫 +色情 倚天屠龙别记 +色情 淫术炼金士 +色情 十景缎 +色情 往事追忆录 +色情 舌战法庭 +色情 少妇白洁 +色情 风月大陆 +色情 风尘劫 +色情 美少妇的哀羞 +色情 阿兵哥言语录 +色情 遥想当年春衫薄 +色情 王子淫传 +色情 神雕外传之郭襄 +色情 睡着的武神 +色情 少年阿宾 +色情 毛主席复活 +色情 蒙汗药 +色情 粗口歌 +色情 激情电影 +色情 AV +色情 十八禁 +色情 性虐待 +色情 激情 +色情 耽美 +色情 金瓶梅 +色情 藏春阁 +色情 玉蒲团 +社会 隐形喷剂 +社会 反雷达测速 +社会 假币 +社会 代开发票 +社会 假钞 +社会 窃听 +社会 电话拦截系统 +社会 探测狗 +社会 手机卡复制器 +社会 手机跟踪定位器 +社会 监听器 +社会 针孔摄像 +社会 监听宝 +暴恐 迷幻药 +社会 手拍肩 +暴恐 迷魂香 +社会 麻古 +反动 政治风波 +反动 政府软弱 +反动 政府无能 +政治 九评 +政治 十七大代表 +社会 办证 +社会 暴力拆迁 +社会 轮暴致死 +社会 人民报 +社会 暴力镇压 +社会 高干子弟名单 +色情 性免费电影 +色情 全裸 +色情 偷 拍 +政治 中共十七大 +其他 徐和柴学友 +其他 修炼之歌 +其他 警察殴打 +其他 新诗年鉴 +其他 李沛瑶遇害 +其他 美国凯德 +其他 肥东交警 +政治 中央军委 +政治 针对台湾 +其他 梁保华 +其他 MC军团 +其他 旧民运 +其他 伪民运 +其他 采花堂 +其他 中国劳工通讯 +政治 评中国共产党 +社会 建立生活性补贴 +反动 中共走狗 +反动 中共小丑 +反动 共奴 +反动 中共恶霸 +反动 共产无赖 +反动 右派 +反动 流氓政府 +暴恐 原子弹制作简明教程 +反动 绝食抗议 +政治 北戴河会议 +政治 邓二世 +反动 内斗退党 +反动 退团 +反动 江理论 +赌博 香港六合彩 +反动 A集中营 +反动 退党 +其他 法新闻社 +其他 欧洲圆明网 +反动 亚太正悟网 +其他 大法新闻社 +其他 白宫事件 +其他 日本大使馆0R409游行 +其他 反日万人游行 +反动 六四屠杀 +反动 六四屠城 +反动 六四政变 +反动 六四之役 +其他 27军长砸洗浴中心 +反动 中共邪教 +其他 调查真相委员会 +其他 追查国际 +反动 中共暴行 +暴恐 大法洪传 +暴恐 弘法体 +暴恐 大法之声 +反动 江独裁 +反动 李屠夫 +反动 江恶人 +反动 中共特务 +暴恐 乙醚 +反动 党内分裂 +其他 新生网 +其他 圆明网 +暴恐 和平修炼 +暴恐 放下生死 +暴恐 大法大福 +暴恐 大硞弟子 +暴恐 支联会 +反动 共产专制 +反动 共产极权 +反动 专政机器 +反动 共产王朝 +反动 毛派 +反动 邓派 +暴恐 五套功法 +暴恐 宇宙最高法理 +暴恐 法正人间 +暴恐 法正乾坤 +暴恐 正法时期 +暴恐 海外护法 +暴恐 洪发交流 +其他 报禁 +其他 党禁 +其他 鹰派 +反动 赣江学院暴动 +反动 全国退党 +反动 绝食抗暴 +反动 维权抗暴 +暴恐 活体器官 +反动 中共暴政 +社会 器官移植 +政治 中共当局 +政治 胡温政府 +其他 江罗集团 +暴恐 师傅法身 +反动 正派民运 +反动 中华联邦政府 +政治 亲共行动 +反动 联邦政府 +反动 流氓民运 +反动 特务民运 +政治 中共警察 +政治 中共监狱 +政治 中共政权 +政治 中共迫害 +政治 自由联邦 +反动 中共独枭 +反动 流氓无产者 +反动 中共专制 +暴恐 明慧周刊 +政治 九评共产党 +政治 江泽民其人 +政治 秘密文件 +政治 机密文件 +政治 红头文件 +政治 政府文件 +社会 破网软件 +社会 无界浏览 +反动 亲共来源 +色情 黄色小说 +色情 台湾18DY电影 +色情 H动漫 +色情 tmd +色情 nnd +色情 包娃衣 +色情 禁播 +色情 H漫画 +色情 丁度巴拉斯 +色情 大禁 +色情 买春堂 +政治 苏东解体 +政治 反右题材 +色情 隐私图片 +社会 卫星接收器 +社会 卫星电视 +社会 信号拦截器 +其他 新闻通气会 +其他 山西洪洞 +社会 巨额骗储 +色情 五奶小青 +色情 红楼绮梦 +色情 阿里布达年代 +色情 不良少少日记 +色情 狂风暴雨 +色情 梦中的女孩 +暴恐 首先使用核武器 +暴恐 汽车爆炸案 +其他 香港GHB水 +其他 色空寺 +其他 周容重 +其他 朱蒙 +暴恐 汕頭頻傳擄童割器官 +暴恐 法輪功 +其他 六决不 +其他 清华网管 +其他 道县公安 +其他 济南建设路 +赌博 老虎机 +赌博 轮盘机 +赌博 百家乐 +赌博 连线机 +赌博 模拟机 +赌博 彩票机 +赌博 礼品机 +其他 卢跃刚 +色情 天浴 +社会 一卡多号 +其他 最淫官员 +社会 偷电 +社会 盗电 +反动 中国人都在上的四大当 +反动 痛批政法委 +社会 山西黑砖窑 +社会 黑窑奴役 +其他 杨元元 +其他 敢坐飞机吗 +其他 韩国身份证 +其他 台湾身份证 +政治 广电总局 +反动 学生暴动 +反动 镇压学生 +其他 广安第二人民医院 +其他 胡新宇 +其他 趙紫陽 +暴恐 自由亚州 +暴恐 明慧 +社会 践踏中国女性 +暴恐 拉凳 +其他 南京大学法学院 +社会 挥发型迷药 +暴恐 喷雾型迷药 +其他 金伯帆 +其他 崔英杰 +暴恐 火药制作 +其他 江氏 +其他 第十六次代表 +其他 仁寿警方 +其他 愈快乐愈堕落 +其他 上海交警 +其他 淫间道 +其他 唐人电视台 +色情 嫩穴 +色情 金鳞岂是池中物 +色情 江山美人志 +赌博 六合采 +其他 民警当副院长 +社会 股市民谣 +色情 禁断少女 +其他 卫星遭黑客攻击 +暴恐 萬人暴 +反动 官逼民反 +其他 中原油田 +其他 张大权 +其他 油田总部 +色情 枪淫少妇 +其他 博白县 +暴恐 動乱 +暴恐 军火价格 +其他 女死囚 +其他 劉奇葆 +暴恐 法lun功 +色情 女友坊 +赌博 香港马会 +色情 白小姐 +其他 曾道人 +其他 一码中特 +其他 自由门 +色情 艳照门 +社会 奴役童工 +色情 性奴 +社会 计生风暴 +反动 厦门大游行 +其他 想不到的黑幕 +暴恐 死亡笔记 +色情 二奶 +色情 2奶 +社会 纪股票市场五卅惨案 +其他 这年头就这样 +社会 代开普通发票 +社会 代开商品发票 +社会 代开国税发票 +社会 代开地税发票 +社会 代开广告发票 +社会 代开运输发票 +社会 代开租赁发票 +社会 代开维修发票 +社会 代开建筑发票 +社会 代开安装发票 +社会 代开餐饮发票 +社会 代开服务发票 +其他 毛爷爷复活 +其他 智能H3 +其他 智能H3 +其他 赣江学院 +其他 江西田园置业集团 +其他 海乐神 +其他 酣乐欣 +色情 高莺莺 +暴恐 完全自杀手册 +其他 无界 +其他 广东王 +其他 口头检查 +其他 三句硬话 +其他 红海湾 +其他 升达 +其他 沈阳公安 +社会 拦截器 +社会 民为法执 +其他 尾行 +其他 电车之狼 +其他 绕过封锁 +暴恐 本拉登 +社会 汕尾事件 +其他 公务员工资 +其他 公务员调资 +色情 鸡吧 +其他 公务员的工资 +反动 反中游行 +反动 支持台湾 +其他 中国军用运输机 +其他 科技精英遇难 +其他 湘阴杨林 +其他 杨林寨 +其他 湘阴县杨林 +其他 死刑枪毙 +社会 马加爵 +其他 死刑过程 +其他 学生与警察 +其他 鬼村 +其他 周容 +其他 重题工 +其他 先烈的电电 +社会 身份证生成 +社会 短信猫 +其他 车牌反光 +其他 次下跪 +社会 求救遭拒 +反动 邪恶的党 +社会 出售迷药 +社会 针孔摄像机 +政治 日本小泉 +政治 小泉恶搞 +政治 温家堡 +政治 蒋彦永 +暴恐 灭绝罪 +其他 大揭露 +其他 突破封锁 +政治 多党执政 +社会 生成身份证 +政治 华国锋 +政治 叶剑英 +政治 陈云 +政治 李先念 +政治 汪东兴 +政治 韦国清 +政治 乌兰夫 +政治 方毅 +政治 刘伯承 +政治 许世友 +政治 纪登奎 +政治 苏振华 +政治 吴德 +政治 余秋里 +政治 张廷发 +政治 陈永贵 +政治 陈锡联 +政治 耿飚 +政治 聂荣臻 +政治 倪志福 +政治 徐向前 +政治 彭冲 +政治 王震 +政治 邓颖超 +政治 杨尚昆 +政治 杨得志 +政治 宋任穷 +政治 胡乔木 +政治 胡耀邦 +政治 彭真 +政治 廖承志 +政治 秦基伟 +政治 陈慕华 +政治 田纪云 +政治 李铁映 +政治 李锡铭 +政治 杨汝岱 +政治 吴学谦 +政治 胡启立 +政治 芮杏文 +政治 杨白冰 +政治 邹家华 +政治 谢非 +政治 谭绍文 +政治 王汉斌 +政治 任建新 +政治 于永波 +政治 傅全有 +政治 吴仪 +政治 王克 +政治 王乐泉 +政治 王兆国 +政治 刘淇 +政治 刘云山 +政治 张立昌 +政治 张德江 +政治 王刚 +社会 隐形耳机 +社会 隐形摄像头 +色情 裸聊 +社会 代考 +社会 英语枪手 +社会 仿真枪 +社会 考试作弊器 +社会 开锁器 +色情 淫秽 +社会 定位器 +社会 上分器 +社会 干扰器 +社会 退币王 +毒品 k粉 +社会 诈骗信息 +暴恐 销售枪支 +暴恐 爆炸物品 +色情 性器官 +色情 风骚小阿姨 +色情 非常诱惑 +色情 风月宝鉴之冥府春色 +色情 风流一夜情 +色情 飞凤春宵 +色情 风情万种野玫瑰 +色情 夫妻作爱 +色情 夫妻做爱 +色情 三级片 +色情 应召女郎 +色情 性生活 +色情 香醇的诱惑 +色情 处男 +色情 性爱 +暴恐 奸杀 +暴恐 血溅红灯区 +色情 雪肌夜叉 +色情 血恋 +色情 现代靓妹仔 +色情 新七擒七纵七色狼 +色情 骚b +色情 三级图片 +色情 淫乱 +色情 a级情片 +色情 淫乱秘史 +色情 艳丽片 +色情 香港伦理片 +色情 淫色漫画 +色情 淫片 +色情 叫春 +色情 中国性搜网 +色情 性息 +色情 淫虫 +色情 艳舞女郎 +色情 禁宮秘史 +色情 少女换衣 +色情 偷欢 +色情 18dy +政治 保钓 +其他 鲍戈 +其他 鲍彤 +反动 暴乱 +反动 暴政 +政治 北韩 +反动 藏独 +政治 曹长青 +政治 曹刚川 +政治 柴玲 +政治 常劲 +政治 陈炳基 +政治 陈军 +政治 陈蒙 +政治 陈破空 +政治 陈希同 +政治 陈小同 +政治 陈宣良 +政治 陈一谘 +政治 陈总统 +政治 程铁军 +政治 程真 +政治 迟浩田 +政治 持不同政见 +反动 赤匪 +反动 赤化 +反动 达赖 +反动 大参考 +暴恐 大法 +暴恐 大纪园 +暴恐 大家论坛 +暴恐 大史记 +暴恐 大史纪 +其他 戴相龙 +其他 弹劾 +政治 登辉 +政治 邓笑贫 +政治 迪里夏提 +暴恐 地下教会 +暴恐 地下刊物 +其他 电视流氓 +政治 钓鱼岛 +其他 丁关根 +其他 丁元 +其他 丁子霖 +反动 东北独立 +反动 东社 +反动 东土耳其斯坦 +反动 东西南北论坛 +反动 动乱 +反动 独裁 +反动 独裁政治 +反动 独夫 +反动 独立台湾会 +反动 屙民 +暴恐 发轮 +暴恐 发正念 +暴恐 法愣 +暴恐 法抡 +暴恐 法仑 +暴恐 法伦 +暴恐 法轮 +暴恐 法论 +反动 反封锁技术 +反动 反腐败论坛 +反动 反共 +暴恐 李洪志 +暴恐 法轮功 +政治 江泽民 +政治 毛泽东 +政治 邓小平 +政治 胡锦涛 +反动 推翻 +反动 打倒 +反动 台独 +暴恐 李红痔 +暴恐 李宏志 +暴恐 真善忍 +暴恐 炼功 +政治 李总统 +政治 李登辉 +政治 李鹏 +政治 李瑞环 +其他 吐血 +色情 18禁 +色情 少儿不宜 +色情 女优 +色情 脱光 +色情 咪咪 +色情 兽欲 +色情 奶子 +色情 酥胸 +色情 处女 +色情 迷药 +色情 强迫 +色情 色情 +色情 三級 +色情 三级 +色情 A片 +色情 喷精 +色情 偷窥 +色情 被虐 +色情 黄色 +色情 被迫 +色情 被逼 +色情 强暴 +色情 口技 +色情 破处 +色情 精液 +色情 幼交 +色情 狂干 +色情 兽交 +色情 群交 +色情 阴部 +色情 幼幼 +色情 女優 +色情 强歼 +色情 乱交 +色情 色友 +色情 婊子 +色情 蒲团 +色情 喷尿 +色情 凌辱 +色情 暴干 +色情 阴唇 +色情 插插 +色情 坐交 +色情 学生妹 +色情 无毛 +色情 猛插 +色情 慰安妇 +色情 露点 +色情 露毛 +色情 行房 +色情 自慰 +色情 吹萧 +色情 色狼 +色情 胸罩 +色情 内裤 +色情 底裤 +色情 私处 +色情 爽死 +色情 变态 +色情 妹疼 +色情 妹痛 +色情 弟疼 +色情 弟痛 +色情 姐疼 +色情 姐痛 +色情 哥疼 +色情 哥痛 +色情 同房 +色情 打炮 +色情 造爱 +色情 作爱 +色情 做爱 +色情 鸡巴 +色情 阴茎 +色情 阳具 +色情 开苞 +色情 肛门 +色情 阴道 +色情 阴蒂 +色情 肉棍 +色情 肉棒 +色情 肉洞 +色情 荡妇 +色情 阴囊 +色情 睾丸 +色情 捅你 +色情 捅我 +色情 插我 +色情 插你 +色情 插她 +色情 插他 +色情 干你 +色情 干她 +色情 干他 +色情 射精 +色情 口交 +色情 屁眼 +色情 阴户 +色情 阴门 +色情 下体 +色情 龟头 +色情 阴毛 +色情 波霸 +色情 偷情 +色情 叫床 +色情 上床 +色情 亚热 +色情 援交 +色情 走光 +色情 情色 +色情 肉欲 +色情 美腿 +色情 自摸 +色情 捆绑 +色情 丝袜 +色情 潮吹 +色情 肛交 +色情 群射 +色情 内射 +色情 臭作 +色情 薄格 +色情 調教 +色情 乱伦 +色情 偷拍 +色情 更衣 +色情 無修正 +色情 虐待 +色情 尿尿 +色情 喷水 +色情 小泽玛莉亚 +色情 武腾兰 +色情 武藤兰 +色情 饭岛爱 +色情 小泽圆 +色情 長瀨愛 +色情 川島和津實 +色情 粉嫩的小沟 +色情 小澤園 +色情 飯島愛 +色情 星崎未來 +色情 及川奈央 +色情 朝河蘭 +色情 夕樹舞子 +色情 大澤惠 +色情 金澤文子 +色情 三浦愛佳 +色情 伊東 +色情 武藤蘭 +色情 叶子楣 +色情 舒淇 +色情 麻衣 +色情 櫻井 +色情 風花 +色情 星野桃 +色情 宝来 +色情 桜田 +色情 藤井彩 +色情 小森美王 +色情 平井 +色情 桃井望 +色情 榊彩弥 +色情 桜井 +色情 中条美華 +色情 大久保玲 +色情 青木友梨 +色情 深田涼子 +色情 愛内萌 +色情 姫島瑠璃香 +色情 長瀬愛 +色情 中野千夏 +色情 春菜 +色情 望月 +色情 岡崎美女 +色情 宮下杏奈 +色情 加藤 +色情 日野美沙 +色情 北島優 +色情 一本道 +色情 夜勤病栋 +政治 三个代表 +政治 一党 +政治 多党 +政治 民主 +政治 专政 +色情 避孕套 +其他 你妈逼 +色情 大鸡巴 +政治 政治 +暴恐 洪志 +暴恐 红志 +暴恐 洪智 +暴恐 红智 +反动 民运 +其他 王丹 +色情 卖春 +色情 买春 +政治 朱容基 +政治 朱镕基 +政治 温家宝 +政治 李长春 +政治 魏京生 +反动 台湾独立 +反动 西藏独立 +反动 疆独 +反动 新疆独立 +其他 大盖帽 +其他 黑社会 +其他 夜总会 +其他 妈个 +其他 公款 +其他 坐台 +其他 腐败 +其他 城管 +反动 暴动 +其他 李远哲 +其他 司法警官 +其他 高干 +政治 尉健行 +政治 李岚清 +政治 黄丽满 +政治 于幼军 +其他 文字狱 +政治 宋祖英 +暴恐 自焚 +其他 猫肉 +其他 吸储 +政治 张五常 +政治 张丕林 +社会 空难 +政治 吴邦国 +政治 曾庆红 +政治 黄菊 +政治 罗干 +政治 吴官正 +政治 贾庆林 +政治 专制 +政治 三個代表 +政治 一黨 +政治 多黨 +政治 專政 +暴恐 大紀元 +暴恐 紅志 +暴恐 紅智 +政治 李鵬 +政治 江澤民 +政治 朱鎔基 +政治 李長春 +政治 李瑞環 +政治 胡錦濤 +政治 貓肉 +政治 吸儲 +政治 張五常 +政治 張丕林 +政治 溫家寶 +政治 吳邦國 +政治 曾慶紅 +政治 黃菊 +政治 賈慶林 +政治 專制 +暴恐 反人类 +暴恐 反社会 +其他 方励之 +其他 方舟子 +其他 斐得勒 +其他 费良勇 +其他 分家在 +反动 分裂 +反动 粉饰太平 +反动 风雨神州 +反动 风雨神州论坛 +其他 封从德 +其他 冯东海 +其他 冯素英 +其他 佛展千手法 +其他 付申奇 +其他 傅申奇 +其他 傅志寰 +政治 高官 +其他 高文谦 +其他 高薪养廉 +其他 高瞻 +其他 高自联 +其他 戈扬 +其他 鸽派 +其他 个人崇拜 +其他 工自联 +政治 共产 +政治 共党 +反动 共匪 +反动 共狗 +反动 共军 +其他 关卓中 +其他 贯通两极法 +其他 广闻 +政治 郭伯雄 +政治 郭罗基 +政治 郭平 +政治 郭岩华 +政治 国家安全 +政治 国家机密 +反动 国军 +其他 国贼 +其他 韩东方 +其他 韩联潮 +其他 何德普 +其他 河殇 +色情 红灯区 +暴恐 红色恐怖 +暴恐 宏法 +暴恐 洪传 +暴恐 洪吟 +暴恐 洪哲胜 +政治 胡紧掏 +政治 胡锦滔 +政治 胡锦淘 +政治 胡景涛 +政治 胡平 +政治 胡总书记 +暴恐 护法 +其他 华建敏 +其他 华通时事论坛 +其他 华夏文摘 +其他 华语世界论坛 +其他 华岳时事论坛 +其他 黄慈萍 +其他 黄祸 +反动 回民暴动 +其他 悔过书 +其他 鸡毛信文汇 +其他 姬胜德 +其他 积克馆 +其他 基督 +其他 贾廷安 +其他 贾育台 +其他 建国党 +其他 江core +其他 江八点 +其他 江流氓 +其他 江罗 +其他 江绵恒 +政治 江青 +政治 江戏子 +政治 江则民 +政治 江泽慧 +政治 江贼 +政治 江贼民 +政治 江折民 +政治 江猪 +政治 江主席 +政治 姜春云 +政治 将则民 +政治 僵贼 +政治 僵贼民 +其他 教养院 +其他 揭批书 +其他 金尧如 +政治 锦涛 +其他 禁看 +暴恐 经文 +其他 开放杂志 +其他 抗议 +政治 邝锦文 +政治 劳动教养所 +政治 劳改 +政治 劳教 +政治 老江 +政治 老毛 +政治 黎安友 +政治 李洪宽 +政治 李继耐 +政治 李兰菊 +政治 李录 +政治 李禄 +政治 李少民 +政治 李淑娴 +政治 李旺阳 +政治 李文斌 +政治 李月月鸟 +政治 李志绥 +政治 连胜德 +政治 廉政大论坛 +政治 梁光烈 +政治 梁擎墩 +政治 两岸关系 +政治 两岸三地论坛 +反动 两个中国 +政治 廖锡龙 +政治 林保华 +政治 林长盛 +政治 林樵清 +政治 林慎立 +政治 凌锋 +政治 刘宾深 +政治 刘宾雁 +政治 刘刚 +政治 刘国凯 +政治 刘华清 +政治 刘俊国 +政治 刘凯中 +政治 刘千石 +政治 刘青 +政治 刘山青 +政治 刘士贤 +政治 刘文胜 +政治 刘晓波 +政治 刘晓竹 +政治 刘永川 +政治 龙虎豹 +政治 陆委会 +政治 吕京花 +政治 吕秀莲 +暴恐 抡功 +暴恐 轮大 +政治 罗礼诗 +政治 马大维 +政治 马良骏 +政治 马三家 +政治 马时敏 +政治 卖国 +政治 毛厕洞 +政治 毛贼东 +其他 美国参考 +其他 美国之音 +政治 蒙独 +政治 蒙古独立 +其他 密穴 +其他 绵恒 +政治 民国 +政治 民进党 +政治 民联 +政治 民意 +政治 民意论坛 +政治 民阵 +政治 民猪 +政治 民主墙 +政治 民族矛盾 +政治 莫伟强 +其他 木犀地 +反动 木子论坛 +反动 南大自由论坛 +社会 闹事 +政治 倪育贤 +政治 潘国平 +政治 泡沫经济 +政治 迫害 +政治 祁建 +政治 齐墨 +政治 钱达 +政治 钱国梁 +政治 钱其琛 +其他 抢粮记 +其他 乔石 +反动 亲美 +其他 钦本立 +其他 情妇 +政治 庆红 +暴恐 热比娅 +暴恐 热站政论网 +反动 人民内情真相 +反动 人民真实 +反动 人民之声论坛 +政治 人权 +其他 善恶有报 +反动 上海帮 +其他 邵家健 +暴恐 神通加持法 +其他 沈彤 +其他 升天 +其他 盛华仁 +其他 盛雪 +其他 石戈 +其他 时代论坛 +其他 时事论坛 +其他 世界经济导报 +其他 事实独立 +其他 双十节 +政治 水扁 +其他 税力 +其他 司马晋 +其他 司马璐 +其他 司徒华 +其他 斯诺 +反动 四川独立 +其他 宋平 +其他 宋书元 +其他 苏绍智 +其他 苏晓康 +反动 台盟 +反动 台湾狗 +反动 台湾建国运动组织 +反动 台湾青年独立联盟 +反动 台湾政论区 +反动 台湾自由联盟 +政治 太子党 +其他 汤光中 +其他 唐柏桥 +其他 唐捷 +其他 滕文生 +暴恐 天怒 +暴恐 天葬 +其他 童屹 +反动 统独 +反动 统独论坛 +反动 统战 +暴恐 屠杀 +政治 外交与方略 +政治 万润南 +政治 万晓东 +政治 汪岷 +政治 王宝森 +政治 王炳章 +政治 王策 +政治 王超华 +政治 王辅臣 +政治 王涵万 +政治 王沪宁 +政治 王军涛 +政治 王力雄 +政治 王瑞林 +政治 王润生 +政治 王若望 +政治 王希哲 +政治 王秀丽 +政治 王冶坪 +其他 网特 +政治 魏新生 +政治 温元凯 +政治 文革 +政治 吴百益 +政治 吴方城 +政治 吴弘达 +政治 吴宏达 +政治 吴仁华 +政治 吴学灿 +政治 吴学璨 +政治 吾尔开希 +其他 五不 +其他 伍凡 +其他 洗脑 +政治 项怀诚 +政治 项小吉 +政治 肖强 +政治 邪恶 +政治 谢长廷 +政治 谢选骏 +政治 谢中之 +政治 辛灏年 +社会 新观察论坛 +社会 新华内情 +社会 新闻封锁 +社会 新语丝 +社会 信用危机 +政治 邢铮 +政治 熊炎 +政治 熊焱 +政治 徐邦秦 +政治 徐才厚 +政治 徐匡迪 +政治 徐水良 +政治 许家屯 +政治 薛伟 +反动 学潮 +反动 学联 +反动 学运 +反动 学自联 +其他 雪山狮子 +政治 严家其 +政治 严家祺 +政治 阎明复 +政治 颜射 +政治 央视内部晚会 +政治 杨怀安 +政治 杨建利 +政治 杨巍 +政治 杨月清 +政治 杨周 +政治 姚月谦 +政治 一中一台 +其他 异见人士 +其他 异议人士 +其他 易丹轩 +其他 易志熹 +其他 尹庆民 +其他 由喜贵 +反动 游行 +其他 幼齿 +政治 于大海 +政治 于浩成 +政治 余英时 +反动 舆论反制 +其他 宇明网 +政治 远志明 +政治 岳武 +政治 则民 +政治 择民 +政治 泽民 +政治 贼民 +政治 曾培炎 +政治 张伯笠 +政治 张钢 +政治 张宏堡 +政治 张健 +政治 张林 +政治 张万年 +政治 张伟国 +政治 张昭富 +政治 张志清 +政治 赵海青 +政治 赵南 +政治 赵品潞 +政治 赵晓微 +政治 赵紫阳 +政治 哲民 +反动 镇压 +其他 争鸣论坛 +其他 正见网 +其他 郑义 +其他 正义党论坛 +色情 换妻 +色情 真木加美 +色情 超爽 +色情 毛片 +色情 打手枪 +色情 欲望 +色情 脚交 +色情 伦理 +色情 艳星 +色情 三陪 +色情 绝色 +色情 床上功夫 +色情 強暴 +色情 陈冠希 +色情 艳照 +色情 喷射 +色情 铃木麻奈美 +色情 星崎未来 +色情 东京热 +色情 菅野亚梨沙 +色情 吉岡美穗 +色情 红音 +色情 原千寻 +色情 熟女 +色情 轮奸 +政治 朱毛 +政治 朱溶剂 +政治 猪聋畸 +政治 猪毛 +政治 猪毛1 +反动 天安门录影带 +反动 天安门事件 +反动 天安门屠杀 +反动 天安门一代 +反动 自民党 +反动 自由民主论坛 +社会 走私 +色情 淫穴 +色情 幼女 +社会 舆论 +暴恐 fa轮 +反动 亲日 +反动 汉奸 +政治 政权 +政治 政治反对派 +政治 政治犯 +反动 支那 +政治 指点江山论坛 +政治 中俄边界 +政治 中功 +政治 中共 +反动 中国威胁论 +反动 中国问题论坛 +反动 中国之春 +反动 中国猪 +其他 中华讲清 +政治 中华民国 +其他 钟山风雨论坛 +政治 江ze民 +政治 周锋锁 +政治 周天法 +政治 陈水扁 +政治 周旋 +政治 朱嘉明 +政治 阿扁 +其他 二逼 +色情 小鸡鸡 +色情 卖逼 +其他 二B +色情 强奸 +色情 卖比 +色情 日死你 +色情 狗卵子 +色情 我操你 +色情 狗b +暴恐 法功 +色情 群奸 +色情 狗操 +色情 猪操 +色情 干死你 +色情 发骚 +色情 贱人 +色情 骚货 +色情 狗娘 +其他 反封锁 +色情 烂逼 +色情 包皮 +色情 烂比 +色情 狗屎 +色情 妓女 +反动 回民暴 +色情 招妓 +色情 牛逼 +色情 鸡八 +色情 牛比 +色情 操你 +色情 十八摸 +色情 傻B +色情 我操 +色情 阴水 +其他 傻逼 +暴恐 氵去车仑工力 +其他 操蛋 +色情 喷你 +色情 操逼 +色情 淫水 +色情 他妈 +色情 操比 +色情 杂种 +其他 他母亲 +其他 哈批 +其他 靠你妈 +其他 你妈 +色情 大逼 +其他 操你妈 +其他 你娘 +色情 大比 +色情 妈批 +色情 蒙古独 +色情 你爸 +色情 大b +反动 四川独 +其他 逼样 +反动 台湾独 +色情 性交 +色情 精子 +色情 龟公 +色情 乳房 +色情 贱逼 +色情 性欲 +反动 西藏独 +其他 贱比 +其他 你妈的 +反动 新疆独 +其他 干你娘 +其他 他妈的 +其他 我日 +其他 去你妈的 +其他 B样 +色情 日你 +色情 阝月 +色情 奸淫 +色情 上访 +色情 淫荡 +色情 操他 +色情 瞒报 +色情 大花逼 +色情 烂货 +其他 失密 +政治 共产党 +色情 破鞋 +色情 贱货 +色情 被盗 +色情 舔奶 +色情 成人书库 +色情 淫图 +色情 交媾 +色情 护士 +色情 大片 +色情 夫妻 +色情 流血 +色情 小穴 +色情 少妇 +政治 北京当局 +反动 北京之春 +其他 北美自由论坛 +其他 博讯 +政治 蔡崇国 +政治 程凯 +反动 大纪元新闻网 +社会 大众真人真事 +反动 东南西北论谈 +社会 封杀 +政治 何勇 +政治 江猪媳 +政治 酱猪媳 +暴恐 枪支 +毒品 毒品 +其他 王八 +毒品 麻黄草 +毒品 兴奋剂 +毒品 mdma +毒品 海洛因 +毒品 海luo因 +毒品 heroin +毒品 diamorphine +毒品 diacetylmorphine +毒品 鸦片 +毒品 阿芙蓉 +毒品 咖啡因 +毒品 cocain +毒品 三唑仑 +毒品 美沙酮 +毒品 麻古 +毒品 k粉 +毒品 凯他敏 +毒品 ketamine +毒品 冰毒 +毒品 cannabis +毒品 大麻 +毒品 爱他死 +毒品 氯胺酮 +毒品 benzodiazepines +毒品 甲基安非他明 +毒品 安非他命 +毒品 吗啡 +毒品 鸦片 +毒品 阿芙蓉 +毒品 咖啡因 +毒品 cocain +毒品 三唑仑 +毒品 美沙酮 +毒品 麻古 +毒品 k粉 +毒品 凯他敏 +毒品 ketamine +毒品 冰毒 +毒品 cannabis +毒品 大麻 +毒品 爱他死 +毒品 氯胺酮 +毒品 benzodiazepines +毒品 甲基安非他明 +毒品 安非他命 +毒品 吗啡 +毒品 大麻树脂 +毒品 大麻油 +毒品 冰毒 +毒品 冰火毒 +毒品 海洛因 +毒品 嗑药 +毒品 麻古 +毒品 罂粟壳 +毒品 罂粟籽 +赌博 6合彩 +赌博 百家乐 +赌博 变牌 +赌博 变牌绝 +赌博 彩宝 +赌博 彩票 +赌博 彩票选号机 +赌博 彩票预测 +赌博 赌博机 +赌博 赌恒指 +赌博 赌具 +赌博 赌球 +赌博 赌球网 +赌博 发牌绝 +赌博 感扑克 +赌博 六HE彩 +赌博 现金投注 +社会 办理本科 +社会 办理各种 +社会 办理票据 +社会 办理文凭 +社会 办理真实 +社会 办理证件 +社会 办理证书 +社会 办理资格 +社会 办文凭 +社会 办怔 +社会 办证 +社会 半刺刀 +社会 辦毕业 +社会 辦證 +社会 帮人怀孕 +社会 代您考 +社会 代讨债 +社会 代写毕 +社会 代写论文 +社会 代孕 +社会 代追债 +社会 考后付款 +社会 考机构 +社会 考考邓 +社会 考联盟 +社会 考前答案 +社会 考前付 +社会 考前密卷 +社会 考前预测 +社会 考试,答案 +社会 考试,作弊器 +社会 考试包过 +社会 考试保 +社会 考试答案 +社会 考试机构 +社会 考试联盟 +社会 考试枪 +社会 考试作弊 +社会 考试作弊器 +社会 考研考中 +社会 考中答案 +赌博 足球投注 +赌博 地下钱庄 +社会 透视镜 +社会 透视扑 +社会 透视器 +社会 透视眼睛 +社会 透视眼镜 +社会 透视药 +社会 透视仪 +社会 黑手党 +社会 黑车 +社会 联通贵宾卡 +社会 联总 +社会 联总这声传单 +社会 联总之声传单 +社会 高息贷款 +社会 高干子弟 +社会 恭喜你的号码 +社会 恭喜您的号码 +社会 跟帖器 +社会 跟踪器 +社会 号屏蔽器 +社会 孔摄像 +社会 预测答案 +暴恐 弓单 +暴恐 火乍 +暴恐 木仓 +暴恐 石肖 +暴恐 核蛋 +暴恐 步qiang +暴恐 bao炸 +暴恐 爆zha +暴恐 baozha +暴恐 zha药 +暴恐 zha弹 +暴恐 炸dan +暴恐 炸yao +暴恐 zhadan +暴恐 zhayao +暴恐 三硝基甲苯 +暴恐 六氟化铀 +暴恐 炸药配方 +暴恐 弹药配方 +暴恐 炸弹配方 +暴恐 皮箱炸弹 +暴恐 火药配方 +暴恐 塔利班 +暴恐 基地组织 +暴恐 恐怖分子 +暴恐 恐怖份子 +暴恐 东突厥斯坦解放组织 +暴恐 东突解放组织 +暴恐 达赖 +暴恐 赖达 +暴恐 dalai +暴恐 哒赖 +暴恐 dl喇嘛 +暴恐 丹增嘉措 +暴恐 打砸抢 +暴恐 藏暴乱 +暴恐 圣战组织 +暴恐 麻果丸 +暴恐 麻将透 +暴恐 麻醉弹 +暴恐 麻醉狗 +暴恐 麻醉枪 +暴恐 麻醉槍 +暴恐 麻醉药 +暴恐 麻醉藥 +暴恐 福音会 +暴恐 中国教徒 +暴恐 砍杀幼 +暴恐 砍伤儿 +暴恐 昆仑女神功 +暴恐 拉登说 +暴恐 雷管 +暴恐 李大轮子 +暴恐 李红痔 +暴恐 李洪X +暴恐 李洪志 +暴恐 麻醉乙醚 +暴恐 门徒会 +暴恐 蒙汗药 +暴恐 蒙汗药粉 +暴恐 末世劫难 +暴恐 末世论 +暴恐 杀害学生 +暴恐 杀指南 +暴恐 现大地震 +暴恐 下法轮 +暴恐 发轮 +暴恐 发伦 +暴恐 发伦功 +暴恐 发仑 +暴恐 发沦 +暴恐 发纶 +暴恐 发论 +暴恐 发论功 +暴恐 发论公 +暴恐 发正念 +暴恐 发囵 +暴恐 发愣 +暴恐 发瞟 +暴恐 罚抡 +暴恐 罚伦 +暴恐 罚仑 +暴恐 罚沦 +暴恐 罚纶 +暴恐 罚囵 +暴恐 筏抡 +暴恐 筏轮 +暴恐 筏伦 +暴恐 筏仑 +暴恐 筏沦 +暴恐 筏纶 +暴恐 筏论 +暴恐 筏囵 +暴恐 伐抡 +暴恐 伐轮 +暴恐 伐伦 +暴恐 伐仑 +暴恐 伐沦 +暴恐 伐论 +暴恐 伐囵 +暴恐 乏抡 +暴恐 乏轮 +暴恐 乏伦 +暴恐 乏仑 +暴恐 乏沦 +暴恐 乏纶 +暴恐 乏论 +暴恐 乏囵 +暴恐 阀抡 +暴恐 阀伦 +暴恐 阀仑 +暴恐 阀沦 +暴恐 阀纶 +暴恐 阀论 +暴恐 阀囵 +暴恐 法 轮 功 +暴恐 法*功 +暴恐 法.轮.功 +暴恐 法L功 +暴恐 法lun功 +暴恐 法功 +暴恐 法会 +暴恐 法抡 +暴恐 法抡功 +暴恐 法轮 +暴恐 法轮大法 +暴恐 法轮佛法 +暴恐 法轮功 +暴恐 法伦 +暴恐 法仑 +暴恐 法沦 +暴恐 法纶 +暴恐 法论 +暴恐 法十轮十功 +暴恐 法西斯 +暴恐 法院 +暴恐 法正 +暴恐 法谪 +暴恐 法谪功 +暴恐 法輪 +暴恐 法囵 +暴恐 法愣 +暴恐 珐.輪功 +暴恐 珐抡 +暴恐 珐轮 +暴恐 珐伦 +暴恐 珐仑 +暴恐 珐沦 +暴恐 五套功法 +暴恐 荭志 +暴恐 闳志 +暴恐 氵去 +暴恐 氵去车仑工力 +暴恐 转法轮 +暴恐 砝抡 +暴恐 砝轮 +暴恐 砝伦 +暴恐 砝仑 +暴恐 砝沦 +暴恐 砝纶 +暴恐 真、善、忍 +暴恐 真理教 +暴恐 真善美 +暴恐 真善忍 +暴恐 砝论 +暴恐 砝囵 +暴恐 泓志 +暴恐 屙民 +暴恐 珐纶 +暴恐 珐论 +暴恐 珐囵 +暴恐 falun +暴恐 Falundafa +暴恐 fa轮 +暴恐 Flg +暴恐 地下教会 +暴恐 炼功 +暴恐 梦网洪志 +暴恐 轮大 +暴恐 抡功 +暴恐 轮功 +暴恐 伦功 +暴恐 摩门教 +暴恐 三水法轮 +暴恐 车臣 +暴恐 达赖 +暴恐 功法 +暴恐 讲法 +暴恐 法车仑 +暴恐 三去车仑 +暴恐 氵去车仑 +暴恐 发论工 +暴恐 法x功 +暴恐 法o功 +暴恐 法0功 +暴恐 法一轮一功 +暴恐 轮子功 +暴恐 车仑工力 +其他 6-4tianwang +其他 89-64cdjp +其他 ADMIN +其他 Administrator +其他 asshole +其他 BLOWJOB +其他 chinaliberal +其他 chinamz +其他 chinesenewsnet +其他 Clockgemstone +其他 creaders +其他 Crestbone +其他 dajiyuan +其他 dfdz +其他 DICK +暴恐 falun +暴恐 falundafa +其他 Feelmistone +其他 freechina +其他 freenet +其他 fuck +其他 gcd +其他 Gruepin +其他 Guichuideng +其他 HACKING +其他 hongzhi +其他 hrichina +其他 HUANET +其他 hypermart.net +其他 incest +其他 jiangdongriji +其他 jiaochuang +其他 jiaochun +其他 KEFU +其他 KISSMYASS +其他 lihongzhi +其他 minghui +其他 minghuinews +其他 nacb +其他 Neckromancer +其他 NMIS +其他 PAPER64 +其他 penis +其他 qiangjian +其他 renminbao +其他 renmingbao +其他 SHIT +其他 SUCKPENIS +其他 taip +其他 tibetalk +其他 triangle +其他 triangleboy +其他 Tringel +其他 UltraSurf +其他 ustibet +其他 voachinese +其他 wangce +其他 WEBZEN +其他 wstaiji +其他 xinsheng +其他 YUMING +其他 zangdu +其他 ZHENGJIAN +其他 ZHENGJIANWANG +其他 ZHENSHANREN +其他 zhuanfalun +暴恐 一氧化汞 +暴恐 乙酰替硫脲 +暴恐 乙酰亚砷酸铜 +暴恐 异硫氰酸烯丙酯 +暴恐 异氰酸苯酯 +暴恐 异氰酸甲酯 +暴恐 因毒磷 +暴恐 因毒硫磷 +暴恐 银氰化钾 +暴恐 用手枪 +暴恐 炸弹教 +暴恐 炸弹遥控 +暴恐 炸广州 +暴恐 炸立交 +暴恐 炸药的制 +暴恐 炸药配 +暴恐 炸药制 +暴恐 作硝化甘 \ No newline at end of file diff --git a/web/OJ/plugins/code-helper/index.css b/web/OJ/plugins/code-helper/index.css new file mode 100644 index 00000000..c468bba4 --- /dev/null +++ b/web/OJ/plugins/code-helper/index.css @@ -0,0 +1,197 @@ +.floating-ball { + position: fixed; + bottom: 2vw; + right: 2vw; + width: 60px; + height: 60px; + border-radius: 50%; + background-color: #0078d4; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + display: flex; + align-items: center; + justify-content: center; + color: #fff; + font-size: 24px; + cursor: pointer; + z-index: 1000; + opacity: 1; + animation: zoom-in 0.4s ease-in-out; +} + +.floating-ball:hover { + background-color: #005a9e; +} + +.chat-box { + position: fixed; + bottom: 2vw; + right: 2vw; + width: 30vw; + height: 35vw; + border-radius: 10px; + background-color: #fff; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + display: none; + flex-direction: column; + line-height: 30px; + z-index: 1000; + animation: zoom-out 0.4s ease-in-out; +} + +.chat-box.zoom-in { + display: flex; + animation: zoom-in 0.4s ease-in-out; +} + +.chat-box.zoom-out { + animation: zoom-out 0.4s ease-in-out; +} + +@keyframes zoom-in { + 0% { + transform: scale(0); + opacity: 0; + transform-origin: bottom right; + } + + 100% { + transform: scale(1); + opacity: 1; + transform-origin: bottom right; + } +} + +@keyframes zoom-out { + 0% { + transform: scale(1); + opacity: 1; + transform-origin: bottom right; + } + + 100% { + transform: scale(0); + opacity: 0; + transform-origin: bottom right; + } +} + +.chat-box-header { + padding: 10px; + background-color: #0078d4; + color: #fff; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + display: flex; + + .title { + padding-left: 10px; + } + + .close-btn { + margin-left: auto; + padding: 0 10px; + cursor: pointer; + } +} + +.chat-box-body { + display: flex; + flex-direction: column; + height: 70vh; + max-width: 900px; + flex-grow: 1; + padding: 10px; + overflow-y: auto; + background-color: #f3f6fc; + border-radius: 0 0 10px 10px; +} + +.messages-container { + flex: 1; + overflow-y: auto; + padding: 10px; + padding-top: 20px; +} + +.message { + width: 100%; + padding: 10px 20px; + border: solid 1px #c3c6cb; + box-sizing: border-box; + background-color: white; +} + +.message.question { + border-radius: 10px 10px 0 0; + margin: 0 !important; + background-color: #f3f6fc; + + p { + margin: 0; + } +} + +.message.answer { + margin-top: -1px; + margin-bottom: 20px; + border-radius: 0 0 10px 10px; + + p { + margin: 0; + } +} + +.message pre { + width: 100%; + padding: 10px; + background-color: #23241f; + border-radius: 6px; + color: #f2f2e3; + box-sizing: border-box; + overflow-x: auto; +} + +.input-area { + display: flex; + align-items: flex-end; + padding: 5px; + border-radius: 15px; + background-color: #ffffff; +} + +.chat-input { + background-color: #ffffff; + flex: 1; + padding: 5px; + border: none; + outline: none; + max-height: 8vw; + overflow-y: auto; + resize: none; +} + +.chat-btn { + margin-left: 10px; + padding: 5px 10px; + font-size: 20px; + color: rgb(5, 140, 203); + cursor: pointer; + transition: all 0.3s ease; +} + +.chat-btn:hover { + color: rgb(78, 170, 232); +} + +.fade-in { + animation: fade-in 0.5s ease; +} + +@keyframes fade-in { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} diff --git a/web/OJ/plugins/code-helper/index.js b/web/OJ/plugins/code-helper/index.js new file mode 100644 index 00000000..7e313742 --- /dev/null +++ b/web/OJ/plugins/code-helper/index.js @@ -0,0 +1,76 @@ +class FloatingChatBox { + constructor() { + // 动态引入CSS文件 + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.href = '/OJ/plugins/code-helper/index.css'; + document.head.appendChild(link); + + // 创建悬浮球 + this.floatingBall = document.createElement('div'); + this.floatingBall.classList.add('floating-ball'); + this.floatingBall.innerHTML = ''; + + // 创建聊天框 + this.chatBox = document.createElement('div'); + this.chatBox.classList.add('chat-box'); + this.chatBox.innerHTML = ` +
+ Code Helper + x +
+
+
+
+
+ + +
+
+ `; + + // 为关闭按钮添加事件监听器 + const closeBtn = this.chatBox.querySelector('.close-btn'); + closeBtn.addEventListener('click', () => { + this.chatBox.classList.remove('zoom-in'); + this.chatBox.classList.add('zoom-out'); + setTimeout(() => { + this.chatBox.style.display = 'none'; + this.floatingBall.style.display = 'flex'; + this.floatingBall.classList.remove('zoom-out'); + this.floatingBall.classList.add('zoom-in'); + }, 390); // 动画持续时间 + }); + + // 悬浮球点击事件 + this.floatingBall.addEventListener('click', () => { + if (this.chatBox.style.display === 'none' || this.chatBox.style.display === '') { + this.chatBox.style.display = 'flex'; + this.chatBox.classList.remove('zoom-out'); + this.chatBox.classList.add('zoom-in'); + this.floatingBall.classList.remove('zoom-in'); + this.floatingBall.classList.add('zoom-out'); + setTimeout(() => { + this.floatingBall.style.display = 'none'; + }, 390); // 动画持续时间 + } + }); + } + + // 将组件添加到页面 + add() { + document.body.appendChild(this.floatingBall); + document.body.appendChild(this.chatBox); + let script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = '/OJ/plugins/code-helper/chat.js'; + document.body.appendChild(script); + } + + // 从页面移除组件 + remove() { + document.body.removeChild(this.floatingBall); + document.body.removeChild(this.chatBox); + } +} diff --git a/web/OJ/template/hznu/index.php b/web/OJ/template/hznu/index.php index a85a5b15..3b68d597 100644 --- a/web/OJ/template/hznu/index.php +++ b/web/OJ/template/hznu/index.php @@ -114,6 +114,19 @@ submission_chart.showLoading(); + + + + + + +