從零構建桌面寫作軟件的書籍管理系統:Electron + Vue 3 實戰指南

📚 從零構建桌面寫作軟件的書籍管理系統:Electron + Vue 3 實戰指南

💡 本文深入探討了基于 Electron + Vue 3 技術棧的桌面寫作軟件中書籍管理系統的設計與實現,涵蓋了書籍的創建、編輯、刪除等核心功能的完整技術方案,為開發者提供一套完整的書籍管理解決方案。

📋 目錄

  • 項目背景
  • 技術架構概覽
  • 書籍管理核心功能實現
  • 核心功能實現細節
  • 用戶體驗優化
  • 技術亮點總結
  • 擴展性考慮
  • 總結與展望

🎯 項目背景

51mazi 是一款專為小說創作者設計的桌面寫作軟件,其核心功能之一就是完善的書籍管理系統。作者需要一個直觀、高效的書籍管理界面來組織和管理自己的創作項目,包括書籍的創建、編輯、刪除以及元數據管理等功能。

📖 書籍管理界面

書籍管理

直觀的書籍管理界面 - 支持創建、編輯、刪除等操作

? 功能特性

  • 📝 書籍創建: 支持多種類型書籍創建
  • ?? 書籍編輯: 實時編輯書籍信息和元數據
  • 🗑? 書籍刪除: 安全刪除確認機制
  • 📊 數據統計: 字數統計和更新記錄
  • 🎨 界面美觀: 書籍卡片式展示
  • 🔄 實時同步: 狀態管理和數據同步

🏗? 技術架構概覽

核心技術棧

  • Electron 35.0.3: 跨平臺桌面應用框架
  • Vue 3.5.13: 漸進式 JavaScript 框架
  • Element Plus 2.10.1: 企業級 UI 組件庫
  • Pinia 3.0.1: Vue 3 官方推薦的狀態管理庫

系統架構設計

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   渲染進程      │    │   主進程        │    │   文件系統      │
│   (Vue 3)      │?──?│   (Node.js)     │?──?│   (本地存儲)    │
└─────────────────┘    └─────────────────┘    └─────────────────┘

📁 項目目錄結構

51mazi/
├── src/
│   ├── main/           # Electron 主進程
│   │   └── index.js    # 主進程入口文件
│   ├── preload/        # 預加載腳本
│   │   └── index.js    # IPC 通信接口
│   └── renderer/       # 渲染進程 (Vue 應用)
│       ├── src/
│       │   ├── components/    # 組件庫
│       │   │   ├── Bookshelf.vue    # 書籍列表組件
│       │   │   └── Book.vue         # 書籍卡片組件
│       │   ├── views/         # 頁面視圖
│       │   ├── stores/        # 狀態管理
│       │   │   └── index.js   # Pinia 狀態管理
│       │   ├── service/       # 服務層
│       │   │   └── books.js   # 書籍相關 API
│       │   └── utils/         # 工具函數
│       └── assets/            # 靜態資源

🔧 書籍管理核心功能實現

1. 📊 書籍數據結構設計

每本書籍包含以下核心信息:

const bookData = {id: 'unique_id',           // 唯一標識name: '書籍名稱',           // 書名type: 'novel',             // 類型typeName: '小說',          // 類型名稱targetCount: 100000,       // 目標字數intro: '書籍簡介',         // 簡介createdAt: '2024-01-01',  // 創建時間updatedAt: '2024-01-01',  // 更新時間totalWords: 50000          // 當前字數
}

💡 完整數據結構請查看: src/renderer/src/components/Bookshelf.vue

2. 🗂? 主進程文件操作層

在主進程中實現文件系統操作,確保數據持久化:

// src/main/index.js
import { ipcMain } from 'electron'
import fs from 'fs'
import { join } from 'path'// 創建書籍
ipcMain.handle('create-book', async (event, bookInfo) => {const safeName = bookInfo.name.replace(/[\\/:*?"<>|]/g, '_')const booksDir = store.get('booksDir')const bookPath = join(booksDir, safeName)// 創建書籍目錄結構if (!fs.existsSync(bookPath)) {fs.mkdirSync(bookPath)}// 寫入元數據文件const meta = {...bookInfo,createdAt: new Date().toLocaleString(),updatedAt: new Date().toLocaleString()}fs.writeFileSync(join(bookPath, 'mazi.json'), JSON.stringify(meta, null, 2))// 創建默認目錄結構const textPath = join(bookPath, '正文')const notesPath = join(bookPath, '筆記')fs.mkdirSync(textPath, { recursive: true })fs.mkdirSync(notesPath, { recursive: true })return true
})// 刪除書籍
ipcMain.handle('delete-book', async (event, { name }) => {const booksDir = store.get('booksDir')const bookPath = join(booksDir, name)if (fs.existsSync(bookPath)) {fs.rmSync(bookPath, { recursive: true })return true}return false
})// 編輯書籍
ipcMain.handle('edit-book', async (event, bookInfo) => {const booksDir = store.get('booksDir')const bookPath = join(booksDir, bookInfo.name)if (fs.existsSync(bookPath)) {const metaPath = join(bookPath, 'mazi.json')const existingMeta = JSON.parse(fs.readFileSync(metaPath, 'utf-8'))const mergedMeta = { ...existingMeta, ...bookInfo }fs.writeFileSync(metaPath, JSON.stringify(mergedMeta, null, 2))return true}return false
})

💡 完整主進程代碼請查看: src/main/index.js

3. 🔌 渲染進程服務層

在渲染進程中封裝 API 調用,提供統一的接口:

// src/renderer/src/service/books.js
export function createBook(bookInfo) {return window.electron.createBook(bookInfo)
}export function updateBook(bookInfo) {return window.electron.editBook(bookInfo)
}export async function deleteBook(name) {const dir = await getBookDir()return window.electron.deleteBook(dir, name)
}export async function readBooksDir() {const mainStore = useMainStore()const dir = await getBookDir()if (!dir) return []const books = await window.electron.readBooksDir(dir)mainStore.setBooks(books)return books
}

💡 完整服務層代碼請查看: src/renderer/src/service/books.js

4. 🎨 用戶界面組件設計

4.1 📚 書籍列表組件 (Bookshelf.vue)
<template><div class="bookshelf"><!-- 頂部操作欄 --><div class="top-bar"><el-button type="primary" @click="handleNewBook"><el-icon><Plus /></el-icon>新建書籍</el-button></div><!-- 書籍列表 --><div class="books-box"><Bookv-for="book in books":key="book.id":name="book.name":type="book.type":type-name="book.typeName":total-words="book.totalWords":updated-at="book.updatedAt"@on-open="onOpen(book)"@on-edit="onEdit(book)"@on-delete="onDelete(book)"/></div></div>
</template>

💡 完整書籍列表組件代碼請查看: src/renderer/src/components/Bookshelf.vue

4.2 📖 書籍卡片組件 (Book.vue)
<template><div class="book" @click="emit('onOpen')" @contextmenu.prevent="showMenu($event)"><div class="spine"></div><div class="cover-bg"><div class="title-block"><div class="vertical-title">{{ name }}</div></div></div><div class="info"><div class="type">{{ typeName }}</div><div class="stats"><div class="word-count">字數:{{ totalWords }}</div><div class="update-time">更新:{{ updatedAt }}</div></div></div></div>
</template>

💡 完整書籍卡片組件代碼請查看: src/renderer/src/components/Book.vue

5. 🗃? 狀態管理設計

使用 Pinia 進行全局狀態管理:

// src/renderer/src/stores/index.js
import { defineStore } from 'pinia'
import { ref } from 'vue'export const useMainStore = defineStore('main', () => {const books = ref([])function setBooks(newBooks) {books.value = newBooks}function addBook(book) {books.value.push(book)}function removeBook(bookId) {const index = books.value.findIndex(book => book.id === bookId)if (index > -1) {books.value.splice(index, 1)}}return {books,setBooks,addBook,removeBook}
})

💡 完整狀態管理代碼請查看: src/renderer/src/stores/index.js

?? 核心功能實現細節

1. 📝 書籍創建流程

async function handleConfirm() {formRef.value.validate(async (valid) => {if (valid) {// 校驗同名書籍const exists = books.value.some((b) => b.name === form.value.name && (!isEdit.value || b.id !== editBookId.value))if (exists) {ElMessage.error('已存在同名書籍,不能重復創建!')return}const randomId = Date.now().toString() + Math.floor(Math.random() * 10000).toString()const bookData = {id: randomId,name: form.value.name,type: form.value.type,typeName: BOOK_TYPES.find((item) => item.value === form.value.type)?.label,targetCount: form.value.targetCount,intro: form.value.intro}await createBook(bookData)dialogVisible.value = falseawait readBooksDir()}})
}

💡 完整創建流程代碼請查看: src/renderer/src/components/Bookshelf.vue

2. ?? 書籍編輯功能

function onEdit(book) {isEdit.value = trueeditBookId.value = book.iddialogVisible.value = trueform.value.name = book.nameform.value.type = book.typeform.value.targetCount = book.targetCountform.value.intro = book.intro
}

💡 完整編輯功能代碼請查看: src/renderer/src/components/Bookshelf.vue

3. 🗑? 書籍刪除確認

async function onDelete(book) {try {await ElMessageBox.confirm(`確定要刪除《${book.name}》嗎?此操作不可恢復!`, '刪除確認', {confirmButtonText: '刪除',cancelButtonText: '取消',type: 'warning'})await deleteBook(book.name)ElMessage.success('刪除成功')await readBooksDir()} catch (e) {// 用戶取消刪除console.log(e)}
}

💡 完整刪除功能代碼請查看: src/renderer/src/components/Bookshelf.vue

🎨 用戶體驗優化

1. 🖱? 右鍵菜單支持

function showMenu(e) {menuX.value = e.clientXmenuY.value = e.clientYmenuVisible.value = truedocument.addEventListener('click', hideMenu)
}function hideMenu() {menuVisible.value = falsedocument.removeEventListener('click', hideMenu)
}

💡 完整右鍵菜單代碼請查看: src/renderer/src/components/Book.vue

2. ? 表單驗證

const rules = ref({name: [{ required: true, message: '請輸入書籍名稱', trigger: 'blur' }],type: [{ required: true, message: '請選擇類型', trigger: 'blur' }],targetCount: [{ required: true, message: '請輸入目標字數', trigger: 'blur' }],intro: [{ required: true, message: '請輸入簡介', trigger: 'blur' }]
})

💡 完整表單驗證代碼請查看: src/renderer/src/components/Bookshelf.vue

3. 💬 錯誤處理與用戶反饋

// 創建成功提示
ElMessage.success('創建成功')// 刪除確認
await ElMessageBox.confirm(`確定要刪除《${book.name}》嗎?此操作不可恢復!`, '刪除確認', {confirmButtonText: '刪除',cancelButtonText: '取消',type: 'warning'
})

💡 完整錯誤處理代碼請查看: src/renderer/src/components/Bookshelf.vue

? 技術亮點總結

1. 🔄 跨進程通信設計

  • 使用 Electron 的 IPC 機制實現主進程與渲染進程的安全通信
  • 通過 contextBridge 暴露安全的 API 接口

2. 🗂? 文件系統管理

  • 自動創建標準化的書籍目錄結構
  • 元數據 JSON 文件存儲,便于擴展和維護
  • 文件名安全處理,避免特殊字符沖突

3. 🗃? 狀態管理優化

  • 使用 Pinia 實現響應式狀態管理
  • 統一的數據流,確保 UI 與數據同步

4. 🎨 用戶體驗設計

  • 直觀的書籍卡片展示
  • 右鍵菜單快速操作
  • 完善的表單驗證和錯誤提示

🔮 擴展性考慮

1. 📚 書籍類型擴展

const BOOK_TYPES = [{ value: 'novel', label: '小說' },{ value: 'essay', label: '散文' },{ value: 'poetry', label: '詩歌' },{ value: 'script', label: '劇本' }
]

💡 完整書籍類型配置請查看: src/renderer/src/constants/config.js

2. 📊 元數據擴展

const bookMeta = {// 基礎信息id: 'unique_id',name: '書籍名稱',type: 'novel',// 擴展信息tags: ['標簽1', '標簽2'],status: 'writing', // writing, completed, pausedcoverImage: 'cover.jpg',wordCountGoal: 100000,// 統計信息currentWordCount: 50000,chaptersCount: 10,lastModified: '2024-01-01'
}

💡 完整元數據結構請查看: src/renderer/src/components/Bookshelf.vue

📝 總結與展望

通過 Electron + Vue 3 技術棧,我們成功構建了一個功能完善、用戶體驗優秀的書籍管理系統。該系統不僅滿足了基本的 CRUD 操作需求,還在用戶體驗、數據安全、擴展性等方面進行了深度優化。

🎯 關鍵成功因素

  • 🏗? 架構清晰: 主進程負責文件操作,渲染進程負責 UI 交互
  • 🔒 數據安全: 通過 IPC 機制確保跨進程通信的安全性
  • 🎨 用戶體驗: 直觀的界面設計和流暢的操作體驗
  • 🔧 可維護性: 模塊化的代碼結構和統一的狀態管理

🚀 技術價值

  • 跨平臺支持: 基于 Electron 實現 Windows、macOS、Linux 全平臺支持
  • 高性能: 使用 Vue 3 的 Composition API 和 Pinia 狀態管理
  • 可擴展: 模塊化的組件設計和清晰的代碼結構
  • 用戶友好: 完善的錯誤處理和用戶反饋機制

這個書籍管理系統為整個寫作軟件奠定了堅實的基礎,為后續的功能擴展提供了良好的架構支持。


📚 相關鏈接

  • 項目地址: GitHub - 51mazi,給個 Star 哦~
  • Electron 官方文檔: Electron Documentation
  • Vue 3 官方文檔: Vue 3 Documentation
  • Pinia 狀態管理: Pinia Documentation

🏷? 標簽

#Electron #Vue3 #書籍管理 #桌面應用 #前端開發 #狀態管理 #用戶體驗


💡 如果這篇文章對你有幫助,請給個 ?? 支持一下!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92376.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025華數杯數學建模A題【 多孔膜光反射性能的優化與控制】原創論文講解(含完整python代碼)

大家好呀&#xff0c;從發布賽題一直到現在&#xff0c;總算完成了2025華數杯數學建模A題【 多孔膜光反射性能的優化與控制】完整的成品論文。本論文可以保證原創&#xff0c;保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃圾半成品論文。A題論…

網絡相關(AI回答)

網管交換機都支持帶tag的以太幀嗎DeepSeek-R1 回答完成深度思考完成 用時24秒&#xff0c;搜索全網20篇資料是的&#xff0c;所有網管交換機都支持處理和轉發帶Tag&#xff08;802.1Q VLAN標簽&#xff09;的以太網幀&#xff0c;這是其核心功能之一。以下是關鍵要點&#xff1…

每日五個pyecharts可視化圖表-bars(5)

探索pyecharts庫中條形圖的高級用法與定制技巧&#xff0c;打造精美數據可視化圖表 在數據可視化中&#xff0c;條形圖是最常用的圖表類型之一。它能夠清晰地展示不同類別的數據對比&#xff0c;幫助我們快速理解數據特征。本文將為您介紹pyecharts庫中條形圖的5種高級用法&…

分布式版本控制工具Git

一.開發中為什么需要Git因為在多人開發中Git可以管理代碼&#xff0c;而且每個人都可以從庫里面下載代碼進行修改&#xff0c;每個人上傳和修改Git都會有記錄&#xff0c;如果出現大錯誤&#xff0c;還可以回退到正常版本。二.Git原理我們首先從代碼庫(Remote)下載代碼到工作區…

OpenAI重磅開源GPT-oss:首款支持商用的AI Agent專屬模型

今日凌晨&#xff0c;OpenAI宣布開源兩款全新大模型——GPT-oss-120B&#xff08;1168億參數&#xff09;與GPT-oss-20B&#xff08;209億參數&#xff09;&#xff0c;成為全球首個支持商業化應用的開放權重推理模型。該模型專為AI智能體&#xff08;Agent&#xff09;設計&am…

【STM32】GPIO的輸入輸出

GPIO是通用的輸入輸出接口&#xff0c;可配置8種輸入模式&#xff0c;輸出模式下可控制端口輸出高低電平&#xff0c;用于點亮LED、控制蜂鳴器、模擬通信協議等&#xff1b;輸入模式下可以讀取端口的高低電平或者電壓&#xff0c;用于讀取按鍵、外接模塊的電平信號、ADC的電壓采…

5分鐘了解OpenCV

在數字化時代&#xff0c;圖像和視頻已經成為信息傳遞的核心載體。從手機拍照的美顏功能到自動駕駛的路況識別&#xff0c;從醫學影像分析到安防監控系統&#xff0c;視覺技術正深刻改變著我們的生活。而在這背后&#xff0c;OpenCV 作為一款強大的開源計算機視覺庫&#xff0c…

Oracle 關閉 impdp任務

Oracle 關閉 impdp任務 執行 impdp system/123456 attachSYS_EXPORT_TABLE_01 執行 stop_jobimmediate

數據結構——鏈表2

1.2 實現單鏈表 在上一篇文章中&#xff0c;單鏈表的實現只有一少部分&#xff0c;這一篇接著來了解單鏈表剩下的接口實現。 SList.h#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>//定義單鏈表就是定義節點&#xff0c;因為單鏈表…

Windows和Linux應急響應以及IP封堵

目錄 1、Windows入侵排查思路 1.1 檢查系統賬號安全 1.2 檢查異常端口、進程 1.3 檢查啟動項、計劃任務、服務 1.4 檢查系統相關信息 1.5 自動化查殺 1.6 日志分析 系統日志分析 Web 訪問日志 2、Linux 入侵排查思路 2.1 賬號安全 2.1.1、基本使用 2.1.2、入侵排查…

MIT成果登上Nature!液態神經網絡YYDS

2025深度學習發論文&模型漲點之——液態神經網絡液態神經網絡&#xff08;Liquid Neural Networks&#xff0c;LNN&#xff09;是一種受生物神經系統啟發的連續時間遞歸神經網絡&#xff08;RNN&#xff09;&#xff0c;其核心創新在于將靜態神經網絡轉化為由微分方程驅動的…

AI 對話高效輸入指令攻略(四):AI+Apache ECharts:生成各種專業圖表

- **AI與數據可視化的革命性結合**:介紹AI如何降低數據可視化門檻,提升效率。 - **Apache ECharts:專業可視化的利器**:使用表格對比展示ECharts的特點、優勢和適用場景。 - **四步實現AI驅動圖表生成**:通過分步指南講解從環境準備到圖表優化的全流程,包含多個代碼示例及…

vue2 基礎學習 day04 (結構/樣式/邏輯、組件通信、進階語法)下

一、非父子通信-event bus 事件總線1.作用非父子組件之間&#xff0c;進行簡易消息傳遞。(復雜場景→ Vuex)2.步驟創建一個都能訪問的事件總線 &#xff08;空Vue實例&#xff09;import Vue from vue const Bus new Vue() export default BusA組件&#xff08;接受方&#xf…

ubuntu 20.04 C和C++的標準頭文件都放在哪個目錄?

在 Ubuntu 20.04 中&#xff0c;C 和 C 標準頭文件的存放目錄主要由編譯器&#xff08;如 GCC&#xff09;的安裝路徑決定&#xff0c;通常分為以下兩類&#xff1a;?1. C 標準頭文件?C 語言的標準頭文件&#xff08;如 <stdio.h>、<stdlib.h> 等&#xff09;默認…

change和watch

是的&#xff0c;你理解得很對&#xff01; change 與 v-model 的結合&#xff1a;change 事件通常用于監聽 表單元素的變化&#xff0c;但它并不一定意味著值發生了變化。它主要是當 用戶與輸入框交互時&#xff08;如點擊選項、選擇文本框內容、提交表單等&#xff09;觸發的…

分布式微服務--GateWay(1)

一、什么是微服務網關&#xff08;API Gateway&#xff09; 定義&#xff1a;微服務網關是整個系統請求的統一入口&#xff0c;負責請求轉發、過濾處理、安全校驗等。 作用&#xff1a; 請求路由 日志記錄 權限控制 參數校驗 解決跨域問題 黑白名單控制 限流、熔斷、降級…

大文件斷點續傳(vue+springboot+mysql)

斷點續傳vue前端代碼后端代碼controller 層service層持久層主表&#xff0c;初始化單次上傳文件表&#xff0c;單次上傳所有的文件記錄文件分塊表科普信息參考其他博主 流程圖 vue前端代碼 這里是只做了demo示例&#xff0c;主線測試沒什么問題&#xff0c;前端同學可參考修…

Nodejs》》MySql

Node.js 操作MySQL數據庫 文檔 # 項目要先安裝mysql包npm i mysqlxx // 安裝指定版本npm i mysql // 默認安裝最新版本 # 連接 mysq// 使用連接池連接const mysql require(mysql)# 建立連接const db mysql.createPool({host:, // 數據庫的IP地址user:ro…

金倉數據庫常見問題(持續更新)

目錄 1.查看大小是否敏感寫參數&#xff0c;提示&#xff1a;未認可的配置參數 "case_sensitive" 2.sys_backup.sh init時提示can not connect the primary node 3.設置邏輯備份運行腳本時提示錯誤are not allowed to use this program (crontab) 4.修改表字段類…

Docker Buildx最佳實踐:多架構鏡像構建指南

文章目錄為什么需要 Docker Buildx安裝與啟用 Docker Buildx創建多架構構建器實例構建多架構鏡像優化構建性能調試多架構構建實戰案例&#xff1a;構建 Go 應用多架構鏡像總結Docker Buildx 是 Docker 官方推出的擴展工具&#xff0c;用于支持多平臺鏡像構建&#xff0c;簡化跨…