Files

1 line
18 KiB
JSON

{"repo": "aatrox97094/test", "files": {"scripts/add_tags_to_nodes.js": {"3a0281da798181765e0591eaed3c7f99ee30454d": {"t": 1785746677.3045356, "n": 7021, "h": "fb013cac5e42f043", "c": "import axios from 'axios';\n\n// 配置\nconst BASE_URL = 'http://localhost:8080';\nconst DEEPSEEK_API_URL = 'https://api.deepseek.com/v1/chat/completions';\nconst DEEPSEEK_API_KEY = 'sk-7ed1dd03305d4045ab66559dead9c8a4';\nconst ADMIN_USERNAME = 'Admin';\nconst ADMIN_PASSWORD = '123456';\n\n// 创建axios实例\nconst api = axios.create({\n baseURL: BASE_URL,\n timeout: 30000,\n});\n\n// 存储用户信息\nlet userId = null;\n\n// 登录函数\nasync function login() {\n try {\n console.log('正在登录admin账户...');\n const response = await api.post(`/user/login?userName=${ADMIN_USERNAME}&userPassword=${ADMIN_PASSWORD}`);\n \n if (response.data && response.data.data && response.data.data.userId) {\n userId = response.data.data.userId;\n console.log(`登录成功!用户ID: ${userId}`);\n return true;\n } else {\n console.error('登录失败:', response.data);\n return false;\n }\n } catch (error) {\n console.error('登录出错:', error.message);\n return false;\n }\n}\n\n// 获取图谱列表\nasync function getGraphList() {\n try {\n console.log('正在获取图谱列表...');\n const response = await api.get(`/api/graph/list?user_id=${userId}`);\n \n if (response.data && response.data.data) {\n const pythonGraph = response.data.data.find(graph => graph.name === 'Python知识图谱');\n if (pythonGraph) {\n console.log(`找到Python知识图谱!图谱ID: ${pythonGraph.graph_id}`);\n return pythonGraph.graph_id;\n } else {\n console.error('未找到Python知识图谱');\n return null;\n }\n } else {\n console.error('获取图谱列表失败:', response.data);\n return null;\n }\n } catch (error) {\n console.error('获取图谱列表出错:', error.message);\n return null;\n }\n}\n\n// 获取图谱中的所有节点\nasync function getGraphNodes(graphId) {\n try {\n console.log('正在获取图谱节点...');\n const response = await api.get(`/api/graph/details?graph_id=${graphId}`);\n \n if (response.data && response.data.data && response.data.data.nodes) {\n console.log(`获取到 ${response.data.data.nodes.length} 个节点`);\n return response.data.data.nodes;\n } else {\n console.error('获取节点失败:', response.data);\n return [];\n }\n } catch (error) {\n console.error('获取节点出错:', error.message);\n return [];\n }\n}\n\n// 获取所有标签\nasync function getAllTags() {\n try {\n const response = await api.get('/article/tags');\n if (response.data && response.data.data) {\n return response.data.data;\n }\n return [];\n } catch (error) {\n console.error('获取标签失败:', error.message);\n return [];\n }\n}\n\n// 创建标签\nasync function createTag(tagName) {\n try {\n const response = await api.post(`/article/tags/create?tagName=${encodeURIComponent(tagName)}`);\n if (response.data && response.data.code === 200) {\n return response.data.data;\n }\n return null;\n } catch (error) {\n console.error(`创建标签失败 (${tagName}):`, error.message);\n return null;\n }\n}\n\n// 为节点添加标签\nasync function addTagToNode(nodeId, tagId) {\n try {\n const response = await api.post(`/api/graph/tag/addToNode`, {\n node_id: nodeId,\n tag_id: tagId\n });\n \n if (response.data && response.data.code === 200) {\n return true;\n } else {\n console.error(`为节点 ${nodeId} 添加标签 ${tagId} 失败:`, response.data);\n return false;\n }\n } catch (error) {\n console.error(`为节点 ${nodeId} 添加标签 ${tagId} 出错:`, error.message);\n return false;\n }\n}\n\n// 使用AI生成标签\nasync function generateTagsForNode(nodeName, nodeDescription) {\n try {\n const prompt = `请为Python编程概念\"${nodeName}\"生成3-5个合适的标签。\n\n节点描述:${nodeDescription ? nodeDescription.substring(0, 500) + '...' : '无描述'}\n\n要求:\n1. 标签应该准确反映节点的内容和技术领域\n2. 标签要简洁明了,适合用于分类和搜索\n3. 必须包含\"Python\"作为基础标签\n4. 其他标签应该涵盖:技术类型(如数据类型、控制流、函数等)、难度级别(如基础、进阶、高级)、应用领域(如Web开发、数据科学、机器学习等)\n5. 只输出标签名称,用逗号分隔,不要其他解释\n\n示例格式:Python, 数据类型, 基础, 编程基础`;\n\n const response = await axios.post(DEEPSEEK_API_URL, {\n model: 'deepseek-chat',\n messages: [\n {\n role: 'system',\n content: '你是一个专业的Python编程专家,擅长为编程概念生成准确、有用的标签。请用中文回答,输出要简洁准确。'\n },\n {\n role: 'user',\n content: prompt\n }\n ],\n temperature: 0.3,\n max_tokens: 200\n }, {\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${DEEPSEEK_API_KEY}`,\n }\n });\n\n if (response.data && response.data.choices && response.data.choices[0]) {\n const content = response.data.choices[0].message.content.trim();\n // 解析标签,去除多余的空格和标点\n const tags = content.split(',').map(tag => tag.trim()).filter(tag => tag.length > 0);\n console.log(` 🤖 AI生成标签: ${tags.join(', ')}`);\n return tags;\n } else {\n throw new Error('API响应格式错误');\n }\n } catch (error) {\n console.error(`AI生成标签失败 (${nodeName}):`, error.message);\n // 返回默认标签\n return ['Python', '编程基础'];\n }\n}\n\n// 主函数\nasync function main() {\n console.log('🏷️ 开始为Python知识图谱节点添加标签...');\n console.log('=====================================');\n \n // 1. 登录\n const loginSuccess = await login();\n if (!loginSuccess) {\n console.error('❌ 登录失败,程序退出');\n return;\n }\n \n // 2. 获取图谱\n const graphId = await getGraphList();\n if (!graphId) {\n console.error('❌ 获取图谱失败,程序退出');\n return;\n }\n \n // 3. 获取节点列表\n const nodes = await getGraphNodes(graphId);\n if (nodes.length === 0) {\n console.error('❌ 未找到节点,程序退出');\n return;\n }\n \n // 4. 获取所有标签\n const allTags = await getAllTags();\n console.log(`获取到 ${allTags.length} 个现有标签`);\n \n // 5. 处理每个节点\n let successCount = 0;\n let failCount = 0;\n \n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n console.log(`\\n[${i + 1}/${nodes.length}] 处理节点: ${node.name} (ID: ${node.node_id})`);\n \n // 检查节点是否已有标签\n if (node.tags && node.tags.length > 0) {\n console.log(` ⏭️ 节点已有 ${node.tags.length} 个标签,跳过`);\n continue;\n }\n \n // 使用AI生成标签\n const tagNames = await generateTagsForNode(node.name, node.description);\n \n let nodeSuccess = true;\n \n for (const tagName of tagNames) {\n // 查找或创建标签\n let tag = allTags.find(t => t.tagName === tagName);\n if (!tag) {\n console.log(` 🔨 创建新标签: ${tagName}`);\n tag = await createTag(tagName);\n if (tag) {\n allTags.push(tag);\n }\n }\n \n if (tag) {\n // 为节点添加标签\n const addSuccess = await addTagToNode(node.node_id, tag.tagId);\n if (addSuccess) {\n console.log(` ✅ 成功添加标签: ${tagName}`);\n } else {\n console.log(` ❌ 添加标签失败: ${tagName}`);\n nodeSuccess = false;\n }\n } else {\n console.log(` ❌ 标签创建失败: ${tagName}`);\n nodeSuccess = false;\n }\n }\n \n if (nodeSuccess) {\n successCount++;\n } else {\n failCount++;\n }\n \n // 添加延迟\n if (i < nodes.length - 1) {\n await new Promise(resolve => setTimeout(resolve, 1000));\n }\n }\n \n console.log('\\n=====================================');\n console.log('🎉 标签添加完成!');\n console.log(`✅ 成功: ${successCount} 个节点`);\n console.log(`❌ 失败: ${failCount} 个节点`);\n console.log(`📊 总计: ${nodes.length} 个节点`);\n}\n\n// 运行主函数\nmain().catch(console.error);\n"}}, "scripts/generate_core_articles.js": {"3a0281da798181765e0591eaed3c7f99ee30454d": {"t": 1785746677.6999836, "n": 7649, "h": "02a4a16c3ab97bd2", "c": "import axios from 'axios';\n\n// 配置\nconst BASE_URL = 'http://localhost:8080';\nconst DEEPSEEK_API_URL = 'https://api.deepseek.com/v1/chat/completions';\nconst DEEPSEEK_API_KEY = 'sk-7ed1dd03305d4045ab66559dead9c8a4';\nconst ADMIN_USERNAME = 'Admin';\nconst ADMIN_PASSWORD = '123456';\n\n// 核心知识点列表(选择最重要的进行文章生成)\nconst CORE_TOPICS = [\n 'Python基础',\n '数据类型',\n '变量',\n '函数',\n '控制流',\n '数据结构',\n '面向对象编程 (OOP)',\n '异常处理',\n '文件I/O',\n '模块与包'\n];\n\n// 创建axios实例\nconst api = axios.create({\n baseURL: BASE_URL,\n timeout: 30000,\n});\n\n// 存储用户信息\nlet userId = null;\n\n// 登录函数\nasync function login() {\n try {\n console.log('正在登录admin账户...');\n const response = await api.post(`/user/login?userName=${ADMIN_USERNAME}&userPassword=${ADMIN_PASSWORD}`);\n \n if (response.data && response.data.data && response.data.data.userId) {\n userId = response.data.data.userId;\n console.log(`登录成功!用户ID: ${userId}`);\n return true;\n } else {\n console.error('登录失败:', response.data);\n return false;\n }\n } catch (error) {\n console.error('登录出错:', error.message);\n return false;\n }\n}\n\n// 获取所有标签\nasync function getAllTags() {\n try {\n const response = await api.get('/article/tags');\n if (response.data && response.data.data) {\n return response.data.data;\n }\n return [];\n } catch (error) {\n console.error('获取标签失败:', error.message);\n return [];\n }\n}\n\n// 创建标签\nasync function createTag(tagName) {\n try {\n const response = await api.post(`/article/tags/create?tagName=${encodeURIComponent(tagName)}`);\n if (response.data && response.data.code === 200) {\n return response.data.data;\n }\n return null;\n } catch (error) {\n console.error(`创建标签失败 (${tagName}):`, error.message);\n return null;\n }\n}\n\n// 使用DeepSeek API生成文章内容\nasync function generateArticleContent(topicName) {\n try {\n const prompt = `请为Python编程概念\"${topicName}\"生成一篇完整的教程文章。\n\n要求:\n1. 使用Markdown格式,输出纯文本\n2. 文章长度控制在2500-3500字\n3. 内容要详细全面,适合初学者到中级学习者\n4. 必须包含以下结构:\n - 文章标题(吸引人且准确)\n - 引言(介绍概念的重要性和应用场景)\n - 基本概念(详细解释)\n - 基本语法和用法\n - 多个代码示例(使用\\`\\`\\`python代码块格式)\n - 实际应用场景和案例\n - 常见错误和注意事项\n - 进阶用法和技巧\n - 练习题和思考题\n - 总结和学习建议\n\n请直接输出完整的Markdown格式文章内容,不要包含任何解释性文字:`;\n\n const response = await axios.post(DEEPSEEK_API_URL, {\n model: 'deepseek-chat',\n messages: [\n {\n role: 'system',\n content: '你是一个专业的Python编程导师和技术写作专家,擅长为不同水平的学习者编写详细、实用的教程文章。请用中文回答,输出要详细且实用,使用Markdown格式。代码示例必须使用```python代码块格式。'\n },\n {\n role: 'user',\n content: prompt\n }\n ],\n temperature: 0.7,\n max_tokens: 4000\n }, {\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${DEEPSEEK_API_KEY}`,\n }\n });\n\n if (response.data && response.data.choices && response.data.choices[0]) {\n return response.data.choices[0].message.content.trim();\n } else {\n throw new Error('API响应格式错误');\n }\n } catch (error) {\n console.error(`生成文章内容失败 (${topicName}):`, error.message);\n return null;\n }\n}\n\n// 创建文章\nasync function createArticle(title, content, tagIds) {\n try {\n const response = await api.post(`/article/create?userId=${userId}`, {\n title: title,\n editorType: 'markdown',\n content: content,\n tags: tagIds\n });\n \n if (response.data && response.data.code === 200) {\n return response.data.data;\n } else {\n console.error(`创建文章失败:`, response.data);\n return null;\n }\n } catch (error) {\n console.error(`创建文章出错:`, error.message);\n return null;\n }\n}\n\n// 处理单个主题生成文章\nasync function processTopicArticle(topicName, index, total) {\n console.log(`\\n[${index + 1}/${total}] 开始为主题生成文章: ${topicName}`);\n \n try {\n // 生成文章内容\n const articleContent = await generateArticleContent(topicName);\n \n if (!articleContent) {\n console.log(`❌ 主题 \"${topicName}\" 文章内容生成失败!`);\n return { success: false, topicName, error: '内容生成失败' };\n }\n \n console.log(`✅ 文章内容生成成功 (${articleContent.length} 字符)`);\n \n // 提取标题(从内容的第一行)\n const lines = articleContent.split('\\n');\n const title = lines[0].replace(/^#\\s*/, '') || `${topicName} - Python编程教程`;\n \n // 获取或创建相关标签\n const allTags = await getAllTags();\n const tagIds = [];\n \n // 为Python相关概念创建标签\n const tagNames = ['Python', '编程教程', '技术文章'];\n \n // 根据主题名称添加特定标签\n if (topicName.includes('基础') || topicName.includes('Python')) {\n tagNames.push('Python基础');\n }\n if (topicName.includes('数据')) {\n tagNames.push('数据类型');\n }\n if (topicName.includes('函数')) {\n tagNames.push('函数');\n }\n if (topicName.includes('面向对象') || topicName.includes('OOP')) {\n tagNames.push('面向对象编程');\n }\n if (topicName.includes('循环') || topicName.includes('控制')) {\n tagNames.push('控制流');\n }\n if (topicName.includes('异常')) {\n tagNames.push('异常处理');\n }\n if (topicName.includes('文件')) {\n tagNames.push('文件操作');\n }\n if (topicName.includes('模块')) {\n tagNames.push('模块与包');\n }\n \n // 处理标签\n for (const tagName of tagNames) {\n let tag = allTags.find(t => t.tagName === tagName);\n if (!tag) {\n console.log(`创建新标签: ${tagName}`);\n tag = await createTag(tagName);\n if (tag) {\n allTags.push(tag);\n }\n }\n if (tag) {\n tagIds.push(tag.tagId);\n }\n }\n \n // 创建文章\n const articleId = await createArticle(title, articleContent, tagIds);\n \n if (articleId) {\n console.log(`✅ 文章 \"${title}\" 创建成功!文章ID: ${articleId}`);\n return { success: true, topicName, articleId, title };\n } else {\n console.log(`❌ 文章 \"${title}\" 创建失败!`);\n return { success: false, topicName, error: '文章创建失败' };\n }\n } catch (error) {\n console.error(`处理主题 \"${topicName}\" 时出错:`, error.message);\n return { success: false, topicName, error: error.message };\n }\n}\n\n// 主函数\nasync function main() {\n console.log('🚀 开始为Python核心知识点生成教程文章...');\n console.log(`📚 将处理 ${CORE_TOPICS.length} 个核心主题`);\n console.log('=====================================');\n \n const startTime = Date.now();\n \n // 1. 登录\n const loginSuccess = await login();\n if (!loginSuccess) {\n console.error('❌ 登录失败,程序退出');\n return;\n }\n \n // 2. 处理每个主题\n const results = [];\n \n for (let i = 0; i < CORE_TOPICS.length; i++) {\n const topicName = CORE_TOPICS[i];\n const result = await processTopicArticle(topicName, i, CORE_TOPICS.length);\n results.push(result);\n \n // 添加延迟避免API请求过快\n if (i < CORE_TOPICS.length - 1) {\n console.log('等待2秒后处理下一个主题...');\n await new Promise(resolve => setTimeout(resolve, 2000));\n }\n }\n \n // 3. 统计结果\n const endTime = Date.now();\n const successCount = results.filter(r => r.success).length;\n const failCount = results.filter(r => !r.success).length;\n const failedTopics = results.filter(r => !r.success);\n const createdArticles = results.filter(r => r.success);\n \n console.log('\\n=====================================');\n console.log('🎉 所有主题处理完成!');\n console.log(`✅ 成功: ${successCount} 个主题`);\n console.log(`❌ 失败: ${failCount} 个主题`);\n console.log(`📊 总计: ${CORE_TOPICS.length} 个主题`);\n console.log(`⏱️ 耗时: ${Math.round((endTime - startTime) / 1000)} 秒`);\n \n if (createdArticles.length > 0) {\n console.log('\\n📝 创建的文章:');\n createdArticles.forEach(article => {\n console.log(` - ${article.title} (主题: ${article.topicName})`);\n });\n }\n \n if (failedTopics.length > 0) {\n console.log('\\n❌ 失败的主题:');\n failedTopics.forEach(topic => {\n console.log(` - ${topic.topicName}: ${topic.error}`);\n });\n }\n \n console.log('\\n✨ 建议检查失败的主题,可能需要手动处理。');\n}\n\n// 运行主函数\nmain().catch(console.error);\n"}}}}