一个现代化的壁纸上传管理后台,支持 GitHub OAuth 登录、AI 智能分类、图片管理和工作流自动化。
- GitHub OAuth 登录 - 安全的 OAuth 认证
- Token 登录 - 支持 Personal Access Token
- 权限分级 - 管理员 / 可写 / 只读 / 无权限
- 权限标签显示 - 导航栏实时显示当前权限
- 多 AI Provider - ModelScope(推荐)、Groq、NVIDIA NIM、Cloudflare Workers AI
- 自动分类 - 上传图片后自动识别类型并推荐三级分类
- 智能命名 - AI 生成 2 个中文文件名建议(8-15 汉字)
- 关键词提取 - 自动提取图片关键词和描述
- 诗意标题 - 生成 8-15 字的诗意中文标题
- 分类匹配度 - 显示分类是否完美匹配现有体系
- 新分类建议 - AI 可建议新的分类(如新 IP、明星等)
- 分类逻辑说明 - 展示 AI 的分类决策链
- 批量处理 - 支持批量上传并并发分析(最多 3 并发)
- 多种提示词模板 - 分类+文件名、仅文件名、自定义
- 三级分类体系 - Desktop / Mobile / Avatar 三个系列
- 树形结构 - 支持一级和二级分类
- 新建分类 - 可写权限用户可创建分类
- 拖拽上传 - 支持拖拽文件和文件夹
- 批量上传 - 支持多文件同时上传,超 50 张显示预计时间
- 多目录上传 - 单次上传支持不同文件指定不同目标目录
- AI 模式 / 手动模式 - 可切换 AI 自动分类或手动选择分类
- 重复检测 - 基于内容 Hash 检测重复上传(30 天 / 最多 500 条)
- 大图压缩 - 超过 20MB 自动压缩,支持 8K 分辨率
- 实时预览 - 上传前图片预览和信息展示
- 进度显示 - 圆形进度条显示上传状态
- 失败重试 - 上传失败文件支持一键重试
- 一键触发 - 触发图片处理工作流
- 状态监控 - 实时显示工作流运行状态
- 版本回滚 - 管理员可回滚到上一版本
- 壁纸统计 - 显示各分类壁纸总数和增量
- 发布历史 - 查看历史发布记录、趋势图和发布者
- 上传历史 - 本地上传记录查看
- 毛玻璃设计 - 现代化暗色主题
- 渐变配色 - 紫色渐变主题色
- 响应式布局 - 适配不同屏幕尺寸
- 流畅动画 - GSAP 驱动的过渡动画
| 类别 | 技术 |
|---|---|
| 框架 | Vue 3 + Composition API |
| 构建 | Vite 7 |
| UI | Element Plus |
| 状态 | Pinia |
| 动画 | GSAP |
| 样式 | SCSS + CSS Variables |
| AI | ModelScope / Groq / NVIDIA NIM / Cloudflare Workers AI |
| 规范 | ESLint + Prettier + Husky |
Fork 本项目? 请先阅读 自托管部署指南,了解如何配置自己的图床仓库、GitHub OAuth 和 AI API Key。
上传页分类怎么自定义? 当前上传页优先读取目标仓库中的远端 manifest。请参考 自托管部署指南 和示例文件 upload-workspace.manifest.example.json。
配置原则:优先使用环境变量、运行时设置页配置和目标仓库中的远端 manifest;不建议 fork 后直接改源码里的默认值。
- Node.js >= 18
- pnpm >= 8
# 1. 克隆仓库
git clone https://github.com/your-org/wallpaper-gallery-studio.git
cd wallpaper-gallery-studio
# 2. 安装依赖
pnpm install
# 3. 配置环境变量
cp .env.example .env.local
# 编辑 .env.local,填入你的 API Key
# 4. 启动开发服务器
pnpm devpnpm dev # 启动开发服务器(含 NVIDIA API 本地代理)
pnpm build # 构建生产版本
pnpm lint # 代码检查
pnpm format # 代码格式化wallpaper-gallery-studio/
├── public/ # 静态资源
│ └── hash-worker.js # Web Worker(文件 Hash 计算)
├── worker/
│ └── ai-proxy.js # Cloudflare Worker(Cloudflare AI 代理)
├── src/
│ ├── components/
│ │ ├── ai/ # AI 相关组件
│ │ │ ├── AIAssistantPanel.vue # AI 工坊主面板
│ │ │ ├── AIProviderSelector.vue # Provider 选择器
│ │ │ ├── CredentialsConfig.vue # 凭证配置
│ │ │ ├── PromptTemplateSelector.vue
│ │ │ └── ResultCard.vue # 分析结果卡片
│ │ ├── upload/ # 上传相关组件
│ │ │ ├── UploadPanel.vue # 主上传面板
│ │ │ ├── UploadPanel/ # 上传面板子组件
│ │ │ │ ├── UploadHeader.vue # 头部(模式切换、AI 配置)
│ │ │ │ ├── UploadDropzone.vue # 拖拽上传区域
│ │ │ │ ├── UploadFileGrid.vue # 文件网格容器
│ │ │ │ └── UploadFileItem.vue # 单个文件卡片
│ │ │ ├── CategorySidebar.vue # 分类侧边栏
│ │ │ ├── WorkflowPanel.vue # 工作流面板
│ │ │ ├── WallpaperStatsBar.vue # 壁纸统计栏
│ │ │ ├── UploadProgressModal.vue # 上传进度弹窗
│ │ │ └── ReleaseHistoryModal.vue # 发布历史弹窗
│ │ ├── common/
│ │ │ ├── AnimatedNumber.vue # 数字动画组件
│ │ │ └── CustomSelect.vue # 自定义下拉框
│ │ ├── GlassCard.vue
│ │ ├── GradientBackground.vue
│ │ ├── MainLayout.vue
│ │ ├── Toast.vue
│ │ └── ConfirmDialog.vue
│ ├── composables/
│ │ └── useAnimation.js
│ ├── config/
│ │ ├── categories.js # 一级 / 二级分类配置
│ │ ├── subcategories.js # 三级分类配置
│ │ └── oauth.js # OAuth 配置
│ ├── router/ # 路由配置
│ ├── services/
│ │ ├── ai/
│ │ │ ├── core/ # AI 核心层(共享)
│ │ │ │ ├── providers/
│ │ │ │ │ ├── base-provider.js # Provider 基类
│ │ │ │ │ ├── cloudflare-provider.js # Cloudflare Workers AI
│ │ │ │ │ ├── groq-provider.js # Groq AI
│ │ │ │ │ ├── nvidia-provider.js # NVIDIA NIM
│ │ │ │ │ ├── modelscope-provider.js # ModelScope
│ │ │ │ │ └── index.js # Provider 工厂
│ │ │ │ ├── image-processor.js # 图片压缩处理
│ │ │ │ └── index.js
│ │ │ ├── classifier/ # 分类服务(上传页面使用)
│ │ │ │ ├── service.js # analyzeImage / analyzeBatch
│ │ │ │ ├── prompts.js # 分类决策树提示词(desktop/mobile/avatar)
│ │ │ │ ├── config.js # 模型列表 + CLASSIFIER_CONFIG + ASSISTANT_CONFIG
│ │ │ │ └── index.js
│ │ │ ├── assistant/ # AI 助手服务(AI 工坊页面使用)
│ │ │ │ ├── service.js # sendMessage / analyzeImage
│ │ │ │ ├── prompts.js # 对话式系统提示词
│ │ │ │ ├── config.js # 从 classifier/config 重新导出
│ │ │ │ └── index.js
│ │ │ └── index.js # 统一导出
│ │ ├── github.js # GitHub API 封装
│ │ └── localStorage.js # 本地存储服务
│ ├── stores/
│ │ ├── ai.js # AI 分析状态(统一 store)
│ │ ├── auth.js # 认证状态
│ │ ├── config.js # 仓库配置状态
│ │ ├── credentials.js # 多 Provider 凭证管理
│ │ ├── upload.js # 上传状态 + AI 自动分析
│ │ ├── workflow.js # 工作流状态
│ │ └── history.js # 上传历史记录
│ ├── styles/
│ │ ├── index.scss
│ │ ├── variables.scss
│ │ └── element-dark.scss
│ ├── utils/
│ │ ├── debounce.js
│ │ ├── errorHandler.js
│ │ ├── hashWorker.js # Web Worker 封装(文件 Hash)
│ │ ├── image-detector.js # 图片类型自动检测
│ │ ├── imageCompressor.js
│ │ ├── previewManager.js # 预览 URL 生命周期管理
│ │ └── rateLimiter.js # API 速率限制器
│ ├── views/
│ │ ├── LoginView.vue
│ │ ├── CallbackView.vue
│ │ ├── UploadView.vue
│ │ ├── AIAssistantView.vue
│ │ ├── HistoryView.vue
│ │ └── SettingsView.vue
│ ├── App.vue
│ └── main.js
├── .env.example # 环境变量示例
├── vite.config.js
└── package.json
复制 .env.example 为 .env.local 并填入你的值:
# Cloudflare Workers AI(可选)
VITE_CLOUDFLARE_ACCOUNT_ID=your_cloudflare_account_id
VITE_CLOUDFLARE_API_TOKEN=your_cloudflare_api_token
VITE_WORKER_URL=https://your-worker.your-subdomain.workers.dev
# ModelScope 魔搭社区(推荐,免费)
# 获取地址:https://modelscope.cn → 个人中心 → API Token
VITE_MODELSCOPE_API_KEY=your_modelscope_api_key
# Groq AI(推荐,速度极快)
# 获取地址:https://console.groq.com/keys
VITE_GROQ_API_KEY=your_groq_api_key
# NVIDIA NIM(可选,视觉模型丰富)
# 获取地址:https://build.nvidia.com → Get API Key
VITE_NVIDIA_API_KEY=your_nvidia_api_key模型列表统一在 src/services/ai/classifier/config.js 中维护,classifier 和 assistant 两个服务共享同一份配置。
- 免费额度充足,国内访问稳定
- 推荐模型:Qwen3 VL 235B(精度最高)、Qwen3 VL 8B(速度快)
- 获取 Key:modelscope.cn → 个人中心 → API Token
- 推理速度极快,免费额度充足
- 推荐模型:Llama 4 Scout Vision、Llama 4 Maverick Vision
- 获取 Key:console.groq.com/keys
- 本地和线上均直连(Groq 官方支持 CORS)
- 视觉模型选择最丰富
- 推荐模型:Llama 3.2 90B Vision(精度最高)
- 获取 Key:build.nvidia.com → Get API Key
- 本地开发走 Vite dev proxy(
/nvidia-api),线上直连
- 需要部署
worker/ai-proxy.js到 Cloudflare Workers - 支持模型:Llama 3.2 11B Vision、LLaVA 1.5 7B
针对三个系列各有专用提示词(classifier/prompts.js):
| 系列 | 决策树重点 |
|---|---|
| Desktop | 人像(魅力/国风/氛围感/清新)、动漫、插画、风景 |
| Mobile | 人像(魅力/日系/清新/氛围感)、动漫、插画 |
| Avatar | IP 形象、动漫角色、人像、萌宠、表情包、插画 |
- 在 Cloudflare Pages 创建项目,连接 GitHub 仓库
- 构建配置:
- 构建命令:
pnpm build - 输出目录:
dist
- 构建命令:
- 在 Settings → Environment variables 添加环境变量(参考上方配置)
- 推送代码,自动触发部署
npm install -g wrangler
wrangler login
wrangler deploy worker/ai-proxy.js --name ai-proxy --compatibility-date 2026-03-17部署后将 Worker URL 填入 VITE_WORKER_URL 环境变量。
| 权限级别 | 说明 | 可用功能 |
|---|---|---|
| 管理员 | 仓库 Owner | 全部功能 + 版本回滚 |
| 可写 | Collaborator (push) | 上传 + 新建分类 + AI 分析 |
| 只读 | Collaborator (pull) | 仅浏览 |
| 无权限 | 无仓库访问权限 | 无法使用 |
| Key | 用途 | 过期策略 |
|---|---|---|
auth_token |
GitHub Token | 手动登出清除 |
uploaded_hashes |
上传文件 Hash(去重) | 30 天 / 最多 500 条 |
upload_history |
上传历史记录 | 手动清除 |
ai_credentials |
AI 凭证(AES-GCM 加密) | 手动清除 |
ai_current_provider |
上次选择的 Provider | 持久 |
MIT