From e181f04c642204e79749af93fa921875ff6c21ba Mon Sep 17 00:00:00 2001 From: baoshiwei <baoshiwei@shlanbao.cn> Date: 星期二, 20 五月 2025 10:46:35 +0800 Subject: [PATCH] refactor(qms): 重构趋势图展示逻辑 --- src/components/HeaderSearch/index.vue | 180 ++++++++++++++++++++++++++++++++--------------------------- 1 files changed, 98 insertions(+), 82 deletions(-) diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue index 543559b..a785958 100644 --- a/src/components/HeaderSearch/index.vue +++ b/src/components/HeaderSearch/index.vue @@ -1,5 +1,5 @@ <template> - <div :class="{ 'show': show }" class="header-search"> + <div :class="{ show: show }" class="header-search"> <svg-icon class-name="search-icon" icon-class="search" @click.stop="click" /> <el-select ref="headerSearchSelectRef" @@ -17,128 +17,144 @@ </div> </template> -<script setup> -import Fuse from 'fuse.js' -import { getNormalPath } from '@/utils/ruoyi' -import { isHttp } from '@/utils/validate' -import usePermissionStore from '@/store/modules/permission' +<script setup lang="ts" name="HeaderSearch"> +import Fuse from 'fuse.js'; +import { getNormalPath } from '@/utils/ruoyi'; +import { isHttp } from '@/utils/validate'; +import usePermissionStore from '@/store/modules/permission'; +import { RouteRecordRaw } from 'vue-router'; + +type Router = Array<{ + path: string; + title: string[]; +}>; const search = ref(''); -const options = ref([]); -const searchPool = ref([]); +const options = ref<any>([]); +const searchPool = ref<Router>([]); const show = ref(false); -const fuse = ref(undefined); -const headerSearchSelectRef = ref(null); +const fuse = ref(); +const headerSearchSelectRef = ref<ElSelectInstance>(); const router = useRouter(); -const routes = computed(() => usePermissionStore().routes); +const routes = computed(() => usePermissionStore().getRoutes()); -function click() { - show.value = !show.value +const click = () => { + show.value = !show.value; if (show.value) { - headerSearchSelectRef.value && headerSearchSelectRef.value.focus() + headerSearchSelectRef.value && headerSearchSelectRef.value.focus(); } }; -function close() { - headerSearchSelectRef.value && headerSearchSelectRef.value.blur() - options.value = [] - show.value = false -} -function change(val) { +const close = () => { + headerSearchSelectRef.value && headerSearchSelectRef.value.blur(); + options.value = []; + show.value = false; +}; +const change = (val: any) => { const path = val.path; + const query = val.query; if (isHttp(path)) { // http(s):// 璺緞鏂扮獥鍙f墦寮� - const pindex = path.indexOf("http"); - window.open(path.substr(pindex, path.length), "_blank"); + const pindex = path.indexOf('http'); + window.open(path.substr(pindex, path.length), '_blank'); } else { - router.push(path) + if (query) { + router.push({ path: path, query: JSON.parse(query) }); + } else { + router.push(path); + } } - - search.value = '' - options.value = [] + search.value = ''; + options.value = []; nextTick(() => { - show.value = false - }) -} -function initFuse(list) { + show.value = false; + }); +}; +const initFuse = (list: Router) => { fuse.value = new Fuse(list, { shouldSort: true, threshold: 0.4, location: 0, distance: 100, minMatchCharLength: 1, - keys: [{ - name: 'title', - weight: 0.7 - }, { - name: 'path', - weight: 0.3 - }] - }) -} + keys: [ + { + name: 'title', + weight: 0.7 + }, + { + name: 'path', + weight: 0.3 + } + ] + }); +}; // Filter out the routes that can be displayed in the sidebar // And generate the internationalized title -function generateRoutes(routes, basePath = '', prefixTitle = []) { - let res = [] - - for (const r of routes) { +const generateRoutes = (routes: RouteRecordRaw[], basePath = '', prefixTitle: string[] = []) => { + let res: Router = []; + routes.forEach((r) => { // skip hidden router - if (r.hidden) { continue } - const p = r.path.length > 0 && r.path[0] === '/' ? r.path : '/' + r.path; - const data = { - path: !isHttp(r.path) ? getNormalPath(basePath + p) : r.path, - title: [...prefixTitle] - } + if (!r.hidden) { + const p = r.path.length > 0 && r.path[0] === '/' ? r.path : '/' + r.path; + const data = { + path: !isHttp(r.path) ? getNormalPath(basePath + p) : r.path, + title: [...prefixTitle], + query: '' + }; + if (r.meta && r.meta.title) { + data.title = [...data.title, r.meta.title]; + if (r.redirect !== 'noRedirect') { + // only push the routes with title + // special case: need to exclude parent router without redirect + res.push(data); + } + } - if (r.meta && r.meta.title) { - data.title = [...data.title, r.meta.title] + if (r.query) { + data.query = r.query; + } - if (r.redirect !== 'noRedirect') { - // only push the routes with title - // special case: need to exclude parent router without redirect - res.push(data) + // recursive child routes + if (r.children) { + const tempRoutes = generateRoutes(r.children, data.path, data.title); + if (tempRoutes.length >= 1) { + res = [...res, ...tempRoutes]; + } } } - - // recursive child routes - if (r.children) { - const tempRoutes = generateRoutes(r.children, data.path, data.title) - if (tempRoutes.length >= 1) { - res = [...res, ...tempRoutes] - } - } - } - return res -} -function querySearch(query) { + }); + return res; +}; +const querySearch = (query: string) => { if (query !== '') { - options.value = fuse.value.search(query) + options.value = fuse.value.search(query); } else { - options.value = [] + options.value = []; } -} +}; onMounted(() => { searchPool.value = generateRoutes(routes.value); -}) +}); -watchEffect(() => { - searchPool.value = generateRoutes(routes.value) -}) +// watchEffect(() => { +// searchPool.value = generateRoutes(routes.value) +// }) watch(show, (value) => { if (value) { - document.body.addEventListener('click', close) + document.body.addEventListener('click', close); } else { - document.body.removeEventListener('click', close) + document.body.removeEventListener('click', close); } -}) +}); -watch(searchPool, (list) => { - initFuse(list) -}) +watch(searchPool, (list: Router) => { + initFuse(list); +}); </script> -<style lang='scss' scoped> +<style lang="scss" scoped> .header-search { font-size: 0 !important; @@ -176,4 +192,4 @@ } } } -</style> \ No newline at end of file +</style> -- Gitblit v1.9.3