From d4558fbacb6480302f8255765ae35489bb1f904e Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sun, 9 Aug 2026 01:50:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(doc):=20Document=20=E7=B3=BB=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E9=87=8D=E8=AE=BE=E8=AE=A1=EF=BC=88=E5=8F=AF=E7=A9=BA?= =?UTF-8?q?=E7=B3=BB=E5=88=97=20UUID=20+=20DocFormat=20=E5=8F=8C=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=EF=BC=89=E4=B8=8E=20doc=20=E5=AD=90=E5=9F=9F=E5=8A=A8?= =?UTF-8?q?=E6=80=81=20API=EF=BC=8C=E5=88=A0=E9=99=A4=E6=97=A7=E9=9D=99?= =?UTF-8?q?=E6=80=81=E9=98=85=E8=AF=BB=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GVSite | 2 +- TempLate/Document/assets/img/doc.png | Bin 95517 -> 0 bytes TempLate/Document/index.html | 659 ------------------ TempLate/Document/lib/script.js | 622 ----------------- TempLate/Document/template.html | 297 -------- TempLate/GERP/index.html | 14 +- TempLate/index.html | 4 +- gvsds/apps/core/views.py | 90 ++- gvsds/apps/doc/manager.py | 38 +- .../apps/doc/migrations/0002_doc_redesign.py | 34 + gvsds/apps/doc/migrations/0003_doc_format.py | 20 + gvsds/apps/doc/models.py | 22 +- gvsds/apps/doc/serializers.py | 14 +- gvsds/apps/doc/views.py | 10 +- gvsds/apps/gerp/serializers.py | 12 +- gvsds/apps/gerp/views/doc.py | 39 +- 16 files changed, 234 insertions(+), 1643 deletions(-) delete mode 100644 TempLate/Document/assets/img/doc.png delete mode 100644 TempLate/Document/index.html delete mode 100644 TempLate/Document/lib/script.js delete mode 100644 TempLate/Document/template.html create mode 100644 gvsds/apps/doc/migrations/0002_doc_redesign.py create mode 100644 gvsds/apps/doc/migrations/0003_doc_format.py diff --git a/GVSite b/GVSite index 6b7d14c6..2c50a807 160000 --- a/GVSite +++ b/GVSite @@ -1 +1 @@ -Subproject commit 6b7d14c6143949ed358e144851675a46ab4d5dac +Subproject commit 2c50a8070b42f106e25d8ee542f3123bc912bb35 diff --git a/TempLate/Document/assets/img/doc.png b/TempLate/Document/assets/img/doc.png deleted file mode 100644 index 73b00b0c05e806571c28015e44f2ee7985a3b8cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95517 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 diff --git a/TempLate/Document/index.html b/TempLate/Document/index.html deleted file mode 100644 index 8f28ef72..00000000 --- a/TempLate/Document/index.html +++ /dev/null @@ -1,659 +0,0 @@ - - - - - - 平滑阅读 - - - - - - - - - - - -
- -
-
-
-

发现知识的乐趣

-

doc.gvsds.com 提供高质量的技术文档、教程和资源,帮助你平滑阅读和学习。

-

用户可以在 manage.gvsds.com 自由上传文档,因此,请识别链接来源并遵守相关法律法规。同时我们也会做好审核工作

- -
- -
-
- - -
-
-

探索分类

-
- - -
- - -
-
-

精选文档

-
- -
- -
-
- Python高级编程技巧 -
- 编程开发 -
-
-
-
- 2025-06-15 - • - 10 分钟阅读 -
-

Python高级编程技巧与最佳实践

-

探索Python高级编程技巧,包括装饰器、生成器、元类和异步编程。了解如何编写更简洁、高效和可维护的Python代码...

-
-
- 作者头像 - 张教授 -
-
- - -
-
-
-
- - -
-
- 数据库性能优化 -
- 数据库 -
-
-
-
- 2025-06-10 - • - 15 分钟阅读 -
-

MySQL数据库性能优化实战指南

-

深入了解MySQL数据库性能优化的核心原则和实践方法。从查询优化、索引设计到配置调优,全面提升数据库性能...

-
-
- 作者头像 - 李工程师 -
-
- - -
-
-
-
- - -
-
- 前端框架对比 -
- 前端开发 -
-
-
-
- 2025-06-05 - • - 20 分钟阅读 -
-

2025年前端框架全面对比:React、Vue、Angular

-

详细对比三大主流前端框架的优缺点、适用场景和性能表现。从生态系统、学习曲线到实际项目应用,助你做出最佳选择...

-
-
- 作者头像 - 王架构师 -
-
- - -
-
-
-
-
-
- - -
-
-
-

享受平滑阅读体验

-

我们专注于打造舒适的阅读环境,让你可以更专注于内容本身。支持多种阅读模式和自定义选项,满足你的个性化需求。

- -
-
-
- -
-
-

护眼模式

-

多种背景色和字体设置,减轻眼睛疲劳,长时间阅读也舒适。

-
-
- -
-
- -
-
-

智能排版

-

自动优化文章排版,段落间距适中,字体大小合适,提升阅读体验。

-
-
- -
-
- -
-
-

Markdown 阅读

-

支持 Markdown 格式文档,实现流程图、公式、代码的查看。

-
-
-
-
- -
-
-
-
- -
-
-
-
-
-
-
-
Python装饰器详解.md
-
- -
-

Python装饰器详解

-

装饰器是Python中一种强大而灵活的工具,用于修改或扩展函数或类的行为。它们允许你在不修改原始代码的情况下,增加额外的功能。

- -

什么是装饰器?

-

装饰器本质上是一个函数,它接受另一个函数作为参数,并返回一个新的函数。这个新的函数通常会包含原始函数的功能,同时增加一些额外的功能。

- -
-
def my_decorator(func):
-    def wrapper():
-        print("在函数执行前做一些事情")
-        func()
-        print("在函数执行后做一些事情")
-    return wrapper
-
-@my_decorator
-def say_hello():
-    print("Hello, World!")
-
- -

上面的代码定义了一个装饰器`my_decorator`,它会在调用被装饰的函数前后打印一些信息。使用`@my_decorator`语法糖可以很方便地应用装饰器。

- -

装饰器的应用场景

-
    -
  • 日志记录
  • -
  • 性能测试
  • -
  • 权限验证
  • -
  • 缓存
  • -
  • 事务处理
  • -
- -

装饰器是Python中一种非常强大的元编程技术,可以帮助你写出更加简洁、优雅和可维护的代码。

-
- -
-
- - - -
-
- - (1/1) FULL - -
-
-
-
-
-
-
- - -
- - -
-
-
-
-
- -

doc.gvsds.com

-
-

提供高质量的技术文档和学习资源,帮助开发者平滑阅读和成长。

-
- - - -
-

联系我们

- -
-
- -
-

© 2025 银河锋锐软件开发工作室. 保留所有权利。

- -
-
-
- - - - - - - - \ No newline at end of file diff --git a/TempLate/Document/lib/script.js b/TempLate/Document/lib/script.js deleted file mode 100644 index b0db6f9b..00000000 --- a/TempLate/Document/lib/script.js +++ /dev/null @@ -1,622 +0,0 @@ -window.WebAssembly = undefined; - -const url = new URL(window.location.href); -const pathParts = url.pathname.split('/'); -const UUID = pathParts.pop() || pathParts.pop(); - -// DOM元素 -const sidebar = document.getElementById('sidebar'); -const sidebarToggle = document.getElementById('sidebar-toggle'); -const overlay = document.getElementById('overlay'); -const sidebarSearch = document.getElementById('sidebar-search'); -const themeToggle = document.getElementById('theme-toggle'); -const articleContainer = document.getElementById('article-container'); -const sidebarNav = document.getElementById('sidebar-nav'); -const globalSearch = document.getElementById('global-search'); -const searchButton = document.getElementById('search-button'); -const headerTitle = document.getElementById('header-title'); - -// 初始化Marked.js -if (window.marked) marked.setOptions({ - highlight: function (code, lang) { - if (lang && hljs.getLanguage(lang)) { - return hljs.highlight(code, { language: lang }).value; - } - return hljs.highlightAuto(code).value; - }, - breaks: true, -}); - -// 渲染侧边栏导航 -function renderSidebar() { - sidebarNav.innerHTML = ''; - - tableOfContents.chapters.forEach(chapter => { - const chapterEl = document.createElement('div'); - chapterEl.className = 'mb-1'; - - const chapterHeader = document.createElement('div'); - chapterHeader.className = 'flex items-center justify-between p-2 rounded-lg hover:bg-gray-100 cursor-pointer transition-all duration-300'; - chapterHeader.innerHTML = ` - - - ${chapter.title} - - - `; - - const chapterContent = document.createElement('div'); - chapterContent.className = 'pl-4 mt-1 space-y-1 overflow-hidden max-h-0 transition-all duration-300'; - - // 添加章节链接 - const chapterLink = document.createElement('a'); - chapterLink.href = `#${chapter.id}`; - chapterLink.className = 'block p-2 rounded-lg hover:bg-gray-100 text-sm transition-all duration-300'; - chapterLink.textContent = chapter.title; - chapterLink.addEventListener('click', (e) => { - e.preventDefault(); - loadArticleAsync(chapter.id); - closeSidebar(); - highlightActiveLink(chapter.id); - }); - chapterContent.appendChild(chapterLink); - - // 添加子章节链接 - if (chapter.sections && chapter.sections.length > 0) { - chapter.sections.forEach(section => { - const sectionLink = document.createElement('a'); - sectionLink.href = `#${section.id}`; - sectionLink.className = 'block p-2 rounded-lg hover:bg-gray-100 text-sm transition-all duration-300'; - sectionLink.innerHTML = ` - ${section.title} - `; - sectionLink.addEventListener('click', (e) => { - e.preventDefault(); - loadArticleAsync(section.id); - closeSidebar(); - highlightActiveLink(section.id); - }); - chapterContent.appendChild(sectionLink); - }); - } - - chapterHeader.addEventListener('click', () => { - const isExpanded = chapterContent.classList.contains('expanded'); - - if (isExpanded) { - chapterContent.classList.remove('expanded'); - chapterContent.style.maxHeight = '0'; - chapterHeader.querySelector('.fa-chevron-down').style.transform = 'rotate(0deg)'; - } else { - chapterContent.classList.add('expanded'); - chapterContent.style.maxHeight = chapterContent.scrollHeight + 'px'; - chapterHeader.querySelector('.fa-chevron-down').style.transform = 'rotate(180deg)'; - } - }); - - chapterEl.appendChild(chapterHeader); - chapterEl.appendChild(chapterContent); - sidebarNav.appendChild(chapterEl); - }); -} - -// 异步加载文章内容 -async function loadArticleAsync(id, password = null) { - // 显示现代化加载动画 - showLoadingAnimation(); - // 找到侧边栏中对应的链接并模拟点击 - const link = document.querySelector(`#sidebar-nav a[href="#${id}"]`); - let apiUrl = `/API/GetDoc/${id}`; - if (password) { - apiUrl += `?Pwd=${password}`; - } - try { - // 使用fetch API进行异步请求 - const response = await fetch(apiUrl); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - - const content = await response.json(); - - if (content.DocDecrypt === false) { - showPasswordPrompt(content.DocContent, id); - } else if (content) { - renderArticle(content); - } else { - showError("未找到文章内容"); - } - } catch (error) { - console.error('Fetch error:', error); - showError("加载文章失败,请稍后再试"); - } -} - -// 显示加载动画 -function showLoadingAnimation() { - articleContainer.innerHTML = ` -
-
-
-
-

正在加载文章内容...

-
- `; -} - -// 显示错误信息 -function showError(message) { - articleContainer.innerHTML = ` -
- -

${message}

-

请尝试刷新页面或联系管理员

-
- `; -} - -function sanitizeInput(input) { - if (typeof input !== 'string') return ''; - // 1. 移除 script 标签 - let sanitized = input.replace(/]*>([\s\S]*?)<\/script>/gi, ''); - // 2. 移除所有事件处理器(包括 onerror) - sanitized = sanitized.replace(/\bon\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^"'>\s]+)/gi, ''); - // 3. 移除 javascript: 和 data: 协议 - sanitized = sanitized.replace(/(javascript|data|vbscript):/gi, ''); - // 4. 编码特殊字符 - sanitized = sanitized - .replace(/\bonerror\s*=\s*"[^"]*"/gi, '') - .replace(/\bonerror\s*=\s*'[^']*'/gi, '') - .replace(/\bonerror\s*=\s*[^"'>\s]+/gi, ''); - return sanitized; -} - -function sanitizeHTML(input) { - const parser = new DOMParser(); - const doc = parser.parseFromString(input, 'text/html'); - const elements = doc.body.getElementsByTagName('*'); - for (let element of elements) { - const attributes = element.attributes; - for (let i = attributes.length - 1; i >= 0; i--) { - const attr = attributes[i]; - if (attr.name.startsWith('on') || - attr.name.match(/^on[a-z]+/i) || - ['src', 'href', 'xlink:href'].includes(attr.name.toLowerCase())) { - element.removeAttribute(attr.name); - } - } - if (['iframe', 'script', 'object', 'embed'].includes(element.tagName.toLowerCase())) { - element.remove(); - } - } - return doc.body.innerHTML; -} - -// 渲染文章内容 -function renderArticle(content) { - // 解析Markdown并渲染 - if (content.DocContent.substring(0, 5) === "`; - const IFcontent = document.getElementById("IFcontent"); - IFcontent.srcdoc = content.DocContent; - IFcontent.onload = function () { - IFcontent.style.height = IFcontent.contentWindow.document.body.scrollHeight + 100 + 'px'; - IFcontent.contentDocument.body.style.color = document.documentElement.classList.contains('dark') ? '#FFFFFF' : '#000000'; - } - } else if (content.DocPermission) { - articleContainer.innerHTML = marked.parse(content.DocContent); - } else { - articleContainer.innerHTML = marked.parse(sanitizeInput(content.DocContent)); - } - - // 渲染数学公式 - document.querySelectorAll('pre code.language-math, pre code.language-katex, pre code.language-latex').forEach((block) => { - const parentPre = block.parentNode; - const displayMode = true; - const mathDiv = document.createElement('div'); - mathDiv.className = 'math'; - mathDiv.textContent = block.textContent; - katex.render(mathDiv.textContent, mathDiv, { - throwOnError: false, - displayMode - }); - parentPre.parentNode.replaceChild(mathDiv, parentPre); - }); - - // 渲染流程图和序列图 - document.querySelectorAll('pre code.language-flow, pre code.language-seq').forEach((block) => { - const parentPre = block.parentNode; - const diagram = document.createElement('div'); - diagram.className = 'mermaid'; - diagram.textContent = block.textContent; - parentPre.parentNode.replaceChild(diagram, parentPre); - }); - if (window.mermaid) mermaid.init(); - - // 为普通代码块添加行号、标题、复制按钮和演示按钮 - document.querySelectorAll('pre code').forEach((block) => { - const lang = block.getAttribute('class')?.replace('hljs', '').trim(); - const supportedLanguages = ['javascript', 'html', 'plaintext']; // 定义支持高亮的语言 - - // 只对支持的语言进行高亮处理 - if (supportedLanguages.includes(lang)) { - hljs.highlightElement(block); - } - - // 跳过数学公式和图表代码块 - if (['math', 'katex', 'latex', 'flow', 'seq'].includes(lang)) { - return; - } - - // 添加行号 - if (!block.classList.contains('nohighlight')) { - const lines = block.textContent.split('\n').length; - let lineNumbersHTML = ''; - - for (let i = 0; i < lines; i++) { - lineNumbersHTML += ''; - } - - const lineNumbersWrapper = document.createElement('div'); - lineNumbersWrapper.className = 'line-numbers'; - lineNumbersWrapper.innerHTML = lineNumbersHTML; - - block.className += ' line-numbers-rows'; - block.parentNode.insertBefore(lineNumbersWrapper, block); - } - - // 添加代码块标题 - const codeTitle = document.createElement('div'); - codeTitle.className = 'code-title'; - codeTitle.textContent = lang || 'plaintext'; - - // 添加复制按钮 - const copyButton = document.createElement('button'); - copyButton.className = 'copy-btn'; - copyButton.innerHTML = ''; - copyButton.addEventListener('click', () => { - const text = block.textContent; - navigator.clipboard.writeText(text).then(() => { - copyButton.innerHTML = ''; - setTimeout(() => { - copyButton.innerHTML = ''; - }, 1000); - }).catch((err) => { - console.error('复制失败: ', err); - }); - }); - codeTitle.appendChild(copyButton); - - // 添加演示按钮 - if (lang === 'javascript' || lang === 'html') { - const demoButton = document.createElement('button'); - demoButton.className = 'demo-btn'; - demoButton.innerHTML = ''; - demoButton.addEventListener('click', () => { - const code = block.textContent; - const newWindow = window.open('', '_blank'); - if (lang === 'javascript') { - newWindow.document.write(``); - } else if (lang === 'html') { - newWindow.document.write(code); - } - }); - codeTitle.appendChild(demoButton); - } - - block.parentNode.insertBefore(codeTitle, block); - }); - - if (window.renderMathInElement) renderMathInElement(document.body); - - // 添加淡入动画 - articleContainer.style.opacity = '0'; - setTimeout(() => { - articleContainer.style.opacity = '1'; - articleContainer.style.transition = 'opacity 0.3s ease'; - }, 50); -} - -// 高亮活动链接 -function highlightActiveLink(id) { - document.querySelectorAll('#sidebar-nav a').forEach(link => { - if (link.getAttribute('href') === `#${id}`) { - link.classList.add('bg-primary/10', 'dark:bg-primary/20', 'text-primary'); - } else { - link.classList.remove('bg-primary/10', 'dark:bg-primary/20', 'text-primary'); - } - }); -} - -// 打开侧边栏 -function openSidebar() { - sidebar.classList.remove('-translate-x-full'); - overlay.classList.remove('hidden'); - setTimeout(() => { - overlay.classList.add('opacity-100'); - }, 10); -} - -// 关闭侧边栏 -function closeSidebar() { - sidebar.classList.add('-translate-x-full'); - overlay.classList.remove('opacity-100'); - setTimeout(() => { - overlay.classList.add('hidden'); - }, 300); -} - -// 切换主题 -function toggleTheme() { - document.documentElement.classList.toggle('dark'); - IFcontent = document.getElementById("IFcontent"); - if (IFcontent) { - iframeDoc = IFcontent.contentDocument || IFcontent.contentWindow.document; - iframeDoc.body.style.color = document.documentElement.classList.contains('dark') ? '#FFF' : '#000'; - iframeDoc.documentElement.classList.toggle('dark'); - } - localStorage.setItem('theme', document.documentElement.classList.contains('dark') ? 'dark' : 'light'); -} - -// 侧边栏搜索功能 -function setupSidebarSearch() { - sidebarSearch.addEventListener('input', (e) => { - const searchTerm = e.target.value.toLowerCase().trim(); - const links = document.querySelectorAll('#sidebar-nav a'); - - links.forEach(link => { - const text = link.textContent.toLowerCase(); - const isVisible = text.includes(searchTerm); - - link.style.display = isVisible ? 'block' : 'none'; - - // 如果章节下所有子项都不可见,则隐藏章节 - const parent = link.closest('div'); - const visibleItems = parent.querySelectorAll('a:not([style*="display: none"])').length; - - const chapterHeader = parent.previousElementSibling; - if (chapterHeader && visibleItems === 0) { - parent.style.display = 'none'; - chapterHeader.style.display = 'none'; - } else if (chapterHeader) { - parent.style.display = ''; - chapterHeader.style.display = ''; - } - }); - }); -} - -// 搜索功能 -function setupSearch() { - searchButton.addEventListener('click', performSearch); - globalSearch.addEventListener('keydown', (e) => { - if (e.key === 'Enter') { - performSearch(); - } - }); -} - -// 执行搜索 -async function performSearch() { - const searchTerm = globalSearch.value.toLowerCase().trim(); - if (!searchTerm) return; - - showLoadingAnimation(); - - try { - // 获取所有文章ID - const allIds = []; - tableOfContents.chapters.forEach(chapter => { - allIds.push(chapter.id); - if (chapter.sections) { - chapter.sections.forEach(section => { - allIds.push(section.id); - }); - } - }); - - // 并行请求所有文章内容 - const results = await Promise.allSettled( - allIds.map(id => fetch(`/API/GetDoc/${id}`) - .then(response => response.json()) - .then(content => ({ id, content })) - ) - ); - - // 处理搜索结果 - const searchResults = []; - results.forEach(result => { - if (result.status === 'fulfilled' && result.value.content) { - const { id, content } = result.value; - c = content.DocContent; - if (c.toLowerCase().includes(searchTerm)) { - const title = tableOfContents.chapters.flatMap(chapter => [ - { id: chapter.id, title: chapter.title }, - ...chapter.sections.map(section => ({ id: section.id, title: section.title })) - ]).find(item => item.id === id)?.title || '未知标题'; - - const excerpt = getExcerpt(c, searchTerm); - searchResults.push({ id, title, excerpt }); - } - } - }); - - // 渲染搜索结果 - renderSearchResults(searchResults); - } catch (error) { - console.error('搜索失败:', error); - showError("搜索过程中发生错误"); - } -} - -// 渲染搜索结果 -function renderSearchResults(results) { - if (results.length > 0) { - let resultsHTML = '
'; - resultsHTML += `

搜索结果: ${results.length} 个匹配项

`; - - results.forEach(result => { - resultsHTML += ` -
-

- ${result.title} -

-
- ${result.excerpt} -
- - 阅读更多 - -
- `; - }); - - resultsHTML += '
'; - articleContainer.innerHTML = resultsHTML; - } else { - showError("未找到匹配的结果"); - } -} - -// 获取摘要(带转义和搜索词高亮) -function getExcerpt(content, searchTerm) { - // 转义HTML特殊字符 - const escapeHtml = (str) => { - return str.replace(/[&<>'"]/g, - tag => ({ - '&': '&', - '<': '<', - '>': '>', - "'": ''', - '"': '"' - }[tag])); - }; - - // 转义内容和搜索词 - const escapedContent = escapeHtml(content); - const escapedSearchTerm = escapeHtml(searchTerm); - - // 查找位置(不区分大小写) - const index = escapedContent.toLowerCase().indexOf(escapedSearchTerm.toLowerCase()); - if (index === -1) return ''; // 没找到搜索词 - - // 计算摘要范围 - const start = Math.max(0, index - 100); - const end = Math.min(escapedContent.length, index + escapedSearchTerm.length + 100); - - // 构建摘要 - let excerpt = escapedContent.substring(start, end); - if (start > 0) excerpt = '...' + excerpt; - if (end < escapedContent.length) excerpt = excerpt + '...'; - - // 高亮搜索词(使用转义后的搜索词) - const regex = new RegExp(escapedSearchTerm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'); - excerpt = excerpt.replace(regex, match => `${match}`); - - return excerpt; -} - -// 展开所有侧边栏章节 -function expandAllSidebarSections() { - const chapterContents = document.querySelectorAll('#sidebar-nav .pl-4.mt-1.space-y-1'); - const chapterHeaders = document.querySelectorAll('#sidebar-nav .flex.items-center.justify-between.p-2.rounded-lg'); - - chapterContents.forEach((chapterContent) => { - chapterContent.style.maxHeight = 'none'; - const height = chapterContent.scrollHeight * 100; - chapterContent.style.maxHeight = '0'; - requestAnimationFrame(() => { - chapterContent.classList.add('expanded'); - chapterContent.style.maxHeight = height + 'px'; - }); - }); - - chapterHeaders.forEach((chapterHeader) => { - const chevron = chapterHeader.querySelector('.fa-chevron-down'); - chevron.style.transform = 'rotate(180deg)'; - }); -} - -// 显示密码输入提示 -function showPasswordPrompt(prompt, id) { - articleContainer.innerHTML = ` -
-

${prompt}

- - - -
- `; - const passwordInput = document.getElementById('password-input'); - const passwordSubmit = document.getElementById('password-submit'); - const passwordError = document.getElementById('password-error'); - - passwordSubmit.addEventListener('click', () => { - const password = passwordInput.value; - loadArticleAsync(id, password).then(() => { - if (articleContainer.innerHTML.includes('密码错误')) { - passwordError.classList.remove('hidden'); - } else { - passwordError.classList.add('hidden'); - } - }); - }); - - passwordInput.addEventListener('keydown', (e) => { - if (e.key === 'Enter') { - const password = passwordInput.value; - loadArticleAsync(id, password).then(() => { - if (articleContainer.innerHTML.includes('密码错误')) { - passwordError.classList.remove('hidden'); - } else { - passwordError.classList.add('hidden'); - } - }); - } - }); -} - -// 初始化 -function init() { - fetch(`/API/GetSerieDirectory/${UUID}`) - .then(response => response.json()) - .then(data => { - window.tableOfContents = data; - headerTitle.innerText = data.title; - document.title = `${data.title} - 章节阅读器`; - renderSidebar(); - setupSearch(); - setupSidebarSearch(); - expandAllSidebarSections(); - - if (data.document) { - loadArticleAsync(UUID); - // 展开,懒得写了 - highlightActiveLink(UUID); - } else { - loadArticleAsync(`${UUID}_index`); - highlightActiveLink(`${UUID}_index`); - } - }) - .catch(error => { - // 错误处理保持不变 - console.error('获取目录失败:', error); - articleContainer.innerHTML = ` -
- -

加载目录失败

-

请检查网络连接或刷新页面

-
- `; - }); - // 恢复主题设置 - //const savedTheme = localStorage.getItem('theme'); - //if (savedTheme === 'dark') { - // document.documentElement.classList.add('dark'); - //} - sidebarToggle.addEventListener('click', openSidebar); - overlay.addEventListener('click', closeSidebar); - themeToggle.addEventListener('click', toggleTheme); -} -window.onload = init; \ No newline at end of file diff --git a/TempLate/Document/template.html b/TempLate/Document/template.html deleted file mode 100644 index 2e9b5da8..00000000 --- a/TempLate/Document/template.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - - - - -
- -
-
-
- -

- 平滑阅读 -

-
- -
- -
-
-
- -
- - - - - - - -
-
-
-
- -

点选章节以开始阅读

-
-
-
-
-
- - -{{ NoFooter }} \ No newline at end of file diff --git a/TempLate/GERP/index.html b/TempLate/GERP/index.html index b631795d..e76bf349 100644 --- a/TempLate/GERP/index.html +++ b/TempLate/GERP/index.html @@ -5,16 +5,16 @@ GERP 管理系统 - + - + - - - - + + + + - +
diff --git a/TempLate/index.html b/TempLate/index.html index c19aa279..5c5602ba 100644 --- a/TempLate/index.html +++ b/TempLate/index.html @@ -5,8 +5,8 @@ 银河锋锐软件开发工作室 - - + +
diff --git a/gvsds/apps/core/views.py b/gvsds/apps/core/views.py index a4d9e12c..af6f27a6 100644 --- a/gvsds/apps/core/views.py +++ b/gvsds/apps/core/views.py @@ -43,7 +43,7 @@ SUBDOMAIN_CONFIG = { '3crb': {'dir': 'CCCRB', 'root_is_index': True}, 'ccgo': {'dir': 'CCGO', 'root_is_index': True}, 'invite': {'dir': '', 'root_is_index': True}, - 'doc': {'dir': 'Document', 'root_is_index': True}, + 'doc': {'dir': '', 'root_is_index': True}, 't4': {'dir': None, 'root_is_index': False}, 'verify': {'dir': 'Verify', 'root_is_index': True}, 'verifox': {'dir': 'Verifox', 'root_is_index': True}, @@ -129,6 +129,86 @@ def _serve_file(full_path, subdomain=None): return response +# ============================================================================ +# doc 子域 JSON API(页面由 GVSite SPA 渲染) +# /API/GetDoc/ → 文章 JSON +# /API/GetSerieDirectory/ → 系列目录 / 单文档标记 JSON +# ============================================================================ + + +def _doc_api(file_path): + """doc 子域 JSON API:API/GetDoc/ 与 API/GetSerieDirectory/。""" + from gvsds.apps.doc.manager import DocManager + from gvsdsdk.model_utils import UUIDObj + + parts = file_path.split('/') + if len(parts) < 3 or parts[0] != 'API': + return None + action = parts[1] + uuid_text = parts[2].strip('/') + try: + uuid_bytes = UUIDObj(uuid_text).bytes + except (ValueError, TypeError, AttributeError): + return JsonResponse({'error': 'invalid_uuid'}, status=404) + + if action == 'GetDoc': + doc = DocManager.GetDocument(uuid_bytes) + if doc is None: + return JsonResponse({'error': 'not_found'}, status=404) + return JsonResponse({ + 'DocTitle': doc.DocTitle or '未命名文档', + 'DocContent': doc.DocContent or '', + 'DocFormat': doc.DocFormat, + 'DocPermission': 1, + 'DocDecrypt': True, + }) + + if action == 'GetSerieDirectory': + from gvsds.apps.doc.models import CommunityDocument, CommunitySeries + try: + serie = CommunitySeries.objects.get(DocSerieUUID=uuid_bytes) + except CommunitySeries.DoesNotExist: + serie = None + if serie is not None: + docs = CommunityDocument.objects.filter(DocSerieUUID=uuid_bytes) + chapters = [ + { + 'id': UUIDObj(d.DocUUID).str.replace('-', ''), + 'title': d.DocTitle or '未命名文档', + 'sections': [], + } + for d in docs + ] + return JsonResponse({ + 'title': serie.DocSerieName or '未命名系列', + 'document': False, + 'chapters': chapters, + }) + # 非系列 UUID:单文档模式,返回所属系列的全部文章供侧边栏展示 + doc = DocManager.GetDocument(uuid_bytes) + if doc is None: + return JsonResponse({'error': 'not_found'}, status=404) + chapters = [] + if doc.DocSerieUUID: + serie_docs = CommunityDocument.objects.filter(DocSerieUUID=doc.DocSerieUUID) + chapters = [ + { + 'id': UUIDObj(d.DocUUID).str.replace('-', ''), + 'title': d.DocTitle or '未命名文档', + 'sections': [], + } + for d in serie_docs + ] + return JsonResponse({ + 'title': doc.DocTitle or '未命名文档', + 'document': True, + 'id': UUIDObj(doc.DocUUID).str.replace('-', ''), + 'chapters': chapters, + }) + + return None + + class SubdomainView(View): def get(self, request, file_path=''): subdomain = _get_subdomain(request) @@ -137,6 +217,14 @@ class SubdomainView(View): if config.get('dir') is None: raise Http404 + # doc 子域:动态阅读 JSON API(页面由 GVSite SPA 渲染,走下方通用静态/SPA fallback) + # doc.gvsds.com/API/GetDoc/ → 文章 JSON + # doc.gvsds.com/API/GetSerieDirectory/ → 目录 JSON + if subdomain == 'doc' and file_path and file_path.startswith('API/'): + api_resp = _doc_api(file_path) + if api_resp: + return api_resp + # ugm 子域:未登录则跳转登录页,已登录则跳转 gerp if subdomain == 'ugm': # JWT Cookie 认证:检查 AccessToken 或 RefreshToken diff --git a/gvsds/apps/doc/manager.py b/gvsds/apps/doc/manager.py index 242f36cb..c8d6d628 100644 --- a/gvsds/apps/doc/manager.py +++ b/gvsds/apps/doc/manager.py @@ -17,7 +17,7 @@ class DocManager: @staticmethod def ListDocuments(Keyword=''): - """获取文档列表(不含 DocContent 全文,仅标题与创建时间)""" + """获取文档列表(不含 DocContent 全文,仅标题/系列/创建时间/格式)""" qs = CommunityDocument.objects.all() if Keyword: qs = qs.filter(DocTitle__icontains=Keyword) @@ -25,7 +25,9 @@ class DocManager: for d in qs: data.append({ 'DocUUID': UUIDObj(d.DocUUID).str, + 'DocSerieUUID': UUIDObj(d.DocSerieUUID).str if d.DocSerieUUID else None, 'DocTitle': d.DocTitle, + 'DocFormat': d.DocFormat, 'DocCreateTime': d.DocCreateTime.isoformat() if d.DocCreateTime else None, }) return data @@ -39,23 +41,24 @@ class DocManager: return None @staticmethod - def AddDocument(Title, Content='', SerieUUID=None): - """新建文档(可选绑定系列)""" + def AddDocument(Title, Content='', SerieUUID=None, Format='markdown'): + """新建文档(可选绑定系列;DocSerieUUID 为可空 UUID 列,直接存 bytes) + + Format: 'markdown' 或 'html'(DocFormat 字段)。 + """ create_data = { 'DocUUID': uuid.uuid4().bytes, 'DocTitle': Title, 'DocContent': Content, + 'DocFormat': Format if Format in ('markdown', 'html') else 'markdown', } - if SerieUUID: - serie = DocManager.GetSerie(SerieUUID) - if serie is not None: - # DocSerieUUID 为 ForeignKey:传实例 - create_data['DocSerieUUID'] = serie + if SerieUUID and DocManager.GetSerie(SerieUUID) is not None: + create_data['DocSerieUUID'] = UUIDObj(SerieUUID).bytes return CommunityDocument.objects.create(**create_data) @staticmethod def ModifyDocument(DocUUID, Data): - """修改文档标题与内容 + """修改文档标题/内容/格式 Returns: (成功?, 错误消息 or None) @@ -63,7 +66,7 @@ class DocManager: doc = DocManager.GetDocument(DocUUID) if doc is None: return False, '文档不存在' - for field in ('DocTitle', 'DocContent'): + for field in ('DocTitle', 'DocContent', 'DocFormat'): if field in Data: setattr(doc, field, Data[field]) doc.save() @@ -86,12 +89,12 @@ class DocManager: @staticmethod def ListSeries(): - """获取系列列表""" + """获取系列列表(统一 DocSerie 前缀字段名)""" data = [] for s in CommunitySeries.objects.all(): data.append({ - 'SerieUUID': UUIDObj(s.DocSerieUUID).str, - 'SerieName': s.DocSerieName, + 'DocSerieUUID': UUIDObj(s.DocSerieUUID).str, + 'DocSerieName': s.DocSerieName, }) return data @@ -152,7 +155,10 @@ class DocManager: @staticmethod def SerieHasDocuments(DocSerieUUID): """判断系列下是否还有文档(防删除)""" - serie = DocManager.GetSerie(DocSerieUUID) - if serie is None: + try: + serie_bytes = UUIDObj(DocSerieUUID).bytes + except (ValueError, AttributeError): return False - return CommunityDocument.objects.filter(DocSerieUUID=serie).exists() + if DocManager.GetSerie(DocSerieUUID) is None: + return False + return CommunityDocument.objects.filter(DocSerieUUID=serie_bytes).exists() diff --git a/gvsds/apps/doc/migrations/0002_doc_redesign.py b/gvsds/apps/doc/migrations/0002_doc_redesign.py new file mode 100644 index 00000000..6ffee531 --- /dev/null +++ b/gvsds/apps/doc/migrations/0002_doc_redesign.py @@ -0,0 +1,34 @@ +"""Redesign CommunityDocument + +系列字段 DocSerieUUID 由 FK 改为可空 UUIDField(非 FK,消除列名不一致); +删除冗余且从未使用的 DocPermission / DocPwd / DocPwdDesc 字段。 +""" +import gvsds.apps.core.models +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('doc', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='communitydocument', + name='doc_permission', + ), + migrations.RemoveField( + model_name='communitydocument', + name='doc_pwd', + ), + migrations.RemoveField( + model_name='communitydocument', + name='doc_pwd_desc', + ), + migrations.AlterField( + model_name='communitydocument', + name='doc_serie_uuid', + field=gvsds.apps.core.models.UUIDField(blank=True, db_column='DocSerieUUID', null=True, serialize=False, verbose_name='所属系列UUID'), + ), + ] diff --git a/gvsds/apps/doc/migrations/0003_doc_format.py b/gvsds/apps/doc/migrations/0003_doc_format.py new file mode 100644 index 00000000..f188786e --- /dev/null +++ b/gvsds/apps/doc/migrations/0003_doc_format.py @@ -0,0 +1,20 @@ +"""Add CommunityDocument.DocFormat + +内容格式字段:markdown(默认,兼容旧内容经 marked 渲染)或 html(富文本)。 +""" +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('doc', '0002_doc_redesign'), + ] + + operations = [ + migrations.AddField( + model_name='communitydocument', + name='doc_format', + field=models.CharField(choices=[('markdown', 'Markdown'), ('html', '富文本 HTML')], db_column='DocFormat', default='markdown', max_length=16, verbose_name='内容格式'), + ), + ] diff --git a/gvsds/apps/doc/models.py b/gvsds/apps/doc/models.py index b59c76b5..d013dff5 100644 --- a/gvsds/apps/doc/models.py +++ b/gvsds/apps/doc/models.py @@ -8,21 +8,23 @@ from gvsds.apps.core.models import UUIDField class CommunityDocument(QModel): - """社区文档表——文档内容与权限管理""" + """社区文档表——文档内容管理 + + DocSerieUUID 为可空 UUIDField(非 FK):系列仅是逻辑分组, + 避免 FK + to_field 导致列名(DocSerieUUID_id)与迁移不一致的坑。 + """ DocUUID = UUIDField(primary_key=True, verbose_name='文档UUID') - DocSerieUUID = models.ForeignKey( - 'CommunitySeries', on_delete=models.CASCADE, - to_field='DocSerieUUID', - related_name='+', - verbose_name='所属系列', - ) + DocSerieUUID = UUIDField(null=True, blank=True, verbose_name='所属系列UUID') DocTitle = models.CharField(max_length=256, verbose_name='文档标题') DocContent = models.TextField(verbose_name='文档内容') + DocFormat = models.CharField( + max_length=16, + default='markdown', + choices=(('markdown', 'Markdown'), ('html', '富文本 HTML')), + verbose_name='内容格式', + ) DocCreateTime = models.DateTimeField(default=datetime.datetime.utcnow, verbose_name='文档创建时间') - DocPermission = models.IntegerField(default=0, verbose_name='文档权限') - DocPwd = UUIDField(verbose_name='文档密码') - DocPwdDesc = models.CharField(max_length=256, verbose_name='密码描述') class Meta: db_table = 'Document' diff --git a/gvsds/apps/doc/serializers.py b/gvsds/apps/doc/serializers.py index 45f5c9c5..ff7c8cc6 100644 --- a/gvsds/apps/doc/serializers.py +++ b/gvsds/apps/doc/serializers.py @@ -10,7 +10,7 @@ class CommunityDocumentSerializer(PascalCaseModelSerializer): class Meta: model = CommunityDocument - fields = ['DocUUID', 'DocSerieUUID', 'DocTitle', 'DocContent', 'DocCreateTime'] + fields = ['DocUUID', 'DocSerieUUID', 'DocTitle', 'DocContent', 'DocFormat', 'DocCreateTime'] def get_DocUUID(self, obj): raw = obj.DocUUID @@ -19,14 +19,12 @@ class CommunityDocumentSerializer(PascalCaseModelSerializer): return str(raw) if raw else None def get_DocSerieUUID(self, obj): - raw = obj.DocSerieUUID_id if hasattr(obj, 'DocSerieUUID_id') else obj.DocSerieUUID + # DocSerieUUID 现为可空 UUIDField(非 FK),直接转字符串 + raw = obj.DocSerieUUID + if raw is None: + return None if isinstance(raw, bytes) and len(raw) == 16: return str(uuid.UUID(bytes=raw)) - if isinstance(raw, CommunitySeries): - raw2 = raw.DocSerieUUID - if isinstance(raw2, bytes) and len(raw2) == 16: - return str(uuid.UUID(bytes=raw2)) - return str(raw2) if raw2 else None return str(raw) if raw else None @@ -47,12 +45,14 @@ class CommunitySeriesSerializer(PascalCaseModelSerializer): class DocAddSerializer(PascalCaseSerializer): DocTitle = serializers.CharField(max_length=256) DocSerieUUID = serializers.CharField(required=False) + DocFormat = serializers.ChoiceField(choices=('markdown', 'html'), required=False) class DocModifySerializer(PascalCaseSerializer): DocUUID = serializers.CharField() DocTitle = serializers.CharField(max_length=256, required=False) DocContent = serializers.CharField(required=False) + DocFormat = serializers.ChoiceField(choices=('markdown', 'html'), required=False) class SerieAddSerializer(PascalCaseSerializer): diff --git a/gvsds/apps/doc/views.py b/gvsds/apps/doc/views.py index 03a142db..58318487 100644 --- a/gvsds/apps/doc/views.py +++ b/gvsds/apps/doc/views.py @@ -40,7 +40,7 @@ class CommunityDocumentViewSet(viewsets.ModelViewSet): for d in qs: data.append({ 'DocUUID': UUIDObj(d.DocUUID).str, - 'DocSerieUUID': UUIDObj(d.DocSerieUUID.pk if hasattr(d, 'DocSerieUUID_id') else d.DocSerieUUID).str, + 'DocSerieUUID': UUIDObj(d.DocSerieUUID).str if d.DocSerieUUID else None, 'DocTitle': d.DocTitle, 'DocCreateTime': d.DocCreateTime.isoformat() if d.DocCreateTime else None, }) @@ -62,6 +62,7 @@ class CommunityDocumentViewSet(viewsets.ModelViewSet): 'DocUUID': UUIDObj(doc.DocUUID).str, 'DocTitle': doc.DocTitle, 'DocContent': doc.DocContent or '', + 'DocFormat': doc.DocFormat, 'DocCreateTime': doc.DocCreateTime.isoformat() if doc.DocCreateTime else None, }) @@ -79,7 +80,12 @@ class CommunityDocumentViewSet(viewsets.ModelViewSet): if DocManager.GetSerie(serie_uuid_str) is None: return Response({'code': 1, 'msg': '系列不存在'}, status=400) - doc = DocManager.AddDocument(Title=data['DocTitle'], Content='', SerieUUID=serie_uuid_str) + doc = DocManager.AddDocument( + Title=data['DocTitle'], + Content='', + SerieUUID=serie_uuid_str, + Format=data.get('DocFormat', 'markdown'), + ) return Response({ 'code': 0, 'msg': '添加成功', diff --git a/gvsds/apps/gerp/serializers.py b/gvsds/apps/gerp/serializers.py index 255929cd..c09ebdbc 100644 --- a/gvsds/apps/gerp/serializers.py +++ b/gvsds/apps/gerp/serializers.py @@ -275,7 +275,7 @@ class FinanceShowSerializer(PascalCaseSerializer): class DocAddSerializer(PascalCaseSerializer): DocTitle = serializers.CharField(max_length=256) DocContent = serializers.CharField(required=False, allow_blank=True, default='') - SerieUUID = serializers.CharField(required=False) + DocSerieUUID = serializers.CharField(required=False) DocTags = serializers.JSONField(default=list) @@ -287,16 +287,12 @@ class DocModifySerializer(PascalCaseSerializer): class SerieAddSerializer(PascalCaseSerializer): - SerieName = serializers.CharField(max_length=256) - SerieDescription = serializers.CharField(default='') - SerieTags = serializers.JSONField(default=list) + DocSerieName = serializers.CharField(max_length=256) class SerieModifySerializer(PascalCaseSerializer): - SerieUUID = serializers.CharField() - SerieName = serializers.CharField(max_length=256, required=False) - SerieDescription = serializers.CharField(required=False) - SerieTags = serializers.JSONField(required=False) + DocSerieUUID = serializers.CharField() + DocSerieName = serializers.CharField(max_length=256, required=False) class WorkOrderCreateSerializer(PascalCaseSerializer): diff --git a/gvsds/apps/gerp/views/doc.py b/gvsds/apps/gerp/views/doc.py index fe5a0c82..d44197b1 100644 --- a/gvsds/apps/gerp/views/doc.py +++ b/gvsds/apps/gerp/views/doc.py @@ -74,10 +74,13 @@ class DocView(ELTAuthenticatedAPIView): return Response({'code': 1, 'msg': '文档不存在'}, status=404) return Response({ 'code': 0, - 'DocUUID': UUIDObj(doc.DocUUID).str, - 'DocTitle': doc.DocTitle, - 'DocContent': doc.DocContent or '', - 'DocCreateTime': doc.DocCreateTime.isoformat() if doc.DocCreateTime else None, + 'data': { + 'DocUUID': UUIDObj(doc.DocUUID).str, + 'DocTitle': doc.DocTitle, + 'DocContent': doc.DocContent or '', + 'DocFormat': doc.DocFormat, + 'DocCreateTime': doc.DocCreateTime.isoformat() if doc.DocCreateTime else None, + }, }) def _AddDoc(self, request): @@ -86,7 +89,12 @@ class DocView(ELTAuthenticatedAPIView): ser.IsValid(raise_exception=True) data = ser.ValidatedData from gvsds.apps.doc.manager import DocManager - doc = DocManager.AddDocument(data['DocTitle'], data.get('DocContent', '')) + doc = DocManager.AddDocument( + data['DocTitle'], + data.get('DocContent', ''), + SerieUUID=data.get('DocSerieUUID'), + Format=data.get('DocFormat', 'markdown'), + ) return Response({ 'code': 0, 'msg': '添加成功', @@ -171,7 +179,9 @@ class DocView(ELTAuthenticatedAPIView): buffer.getvalue(), content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document', ) - response['Content-Disposition'] = f'attachment; filename*=UTF-8\'\'{__import__("urllib.parse", fromlist=["quote"]).quote(filename)}' + # 同时提供 ASCII filename 与 RFC 5987 filename*(兼容各浏览器下载文件名) + quoted = __import__('urllib.parse', fromlist=['quote']).quote(filename) + response['Content-Disposition'] = f"attachment; filename=\"document.docx\"; filename*=UTF-8''{quoted}" return response @staticmethod @@ -186,7 +196,8 @@ class DocView(ELTAuthenticatedAPIView): '' ) response = HttpResponse(html, content_type='text/html; charset=utf-8') - response['Content-Disposition'] = f'attachment; filename*=UTF-8\'\'{__import__("urllib.parse", fromlist=["quote"]).quote(filename)}' + quoted = __import__('urllib.parse', fromlist=['quote']).quote(filename) + response['Content-Disposition'] = f"attachment; filename=\"document.html\"; filename*=UTF-8''{quoted}" return response @@ -204,19 +215,25 @@ class SerieView(ELTAuthenticatedAPIView): if action == 'AddSerie': ser = SerieAddSerializer(data=request.data) ser.IsValid(raise_exception=True) - DocManager.AddSeries(ser.ValidatedData) + data = ser.ValidatedData + DocManager.AddSeries({ + 'DocSerieName': data['DocSerieName'], + 'DocAuthorUserUUID': getattr(request.user, 'UserUUID', None), + }) return Response({'code': 0, 'msg': '添加成功'}, status=201) elif action == 'ModifySerieSettings': ser = SerieModifySerializer(data=request.data) ser.IsValid(raise_exception=True) data = ser.ValidatedData - ok, err = DocManager.ModifySerie(data['SerieUUID'], data) + ok, err = DocManager.ModifySerie(data['DocSerieUUID'], {'DocSerieName': data.get('DocSerieName')}) if not ok: return Response({'code': 1, 'msg': err or '系列不存在'}, status=404) return Response({'code': 0, 'msg': '修改成功'}) elif action == 'DeleteSerie': - serie_uuid = request.data.get('SerieUUID') - ok, err = DocManager.DeleteSerie(serie_uuid) + doc_serie_uuid = request.data.get('DocSerieUUID') + if not doc_serie_uuid: + return Response({'code': 1, 'msg': '缺少DocSerieUUID'}, status=400) + ok, err = DocManager.DeleteSerie(doc_serie_uuid) if not ok: return Response({'code': 1, 'msg': err or '系列不存在'}, status=404) return Response({'code': 0, 'msg': '删除成功'})