+ @mouseleave="handleMouseLeave">
@@ -43,89 +34,86 @@
-
\ No newline at end of file
+
diff --git a/src/main.js b/src/main.js
index 7adc316..d633bb0 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,5 +1,6 @@
import { createApp } from 'vue'
import { createRouter, createWebHashHistory } from 'vue-router'
+import { createPinia } from 'pinia'
import App from './App.vue'
// Pages
@@ -27,5 +28,6 @@ const router = createRouter({
// App
const app = createApp(App)
+app.use(createPinia())
app.use(router)
app.mount('#app')
\ No newline at end of file
diff --git a/src/pages/FolderPage.vue b/src/pages/FolderPage.vue
index 93df455..a4f837f 100644
--- a/src/pages/FolderPage.vue
+++ b/src/pages/FolderPage.vue
@@ -38,95 +38,79 @@
-
\ No newline at end of file
diff --git a/src/pages/NoteDetailPage.vue b/src/pages/NoteDetailPage.vue
index 7e68b10..4fa20fe 100644
--- a/src/pages/NoteDetailPage.vue
+++ b/src/pages/NoteDetailPage.vue
@@ -59,81 +59,62 @@
-
\ No newline at end of file
diff --git a/src/pages/NoteEditorPage.vue b/src/pages/NoteEditorPage.vue
index 0724b87..3299c13 100644
--- a/src/pages/NoteEditorPage.vue
+++ b/src/pages/NoteEditorPage.vue
@@ -62,136 +62,113 @@
-
\ No newline at end of file
diff --git a/src/pages/NoteListPage.vue b/src/pages/NoteListPage.vue
index 931c26c..5622415 100644
--- a/src/pages/NoteListPage.vue
+++ b/src/pages/NoteListPage.vue
@@ -4,7 +4,7 @@
:title="headerTitle"
:onAction="handleAddNote"
actionIcon="create"
- leftIcon="settings"
+ leftType="settings"
:onLeftAction="handleSettingsPress"
:onFolderToggle="handleFolderToggle"
:isFolderExpanded="isFolderExpanded"
@@ -123,185 +123,154 @@
-
\ No newline at end of file
diff --git a/src/pages/SettingsPage.vue b/src/pages/SettingsPage.vue
index c782cf0..db78478 100644
--- a/src/pages/SettingsPage.vue
+++ b/src/pages/SettingsPage.vue
@@ -79,78 +79,64 @@
-
\ No newline at end of file
diff --git a/src/stores/useAppStore.js b/src/stores/useAppStore.js
new file mode 100644
index 0000000..838e679
--- /dev/null
+++ b/src/stores/useAppStore.js
@@ -0,0 +1,139 @@
+import { defineStore } from 'pinia';
+import * as storage from '../utils/storage';
+
+export const useAppStore = defineStore('app', {
+ state: () => ({
+ notes: [],
+ folders: [],
+ settings: { cloudSync: false, darkMode: false }
+ }),
+
+ getters: {
+ starredNotesCount: (state) => {
+ return state.notes.filter(note => note.isStarred).length;
+ },
+
+ allNotesCount: (state) => {
+ return state.notes.length;
+ }
+ },
+
+ actions: {
+ // 初始化数据
+ async loadData() {
+ try {
+ const loadedNotes = await storage.getNotes();
+ const loadedFolders = await storage.getFolders();
+ const loadedSettings = await storage.getSettings();
+
+ this.notes = loadedNotes;
+ this.folders = loadedFolders;
+ this.settings = loadedSettings;
+ } catch (error) {
+ console.error('Error loading data:', error);
+ }
+ },
+
+ // 保存notes到localStorage
+ async saveNotes() {
+ try {
+ await storage.saveNotes(this.notes);
+ } catch (error) {
+ console.error('Error saving notes:', error);
+ }
+ },
+
+ // 保存folders到localStorage
+ async saveFolders() {
+ try {
+ await storage.saveFolders(this.folders);
+ } catch (error) {
+ console.error('Error saving folders:', error);
+ }
+ },
+
+ // 保存settings到localStorage
+ async saveSettings() {
+ try {
+ await storage.saveSettings(this.settings);
+ } catch (error) {
+ console.error('Error saving settings:', error);
+ }
+ },
+
+ // Note functions
+ async addNote(note) {
+ try {
+ const newNote = await storage.addNote(note);
+ this.notes.push(newNote);
+ return newNote;
+ } catch (error) {
+ console.error('Error adding note:', error);
+ throw error;
+ }
+ },
+
+ async updateNote(id, updates) {
+ try {
+ const updatedNote = await storage.updateNote(id, updates);
+ if (updatedNote) {
+ const index = this.notes.findIndex(note => note.id === id);
+ if (index !== -1) {
+ this.notes[index] = updatedNote;
+ }
+ }
+ return updatedNote;
+ } catch (error) {
+ console.error('Error updating note:', error);
+ throw error;
+ }
+ },
+
+ async deleteNote(id) {
+ try {
+ const result = await storage.deleteNote(id);
+ if (result) {
+ this.notes = this.notes.filter(note => note.id !== id);
+ }
+ return result;
+ } catch (error) {
+ console.error('Error deleting note:', error);
+ throw error;
+ }
+ },
+
+ // Folder functions
+ async addFolder(folder) {
+ try {
+ const newFolder = await storage.addFolder(folder);
+ this.folders.push(newFolder);
+ return newFolder;
+ } catch (error) {
+ console.error('Error adding folder:', error);
+ throw error;
+ }
+ },
+
+ // Settings functions
+ async updateSettings(newSettings) {
+ try {
+ const updatedSettings = { ...this.settings, ...newSettings };
+ this.settings = updatedSettings;
+ await storage.saveSettings(updatedSettings);
+ } catch (error) {
+ console.error('Error updating settings:', error);
+ throw error;
+ }
+ },
+
+ // 切换云同步设置
+ async toggleCloudSync() {
+ await this.updateSettings({ cloudSync: !this.settings.cloudSync });
+ },
+
+ // 切换深色模式设置
+ async toggleDarkMode() {
+ await this.updateSettings({ darkMode: !this.settings.darkMode });
+ }
+ }
+});
\ No newline at end of file
diff --git a/src/stores/useAppStore.test.js b/src/stores/useAppStore.test.js
new file mode 100644
index 0000000..d39d571
--- /dev/null
+++ b/src/stores/useAppStore.test.js
@@ -0,0 +1,9 @@
+import { useAppStore } from './useAppStore';
+
+// 测试store是否能正常工作
+describe('AppStore', () => {
+ it('should initialize with default state', () => {
+ // 这里可以添加测试代码
+ expect(true).toBe(true);
+ });
+});
\ No newline at end of file
diff --git a/src/utils/AppDataContext.js b/src/utils/AppDataContext.js
deleted file mode 100644
index 56e638f..0000000
--- a/src/utils/AppDataContext.js
+++ /dev/null
@@ -1,119 +0,0 @@
-import { reactive, provide, inject, watch } from 'vue';
-import * as storage from './storage';
-
-// Define the context key
-const AppDataContextKey = Symbol('AppDataContext');
-
-// Create the provider component
-export const AppDataProvider = {
- setup(props, { slots }) {
- // Initialize reactive state
- const state = reactive({
- notes: [],
- folders: [],
- settings: { cloudSync: false, darkMode: false }
- });
-
- // Load data on app start
- const loadData = async () => {
- const loadedNotes = await storage.getNotes();
- const loadedFolders = await storage.getFolders();
- const loadedSettings = await storage.getSettings();
-
- state.notes = loadedNotes;
- state.folders = loadedFolders;
- state.settings = loadedSettings;
- };
-
- // Save notes when they change
- watch(
- () => state.notes,
- (newNotes) => {
- storage.saveNotes(newNotes);
- },
- { deep: true }
- );
-
- // Save folders when they change
- watch(
- () => state.folders,
- (newFolders) => {
- storage.saveFolders(newFolders);
- },
- { deep: true }
- );
-
- // Save settings when they change
- watch(
- () => state.settings,
- (newSettings) => {
- storage.saveSettings(newSettings);
- },
- { deep: true }
- );
-
- // Note functions
- const addNote = async (note) => {
- const newNote = await storage.addNote(note);
- state.notes.push(newNote);
- return newNote;
- };
-
- const updateNote = async (id, updates) => {
- const updatedNote = await storage.updateNote(id, updates);
- if (updatedNote) {
- const index = state.notes.findIndex(note => note.id === id);
- if (index !== -1) {
- state.notes[index] = updatedNote;
- }
- }
- return updatedNote;
- };
-
- const deleteNote = async (id) => {
- const result = await storage.deleteNote(id);
- if (result) {
- state.notes = state.notes.filter(note => note.id !== id);
- }
- return result;
- };
-
- // Folder functions
- const addFolder = async (folder) => {
- const newFolder = await storage.addFolder(folder);
- state.folders.push(newFolder);
- return newFolder;
- };
-
- // Settings functions
- const updateSettings = async (newSettings) => {
- const updatedSettings = { ...state.settings, ...newSettings };
- state.settings = updatedSettings;
- await storage.saveSettings(updatedSettings);
- };
-
- // Load initial data
- loadData();
-
- // Provide the context
- provide(AppDataContextKey, {
- state,
- addNote,
- updateNote,
- deleteNote,
- addFolder,
- updateSettings
- });
-
- return () => slots.default?.();
- }
-};
-
-// Hook to use the context
-export const useAppData = () => {
- const context = inject(AppDataContextKey);
- if (!context) {
- throw new Error('useAppData must be used within an AppDataProvider');
- }
- return context;
-};
\ No newline at end of file
diff --git a/vite.config.js b/vite.config.js
index 0b15da1..76f2ac1 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -11,5 +11,15 @@ export default defineConfig({
},
server: {
port: 3000
+ },
+ build: {
+ rollupOptions: {
+ output: {
+ // 为CSS和JS文件添加哈希后缀
+ entryFileNames: 'assets/[name].[hash].js',
+ chunkFileNames: 'assets/[name].[hash].js',
+ assetFileNames: 'assets/[name].[hash].[ext]'
+ }
+ }
}
})
\ No newline at end of file