Files
loongyan/web/README.md
2026-03-21 21:17:01 +08:00

325 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🖼️ Loongyan Web
Loongyan 相册系统的前端应用,基于 [SvelteKit](https://kit.svelte.dev/) 5 构建,提供现代化的相册浏览体验。
![Svelte](https://img.shields.io/badge/Svelte-5-FF3E00.svg)
![SvelteKit](https://img.shields.io/badge/SvelteKit-2-FF3E00.svg)
![Vite](https://img.shields.io/badge/Vite-7-646CFF.svg)
---
## ✨ 功能特性
- 📁 **相册列表** - 卡片式展示所有相册
- 🖼️ **照片浏览** - 网格布局展示照片,支持预览
- 🔍 **照片详情** - 查看照片完整信息和原图
- 🌍 **国际化** - 支持中文/英文切换Paraglide JS
- 📱 **响应式设计** - 适配桌面和移动设备
- ⌨️ **键盘导航** - 左右键切换照片ESC 关闭预览
- 🎨 **UI 组件库** - 可复用的组件系统
- 🔐 **用户认证** - Better Auth 集成
---
## 🛠️ 技术栈
| 技术 | 说明 |
|------|------|
| [Svelte 5](https://svelte.dev/) | 前端框架Runes 模式) |
| [SvelteKit 2](https://kit.svelte.dev/) | 全栈框架 |
| [Vite 7](https://vitejs.dev/) | 构建工具 |
| [Paraglide JS](https://inlang.com/m/gerre34r/library-inlang-paraglideJs) | 国际化 |
| [Better Auth](https://www.better-auth.com/) | 用户认证 |
| [Drizzle ORM](https://orm.drizzle.team/) | 数据库 ORM |
| [SQLite](https://www.sqlite.org/) | 嵌入式数据库 |
| [Vitest](https://vitest.dev/) | 单元测试 |
| [Playwright](https://playwright.dev/) | 浏览器测试 |
| [mdsvex](https://mdsvex.pngwn.io/) | Markdown 组件 |
---
## 📁 项目结构
```
web/
├── src/
│ ├── lib/
│ │ ├── api/ # API 客户端
│ │ │ ├── client.js # API 请求封装
│ │ │ └── types.js # 类型定义
│ │ ├── components/ # UI 组件
│ │ │ ├── album/ # 相册组件
│ │ │ ├── photo/ # 照片组件
│ │ │ ├── layout/ # 布局组件
│ │ │ └── ui/ # 基础 UI 组件
│ │ ├── paraglide/ # 国际化生成文件
│ │ └── server/ # 服务端代码
│ │ ├── auth.js # 认证配置
│ │ └── db/ # 数据库
│ ├── routes/ # 页面路由
│ │ ├── +layout.svelte # 根布局
│ │ ├── +page.svelte # 首页(相册列表)
│ │ ├── album/[id]/ # 相册详情页
│ │ ├── photo/[id]/ # 照片详情页
│ │ └── demo/ # 演示页面
│ └── app.html # HTML 模板
├── messages/ # 国际化翻译文件
│ ├── en.json
│ └── zh.json
├── static/ # 静态资源
├── package.json
├── svelte.config.js
├── vite.config.js
└── drizzle.config.js
```
---
## 🚀 快速开始
### 环境要求
- Node.js 18+
- pnpm推荐或 npm
### 安装依赖
```bash
pnpm install
```
### 开发运行
```bash
pnpm dev
# 或自动打开浏览器
pnpm dev -- --open
```
开发服务器将在 `http://localhost:5173` 启动。
> ⚠️ **注意**: 前端需要配合后端 API 使用。开发模式下,`/api` 请求会自动代理到 `http://localhost:8080`。
### 构建生产版本
```bash
pnpm build
```
### 预览生产构建
```bash
pnpm preview
```
---
## 📡 API 配置
### 代理配置(开发)
开发模式下API 请求自动代理到后端(`vite.config.js`
```js
server: {
proxy: {
'/api': 'http://localhost:8080'
}
}
```
### API 基础路径
API 基础路径定义在 `src/lib/api/client.js`
```js
const API_BASE = '/api/v1';
```
### 可用 API 方法
| 方法 | 说明 |
|------|------|
| `getAlbums()` | 获取所有相册 |
| `getAlbum(id)` | 获取相册详情 |
| `getAlbumPhotos(albumId)` | 获取相册内照片 |
| `getPhoto(id)` | 获取照片详情 |
| `getPhotoFileUrl(id)` | 获取原图 URL |
| `getPhotoPreviewUrl(id)` | 获取预览图 URL |
---
## 🧪 测试
### 运行测试
```bash
pnpm test
```
### 单元测试
```bash
pnpm test:unit
```
### 类型检查
```bash
pnpm check
# 监听模式
pnpm check:watch
```
---
## 🎨 组件库
### 基础 UI 组件
| 组件 | 说明 |
|------|------|
| `Button` | 按钮组件 |
| `Card` | 卡片容器 |
| `Container` | 页面容器 |
| `Grid` | 网格布局 |
| `Loading` | 加载状态 |
| `Empty` | 空状态提示 |
### 业务组件
| 组件 | 说明 |
|------|------|
| `AlbumCard` | 相册卡片 |
| `AlbumList` | 相册列表 |
| `PhotoCard` | 照片卡片 |
| `PhotoGrid` | 照片网格 |
| `BackLink` | 返回链接 |
| `PageHeader` | 页面标题 |
---
## 🌍 国际化
### 支持语言
- 🇨🇳 中文zh
- 🇬🇧 Englishen
### 翻译文件
翻译文件位于 `messages/` 目录:
```json
// messages/zh.json
{
"welcome": "欢迎"
}
// messages/en.json
{
"welcome": "Welcome"
}
```
### 使用方法
```svelte
<script>
import * as m from '$lib/paraglide/messages';
</script>
<h1>{m.welcome()}</h1>
```
---
## 🔐 用户认证
项目集成 Better Auth提供用户认证功能。
### 生成认证 Schema
```bash
pnpm auth:schema
```
### 数据库
使用 SQLite + Drizzle ORM
```bash
# 生成迁移
pnpm drizzle-kit generate
# 执行迁移
pnpm drizzle-kit migrate
```
---
## 📜 脚本命令
| 命令 | 说明 |
|------|------|
| `pnpm dev` | 启动开发服务器 |
| `pnpm build` | 构建生产版本 |
| `pnpm preview` | 预览生产构建 |
| `pnpm test` | 运行测试 |
| `pnpm test:unit` | 运行单元测试 |
| `pnpm check` | 类型检查 |
| `pnpm lint` | 代码检查 |
| `pnpm format` | 格式化代码 |
| `pnpm auth:schema` | 生成认证 Schema |
---
## 📦 部署
### 适配器
默认使用 `@sveltejs/adapter-auto`,会自动检测部署环境。
如需部署到特定平台,可安装对应适配器:
```bash
# Vercel
pnpm add -D @sveltejs/adapter-vercel
# Netlify
pnpm add -D @sveltejs/adapter-netlify
# Node.js
pnpm add -D @sveltejs/adapter-node
# 静态站点
pnpm add -D @sveltejs/adapter-static
```
然后在 `svelte.config.js` 中配置:
```js
import adapter from '@sveltejs/adapter-node';
const config = {
kit: {
adapter: adapter()
}
};
```
---
## 🔗 相关链接
- [后端 API 文档](../README.md#-api-文档)
- [SvelteKit 文档](https://kit.svelte.dev/docs)
- [Svelte 5 文档](https://svelte-5-preview.vercel.app/)
---
<div align="center">
<sub>Made with ❤️ using SvelteKit</sub>
</div>