AI 写作助手界面优化说明

1. 概述

本文档旨在记录近期对 AI 写作助手用户界面(UI)进行的优化调整。主要内容包括界面布局的重新设计、桌面端与移动端的适配情况,以及初步的用户使用体验反馈。

2. 界面布局调整

本次更新的核心是对主编辑界面的布局进行了重构,旨在提升交互一致性与视觉美观度。

2.1 主要改动

将原本固定在编辑器功能区的“图片”按钮,调整为与“Unsplash”按钮风格一致的悬浮式设计。两个功能按钮均以独立、轻量的图标形式悬浮于编辑器两侧,保持了操作入口的清晰与统一。

2.2 桌面端布局效果

在桌面端(电脑端),优化后的布局采用了对称设计,以增强视觉平衡感与专业度:

  • Unsplash 按钮:悬浮于编辑器的右侧
  • AI 助手按钮:悬浮于编辑器的左侧

2.2.1 界面示意图

已知问题:在测试中发现,Unsplash 插件上传中文名称的图片后,返回的链接中包含多余的连字符(-------)。此问题已列入修复计划。

3. 移动端适配情况

3.1 当前显示状态

在移动设备上,由于屏幕尺寸和布局空间的限制,Unsplash 与 AI 助手两个功能图标可能出现位置不对称或重叠的情况。

备注:考虑到移动端用户体验的优先级与当前开发资源的分配,此次更新暂未对移动端布局进行深度调整。此不对称状态已被列为后续优化项

4. 使用体验反馈

4.1 功能价值评估

通过实际测试,AI 写作助手在辅助写作方面展现出显著价值。与传统手动写作方式相比,其主要优势体现在:

  • 提升写作效率:能够快速生成内容初稿或扩展现有段落。
  • 提供创作灵感:在思路枯竭时提供多样化的内容建议,帮助突破思维瓶颈。
  • 优化内容结构:辅助梳理文章逻辑、优化段落衔接。
  • 减少写作阻力:降低启动写作和持续创作的心理门槛。

4.2 用户行为观察

初步的使用数据与反馈显示,AI 助手的引入可能带来以下积极影响:

  • 增加写作频率:工具的便捷性和辅助性鼓励用户更频繁地进行内容创作。
  • 促进持续创作:有效的辅助功能有助于缓解写作过程中的压力,有助于培养更稳定的创作习惯。

文档更新日期:2026年1月
版本状态:桌面端优化已部署;移动端适配待后续优化


插件功能说明

概述

本插件目前已基本可用,旨在简化图片上传与管理流程。插件最初为 Unsplash 集成而设计,后扩展支持 Cloudflare R2 作为图床解决方案。

设计背景与演进

Unsplash 集成初衷

插件最初设计用于将 Unsplash 的摄影作品便捷插入博客系统。通过 Unsplash API 实现高质量图片的快速调用。

功能扩展与限制

发现 Unsplash 不适合作为常规图床使用,其定位更多是提供大分辨率摄影作品。因此开发方向调整为:

  1. 支持自定义图床解决方案
  2. 保留 Unsplash 图片集成的核心功能

Cloudflare R2 图床集成

核心功能

  • 图片存储:集成 Cloudflare R2 作为对象存储服务
  • CDN 加速:通过 Cloudflare CDN 实现全球加速
  • 智能缓存:自动管理图片缓存策略
  • 便捷删除:在插件界面直接管理已上传图片

技术特性

  • 支持多种图片格式
  • 保持原始图片质量
  • 自动生成缩略图
  • 响应式图片适配

用户界面展示

主界面

上传界面
界面针对移动端优化,支持各种屏幕尺寸

图片预览

预览功能
提供直观的图片预览体验

搜索功能

搜索界面
支持关键词快速定位图片

兼容性说明

  • 桌面端:完全支持
  • 移动端:针对小屏幕设备优化
  • 浏览器:兼容主流现代浏览器

图床插件测试报告

概述

本文档旨在测试不同图片源在Markdown文档中的显示效果和功能状态。测试涵盖三种图片源:自定义图床、Unsplash搜索和Unsplash个人相册。

测试环境与目的

  • 测试目的:验证不同图片源的加载性能、显示效果及元数据完整性
  • 测试方法:在Markdown文档中嵌入三种来源的图片并观察其表现
  • 评估维度:图片加载、样式渲染、版权信息显示、链接功能

测试用例详情

1. 自定义图床测试

来源:Cloudflare R2存储服务

测试图片
图床测试图片

配置参数

  • 样式:max-width:100%; border-radius:8px;
  • 存储服务:Cloudflare R2
  • 域名:自定义域名 (lonecho.com)

2. Unsplash搜索功能测试

来源:Unsplash API搜索接口

测试图片
above-cloud photo of blue skies

版权信息

Photo by Taylor Van Riper on Unsplash

技术参数

  • 查询关键词:sky
  • 图片ID:M3w3MTE5MjF8MHwxfHNlYXJjaHwyfHxza3l8ZW58MHx8fHwxNzY5NjUzNTI1fDA
  • 格式:JPEG (tinysrgb)
  • 尺寸:1080px宽度

3. Unsplash相册功能测试

来源:Unsplash个人收藏相册

测试图片
a close up of a green leaf with drops of water on it

版权信息

Photo by Clay Banks on Unsplash

技术参数

  • 相册标识:收藏集ID
  • 图片ID:M3w3MTE5MjF8MHwxfGNvbGxlY3Rpb258MXxnNWlEMmJHTXlMOHx8fHx8Mnx8MTc2OTY5NDIxOXw
  • 处理参数:裁剪(entropy)、色彩空间(tinysrgb)

样式一致性检查

所有图片应用了统一的显示样式:

  • max-width: 100% - 响应式宽度适配
  • border-radius: 8px - 圆角视觉效果
  • 版权信息样式:12px字体、#666颜色、上边距8px、1.4行高

待观察问题与评估要点

  1. 加载性能:不同来源图片的加载速度和成功率
  2. 显示效果:图片清晰度、色彩保真度、响应式适配
  3. 功能完整性

    • Unsplash图片的版权信息显示
    • 摄影师链接的可访问性
    • UTM参数追踪功能
  4. 技术兼容性

    • Markdown语法与HTML混合渲染
    • 长URL在文档中的可读性
    • 特殊字符处理

结论与建议

请基于以上测试结果,评估以下方面:

  1. 三种图片源的实际表现差异
  2. 当前实现方案的不足之处
  3. 可能的优化建议和改进方向

文档版本:1.0 | 测试日期:2026年1月(根据图片URL推断)


基于 Cloudflare Workers 与 R2 的博客图片代理部署指南

本文详细介绍了如何利用 Cloudflare WorkersR2 存储桶搭建一个为博客服务的图片代理服务。该方案能够实现图片的高效托管、跨域访问与长期缓存,从而提升博客的图片加载速度与兼容性。


一、方案概述

整个方案分为三个核心步骤:

  1. 配置 R2 存储桶:创建存储桶,开启公共访问,并配置 CORS 策略。
  2. 部署 Workers 代理:编写并部署一个 Worker 脚本,用于代理和缓存图片请求。
  3. 绑定自定义域名:为 Workers 服务配置自定义域名(如博客域名),完成服务集成。

最终实现一个高效、可缓存且支持跨域的博客图片托管与代理服务。


二、配置 Cloudflare R2 存储桶

2.1 创建存储桶并开启公共访问

  1. 在 Cloudflare 控制台中创建 R2 存储桶。
  2. 为该存储桶开启 公共开发 URL,以便通过固定域名访问桶内资源。

2.2 配置 CORS 策略

为允许您的博客域名跨域访问图片,需在 R2 存储桶设置中添加 CORS 策略。

配置示例(JSON):

[
  {
    "AllowedOrigins": [
      "https://lonecho.com",
      "https://www.lonecho.com"
    ],
    "AllowedMethods": [
      "GET"
    ],
    "AllowedHeaders": [
      "*"
    ],
    "MaxAgeSeconds": 3600
  }
]
说明:此策略仅允许来自指定域名的 GET 请求,预检请求缓存时间为 3600 秒。其余配置可保持默认。

配置截图参考:

  • 存储桶概览与公共 URL 设置
    设置.png
  • CORS 策略配置界面 (1)
    屏幕截图 2026-01-28 221219.png
  • CORS 策略配置界面 (2)
    屏幕截图 2026-01-28 221335.png

三、部署 Cloudflare Workers 代理服务

3.1 创建应用

在 Cloudflare 控制台的 Workers 和 Pages 中创建新应用,选择 helloworld 模板。

3.2 部署代理脚本

将模板代码替换为以下脚本,并R2_PUBLIC_URL 修改为您自己的 R2 公共域名

// 配置:你的 R2 存储桶的公共访问域名
const R2_PUBLIC_URL = 'https://pub-b6f3这里是公共开发 URL 11.r2.dev'; // 请替换为你的实际域名

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);
    const path = url.pathname;

    // 记录请求日志
    console.log(`[${new Date().toISOString()}] ${request.method} ${path}`);

    // 根路径返回服务说明
    if (path === '/') {
      return new Response('Image Proxy Service for Blog\n访问 https://blog.lonecho.com/图片文件名.jpg 使用', {
        headers: { 'content-type': 'text/plain;charset=UTF-8' }
      });
    }

    // 仅允许图片文件
    const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.bmp', '.ico'];
    const isImageRequest = imageExtensions.some(ext => path.toLowerCase().endsWith(ext));
    
    if (!isImageRequest) {
      return new Response('Only image files are allowed', { status: 400 });
    }

    // 仅允许 GET 请求
    if (request.method !== 'GET') {
      return new Response('Method not allowed', { status: 405 });
    }

    // 构造 R2 图片 URL
    const imageUrl = `${R2_PUBLIC_URL}${path}`;

    // 利用 Cloudflare 缓存
    const cacheKey = new Request(imageUrl, request);
    const cache = caches.default;

    let response = await cache.match(cacheKey);

    if (!response) {
      console.log(`Cache miss: ${path}`);
      
      // 缓存未命中,从 R2 获取图片
      response = await fetch(imageUrl);

      if (response.status === 404) {
        console.log(`Image not found: ${path}`);
        return new Response('Image not found', { status: 404 });
      }

      // 复制响应以便缓存
      response = new Response(response.body, response);

      // 设置缓存控制头:30 天
      response.headers.set('cache-control', 'public, max-age=2592000, immutable');
      response.headers.set('cdn-cache-control', 'max-age=2592000');
      
      // 添加 CORS 头,允许跨域访问
      response.headers.set('access-control-allow-origin', '*');
      response.headers.set('access-control-allow-methods', 'GET, HEAD');

      // 存入缓存
      ctx.waitUntil(cache.put(cacheKey, response.clone()));
    } else {
      console.log(`Cache hit: ${path}`);
    }

    return response;
  }
};

脚本功能说明:

  • 请求过滤:仅代理图片文件(如 .jpg, .png 等)的 GET 请求。
  • 缓存机制:利用 Cloudflare 全球缓存,为图片设置 30 天(2592000 秒)的长期缓存。
  • CORS 支持:在响应中添加 Access-Control-Allow-Origin: * 等头部,确保跨域访问正常。
  • 日志记录:输出缓存命中/未命中及错误日志,便于调试。

四、配置自定义域名与测试

4.1 绑定自定义域名

在 Workers 应用设置中,添加您的博客域名(例如 https://blog.lonecho.com)作为自定义域名。

配置截图参考:
屏幕截图 2026-01-28 222032.png

4.2 服务测试

部署完成后,建议使用专业工具进行测试,以确保缓存策略与 CORS 配置生效。

推荐测试工具:

  • REDbot:用于检查 HTTP 缓存和 CORS 头部。
  • 浏览器开发者工具:检查网络请求的 Response Headers,确认 cache-controlaccess-control-allow-origin 等字段是否正确返回。

五、总结

通过以上步骤,您已经成功搭建了一个基于 Cloudflare 生态的图片代理服务。此方案具有以下优势:

  1. 性能优异:利用 Cloudflare 全球边缘网络和缓存,大幅提升图片加载速度。
  2. 成本可控:R2 存储定价低廉,Workers 免费额度足以应对中小型博客流量。
  3. 配置灵活:通过 Workers 脚本可轻松定制缓存策略、访问规则和错误处理。
  4. 维护简单:无需自建服务器,所有服务均在 Cloudflare 平台统一管理。

现在,您可以在博客中使用形如 https://blog.lonecho.com/图片文件名.jpg 的链接来访问托管在 R2 中的图片了。


好的,已为您润色。以下提供了两个版本,均保持了原文的核心意思和Markdown格式,但在表达上更为流畅和专业。

屏幕截图 2026-01-27 233606.png

ai.png

ai2.png

ai3.png

版本一 (偏向简洁、直接)

这是一个测试页面。

我忽然想到,我最喜欢的AI助手是智谱AI。因为它不仅功能强大,更重要的是,它为我提供了免费使用的渠道,这恰好能巧妙地遮蔽我囊中羞涩的现实


版本二 (偏向书面、文雅)

这是一个测试页面。

我忽然想到,我最偏爱的AI助手是智谱AI。其最大的吸引力,在于它慷慨的免费使用政策。这让我在享受前沿科技便利的同时,也能体面地遮掩囊中羞涩,免于为高昂费用而烦恼。


润色说明:

  1. 逻辑梳理:将原文的两个句子整合成一个更连贯的段落,阐明了“免费”是“喜欢”智谱AI的核心原因,并自然地引出了“囊中羞涩”这个略显幽默的自嘲。
  2. 词语优化

    • 将“免费的智谱”优化为“智谱AI”或“智谱AI(因为它不仅功能强大...)”,表述更完整、专业。
    • 将“通过免费使用”优化为“提供了免费使用的渠道”或“慷慨的免费使用政策”,语言更书面化。
    • 将“遮蔽我的囊中羞涩”这个略显生硬的表达,优化为“遮蔽我囊中羞涩的现实”或“体面地遮掩囊中羞涩,免于为高昂费用而烦恼”,使其在保留自嘲幽默感的同时,表达更加流畅、自然且易于理解。
  3. 风格统一:两个版本都保持了原文作为个人测试页面的随笔风格,但提升了语言的专业度和流畅度,使表达更加得体。您可以根据自己的偏好选择其一。