江江好-Tauri开发跨平台的本地影视资源管理软件
DEMO效果

方案
技术栈选择
Tauri
- 
优点: 轻量级、跨平台、安全性高。
 - 
用途: 负责与操作系统交互,管理文件系统访问。
为什么不使用Electron
选择 Tauri 而不使用 Electron 的原因主要有以下几点:
 
Tauri 的优点
- 
更小的应用体积:
- Tauri 应用通常比 Electron 应用小得多,因为它使用系统自带的 WebView 而不是捆绑整个 Chromium。
 
 - 
更低的内存占用:
- 使用系统的 WebView 控件,使得内存占用更低。
 
 - 
安全性:
- Tauri 提供了更细粒度的 API 权限管理,安全性更高。
 
 - 
多语言支持:
- 后端使用 Rust 编写,提供了强大的性能和安全保障。
 
 - 
现代化的开发体验:
- 支持多种前端框架和工具,能与 Vite 等现代工具无缝集成。
 
 
Vite
- 优点: 快速的开发和构建速度,热模块替换(HMR)。
 - 用途: 提供开发服务器和构建工具。
 
Vue 3
- 优点: 响应式系统、组合式 API。
 - 用途: 构建用户界面和组件。
 
功能设计
1. 文件扫描
- 功能描述: 扫描用户指定的本地文件夹,识别电影文件。
 - 实现思路: 使用 Tauri 提供的 API 进行本地文件系统访问,过滤出常见的视频文件格式(如 
.mp4,.mkv)。 
2. 资料刮削
- 功能描述: 自动获取电影的相关信息,如标题、简介、海报等。
 - 实现思路:
- 使用第三方 API(如 TMDb)进行数据请求。
 - 采用关键词或文件名进行匹配,获取最相关的电影信息。
 
 
3. 信息展示
- 功能描述: 在应用界面中展示电影的详细信息。
 - 实现思路:
- 使用 Vue 组件动态渲染电影列表。
 - 显示电影海报、标题、简介等信息。
 
 
4. 用户交互
- 功能描述: 允许用户手动更新电影信息,添加自定义分类。
 - 实现思路:
- 提供搜索功能,用户可以手动输入电影名称更新信息。
 - 允许用户创建和管理自定义分类标签。
 
 
数据处理
- 本地缓存: 使用 Tauri 的本地存储功能缓存电影信息,减少重复请求。
 - 数据格式: 将电影信息存储为 JSON 格式,便于解析和展示。
 
UI/UX 设计
- 界面布局: 使用响应式设计,确保在不同设备上有良好的显示效果。
 - 交互体验: 提供直观的操作流程,减少用户学习成本。
 
安全性考虑
- 权限管理: 仅请求必要的文件系统权限,确保用户数据安全。
 - API 密钥保护: 使用环境变量存储 API 密钥,避免在客户端代码中暴露。
 
开发流程
1. 初始化项目
创建 Tauri 项目
npm create tauri-app
cd <project-name>
配置 Vite 和 Vue 3
安装依赖:
npm install vue@next
npm install @vitejs/plugin-vue
配置 vite.config.js:
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
export default defineConfig({
  plugins: [vue()],
});
2. 文件扫描模块
使用 Tauri 访问本地文件系统
在 Tauri 后端中使用 Rust 访问本地文件系统:
use std::fs;
#[tauri::command]
fn scan_directory(path: &str) -> Vec<String> {
    let paths = fs::read_dir(path).unwrap();
    let mut files = Vec::new();
    for path in paths {
        let path = path.unwrap().path();
        if let Some(ext) = path.extension() {
            if ext == "mp4" || ext == "mkv" {
                files.push(path.to_str().unwrap().to_string());
            }
        }
    }
    files
}
在 src-tauri/src/main.rs 中注册命令:
fn main() {
  tauri::Builder::default()
    .invoke_handler(tauri::generate_handler![scan_directory])
    .run(tauri::generate_context!())
    .expect("error while running tauri application");
}
3. 前端开发
创建 Vue 组件
在 src/components 中创建 MovieList.vue:
<template>
  <div>
    <button @click="scanMovies">Scan Movies</button>
    <div v-for="movie in movies" :key="movie" class="movie-item">
      {{ movie }}
    </div>
  </div>
</template>
<script>
import { ref } from 'vue';
import { invoke } from '@tauri-apps/api/tauri';
export default {
  setup() {
    const movies = ref([]);
    async function scanMovies() {
      movies.value = await invoke('scan_directory', { path: '/your/movie/directory' });
    }
    return { movies, scanMovies };
  },
};
</script>
<style>
.movie-item {
  margin: 10px 0;
}
</style>
4. 资料刮削
使用 TMDb API 获取电影信息
安装 Axios:
npm install axios
创建一个 API 模块 src/api/movies.js:
import axios from 'axios';
const API_KEY = 'YOUR_TMDB_API_KEY';
export async function fetchMovieData(movieName) {
  const response = await axios.get(`https://api.themoviedb.org/3/search/movie`, {
    params: {
      api_key: API_KEY,
      query: movieName,
    },
  });
  return response.data.results[0];
}
5. 组合功能
在 MovieList.vue 中调用 API:
<template>
  <div>
    <button @click="scanMovies">Scan Movies</button>
    <div v-for="movie in movies" :key="movie.id" class="movie-item">
      <img :src="`https://image.tmdb.org/t/p/w200/${movie.poster_path}`" alt="Movie Poster" />
      <h3>{{ movie.title }}</h3>
      <p>{{ movie.overview }}</p>
    </div>
  </div>
</template>
<script>
import { ref } from 'vue';
import { invoke } from '@tauri-apps/api/tauri';
import { fetchMovieData } from '../api/movies';
export default {
  setup() {
    const movies = ref([]);
    async function scanMovies() {
      const files = await invoke('scan_directory', { path: '/your/movie/directory' });
      const movieData = await Promise.all(files.map(file => fetchMovieData(file)));
      movies.value = movieData.filter(data => data);
    }
    return { movies, scanMovies };
  },
};
</script>
<style>
.movie-item {
  margin: 10px 0;
  display: flex;
  align-items: center;
}
.movie-item img {
  margin-right: 10px;
}
</style>
DEMO相关截图


 评论
            
                匿名评论
                隐私政策
            
            
                你无需删除空行,直接评论以获取最佳展示效果