feat: CutThenThink v3.0 初始版本
完整实现 Tauri + Vanilla JS 轻量级截图工具 Phase 1 - 项目搭建 - Tauri 2.x 项目初始化 - Vite 前端项目搭建 - 基础 UI 框架(CSS 变量、组件库) - 构建配置优化 Phase 2 - 核心截图功能 - 全屏/区域/窗口截图 - 截图预览和管理 - 文件命名和缩略图 - 全局快捷键集成 Phase 3 - 上传与存储 - 多图床上传(GitHub/Imgur/自定义) - 配置管理系统 - SQLite 数据库 Phase 4 - OCR 集成 - 云端 OCR(百度/腾讯云) - 插件管理系统 - 本地 OCR 插件(Go) - OCR 结果处理 Phase 5 - AI 分类系统 - Claude/OpenAI API 集成 - Prompt 模板引擎 - 模板管理界面 - 自动分类流程 Phase 6 - 历史记录与管理 - 图库视图(网格/列表) - 搜索与筛选 - 批量操作 - 导出功能(JSON/CSV/ZIP) Phase 7 - 打包与发布 - 多平台构建配置 - CI/CD 工作流 - 图标和资源 - 安装包配置 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
298
docs/FRONTEND_GUIDE.md
Normal file
298
docs/FRONTEND_GUIDE.md
Normal file
@@ -0,0 +1,298 @@
|
||||
# 前端开发快速参考
|
||||
|
||||
## 目录结构说明
|
||||
|
||||
```
|
||||
cutThink_lite/
|
||||
├── src/ # 源代码目录
|
||||
│ ├── api/ # Tauri 后端 API 封装
|
||||
│ ├── components/ # UI 组件
|
||||
│ │ ├── views/ # 页面视图组件
|
||||
│ │ └── shared/ # 共享组件
|
||||
│ ├── store/ # 状态管理
|
||||
│ └── utils/ # 工具函数
|
||||
├── index.html # HTML 入口
|
||||
├── main.js # JavaScript 入口
|
||||
├── style.css # 全局样式
|
||||
└── vite.config.js # Vite 配置
|
||||
```
|
||||
|
||||
## 核心模块说明
|
||||
|
||||
### 1. API 模块 (`src/api/`)
|
||||
|
||||
封装所有 Tauri 后端调用,使用示例:
|
||||
|
||||
```javascript
|
||||
import { screenshotAPI, uploadAPI, settingsAPI } from '@/api/index.js'
|
||||
|
||||
// 截图
|
||||
const result = await screenshotAPI.captureFull()
|
||||
|
||||
// 上传
|
||||
const url = await uploadAPI.upload('/path/to/image.png')
|
||||
|
||||
// 获取设置
|
||||
const settings = await settingsAPI.get()
|
||||
```
|
||||
|
||||
### 2. 状态管理 (`src/store/`)
|
||||
|
||||
响应式状态管理,使用示例:
|
||||
|
||||
```javascript
|
||||
import { useStore } from '@/store/index.js'
|
||||
|
||||
const store = useStore()
|
||||
|
||||
// 读取状态
|
||||
console.log(store.currentView)
|
||||
console.log(store.screenshots)
|
||||
|
||||
// 更新状态
|
||||
store.setCurrentView('gallery')
|
||||
store.addScreenshot(newScreenshot)
|
||||
|
||||
// 监听状态变化
|
||||
appStore.subscribe((state, prevState) => {
|
||||
console.log('状态变化:', state, prevState)
|
||||
})
|
||||
```
|
||||
|
||||
### 3. 工具函数 (`src/utils/`)
|
||||
|
||||
#### helpers.js - 辅助函数
|
||||
|
||||
```javascript
|
||||
import {
|
||||
formatDate,
|
||||
formatFileSize,
|
||||
debounce,
|
||||
throttle,
|
||||
deepClone,
|
||||
generateId,
|
||||
copyText,
|
||||
compressImage,
|
||||
parseHotkey,
|
||||
delay
|
||||
} from '@/utils/helpers.js'
|
||||
|
||||
// 日期格式化
|
||||
formatDate(date, 'relative') // "5 分钟前"
|
||||
|
||||
// 文件大小格式化
|
||||
formatFileSize(1024) // "1 KB"
|
||||
|
||||
// 防抖
|
||||
const debouncedSearch = debounce(search, 300)
|
||||
|
||||
// 延迟
|
||||
await delay(1000)
|
||||
```
|
||||
|
||||
#### dom.js - DOM 操作
|
||||
|
||||
```javascript
|
||||
import {
|
||||
$, $$,
|
||||
createElement,
|
||||
show, hide,
|
||||
addClass, removeClass,
|
||||
delegate,
|
||||
dispatchEvent
|
||||
} from '@/utils/dom.js'
|
||||
|
||||
// 查询元素
|
||||
const btn = $('.btn-primary')
|
||||
const items = $$('.list-item')
|
||||
|
||||
// 创建元素
|
||||
const div = createElement('div', {
|
||||
className: 'my-class',
|
||||
text: 'Hello',
|
||||
attrs: { id: 'my-id' }
|
||||
})
|
||||
|
||||
// 显示/隐藏
|
||||
show(element)
|
||||
hide(element)
|
||||
|
||||
// 委托事件
|
||||
delegate(parent, '.btn', 'click', handler)
|
||||
```
|
||||
|
||||
### 4. 组件使用
|
||||
|
||||
#### Notification - 通知组件
|
||||
|
||||
```javascript
|
||||
import { Notification } from '@/components/shared/index.js'
|
||||
|
||||
Notification.success('操作成功')
|
||||
Notification.error('操作失败')
|
||||
Notification.warning('警告信息')
|
||||
Notification.info('提示信息')
|
||||
```
|
||||
|
||||
#### Modal - 模态框
|
||||
|
||||
```javascript
|
||||
import { Modal } from '@/components/shared/index.js'
|
||||
|
||||
// 确认对话框
|
||||
const result = await Modal.confirm({
|
||||
title: '确认删除',
|
||||
content: '确定要删除吗?'
|
||||
})
|
||||
|
||||
// 警告对话框
|
||||
await Modal.alert({
|
||||
title: '提示',
|
||||
content: '操作完成'
|
||||
})
|
||||
```
|
||||
|
||||
#### Loading - 加载指示器
|
||||
|
||||
```javascript
|
||||
import { Loading } from '@/components/shared/index.js'
|
||||
|
||||
Loading.show('加载中...')
|
||||
// 执行操作
|
||||
Loading.hide()
|
||||
```
|
||||
|
||||
## 开发工作流
|
||||
|
||||
### 1. 启动开发服务器
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
服务器会在 http://localhost:5173 启动
|
||||
|
||||
### 2. 修改代码后
|
||||
|
||||
Vite 的 HMR (热模块替换) 会自动刷新浏览器,无需手动重启。
|
||||
|
||||
### 3. 调试技巧
|
||||
|
||||
- 使用浏览器开发者工具 (F12)
|
||||
- 在代码中使用 `console.log()` 调试
|
||||
- 检查 Network 面板查看 Tauri 调用
|
||||
|
||||
### 4. 添加新功能
|
||||
|
||||
1. 在 `src/api/` 添加 API 调用
|
||||
2. 在 `src/store/` 添加状态(如需要)
|
||||
3. 在 `src/components/views/` 创建或修改视图
|
||||
4. 在 `main.js` 中集成新功能
|
||||
|
||||
## 样式开发
|
||||
|
||||
### CSS 变量
|
||||
|
||||
```css
|
||||
/* 使用预定义的颜色变量 */
|
||||
color: var(--text-primary);
|
||||
background: var(--bg-secondary);
|
||||
border-color: var(--border-color);
|
||||
```
|
||||
|
||||
### 主题切换
|
||||
|
||||
```javascript
|
||||
// 切换到深色模式
|
||||
document.documentElement.setAttribute('data-theme', 'dark')
|
||||
|
||||
// 切换到浅色模式
|
||||
document.documentElement.setAttribute('data-theme', 'light')
|
||||
|
||||
// 跟随系统
|
||||
document.documentElement.setAttribute('data-theme', 'system')
|
||||
```
|
||||
|
||||
### 响应式设计
|
||||
|
||||
```css
|
||||
/* 使用媒体查询 */
|
||||
@media (max-width: 768px) {
|
||||
.sidebar {
|
||||
width: 60px;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Tauri 集成
|
||||
|
||||
### 调用 Rust 后端命令
|
||||
|
||||
```javascript
|
||||
import { invoke } from '@tauri-apps/api/tauri'
|
||||
|
||||
// 调用后端命令
|
||||
const result = await invoke('command_name', {
|
||||
param1: 'value1',
|
||||
param2: 'value2'
|
||||
})
|
||||
```
|
||||
|
||||
### 监听后端事件
|
||||
|
||||
```javascript
|
||||
import { listen } from '@tauri-apps/api/event'
|
||||
|
||||
// 监听事件
|
||||
const unlisten = await listen('event-name', (event) => {
|
||||
console.log('收到事件:', event.payload)
|
||||
})
|
||||
|
||||
// 取消监听
|
||||
unlisten()
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 如何添加新页面?
|
||||
|
||||
A: 在 `src/components/views/` 创建新的视图组件,然后在 `index.html` 中添加对应的 HTML 结构。
|
||||
|
||||
### Q: 如何修改样式?
|
||||
|
||||
A: 可以:
|
||||
1. 修改 `style.css` 全局样式
|
||||
2. 在组件中使用内联样式
|
||||
3. 添加新的 CSS 文件并导入
|
||||
|
||||
### Q: Tauri 命令调用失败?
|
||||
|
||||
A: 确保:
|
||||
1. Rust 后端已实现该命令
|
||||
2. 命令已在 `tauri.conf.json` 中注册
|
||||
3. 参数名称和类型匹配
|
||||
|
||||
### Q: HMR 不工作?
|
||||
|
||||
A: 检查:
|
||||
1. Vite 开发服务器是否运行
|
||||
2. 文件是否在监听目录中
|
||||
3. 浏览器控制台是否有错误
|
||||
|
||||
## 性能优化建议
|
||||
|
||||
1. **使用防抖/节流**: 对频繁触发的事件使用 `debounce` 或 `throttle`
|
||||
2. **按需加载**: 大型组件可以按需加载
|
||||
3. **避免频繁 DOM 操作**: 批量更新 DOM
|
||||
4. **使用事件委托**: 减少事件监听器数量
|
||||
5. **优化图片**: 使用 `compressImage` 压缩大图片
|
||||
|
||||
## 下一步
|
||||
|
||||
- 阅读 `src/api/` 了解可用的 API
|
||||
- 查看 `src/components/views/` 了解现有组件
|
||||
- 运行 `npm run dev` 开始开发
|
||||
|
||||
---
|
||||
|
||||
更新时间: 2026-02-12
|
||||
Reference in New Issue
Block a user