# test_specify **Repository Path**: being1943/test_specify ## Basic Information - **Project Name**: test_specify - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: 001- - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-19 - **Last Updated**: 2025-10-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 📸 相册管理器 (Photo Album Organizer)
![License](https://img.shields.io/badge/license-MIT-blue.svg) ![Svelte](https://img.shields.io/badge/Svelte-5.0-FF3E00?logo=svelte) ![TypeScript](https://img.shields.io/badge/TypeScript-5.0-3178C6?logo=typescript) ![Vite](https://img.shields.io/badge/Vite-5.0-646CFF?logo=vite) 一个现代化的本地相册管理应用,让照片整理变得简单而优雅。 [功能特性](#-功能特性) • [快速开始](#-快速开始) • [技术栈](#-技术栈) • [项目结构](#-项目结构)
--- ## ✨ 功能特性 ### 📁 相册管理 - **创建相册** - 轻松创建和组织你的照片集 - **相册封面** - 自动使用第一张照片作为相册封面 - **拖拽移动** - 通过拖拽将照片在相册间移动 - **批量操作** - 支持批量选择、移动和删除照片 ### 🖼️ 照片管理 - **批量上传** - 支持一次上传多张照片 - **缩略图生成** - 自动生成缩略图,提升加载速度 - **日期分组** - 按拍摄日期智能分组显示 - **EXIF 信息** - 读取并显示照片的元数据信息 - **全屏查看** - 沉浸式照片浏览体验 ### 🔍 搜索功能 - **全局搜索** - 快速搜索相册和照片 - **智能匹配** - 支持相册名称和照片文件名搜索 - **即时跳转** - 搜索结果可直接跳转到对应位置 ### 💾 数据存储 - **本地存储** - 使用 IndexedDB 存储,数据完全本地化 - **隐私保护** - 所有数据保存在浏览器本地,不上传云端 - **数据导出** - 支持导出相册数据(JSON 格式) ### 🎨 用户体验 - **现代 UI** - 精美的渐变色设计和流畅动画 - **响应式布局** - 完美适配桌面和移动设备 - **拖拽交互** - 直观的拖拽操作体验 - **操作历史** - 记录所有操作,便于追踪 --- ## 🚀 快速开始 ### 前置要求 - Node.js 18+ - npm 或 pnpm ### 安装 ```bash # 克隆项目 git clone cd photo-album-organizer # 安装依赖 npm install # 或 pnpm install ``` ### 开发 ```bash # 启动开发服务器 npm run dev # 在浏览器中打开 # http://localhost:5173 ``` ### 构建 ```bash # 构建生产版本 npm run build # 预览生产构建 npm run preview ``` ### 部署 ```bash # 构建静态网站 npm run build # 构建产物在 build/ 目录中 # 可以直接部署到任何静态网站托管服务 ``` ### 测试 ```bash # 运行单元测试 npm run test:unit # 运行集成测试 npm run test:integration # 生成测试覆盖率报告 npm run test:coverage ``` --- ## 🚀 部署指南 本应用是一个纯前端 SPA (Single Page Application),可以部署到任何静态网站托管服务。 ### 构建应用 ```bash # 安装依赖 npm install # 构建生产版本 npm run build ``` 构建完成后,`build/` 目录包含所有静态文件,可以直接部署。 ### 部署选项 #### 1. Vercel (推荐) [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new) ```bash # 安装 Vercel CLI npm i -g vercel # 部署 vercel --prod ``` #### 2. Netlify [![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start) 1. 将代码推送到 GitHub 2. 在 Netlify 中连接仓库 3. 构建设置: - **Build command**: `npm run build` - **Publish directory**: `build` #### 3. GitHub Pages ```bash # 安装 gh-pages npm install -D gh-pages # 添加部署脚本到 package.json "scripts": { "deploy": "npm run build && gh-pages -d build" } # 部署 npm run deploy ``` #### 4. 自托管服务器 ```bash # 构建应用 npm run build # 将 build/ 目录上传到服务器 # 配置 Web 服务器 (Nginx/Apache) 指向 build/ 目录 ``` **Nginx 配置示例:** ```nginx server { listen 80; server_name your-domain.com; root /path/to/build; index index.html; location / { try_files $uri $uri/ /index.html; } # 缓存静态资源 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; } } ``` #### 5. Docker 部署 创建 `Dockerfile`: ```dockerfile FROM nginx:alpine COPY build /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` ```bash # 构建镜像 docker build -t photo-album-organizer . # 运行容器 docker run -p 80:80 photo-album-organizer ``` ### 部署注意事项 #### 🔒 HTTPS 要求 - **必须使用 HTTPS** - IndexedDB 在非安全上下文中功能受限 - 大多数现代托管服务默认提供 HTTPS #### 📱 PWA 支持 (可选) 如需 PWA 功能,可添加 Service Worker: ```bash # 安装 PWA 插件 npm install -D @vite-pwa/sveltekit # 配置 vite.config.js import { sveltekit } from '@sveltejs/kit/vite'; import { VitePWA } from 'vite-plugin-pwa'; export default { plugins: [ sveltekit(), VitePWA({ registerType: 'autoUpdate', workbox: { globPatterns: ['**/*.{js,css,html,ico,png,svg}'] } }) ] }; ``` #### 🌐 自定义域名 1. 在托管服务中配置自定义域名 2. 确保 DNS 记录正确指向 3. 启用 HTTPS 证书 #### 📊 性能优化 - 启用 Gzip/Brotli 压缩 - 配置适当的缓存头 - 使用 CDN 加速静态资源 --- ## 🛠️ 技术栈 ### 核心框架 - **[Svelte 5](https://svelte.dev/)** - 现代化的响应式前端框架 - **[TypeScript](https://www.typescriptlang.org/)** - 类型安全的 JavaScript 超集 - **[Vite](https://vitejs.dev/)** - 快速的前端构建工具 ### 数据存储 - **[Dexie.js](https://dexie.org/)** - IndexedDB 的现代化封装库 - **IndexedDB** - 浏览器本地数据库 ### 图片处理 - **[exifr](https://github.com/MikeKovarik/exifr)** - EXIF 元数据读取 - **Canvas API** - 缩略图生成 ### 测试工具 - **[Vitest](https://vitest.dev/)** - 快速的单元测试框架 - **[Playwright](https://playwright.dev/)** - 端到端测试工具 - **[@testing-library/svelte](https://testing-library.com/docs/svelte-testing-library/intro/)** - Svelte 组件测试 ### 开发工具 - **ESLint** - 代码质量检查 - **Prettier** - 代码格式化 --- ## 📂 项目结构 ``` photo-album-organizer/ ├── src/ │ ├── components/ # Svelte 组件 │ │ ├── common/ # 通用组件 │ │ ├── AlbumList.svelte │ │ ├── PhotoGrid.svelte │ │ └── PhotoViewer.svelte │ ├── services/ # 业务逻辑服务 │ │ ├── StorageService.ts │ │ ├── PhotoService.ts │ │ └── SearchService.ts │ ├── stores/ # Svelte stores (状态管理) │ │ ├── albumStore.ts │ │ ├── photoStore.ts │ │ └── uiStore.ts │ ├── utils/ # 工具函数 │ │ ├── dateUtils.ts │ │ ├── imageUtils.ts │ │ └── exportUtils.ts │ ├── types/ # TypeScript 类型定义 │ │ └── index.ts │ ├── styles/ # 全局样式 │ │ ├── global.css │ │ └── components.css │ └── App.svelte # 根组件 ├── tests/ # 测试文件 │ ├── unit/ # 单元测试 │ └── integration/ # 集成测试 ├── public/ # 静态资源 │ └── favicon.svg └── package.json ``` --- ## 🎯 核心功能实现 ### 相册封面自动更新 当相册中的照片发生变化时(上传、删除、移动),封面会自动更新: - 上传照片后,如果是第一张照片,自动设为封面 - 删除照片后,如果删除的是封面照片,自动使用下一张 - 移动照片后,源相册和目标相册的封面都会更新 ### 拖拽移动照片 支持将照片从一个相册拖拽到另一个相册: 1. 在照片网格中选择照片 2. 拖拽选中的照片 3. 悬停在目标相册上 4. 释放鼠标完成移动 ### 日期智能分组 照片按拍摄日期自动分组显示: - 优先使用 EXIF 中的拍摄时间 - 如果没有 EXIF,使用文件修改时间 - 支持折叠/展开日期分组 --- ## 🎨 设计特色 ### 渐变色主题 采用现代化的蓝紫渐变色调,营造优雅的视觉体验: - 主色调:`#667eea` → `#764ba2` - 强调色:`#f59e0b` - 背景色:`#f8fafc` ### 流畅动画 所有交互都配有精心设计的过渡动画: - 悬停效果 - 拖拽反馈 - 页面切换 - 加载状态 ### 响应式设计 完美适配各种屏幕尺寸: - 桌面端:侧边栏 + 主内容区 - 移动端:堆叠布局 - 平板:自适应网格 --- ## 📊 数据模型 ### Album (相册) ```typescript interface Album { id?: number; name: string; description?: string; coverPhotoId?: number; photoCount: number; createdAt: Date; updatedAt: Date; } ``` ### Photo (照片) ```typescript interface Photo { id?: number; albumId: number; fileName: string; fileBlob: Blob; thumbnailBlob?: Blob; fileSize: number; mimeType: string; width?: number; height?: number; takenAt?: Date; uploadedAt: Date; exifData?: ExifData; } ``` --- ## 🔒 隐私与安全 - ✅ **完全本地化** - 所有数据存储在浏览器的 IndexedDB 中 - ✅ **无需登录** - 不需要账号,直接使用 - ✅ **无网络请求** - 不上传任何数据到服务器 - ✅ **数据控制** - 用户完全掌控自己的数据 --- ## 🤝 贡献指南 欢迎贡献代码、报告问题或提出建议! 1. Fork 本项目 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 开启 Pull Request --- ## 📝 开发计划 - [ ] 支持视频文件 - [ ] 照片编辑功能(裁剪、滤镜) - [ ] 标签系统 - [ ] 收藏功能 - [ ] 幻灯片播放 - [ ] PWA 支持 - [ ] 云端同步(可选) --- ## 📄 许可证 本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件 --- ## 🙏 致谢 - [Svelte](https://svelte.dev/) - 优雅的前端框架 - [Dexie.js](https://dexie.org/) - 强大的 IndexedDB 封装 - [exifr](https://github.com/MikeKovarik/exifr) - EXIF 数据读取 - 所有开源贡献者 ---
**用 ❤️ 和 Svelte 构建** [⬆ 回到顶部](#-相册管理器-photo-album-organizer)