feat(frontend): 搭建桌面端基础界面与 Workspace

- App Shell 壳层:主导航、次导航、Title Bar、状态栏
- Vault 入口页:最近 Vault、打开/创建 Vault、AI Core 状态
- Workspace 与文件树:浏览、打开、创建笔记/文件夹
- Design Token:浅色/深色主题 CSS Variables
- Contracts / Service / Store / Router 基础架构
- 统一 ApiClient 与 SseClient,对接后端 API 契约
This commit is contained in:
2026-08-29 10:36:16 +08:00
parent 694c1b27c1
commit f9efc4f4a2
42 changed files with 8044 additions and 167 deletions
+69
View File
@@ -0,0 +1,69 @@
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import type { Plugin } from '@/contracts'
import { mockPlugins } from '@/services/pluginService'
export const usePluginStore = defineStore('plugin', () => {
const plugins = ref<Plugin[]>(mockPlugins)
const selectedPluginId = ref<string | null>(null)
const isLoading = ref(false)
const selectedPlugin = computed(() =>
plugins.value.find((p) => p.plugin_id === selectedPluginId.value) || null
)
const enabledPlugins = computed(() => plugins.value.filter((p) => p.enabled))
const readyPlugins = computed(() => plugins.value.filter((p) => p.status === 'ready'))
const errorPlugins = computed(() => plugins.value.filter((p) => p.status === 'error'))
async function loadPlugins() {
isLoading.value = true
try {
const { listPlugins } = await import('@/services/pluginService')
plugins.value = await listPlugins()
} finally {
isLoading.value = false
}
}
function selectPlugin(pluginId: string | null) {
selectedPluginId.value = pluginId
}
async function enablePlugin(pluginId: string) {
const plugin = plugins.value.find((p) => p.plugin_id === pluginId)
if (plugin) {
plugin.enabled = true
plugin.status = 'ready'
}
}
async function disablePlugin(pluginId: string) {
const plugin = plugins.value.find((p) => p.plugin_id === pluginId)
if (plugin) {
plugin.enabled = false
plugin.status = 'disabled'
}
}
async function uninstallPlugin(pluginId: string) {
const idx = plugins.value.findIndex((p) => p.plugin_id === pluginId)
if (idx > -1) plugins.value.splice(idx, 1)
if (selectedPluginId.value === pluginId) selectedPluginId.value = null
}
return {
plugins,
selectedPluginId,
selectedPlugin,
enabledPlugins,
readyPlugins,
errorPlugins,
isLoading,
loadPlugins,
selectPlugin,
enablePlugin,
disablePlugin,
uninstallPlugin,
}
})