diff --git a/src/layout/components/TagView/TagView.vue b/src/layout/components/TagView/TagView.vue new file mode 100644 index 00000000..d26661c6 --- /dev/null +++ b/src/layout/components/TagView/TagView.vue @@ -0,0 +1,197 @@ + + + + + \ No newline at end of file diff --git a/src/layout/index.vue b/src/layout/index.vue index e35c40b8..a7e28783 100644 --- a/src/layout/index.vue +++ b/src/layout/index.vue @@ -6,6 +6,7 @@ + @@ -18,6 +19,7 @@ import { ref } from 'vue'; import { AppMain, Navbar } from './components'; import Menu from './components/Menu/Menu.vue'; +import TagView from './components/TagView/TagView.vue'; const collapsed = ref(false); const onCollapse = () => { diff --git a/src/store/tagView.js b/src/store/tagView.js new file mode 100644 index 00000000..752db5bf --- /dev/null +++ b/src/store/tagView.js @@ -0,0 +1,83 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; +import { sessionStorage } from '@/utils/storage'; + +export const useTagViewStore = defineStore('tagView', () => { + const visitedViews = ref(sessionStorage.getItem('tagList') || []); + const cachedViews = ref([]); + + function addVisitedViews(view) { + console.log(view.meta.title) + + // Akiraka 20240228 限制标签数量 + if (visitedViews.value.length >= 20) { + visitedViews.value.splice(0,1) + } + + if (visitedViews.value.some(v => v.path === view.path || v.meta.title === view.meta.title)) return; + + visitedViews.value.push( + Object.assign({}, view, { + title: view.meta.title || 'no-name' + }) + ) + sessionStorage.setItem('tagList', visitedViews.value); + } + + function delVisitedViews(view) { + for (const [i, v] of visitedViews.value.entries()) { + if (v.path === view.path) { + visitedViews.value.splice(i, 1); + break; + } + } + sessionStorage.setItem('tagList', visitedViews.value); + } + + function delAllVisitedViews(view) { + visitedViews.value = visitedViews.value.filter(v => v.path === view.path); + sessionStorage.setItem('tagList', visitedViews.value); + } + + function delLeftVisitedViews(view) { + for (const [i, v] of visitedViews.value.entries()) { + if (v.path === view.path) { + visitedViews.value = visitedViews.value.slice(i); + break; + } + } + sessionStorage.setItem('tagList', visitedViews.value); + } + function delRightVisitedViews(view) { + for (const [i, v] of visitedViews.value.entries()) { + if (v.path === view.path) { + visitedViews.value = visitedViews.value.slice(0, i + 1); + break; + } + } + sessionStorage.setItem('tagList', visitedViews.value); + } + + function addCachedViews(view) { + if (cachedViews.value.includes(view.name)) return; + if (!view.meta.noCache) cachedViews.value.push(view.name); + } + + function delCachedViews(view) { + visitedViews.value = visitedViews.value.filter(v => v !== view.name); + } + + function delCachedVisitedViews() { + cachedViews.value = []; + } + + return { + visitedViews, + cachedViews, + addVisitedViews, + delVisitedViews, + delAllVisitedViews, + delLeftVisitedViews, + delRightVisitedViews + } +}) \ No newline at end of file diff --git a/src/utils/storage.js b/src/utils/storage.js index 95c9f030..98a2403e 100644 --- a/src/utils/storage.js +++ b/src/utils/storage.js @@ -28,4 +28,34 @@ export const storage = { removeItem(key) { window.localStorage.removeItem(key); } +} + +export const sessionStorage = { + getKeys() { + const keys = []; + for (let i = 0; i < window.sessionStorage.length; i++) { + keys.push(window.sessionStorage.key(i)); + } + + return keys; + }, + setItem(key, val) { + if (typeof key !== 'string') { + key = key.toString(); + } + + if (key === undefined || key.trim().length === 0) throw new Error('key 参数不能为空或者undefined'); + + window.sessionStorage.setItem(key, JSON.stringify(val)); + }, + getItem(key) { + const val = window.sessionStorage.getItem(key); + return JSON.parse(val); + }, + clearAllKeys() { + window.sessionStorage.clear(); + }, + removeItem(key) { + window.sessionStorage.removeItem(key); + } } \ No newline at end of file