V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
wuhen8
V2EX  ›  分享创造

分享一个 macOS 风格的 Web 桌面文件管理系统,包含 Go 后端和 React 前端。支持窗口管理、代码编辑、终端模拟、Docker 管理、视频/音乐播放、AI 对话与 Skills 扩展等功能。

  •  
  •   wuhen8 · 7 小时 39 分钟前 · 262 次点击

    全 AI 编写,没写一行代码,go 后端,React 前端,ai 还是比较适合写 React

    功能特性

    后端

    • RESTful API + WebSocket 实时通信
    • 文件/文件夹 CRUD 操作
    • 分片上传(支持 S3 直传)
    • JWT 认证机制
    • Docker Compose 管理
    • 终端 WebSocket 代理
    • 定时任务管理
    • AI 对话 + Skills 扩展系统
    • 多存储驱动(本地文件系统、S3/MinIO )

    前端

    • macOS 风格桌面体验(窗口拖拽、缩放、吸附、最大化/最小化)
    • 16 个模块化应用(文件管理器、代码编辑器、终端、Docker 管理、AI 对话等)
    • Monaco Editor 代码编辑(语法高亮、格式化)
    • xterm.js 终端模拟器
    • ArtPlayer 视频播放器
    • 音乐播放器(播放列表、循环、随机)
    • Markdown 预览( GFM + 代码高亮)
    • Spotlight 搜索( Cmd+K )
    • 右键上下文菜单系统
    • 全局快捷键
    • 主题与偏好设置(壁纸、Dock 大小、编辑器主题等)
    • 应用商店(安装/卸载扩展应用)

    Skills 系统

    Skills 是 AI 对话功能的扩展机制,允许你为 AI 添加自定义知识(提示词)或可执行工具(脚本)。

    Skills 目录位于 {FM_DATA_DIR}/skills/(默认 /opt/file-manager/skills/),启动时自动创建。

    Skill 类型

    1. 提示词 Skill ( Prompt Skill )

    为 AI 注入额外的上下文知识,支持两种格式:

    社区格式(推荐) — 子目录 + SKILL.md

    skills/
    └── my-knowledge/
        └── SKILL.md
    

    SKILL.md 支持 YAML frontmatter:

    ---
    name: my-knowledge
    description: 自定义知识描述
    ---
    
    这里是提示词内容,AI 对话时会自动加载。
    

    根级文件(旧格式) — 直接放置 .md.txt 文件:

    skills/
    └── my-prompt.md
    

    单个提示词文件最大 20KB ,所有提示词总计最大 200KB 。

    2. 脚本工具 Skill ( Script Tool Skill )

    让 AI 能够调用自定义脚本执行操作(如读取 Excel 、调用外部 API 等)。脚本在 Docker 沙箱容器中隔离执行。

    子目录格式(推荐)meta.json + main.py / main.sh

    skills/
    └── read_excel/
        ├── meta.json
        └── main.py
    

    meta.json 定义工具的名称、描述和参数:

    {
      "name": "read_excel",
      "description": "读取 Excel 文件内容",
      "parameters": {
        "type": "object",
        "properties": {
          "file_path": {
            "type": "string",
            "description": "文件路径"
          }
        },
        "required": ["file_path"]
      }
    }
    

    main.py 中通过 ARGS 获取参数:

    # ARGS 是一个 dict ,包含 AI 传入的参数
    file_path = ARGS["file_path"]
    # 你的处理逻辑...
    print(result)
    

    main.sh 中通过 $ARGS 环境变量获取 JSON 参数:

    echo "$ARGS" | jq -r '.file_path'
    # 你的处理逻辑...
    

    根级文件(旧格式).py/.sh + 同名 .json

    skills/
    ├── read_excel.py
    └── read_excel.json
    

    沙箱配置

    脚本工具 Skill 在 Docker 沙箱容器中执行,需要:

    1. 预先创建并启动一个 Docker 容器(默认名称 fm-sandbox,可通过 FM_SANDBOX_CONTAINER 环境变量修改)
    2. 将 Skills 目录挂载到容器的 /skills/ 路径

    示例:

    docker run -d --name fm-sandbox \
      -v /opt/file-manager/skills:/skills:ro \
      python:3.11-slim \
      sleep infinity
    

    技术栈

    后端

    • Go + Gin Web Framework
    • JWT Authentication ( golang-jwt )
    • WebSocket ( gorilla/websocket )
    • Docker SDK
    • S3/MinIO ( minio-go )
    • SQLite ( modernc.org/sqlite

    前端

    • React 18 + TypeScript
    • Vite 5 (构建工具)
    • Zustand (状态管理)
    • Tailwind CSS 4
    • shadcn/ui ( Radix UI + Tailwind )
    • Monaco Editor (代码编辑)
    • xterm.js (终端)
    • ArtPlayer (视频播放)
    • framer-motion (动画)
    • Axios ( HTTP 请求)
    • lucide-react (图标)

    环境变量

    变量名 说明 默认值
    FM_DATA_DIR 应用数据目录,存放数据库、Skills 、配置等 /opt/file-manager
    FM_PORT 服务监听端口 8080
    FM_JWT_SECRET JWT 签名密钥。未设置时每次启动随机生成,重启后所有已签发的 Token 失效 随机 32 字节
    FM_SANDBOX_CONTAINER AI Skills 脚本执行所用的 Docker 沙箱容器名称 fm-sandbox

    示例:

    export FM_DATA_DIR=/data/file-manager
    export FM_PORT=9090
    export FM_JWT_SECRET=your-secret-key
    export FM_SANDBOX_CONTAINER=my-sandbox
    

    大家可以在这里体验一下 https://huggingface.co/spaces/wuhenba/webos https://wuhenba-webos.hf.space/ 密码: Admin@123

    二进制包也在这里可以下载

    1 条回复    2026-02-14 17:12:54 +08:00
    Moyyyyyyyyyyye
        1
    Moyyyyyyyyyyye  
    PRO
       7 小时 8 分钟前
    我更希望自己的产品介绍自己写,ai 写的看的有用的信息密度太低了,个人见解
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1293 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 16:21 · PVG 00:21 · LAX 08:21 · JFK 11:21
    ♥ Do have faith in what you're doing.