更新日志

2025-07-01:增强网站设置功能与KV数据库集成

功能更新

  1. 网站前台动态配置

    • 将网站前台页面中的硬编码设置替换为从KV数据库动态读取
    • 通过管理后台更新的设置会立即反映在前台页面
    • 支持实时更新网站名称、SEO信息和页面元数据
  2. 网站设置数据结构

    • 集中管理基本设置:网站名称、域名、描述信息
    • SEO设置:添加关键词和元描述标签
    • 搜索引擎优化:支持自定义robots.txt内容
  3. 容错机制

    • 添加默认设置作为回退方案,确保即使KV读取失败也能正常显示页面
    • 优化错误处理流程,增加日志记录,便于故障排查
    • 实现设置缓存机制,提高页面加载性能

技术实现

  1. 模板系统改进:

    // 默认的网站设置,如果从KV中读取失败则使用这些值
    const DEFAULT_SITE_SETTINGS = {
      siteName: 'CloudDocs',
      siteDomain: 'docs.example.com',
      siteDescription: '基于 Cloudflare Workers 的在线文档系统,提供快速、可靠的文档托管服务。',
      seoKeywords: '文档, API, Markdown, 云端, Cloudflare',
      metaDescription: 'CloudDocs是一个基于Cloudflare Workers的文档系统,提供高性能、易用的文档托管服务,支持Markdown格式和自动索引。',
      robotsTxt: 'User-agent: *\nAllow: /\nSitemap: https://docs.example.com/sitemap.xml'
    };
    
    // 生成HTML页面的模板函数,新增设置参数
    export function getPageTemplate(title, content, currentPath = '', activeGroup = '', siteSettings = null) {
      // 使用传入的网站设置或默认设置
      const settings = siteSettings || currentSiteSettings || DEFAULT_SITE_SETTINGS;
      
      // 使用设置中的siteName作为标题前缀
      const pageTitle = title.includes(settings.siteName) ? title : `${title} - ${settings.siteName}`;
      
      // ...页面HTML生成
    }
    
  2. KV存储读取:

    // 从KV存储获取网站设置
    async function getSiteSettings(c) {
      try {
        // 从KV存储获取设置
        const settingsJson = await c.env.DOCS.get('_site_settings');
        
        // 如果设置存在,解析并返回
        if (settingsJson) {
          return JSON.parse(settingsJson);
        }
        
        // 如果设置不存在,返回null (模板函数会使用默认值)
        return null;
      } catch (error) {
        console.error('获取网站设置失败:', error);
        return null;
      }
    }
    
  3. 设置数据全局管理:

    // 当前页面使用的站点设置
    let currentSiteSettings = null;
    
    // 设置当前网站设置
    export function setSiteSettings(settings) {
      currentSiteSettings = settings;
    }
    

新增和修改文件

  • src/worker/docs/template.js:增加网站设置参数和默认值,优化模板生成函数
  • src/worker/docs/routes.js:添加从KV获取设置的功能,并将设置传递给模板
  • public/js/theme.js:优化主题切换脚本,确保与动态设置兼容

使用体验改进

  • 管理员可通过后台界面一键更新网站信息,无需修改代码
  • 网站标题、描述、关键词等元素统一管理,确保一致性
  • 新增的robots.txt支持改进了网站的SEO优化能力
  • 访问者获得个性化的网站体验,反映站点的实际配置

2025-04-03:添加后台管理功能与优化代码结构

功能更新

  1. 添加管理后台

    • 新增管理控制台页面,包含统计数据和运营信息
    • 实现站点设置页面,用于更新网站基本信息
    • 添加文档管理功能,支持查看和管理所有文档
  2. 代码架构优化

    • 重构项目结构,采用更模块化的组织方式
    • 将前台和后台模板分离,提高代码可维护性
    • 路由处理逻辑模块化,按功能划分为独立文件
  3. 技术改进

    • 优化路由注册机制,提高代码复用性
    • 统一应用初始化流程,简化入口文件
    • 改进静态资源服务,支持后台管理界面资源

技术实现

  1. 管理页面模板:

    // 生成管理页面HTML模板
    export function getAdminTemplate(title, content, currentPath = '') {
      return `<!DOCTYPE html>
      <html lang="zh-CN">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>${title} - 管理控制台</title>
        <link href="/css/styles.css" rel="stylesheet">
        <!-- 其他资源引用 -->
      </head>
      <body>
        <!-- 管理后台界面结构 -->
      </body>
      </html>`;
    }
    
  2. 模块化路由处理:

    // 注册管理页面路由
    export function registerAdminRoutes(app) {
      // 管理控制台首页
      app.get('/admin', async (c) => {
        // 控制台逻辑实现
      });
    
      // 站点设置页面
      app.get('/admin/site-settings', async (c) => {
        // 站点设置逻辑实现
      });
    
      // 文档管理页面
      app.get('/admin/docs', async (c) => {
        // 文档管理逻辑实现
      });
    }
    

新增和修改文件

  • src/worker/admin/template.js:新增管理页面HTML模板生成
  • src/worker/admin/routes.js:新增管理路由处理逻辑
  • src/worker/docs/template.js:从原template.js移动的前台文档模板
  • src/worker/docs/routes.js:文档相关路由处理
  • src/worker/index.js:统一的应用初始化模块
  • src/index.js:简化的应用入口文件

使用体验改进

  • 管理后台提供直观的数据统计和文档管理界面
  • 站点设置功能使网站信息更新更加便捷
  • 模块化的代码结构便于未来功能扩展和维护
  • 统一的页面风格和交互体验,确保一致性

2025-06-01:优化首页导航体验

功能更新

  1. 首页导航自动折叠

    • 修改首页打开时的导航行为,默认折叠所有一级导航组
    • 改进导航组激活状态的显示逻辑,保持界面整洁
    • 统一了所有页面的导航交互体验
  2. 导航组交互优化

    • 完善学习资料组的展开与激活逻辑,修复显示问题
    • 确保点击导航组链接后,相应的导航组保持展开状态
    • 优化导航组间的切换效果,避免同时展开多个导航组

技术实现

  1. src/index.js中:

    // 首页路由不激活任何导航组,保持所有导航折叠
    return new Response(getPageTemplate('在线文档', html, '', ''), { headers });
    
  2. src/template.js中:

    // 处理没有活动组的情况(如首页)
    if (activeGroup) {
      // 代码处理有活动组的情况,展开当前活动组
    } else {
      // 如果没有活动组(比如在首页),折叠所有导航组
      document.querySelectorAll('.nav-group-header').forEach(header => {
        header.classList.remove('expanded');
        header.querySelector('svg').style.transform = 'rotate(-90deg)';
        const group = header.getAttribute('data-group');
        const content = document.getElementById(group + 'Content');
        if (content) {
          content.classList.remove('expanded');
        }
      });
    }
    

新增和修改文件

  • src/index.js:修改首页路由处理,将activeGroup参数设为空字符串
  • src/template.js:增加处理没有活动导航组情况的逻辑

使用体验改进

  • 首次访问网站时导航保持折叠状态,界面更加整洁
  • 在文档页面间导航时,相关导航组会智能展开和折叠
  • 改善了学习资料组的交互体验,修复了展开和高亮问题
  • 整体导航交互更加一致,提升用户体验

2025-05-20:添加代码块复制功能

功能更新

  1. 代码块复制功能

    • 在每个代码块右上角添加复制按钮
    • 鼠标悬停在代码块上时显示复制按钮
    • 点击按钮复制代码内容到剪贴板
    • 提供视觉反馈指示复制成功或失败
  2. 用户体验改进

    • 设计简洁的复制按钮样式,适配亮色和暗色模式
    • 添加按钮悬停效果和提示文本
    • 适配各种屏幕尺寸
    • 实现无障碍支持,包括适当的ARIA标签

技术实现

  1. JavaScript复制功能:

    // 复制代码到剪贴板
    navigator.clipboard.writeText(code)
      .then(() => {
        // 复制成功,显示反馈
        copyButton.classList.add('success');
        tooltip.textContent = '已复制!';
      })
      .catch((err) => {
        // 复制失败,显示错误
        copyButton.classList.add('error');
        tooltip.textContent = '复制失败';
      });
    
  2. 兼容性处理:

    // 对于不支持Clipboard API的浏览器提供回退方法
    function fallbackCopyTextToClipboard(text) {
      const textArea = document.createElement('textarea');
      textArea.value = text;
      document.body.appendChild(textArea);
      textArea.select();
      document.execCommand('copy');
      document.body.removeChild(textArea);
    }
    

新增和修改文件

  • public/js/code-copy.js:新增复制代码功能的JavaScript实现
  • src/css/input.css:添加复制按钮的样式和交互状态
  • src/template.js:在HTML模板中引入复制代码脚本

使用体验改进

  • 用户可以通过简单点击快速复制代码,提高效率
  • 直观的视觉反馈指示操作结果
  • 优雅的动画和过渡效果增强用户体验
  • 适配移动端和桌面端的不同交互需求

2025-05-15:增加暗黑模式支持

功能更新

  1. 暗黑模式支持

    • 新增网站暗黑模式切换功能,提升用户阅读体验
    • 自动检测系统偏好设置,支持手动切换
    • 增加主题切换按钮,方便用户随时切换
    • 所有元素适配暗黑模式,提供良好的视觉体验
  2. 暗黑模式界面优化

    • 精心设计的暗色配色方案,减少用眼疲劳
    • 优化代码块、表格、图片等元素在暗黑模式下的显示效果
    • 特别优化了阅读核心内容的对比度和可读性
    • 保持品牌色调的一致性和辨识度
  3. 技术升级

    • 更新Tailwind CSS配置,启用"class"模式的暗黑模式策略
    • 为所有UI组件添加暗黑模式样式变体
    • 优化CSS构建流程,减小最终样式文件体积
    • 添加主题持久化存储,记住用户的主题偏好

技术实现

  1. tailwind.config.js中:

    module.exports = {
      darkMode: 'class',
      // 其他配置
      theme: {
        extend: {
          // 暗黑模式排版配置
          typography: {
            dark: {
              css: {
                color: '#e5e7eb',
                'h1, h2, h3, h4': {
                  color: '#f3f4f6',
                },
                // 其他暗黑模式文本样式
              },
            },
          },
        },
      },
    }
    
  2. 主题切换JavaScript:

    // 检查当前主题,如果是暗黑模式则添加dark类
    if (localStorage.theme === 'dark' || 
        (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
      document.documentElement.classList.add('dark')
    } else {
      document.documentElement.classList.remove('dark')
    }
    
    // 主题切换事件监听
    themeToggle.addEventListener('click', () => {
      const isDark = document.documentElement.classList.toggle('dark');
      localStorage.theme = isDark ? 'dark' : 'light';
    });
    

新增和修改文件

  • tailwind.config.js:更新暗黑模式配置
  • public/js/theme.js:新增主题切换逻辑
  • src/css/input.css:为所有组件添加暗黑模式样式
  • src/template.js:更新HTML模板,添加暗黑模式切换按钮
  • src/index.js:添加JS静态文件服务配置

使用体验改进

  • 用户可以通过顶部菜单中的主题切换按钮切换亮/暗模式
  • 网站会记住用户的主题偏好,下次访问时自动应用
  • 首次访问时会根据用户的系统设置自动应用相应主题
  • 所有内容在暗黑模式下更易于阅读,减少视觉疲劳

2025-05-01:CloudDocs v2.0 正式发布

我们很高兴地宣布 CloudDocs v2.0 正式发布!这是一次重大更新,带来了全面的用户体验优化和功能增强。详细发布说明请查看v2.0版本说明

主要更新亮点

  1. 导航系统重构:多级导航支持、智能折叠、动态高亮
  2. 性能优化:页面加载速度提升、懒加载支持、缓存策略优化
  3. 文档功能增强:搜索功能增强、学习资料分区、版本控制
  4. 界面设计升级:视觉风格优化、响应式布局完善、无障碍设计

安装与升级

从 v1.x 升级到 v2.0 的步骤:

# 拉取最新代码
git pull origin v2.0

# 安装新依赖
npm install

# 部署更新
wrangler deploy

2025-04-15:优化导航系统和用户界面

功能更新

  1. 导航菜单交互优化

    • 修改了左侧导航菜单的展开/折叠逻辑,提供更平滑的用户体验
    • 添加了视觉指示器(箭头动画),明确显示导航状态
    • 优化了移动端和桌面端的导航行为
  2. 导航结构优化

    • 新增"学习资料"一级导航分类
    • 包含教程指南、示例代码和最佳实践等子项
    • 保持与文档导航一致的视觉风格
  3. 二级导航样式升级

    • 为活动状态的导航项添加背景色和文本颜色变化
    • 改进悬停效果,提供更好的视觉反馈
    • 确保当前页面导航项突出显示,便于用户定位
  4. 文档编码优化

    • 修复了文件的中文字符编码问题
    • 确保所有中文显示正常,避免乱码

技术实现

  1. src/template.js中:

    // 添加导航组折叠/展开功能
    document.querySelectorAll('.nav-group-header').forEach(header => {
      // 根据当前路径初始化展开状态
      if (currentPath.startsWith('/' + group + '/')) {
        header.classList.add('expanded');
        content.classList.add('expanded');
        header.querySelector('svg').style.transform = 'rotate(0deg)';
      }
    
      // 点击标题切换展开状态
      header.addEventListener('click', (e) => {
        // ...展开/折叠逻辑
      });
    });
    
  2. 新增二级导航激活样式:

    /* 激活状态样式 */
    .nav-group-item.active {
      background-color: rgba(14, 165, 233, 0.1);
      color: #0EA5E9;
      font-weight: 500;
    }
    
    .nav-group-item.active:hover {
      background-color: rgba(14, 165, 233, 0.15);
    }
    

新增和修改文件

  • upload-single-doc.js:修复了编码问题,确保中文正常显示
  • src/template.js:更新了导航菜单的HTML结构、CSS样式和JavaScript交互逻辑

使用体验改进

  • 访问特定文档页面时,对应的导航分类会自动展开
  • 当前页面的导航项会高亮显示
  • 可通过点击一级分类标题展开/折叠子项
  • 导航逻辑更加智能,能够根据当前页面路径自动适应

2025-04-01:修复KV文档上传BUG

问题描述

在使用Wrangler上传文档到Cloudflare KV存储时,发现使用--binding=DOCS参数的方法只能更新本地KV存储,而无法将文档实际上传到Cloudflare的远程KV存储。

原因分析

  1. Wrangler命令行工具在使用--binding参数时,默认只操作本地KV存储,除非特别指定--remote标志。
  2. 使用--namespace-id参数可以直接操作远程KV存储,更加可靠。

解决方案

  1. 修改上传脚本,替换--binding=DOCS--namespace-id=<ID>参数
  2. 添加--remote标志确保操作的是远程KV存储
  3. 在文件验证过程中也使用相同的参数设置
  4. 创建单文件上传工具以简化特定文档的更新流程

具体修改

  1. upload-docs.js中:

    // 旧代码
    const uploadCommand = `wrangler kv key put --binding=DOCS "${fileName}" --path="${filePath}"`;
    
    // 新代码
    const namespaceId = 'bafaf13435d348f59e9aa2b8917ac339';
    const uploadCommand = `wrangler kv key put --namespace-id ${namespaceId} "${fileName}" --path="${filePath}" --remote`;
    
  2. list-docs.js中:

    // 旧代码
    const command = `wrangler kv key list --binding=DOCS`;
    
    // 新代码
    const namespaceId = 'bafaf13435d348f59e9aa2b8917ac339';
    const command = `wrangler kv key list --namespace-id=${namespaceId} --remote`;
    
  3. 创建了新的upload-single-doc.js工具,提供交互式界面选择和上传单个文档。

上传流程

  1. 使用修改后的脚本上传文档到KV存储
  2. 运行wrangler deploy命令部署Worker应用
  3. 验证文档是否已更新

注意事项

  • 使用--namespace-id参数时不需要指定环境(--env)
  • 上传后需要重新部署Worker才能让更改生效
  • 命名空间ID可在wrangler.toml配置文件中找到