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 = `
+
+
+ `;
+
+ // 为关闭按钮添加事件监听器
+ 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();
+
+
+
+
+
+
+