This commit is contained in:
2026-02-21 18:48:18 +08:00
parent 9f3fd2ae9d
commit 8a55430d55
20 changed files with 2025 additions and 97 deletions

View File

@@ -0,0 +1,43 @@
{
"hash": "0daa58b8",
"configHash": "a23338b4",
"lockfileHash": "179ea88f",
"browserHash": "6f87fcc3",
"optimized": {
"vue": {
"src": "../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js",
"file": "vue.js",
"fileHash": "69e73e5b",
"needsInterop": false
},
"vitepress > @vue/devtools-api": {
"src": "../../../../node_modules/vitepress/node_modules/@vue/devtools-api/dist/index.js",
"file": "vitepress___@vue_devtools-api.js",
"fileHash": "9a76c491",
"needsInterop": false
},
"vitepress > @vueuse/core": {
"src": "../../../../node_modules/@vueuse/core/index.mjs",
"file": "vitepress___@vueuse_core.js",
"fileHash": "4bc31a77",
"needsInterop": false
},
"pinia": {
"src": "../../../../node_modules/pinia/dist/pinia.mjs",
"file": "pinia.js",
"fileHash": "3af78da8",
"needsInterop": false
},
"pinia-plugin-persistedstate": {
"src": "../../../../node_modules/pinia-plugin-persistedstate/dist/index.js",
"file": "pinia-plugin-persistedstate.js",
"fileHash": "d77b5825",
"needsInterop": false
}
},
"chunks": {
"chunk-SNNOYR6U": {
"file": "chunk-SNNOYR6U.js"
}
}
}

View File

@@ -0,0 +1,137 @@
// node_modules/pinia-plugin-persistedstate/dist/index.js
function isObject(v) {
return typeof v === "object" && v !== null;
}
function normalizeOptions(options, factoryOptions) {
options = isObject(options) ? options : /* @__PURE__ */ Object.create(null);
return new Proxy(options, {
get(target, key, receiver) {
if (key === "key")
return Reflect.get(target, key, receiver);
return Reflect.get(target, key, receiver) || Reflect.get(factoryOptions, key, receiver);
}
});
}
function get(state, path) {
return path.reduce((obj, p) => {
return obj == null ? void 0 : obj[p];
}, state);
}
function set(state, path, val) {
return path.slice(0, -1).reduce((obj, p) => {
if (/^(__proto__)$/.test(p))
return {};
else return obj[p] = obj[p] || {};
}, state)[path[path.length - 1]] = val, state;
}
function pick(baseState, paths) {
return paths.reduce((substate, path) => {
const pathArray = path.split(".");
return set(substate, pathArray, get(baseState, pathArray));
}, {});
}
function parsePersistence(factoryOptions, store) {
return (o) => {
var _a;
try {
const {
storage = localStorage,
beforeRestore = void 0,
afterRestore = void 0,
serializer = {
serialize: JSON.stringify,
deserialize: JSON.parse
},
key = store.$id,
paths = null,
debug = false
} = o;
return {
storage,
beforeRestore,
afterRestore,
serializer,
key: ((_a = factoryOptions.key) != null ? _a : (k) => k)(typeof key == "string" ? key : key(store.$id)),
paths,
debug
};
} catch (e) {
if (o.debug)
console.error("[pinia-plugin-persistedstate]", e);
return null;
}
};
}
function hydrateStore(store, { storage, serializer, key, debug }) {
try {
const fromStorage = storage == null ? void 0 : storage.getItem(key);
if (fromStorage)
store.$patch(serializer == null ? void 0 : serializer.deserialize(fromStorage));
} catch (e) {
if (debug)
console.error("[pinia-plugin-persistedstate]", e);
}
}
function persistState(state, { storage, serializer, key, paths, debug }) {
try {
const toStore = Array.isArray(paths) ? pick(state, paths) : state;
storage.setItem(key, serializer.serialize(toStore));
} catch (e) {
if (debug)
console.error("[pinia-plugin-persistedstate]", e);
}
}
function createPersistedState(factoryOptions = {}) {
return (context) => {
const { auto = false } = factoryOptions;
const {
options: { persist = auto },
store,
pinia
} = context;
if (!persist)
return;
if (!(store.$id in pinia.state.value)) {
const original_store = pinia._s.get(store.$id.replace("__hot:", ""));
if (original_store)
Promise.resolve().then(() => original_store.$persist());
return;
}
const persistences = (Array.isArray(persist) ? persist.map((p) => normalizeOptions(p, factoryOptions)) : [normalizeOptions(persist, factoryOptions)]).map(parsePersistence(factoryOptions, store)).filter(Boolean);
store.$persist = () => {
persistences.forEach((persistence) => {
persistState(store.$state, persistence);
});
};
store.$hydrate = ({ runHooks = true } = {}) => {
persistences.forEach((persistence) => {
const { beforeRestore, afterRestore } = persistence;
if (runHooks)
beforeRestore == null ? void 0 : beforeRestore(context);
hydrateStore(store, persistence);
if (runHooks)
afterRestore == null ? void 0 : afterRestore(context);
});
};
persistences.forEach((persistence) => {
const { beforeRestore, afterRestore } = persistence;
beforeRestore == null ? void 0 : beforeRestore(context);
hydrateStore(store, persistence);
afterRestore == null ? void 0 : afterRestore(context);
store.$subscribe(
(_mutation, state) => {
persistState(state, persistence);
},
{
detached: true
}
);
});
};
}
var src_default = createPersistedState();
export {
createPersistedState,
src_default as default
};
//# sourceMappingURL=pinia-plugin-persistedstate.js.map

View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": ["../../../../node_modules/pinia-plugin-persistedstate/dist/index.js"],
"sourcesContent": ["// src/normalize.ts\nfunction isObject(v) {\n return typeof v === \"object\" && v !== null;\n}\nfunction normalizeOptions(options, factoryOptions) {\n options = isObject(options) ? options : /* @__PURE__ */ Object.create(null);\n return new Proxy(options, {\n get(target, key, receiver) {\n if (key === \"key\")\n return Reflect.get(target, key, receiver);\n return Reflect.get(target, key, receiver) || Reflect.get(factoryOptions, key, receiver);\n }\n });\n}\n\n// src/pick.ts\nfunction get(state, path) {\n return path.reduce((obj, p) => {\n return obj == null ? void 0 : obj[p];\n }, state);\n}\nfunction set(state, path, val) {\n return path.slice(0, -1).reduce((obj, p) => {\n if (/^(__proto__)$/.test(p))\n return {};\n else return obj[p] = obj[p] || {};\n }, state)[path[path.length - 1]] = val, state;\n}\nfunction pick(baseState, paths) {\n return paths.reduce((substate, path) => {\n const pathArray = path.split(\".\");\n return set(substate, pathArray, get(baseState, pathArray));\n }, {});\n}\n\n// src/plugin.ts\nfunction parsePersistence(factoryOptions, store) {\n return (o) => {\n var _a;\n try {\n const {\n storage = localStorage,\n beforeRestore = void 0,\n afterRestore = void 0,\n serializer = {\n serialize: JSON.stringify,\n deserialize: JSON.parse\n },\n key = store.$id,\n paths = null,\n debug = false\n } = o;\n return {\n storage,\n beforeRestore,\n afterRestore,\n serializer,\n key: ((_a = factoryOptions.key) != null ? _a : (k) => k)(typeof key == \"string\" ? key : key(store.$id)),\n paths,\n debug\n };\n } catch (e) {\n if (o.debug)\n console.error(\"[pinia-plugin-persistedstate]\", e);\n return null;\n }\n };\n}\nfunction hydrateStore(store, { storage, serializer, key, debug }) {\n try {\n const fromStorage = storage == null ? void 0 : storage.getItem(key);\n if (fromStorage)\n store.$patch(serializer == null ? void 0 : serializer.deserialize(fromStorage));\n } catch (e) {\n if (debug)\n console.error(\"[pinia-plugin-persistedstate]\", e);\n }\n}\nfunction persistState(state, { storage, serializer, key, paths, debug }) {\n try {\n const toStore = Array.isArray(paths) ? pick(state, paths) : state;\n storage.setItem(key, serializer.serialize(toStore));\n } catch (e) {\n if (debug)\n console.error(\"[pinia-plugin-persistedstate]\", e);\n }\n}\nfunction createPersistedState(factoryOptions = {}) {\n return (context) => {\n const { auto = false } = factoryOptions;\n const {\n options: { persist = auto },\n store,\n pinia\n } = context;\n if (!persist)\n return;\n if (!(store.$id in pinia.state.value)) {\n const original_store = pinia._s.get(store.$id.replace(\"__hot:\", \"\"));\n if (original_store)\n Promise.resolve().then(() => original_store.$persist());\n return;\n }\n const persistences = (Array.isArray(persist) ? persist.map((p) => normalizeOptions(p, factoryOptions)) : [normalizeOptions(persist, factoryOptions)]).map(parsePersistence(factoryOptions, store)).filter(Boolean);\n store.$persist = () => {\n persistences.forEach((persistence) => {\n persistState(store.$state, persistence);\n });\n };\n store.$hydrate = ({ runHooks = true } = {}) => {\n persistences.forEach((persistence) => {\n const { beforeRestore, afterRestore } = persistence;\n if (runHooks)\n beforeRestore == null ? void 0 : beforeRestore(context);\n hydrateStore(store, persistence);\n if (runHooks)\n afterRestore == null ? void 0 : afterRestore(context);\n });\n };\n persistences.forEach((persistence) => {\n const { beforeRestore, afterRestore } = persistence;\n beforeRestore == null ? void 0 : beforeRestore(context);\n hydrateStore(store, persistence);\n afterRestore == null ? void 0 : afterRestore(context);\n store.$subscribe(\n (_mutation, state) => {\n persistState(state, persistence);\n },\n {\n detached: true\n }\n );\n });\n };\n}\n\n// src/index.ts\nvar src_default = createPersistedState();\nexport {\n createPersistedState,\n src_default as default\n};\n"],
"mappings": "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",
"names": []
}

1715
docs/.vitepress/cache/deps/pinia.js vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -12,6 +12,7 @@ import TaoXin from './components/TaoXin.vue'
import Cafe from './components/Cafe.vue'
import Settings from './components/Settings.vue'
import DocSidebar from './components/DocSidebar.vue'
import sidebarData from './data/sidebar.json'
const { frontmatter } = useData()
const settingsStore = useSettingsStore()
@@ -23,6 +24,13 @@ const isHome = computed(() => frontmatter.value.home === true)
const blurAmount = computed(() => settingsStore.theme.blurAmount ?? 20)
const backgroundColor = computed(() => settingsStore.theme.backgroundColor ?? 'rgba(30, 30, 30, 0.7)')
const navItems = computed(() => {
return sidebarData.map(group => ({
text: group.title,
link: group.path
}))
})
const handleResize = () => {
settingsStore.setMobile(isMobileDevice())
}
@@ -69,8 +77,14 @@ onUnmounted(() => {
<a href="/" class="logo">乌仿镇</a>
<nav class="doc-nav">
<a href="/" class="nav-link">首页</a>
<a href="/java/" class="nav-link">Java</a>
<a href="/vue/" class="nav-link">Vue</a>
<a
v-for="item in navItems"
:key="item.link"
:href="item.link"
class="nav-link"
>
{{ item.text }}
</a>
</nav>
</header>

View File

@@ -1,41 +1,20 @@
<script setup lang="ts">
import { computed } from 'vue'
import { useData } from 'vitepress'
import sidebarData from '../data/sidebar.json'
const { page } = useData()
const sidebarItems = {
'/java/': [
{ text: '概述', link: '/java/' },
{ text: '基础语法', link: '/java/basic' },
{ text: '面向对象', link: '/java/oop' },
{ text: '集合框架', link: '/java/collection' },
{ text: '多线程', link: '/java/thread' }
],
'/vue/': [
{ text: '概述', link: '/vue/' },
{ text: 'Vue3基础', link: '/vue/basic' },
{ text: '组件开发', link: '/vue/component' },
{ text: '组合式API', link: '/vue/composition' },
{ text: '状态管理', link: '/vue/pinia' }
]
}
function getCurrentSidebar() {
const currentSidebar = computed(() => {
const path = page.value.relativePath
for (const [prefix, items] of Object.entries(sidebarItems)) {
if (path.startsWith(prefix.replace(/^\//, ''))) {
return { title: prefix === '/java/' ? 'Java 笔记' : 'Vue 笔记', items }
}
}
return null
}
const currentSidebar = getCurrentSidebar()
const pathPrefix = path.split('/')[0]
return sidebarData.find(group => group.path === `/${pathPrefix}/`)
})
</script>
<template>
<div class="sidebar" v-if="currentSidebar">
<h2 class="sidebar-title">{{ currentSidebar.title }}</h2>
<h2 class="sidebar-title">{{ currentSidebar.title }} 笔记</h2>
<ul class="sidebar-list">
<li v-for="item in currentSidebar.items" :key="item.link">
<a :href="item.link" class="sidebar-link">{{ item.text }}</a>

11
docs/.vitepress/theme/data/sidebar.d.ts vendored Normal file
View File

@@ -0,0 +1,11 @@
declare module '*.json' {
const value: {
title: string
path: string
items: {
text: string
link: string
}[]
}[]
export default value
}

View File

@@ -0,0 +1,64 @@
[
{
"title": "java",
"path": "/java/",
"items": [
{
"text": "概述",
"link": "/java/"
},
{
"text": "Java基础语法",
"link": "/java/basic"
},
{
"text": "集合框架",
"link": "/java/collection"
},
{
"text": "面向对象编程",
"link": "/java/oop"
},
{
"text": "多线程编程",
"link": "/java/thread"
}
]
},
{
"title": "vue",
"path": "/vue/",
"items": [
{
"text": "概述",
"link": "/vue/"
},
{
"text": "Vue3基础",
"link": "/vue/basic"
},
{
"text": "组件开发",
"link": "/vue/component"
},
{
"text": "组合式API",
"link": "/vue/composition"
},
{
"text": "状态管理",
"link": "/vue/pinia"
}
]
},
{
"title": "杂谈",
"path": "/杂谈/",
"items": [
{
"text": "概述",
"link": "/杂谈/"
}
]
}
]

View File

@@ -0,0 +1,2 @@
# 123
1231

View File

@@ -12,14 +12,11 @@ interface SidebarItem {
}
interface SidebarGroup {
text: string
title: string
path: string
items: SidebarItem[]
}
interface SidebarConfig {
[path: string]: SidebarGroup[]
}
function getTitleFromFile(filePath: string): string {
const content = fs.readFileSync(filePath, 'utf-8')
@@ -57,8 +54,8 @@ function getSidebarOrder(filePath: string, fileName: string): number {
return 999
}
function generateSidebar(): SidebarConfig {
const sidebar: SidebarConfig = {}
function generateSidebar(): SidebarGroup[] {
const sidebar: SidebarGroup[] = []
const entries = fs.readdirSync(docsDir, { withFileTypes: true })
@@ -94,78 +91,30 @@ function generateSidebar(): SidebarConfig {
}
})
const dirName = entry.name.charAt(0).toUpperCase() + entry.name.slice(1)
sidebar[`/${entry.name}/`] = [
{
text: `${dirName} 笔记`,
items
}
]
sidebar.push({
title: entry.name,
path: `/${entry.name}/`,
items
})
}
return sidebar
}
function generateNav(sidebar: SidebarConfig) {
return Object.keys(sidebar).map(p => {
const name = p.replace(/\//g, '').charAt(0).toUpperCase() + p.replace(/\//g, '').slice(1)
return {
text: name,
link: p
}
})
}
function formatObject(obj: unknown, indent: number = 0): string {
const spaces = ' '.repeat(indent)
const innerSpaces = ' '.repeat(indent + 2)
if (Array.isArray(obj)) {
if (obj.length === 0) return '[]'
const items = obj.map(item => formatObject(item, indent + 2))
return `[\n${items.map(i => innerSpaces + i).join(',\n')}\n${spaces}]`
}
if (typeof obj === 'object' && obj !== null) {
const entries = Object.entries(obj)
if (entries.length === 0) return '{}'
const items = entries.map(([key, value]) => {
const formattedValue = formatObject(value, indent + 2)
return `${innerSpaces}'${key}': ${formattedValue}`
})
return `{\n${items.join(',\n')}\n${spaces}}`
}
if (typeof obj === 'string') {
return `'${obj}'`
}
return String(obj)
}
function updateConfig() {
const sidebar = generateSidebar()
const nav = generateNav(sidebar)
const configPath = path.resolve(__dirname, '../docs/.vitepress/config.mts')
let config = fs.readFileSync(configPath, 'utf-8')
const outputPath = path.resolve(__dirname, '../docs/.vitepress/theme/data/sidebar.json')
const outputDir = path.dirname(outputPath)
const sidebarStr = formatObject(sidebar, 4)
const navStr = formatObject(nav, 4)
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true })
}
const sidebarRegex = /sidebar:\s*\{\s*\n\s*\}/
const navRegex = /nav:\s*\[\s*\n\s*\]/
fs.writeFileSync(outputPath, JSON.stringify(sidebar, null, 2))
config = config.replace(sidebarRegex, `sidebar: ${sidebarStr}`)
config = config.replace(navRegex, `nav: ${navStr}`)
fs.writeFileSync(configPath, config)
console.log('Sidebar config updated:')
console.log('Sidebar JSON generated:')
console.log(JSON.stringify(sidebar, null, 2))
console.log('\nNav config updated:')
console.log(JSON.stringify(nav, null, 2))
}
updateConfig()