mirror of
				https://github.com/soybeanjs/soybean-admin.git
				synced 2025-11-04 15:53:43 +08:00 
			
		
		
		
	feat(projects): add page function_tab
This commit is contained in:
		@@ -11,7 +11,9 @@ defineOptions({
 | 
				
			|||||||
    <div class="flex text-400px text-primary">
 | 
					    <div class="flex text-400px text-primary">
 | 
				
			||||||
      <SvgIcon local-icon="expectation" />
 | 
					      <SvgIcon local-icon="expectation" />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <h3 class="text-28px font-500 text-primary">{{ $t('common.lookForward') }}</h3>
 | 
					    <slot>
 | 
				
			||||||
 | 
					      <h3 class="text-28px font-500 text-primary">{{ $t('common.lookForward') }}</h3>
 | 
				
			||||||
 | 
					    </slot>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -111,6 +111,9 @@ const local: App.I18n.Schema = {
 | 
				
			|||||||
    home: 'Home',
 | 
					    home: 'Home',
 | 
				
			||||||
    'user-center': 'User Center',
 | 
					    'user-center': 'User Center',
 | 
				
			||||||
    about: 'About',
 | 
					    about: 'About',
 | 
				
			||||||
 | 
					    function: 'System Function',
 | 
				
			||||||
 | 
					    function_tab: 'Tab',
 | 
				
			||||||
 | 
					    'function_multi-tab': 'Multi Tab',
 | 
				
			||||||
    manage: 'System Manage',
 | 
					    manage: 'System Manage',
 | 
				
			||||||
    manage_user: 'User Manage',
 | 
					    manage_user: 'User Manage',
 | 
				
			||||||
    'manage_user-detail': 'User Detail',
 | 
					    'manage_user-detail': 'User Detail',
 | 
				
			||||||
@@ -211,6 +214,32 @@ const local: App.I18n.Schema = {
 | 
				
			|||||||
        desc5: 'Soybean just wrote some of the workbench pages casually, and it was enough to see!'
 | 
					        desc5: 'Soybean just wrote some of the workbench pages casually, and it was enough to see!'
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      creativity: 'Creativity'
 | 
					      creativity: 'Creativity'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    function: {
 | 
				
			||||||
 | 
					      tab: {
 | 
				
			||||||
 | 
					        tabOperate: {
 | 
				
			||||||
 | 
					          title: 'Tab Operation',
 | 
				
			||||||
 | 
					          addTab: 'Add Tab',
 | 
				
			||||||
 | 
					          addTabDesc: 'To about page',
 | 
				
			||||||
 | 
					          closeTab: 'Close Tab',
 | 
				
			||||||
 | 
					          closeCurrentTab: 'Close Current Tab',
 | 
				
			||||||
 | 
					          closeAboutTab: 'Close "About" Tab',
 | 
				
			||||||
 | 
					          addMultiTab: 'Add Multi Tab',
 | 
				
			||||||
 | 
					          addMultiTabDesc1: 'To MultiTab page',
 | 
				
			||||||
 | 
					          addMultiTabDesc2: 'To MultiTab page(with query params)'
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        tabTitle: {
 | 
				
			||||||
 | 
					          title: 'Tab Title',
 | 
				
			||||||
 | 
					          changeTitle: 'Change Title',
 | 
				
			||||||
 | 
					          change: 'Change',
 | 
				
			||||||
 | 
					          resetTitle: 'Reset Title',
 | 
				
			||||||
 | 
					          reset: 'Reset'
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      multiTab: {
 | 
				
			||||||
 | 
					        routeParam: 'Route Param',
 | 
				
			||||||
 | 
					        backTab: 'Back function_tab'
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  form: {
 | 
					  form: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -111,6 +111,9 @@ const local: App.I18n.Schema = {
 | 
				
			|||||||
    home: '首页',
 | 
					    home: '首页',
 | 
				
			||||||
    'user-center': '个人中心',
 | 
					    'user-center': '个人中心',
 | 
				
			||||||
    about: '关于',
 | 
					    about: '关于',
 | 
				
			||||||
 | 
					    function: '系统功能',
 | 
				
			||||||
 | 
					    function_tab: '标签页',
 | 
				
			||||||
 | 
					    'function_multi-tab': '多标签页',
 | 
				
			||||||
    manage: '系统管理',
 | 
					    manage: '系统管理',
 | 
				
			||||||
    manage_user: '用户管理',
 | 
					    manage_user: '用户管理',
 | 
				
			||||||
    'manage_user-detail': '用户详情',
 | 
					    'manage_user-detail': '用户详情',
 | 
				
			||||||
@@ -211,6 +214,32 @@ const local: App.I18n.Schema = {
 | 
				
			|||||||
        desc5: 'Soybean 刚才把工作台页面随便写了一些,凑合能看了!'
 | 
					        desc5: 'Soybean 刚才把工作台页面随便写了一些,凑合能看了!'
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      creativity: '创意'
 | 
					      creativity: '创意'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    function: {
 | 
				
			||||||
 | 
					      tab: {
 | 
				
			||||||
 | 
					        tabOperate: {
 | 
				
			||||||
 | 
					          title: '标签页操作',
 | 
				
			||||||
 | 
					          addTab: '添加标签页',
 | 
				
			||||||
 | 
					          addTabDesc: '跳转到关于页面',
 | 
				
			||||||
 | 
					          closeTab: '关闭标签页',
 | 
				
			||||||
 | 
					          closeCurrentTab: '关闭当前标签页',
 | 
				
			||||||
 | 
					          closeAboutTab: '关闭"关于"标签页',
 | 
				
			||||||
 | 
					          addMultiTab: '添加多标签页',
 | 
				
			||||||
 | 
					          addMultiTabDesc1: '跳转到多标签页页面',
 | 
				
			||||||
 | 
					          addMultiTabDesc2: '跳转到多标签页页面(带有查询参数)'
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        tabTitle: {
 | 
				
			||||||
 | 
					          title: '标签页标题',
 | 
				
			||||||
 | 
					          changeTitle: '修改标题',
 | 
				
			||||||
 | 
					          change: '修改',
 | 
				
			||||||
 | 
					          resetTitle: '重置标题',
 | 
				
			||||||
 | 
					          reset: '重置'
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      multiTab: {
 | 
				
			||||||
 | 
					        routeParam: '路由参数',
 | 
				
			||||||
 | 
					        backTab: '返回 function_tab'
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  form: {
 | 
					  form: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,6 +20,8 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
 | 
				
			|||||||
  500: () => import("@/views/_builtin/500/index.vue"),
 | 
					  500: () => import("@/views/_builtin/500/index.vue"),
 | 
				
			||||||
  login: () => import("@/views/_builtin/login/index.vue"),
 | 
					  login: () => import("@/views/_builtin/login/index.vue"),
 | 
				
			||||||
  about: () => import("@/views/about/index.vue"),
 | 
					  about: () => import("@/views/about/index.vue"),
 | 
				
			||||||
 | 
					  "function_multi-tab": () => import("@/views/function/multi-tab/index.vue"),
 | 
				
			||||||
 | 
					  function_tab: () => import("@/views/function/tab/index.vue"),
 | 
				
			||||||
  home: () => import("@/views/home/index.vue"),
 | 
					  home: () => import("@/views/home/index.vue"),
 | 
				
			||||||
  manage_role: () => import("@/views/manage/role/index.vue"),
 | 
					  manage_role: () => import("@/views/manage/role/index.vue"),
 | 
				
			||||||
  manage_route: () => import("@/views/manage/route/index.vue"),
 | 
					  manage_route: () => import("@/views/manage/route/index.vue"),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,6 +47,42 @@ export const generatedRoutes: GeneratedRoute[] = [
 | 
				
			|||||||
      order: 10
 | 
					      order: 10
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    name: 'function',
 | 
				
			||||||
 | 
					    path: '/function',
 | 
				
			||||||
 | 
					    component: 'layout.base',
 | 
				
			||||||
 | 
					    meta: {
 | 
				
			||||||
 | 
					      title: 'function',
 | 
				
			||||||
 | 
					      i18nKey: 'route.function',
 | 
				
			||||||
 | 
					      icon: 'icon-park-outline:all-application',
 | 
				
			||||||
 | 
					      order: 6
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    children: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        name: 'function_multi-tab',
 | 
				
			||||||
 | 
					        path: '/function/multi-tab',
 | 
				
			||||||
 | 
					        component: 'view.function_multi-tab',
 | 
				
			||||||
 | 
					        meta: {
 | 
				
			||||||
 | 
					          title: 'function_multi-tab',
 | 
				
			||||||
 | 
					          i18nKey: 'route.function_multi-tab',
 | 
				
			||||||
 | 
					          icon: 'ic:round-tab',
 | 
				
			||||||
 | 
					          multiTab: true,
 | 
				
			||||||
 | 
					          hideInMenu: true,
 | 
				
			||||||
 | 
					          activeMenu: 'function_tab'
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        name: 'function_tab',
 | 
				
			||||||
 | 
					        path: '/function/tab',
 | 
				
			||||||
 | 
					        component: 'view.function_tab',
 | 
				
			||||||
 | 
					        meta: {
 | 
				
			||||||
 | 
					          title: 'function_tab',
 | 
				
			||||||
 | 
					          i18nKey: 'route.function_tab',
 | 
				
			||||||
 | 
					          icon: 'ic:round-tab'
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    name: 'home',
 | 
					    name: 'home',
 | 
				
			||||||
    path: '/home',
 | 
					    path: '/home',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -151,6 +151,9 @@ const routeMap: RouteMap = {
 | 
				
			|||||||
  "404": "/404",
 | 
					  "404": "/404",
 | 
				
			||||||
  "500": "/500",
 | 
					  "500": "/500",
 | 
				
			||||||
  "about": "/about",
 | 
					  "about": "/about",
 | 
				
			||||||
 | 
					  "function": "/function",
 | 
				
			||||||
 | 
					  "function_multi-tab": "/function/multi-tab",
 | 
				
			||||||
 | 
					  "function_tab": "/function/tab",
 | 
				
			||||||
  "home": "/home",
 | 
					  "home": "/home",
 | 
				
			||||||
  "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?",
 | 
					  "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?",
 | 
				
			||||||
  "manage": "/manage",
 | 
					  "manage": "/manage",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ import { computed, ref } from 'vue';
 | 
				
			|||||||
import { useRouter } from 'vue-router';
 | 
					import { useRouter } from 'vue-router';
 | 
				
			||||||
import { defineStore } from 'pinia';
 | 
					import { defineStore } from 'pinia';
 | 
				
			||||||
import { useEventListener } from '@vueuse/core';
 | 
					import { useEventListener } from '@vueuse/core';
 | 
				
			||||||
 | 
					import type { RouteKey } from '@elegant-router/types';
 | 
				
			||||||
import { SetupStoreId } from '@/enum';
 | 
					import { SetupStoreId } from '@/enum';
 | 
				
			||||||
import { useRouterPush } from '@/hooks/common/router';
 | 
					import { useRouterPush } from '@/hooks/common/router';
 | 
				
			||||||
import { localStg } from '@/utils/storage';
 | 
					import { localStg } from '@/utils/storage';
 | 
				
			||||||
@@ -10,6 +11,7 @@ import {
 | 
				
			|||||||
  filterTabsByAllRoutes,
 | 
					  filterTabsByAllRoutes,
 | 
				
			||||||
  filterTabsById,
 | 
					  filterTabsById,
 | 
				
			||||||
  filterTabsByIds,
 | 
					  filterTabsByIds,
 | 
				
			||||||
 | 
					  findTabByRouteName,
 | 
				
			||||||
  getAllTabs,
 | 
					  getAllTabs,
 | 
				
			||||||
  getDefaultHomeTab,
 | 
					  getDefaultHomeTab,
 | 
				
			||||||
  getFixedTabIds,
 | 
					  getFixedTabIds,
 | 
				
			||||||
@@ -112,6 +114,23 @@ export const useTabStore = defineStore(SetupStoreId.Tab, () => {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** remove active tab */
 | 
				
			||||||
 | 
					  async function removeActiveTab() {
 | 
				
			||||||
 | 
					    await removeTab(activeTabId.value);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * remove tab by route name
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param routeName route name
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  async function removeTabByRouteName(routeName: RouteKey) {
 | 
				
			||||||
 | 
					    const tab = findTabByRouteName(routeName, tabs.value);
 | 
				
			||||||
 | 
					    if (!tab) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await removeTab(tab.id);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Clear tabs
 | 
					   * Clear tabs
 | 
				
			||||||
   *
 | 
					   *
 | 
				
			||||||
@@ -192,6 +211,7 @@ export const useTabStore = defineStore(SetupStoreId.Tab, () => {
 | 
				
			|||||||
    const tab = tabs.value.find(item => item.id === id);
 | 
					    const tab = tabs.value.find(item => item.id === id);
 | 
				
			||||||
    if (!tab) return;
 | 
					    if (!tab) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    tab.oldLabel = tab.label;
 | 
				
			||||||
    tab.newLabel = label;
 | 
					    tab.newLabel = label;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -252,6 +272,8 @@ export const useTabStore = defineStore(SetupStoreId.Tab, () => {
 | 
				
			|||||||
    initTabStore,
 | 
					    initTabStore,
 | 
				
			||||||
    addTab,
 | 
					    addTab,
 | 
				
			||||||
    removeTab,
 | 
					    removeTab,
 | 
				
			||||||
 | 
					    removeActiveTab,
 | 
				
			||||||
 | 
					    removeTabByRouteName,
 | 
				
			||||||
    clearTabs,
 | 
					    clearTabs,
 | 
				
			||||||
    clearLeftTabs,
 | 
					    clearLeftTabs,
 | 
				
			||||||
    clearRightTabs,
 | 
					    clearRightTabs,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
import type { Router } from 'vue-router';
 | 
					import type { Router } from 'vue-router';
 | 
				
			||||||
import type { LastLevelRouteKey, RouteMap } from '@elegant-router/types';
 | 
					import type { LastLevelRouteKey, RouteKey, RouteMap } from '@elegant-router/types';
 | 
				
			||||||
import { $t } from '@/locales';
 | 
					import { $t } from '@/locales';
 | 
				
			||||||
import { getRoutePath } from '@/router/elegant/transform';
 | 
					import { getRoutePath } from '@/router/elegant/transform';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -166,10 +166,12 @@ export function getFixedTabIds(tabs: App.Global.Tab[]) {
 | 
				
			|||||||
 * @param tabs
 | 
					 * @param tabs
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
function updateTabsLabel(tabs: App.Global.Tab[]) {
 | 
					function updateTabsLabel(tabs: App.Global.Tab[]) {
 | 
				
			||||||
  return tabs.map(tab => ({
 | 
					  const updated = tabs.map(tab => ({
 | 
				
			||||||
    ...tab,
 | 
					    ...tab,
 | 
				
			||||||
    label: tab.newLabel || tab.label
 | 
					    label: tab.newLabel || tab.oldLabel || tab.label
 | 
				
			||||||
  }));
 | 
					  }));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return updated;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -194,3 +196,18 @@ export function updateTabByI18nKey(tab: App.Global.Tab) {
 | 
				
			|||||||
export function updateTabsByI18nKey(tabs: App.Global.Tab[]) {
 | 
					export function updateTabsByI18nKey(tabs: App.Global.Tab[]) {
 | 
				
			||||||
  return tabs.map(tab => updateTabByI18nKey(tab));
 | 
					  return tabs.map(tab => updateTabByI18nKey(tab));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * find tab by route name
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param name
 | 
				
			||||||
 | 
					 * @param tabs
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export function findTabByRouteName(name: RouteKey, tabs: App.Global.Tab[]) {
 | 
				
			||||||
 | 
					  const routePath = getRoutePath(name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const tabId = routePath;
 | 
				
			||||||
 | 
					  const multiTabId = `${routePath}?`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return tabs.find(tab => tab.id === tabId || tab.id.startsWith(multiTabId));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										32
									
								
								src/typings/app.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								src/typings/app.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -185,6 +185,12 @@ declare namespace App {
 | 
				
			|||||||
       * If set, the tab label will be replaced by this value
 | 
					       * If set, the tab label will be replaced by this value
 | 
				
			||||||
       */
 | 
					       */
 | 
				
			||||||
      newLabel?: string;
 | 
					      newLabel?: string;
 | 
				
			||||||
 | 
					      /**
 | 
				
			||||||
 | 
					       * The old tab label
 | 
				
			||||||
 | 
					       *
 | 
				
			||||||
 | 
					       * when reset the tab label, the tab label will be replaced by this value
 | 
				
			||||||
 | 
					       */
 | 
				
			||||||
 | 
					      oldLabel?: string;
 | 
				
			||||||
      /** The tab route key */
 | 
					      /** The tab route key */
 | 
				
			||||||
      routeKey: LastLevelRouteKey;
 | 
					      routeKey: LastLevelRouteKey;
 | 
				
			||||||
      /** The tab route path */
 | 
					      /** The tab route path */
 | 
				
			||||||
@@ -396,6 +402,32 @@ declare namespace App {
 | 
				
			|||||||
          };
 | 
					          };
 | 
				
			||||||
          creativity: string;
 | 
					          creativity: string;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					        function: {
 | 
				
			||||||
 | 
					          tab: {
 | 
				
			||||||
 | 
					            tabOperate: {
 | 
				
			||||||
 | 
					              title: string;
 | 
				
			||||||
 | 
					              addTab: string;
 | 
				
			||||||
 | 
					              addTabDesc: string;
 | 
				
			||||||
 | 
					              closeTab: string;
 | 
				
			||||||
 | 
					              closeCurrentTab: string;
 | 
				
			||||||
 | 
					              closeAboutTab: string;
 | 
				
			||||||
 | 
					              addMultiTab: string;
 | 
				
			||||||
 | 
					              addMultiTabDesc1: string;
 | 
				
			||||||
 | 
					              addMultiTabDesc2: string;
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            tabTitle: {
 | 
				
			||||||
 | 
					              title: string;
 | 
				
			||||||
 | 
					              changeTitle: string;
 | 
				
			||||||
 | 
					              change: string;
 | 
				
			||||||
 | 
					              resetTitle: string;
 | 
				
			||||||
 | 
					              reset: string;
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					          multiTab: {
 | 
				
			||||||
 | 
					            routeParam: string;
 | 
				
			||||||
 | 
					            backTab: string;
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      form: {
 | 
					      form: {
 | 
				
			||||||
        userName: FormMsg;
 | 
					        userName: FormMsg;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								src/typings/components.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								src/typings/components.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -41,6 +41,7 @@ declare module 'vue' {
 | 
				
			|||||||
    NGrid: typeof import('naive-ui')['NGrid']
 | 
					    NGrid: typeof import('naive-ui')['NGrid']
 | 
				
			||||||
    NGridItem: typeof import('naive-ui')['NGridItem']
 | 
					    NGridItem: typeof import('naive-ui')['NGridItem']
 | 
				
			||||||
    NInput: typeof import('naive-ui')['NInput']
 | 
					    NInput: typeof import('naive-ui')['NInput']
 | 
				
			||||||
 | 
					    NInputGroup: typeof import('naive-ui')['NInputGroup']
 | 
				
			||||||
    NInputNumber: typeof import('naive-ui')['NInputNumber']
 | 
					    NInputNumber: typeof import('naive-ui')['NInputNumber']
 | 
				
			||||||
    NList: typeof import('naive-ui')['NList']
 | 
					    NList: typeof import('naive-ui')['NList']
 | 
				
			||||||
    NListItem: typeof import('naive-ui')['NListItem']
 | 
					    NListItem: typeof import('naive-ui')['NListItem']
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								src/typings/elegant-router.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								src/typings/elegant-router.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -25,6 +25,9 @@ declare module "@elegant-router/types" {
 | 
				
			|||||||
    "404": "/404";
 | 
					    "404": "/404";
 | 
				
			||||||
    "500": "/500";
 | 
					    "500": "/500";
 | 
				
			||||||
    "about": "/about";
 | 
					    "about": "/about";
 | 
				
			||||||
 | 
					    "function": "/function";
 | 
				
			||||||
 | 
					    "function_multi-tab": "/function/multi-tab";
 | 
				
			||||||
 | 
					    "function_tab": "/function/tab";
 | 
				
			||||||
    "home": "/home";
 | 
					    "home": "/home";
 | 
				
			||||||
    "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?";
 | 
					    "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?";
 | 
				
			||||||
    "manage": "/manage";
 | 
					    "manage": "/manage";
 | 
				
			||||||
@@ -78,6 +81,7 @@ declare module "@elegant-router/types" {
 | 
				
			|||||||
    | "404"
 | 
					    | "404"
 | 
				
			||||||
    | "500"
 | 
					    | "500"
 | 
				
			||||||
    | "about"
 | 
					    | "about"
 | 
				
			||||||
 | 
					    | "function"
 | 
				
			||||||
    | "home"
 | 
					    | "home"
 | 
				
			||||||
    | "login"
 | 
					    | "login"
 | 
				
			||||||
    | "manage"
 | 
					    | "manage"
 | 
				
			||||||
@@ -105,6 +109,8 @@ declare module "@elegant-router/types" {
 | 
				
			|||||||
    | "500"
 | 
					    | "500"
 | 
				
			||||||
    | "login"
 | 
					    | "login"
 | 
				
			||||||
    | "about"
 | 
					    | "about"
 | 
				
			||||||
 | 
					    | "function_multi-tab"
 | 
				
			||||||
 | 
					    | "function_tab"
 | 
				
			||||||
    | "home"
 | 
					    | "home"
 | 
				
			||||||
    | "manage_role"
 | 
					    | "manage_role"
 | 
				
			||||||
    | "manage_route"
 | 
					    | "manage_route"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								src/views/function/multi-tab/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/views/function/multi-tab/index.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import { useRoute } from 'vue-router';
 | 
				
			||||||
 | 
					import { computed } from 'vue';
 | 
				
			||||||
 | 
					import { useRouterPush } from '@/hooks/common/router';
 | 
				
			||||||
 | 
					import { $t } from '@/locales';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const route = useRoute();
 | 
				
			||||||
 | 
					const { routerPushByKey } = useRouterPush();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const routeQuery = computed(() => JSON.stringify(route.query));
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div>
 | 
				
			||||||
 | 
					    <LookForward>
 | 
				
			||||||
 | 
					      <div>
 | 
				
			||||||
 | 
					        <NButton @click="routerPushByKey('function_tab')">{{ $t('page.function.multiTab.backTab') }}</NButton>
 | 
				
			||||||
 | 
					        <div class="py-24px">{{ $t('page.function.multiTab.routeParam') }}: {{ routeQuery }}</div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    </LookForward>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped></style>
 | 
				
			||||||
							
								
								
									
										88
									
								
								src/views/function/tab/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								src/views/function/tab/index.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
				
			|||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import { ref } from 'vue';
 | 
				
			||||||
 | 
					import { useRouterPush } from '@/hooks/common/router';
 | 
				
			||||||
 | 
					import { $t } from '@/locales';
 | 
				
			||||||
 | 
					import { useTabStore } from '@/store/modules/tab';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const tabStore = useTabStore();
 | 
				
			||||||
 | 
					const { routerPushByKey } = useRouterPush();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const tabLabel = ref('');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function changeTabLabel() {
 | 
				
			||||||
 | 
					  tabStore.setTabLabel(tabLabel.value);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function resetTabLabel() {
 | 
				
			||||||
 | 
					  tabStore.resetTabLabel();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <NSpace vertical :size="16">
 | 
				
			||||||
 | 
					    <NCard
 | 
				
			||||||
 | 
					      :title="$t('page.function.tab.tabOperate.title')"
 | 
				
			||||||
 | 
					      :bordered="false"
 | 
				
			||||||
 | 
					      size="small"
 | 
				
			||||||
 | 
					      segmented
 | 
				
			||||||
 | 
					      class="card-wrapper"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <NList>
 | 
				
			||||||
 | 
					        <NListItem>
 | 
				
			||||||
 | 
					          <NThing :title="$t('page.function.tab.tabOperate.addTab')">
 | 
				
			||||||
 | 
					            <NButton @click="routerPushByKey('about')">{{ $t('page.function.tab.tabOperate.addTabDesc') }}</NButton>
 | 
				
			||||||
 | 
					          </NThing>
 | 
				
			||||||
 | 
					        </NListItem>
 | 
				
			||||||
 | 
					        <NListItem>
 | 
				
			||||||
 | 
					          <NThing :title="$t('page.function.tab.tabOperate.closeTab')">
 | 
				
			||||||
 | 
					            <NSpace>
 | 
				
			||||||
 | 
					              <NButton @click="tabStore.removeActiveTab">
 | 
				
			||||||
 | 
					                {{ $t('page.function.tab.tabOperate.closeCurrentTab') }}
 | 
				
			||||||
 | 
					              </NButton>
 | 
				
			||||||
 | 
					              <NButton @click="tabStore.removeTabByRouteName('about')">
 | 
				
			||||||
 | 
					                {{ $t('page.function.tab.tabOperate.closeAboutTab') }}
 | 
				
			||||||
 | 
					              </NButton>
 | 
				
			||||||
 | 
					            </NSpace>
 | 
				
			||||||
 | 
					          </NThing>
 | 
				
			||||||
 | 
					        </NListItem>
 | 
				
			||||||
 | 
					        <NListItem>
 | 
				
			||||||
 | 
					          <NThing :title="$t('page.function.tab.tabOperate.addMultiTab')">
 | 
				
			||||||
 | 
					            <NSpace>
 | 
				
			||||||
 | 
					              <NButton @click="routerPushByKey('function_multi-tab')">
 | 
				
			||||||
 | 
					                {{ $t('page.function.tab.tabOperate.addMultiTabDesc1') }}
 | 
				
			||||||
 | 
					              </NButton>
 | 
				
			||||||
 | 
					              <NButton @click="routerPushByKey('function_multi-tab', { query: { a: '1' } })">
 | 
				
			||||||
 | 
					                {{ $t('page.function.tab.tabOperate.addMultiTabDesc2') }}
 | 
				
			||||||
 | 
					              </NButton>
 | 
				
			||||||
 | 
					            </NSpace>
 | 
				
			||||||
 | 
					          </NThing>
 | 
				
			||||||
 | 
					        </NListItem>
 | 
				
			||||||
 | 
					      </NList>
 | 
				
			||||||
 | 
					    </NCard>
 | 
				
			||||||
 | 
					    <NCard
 | 
				
			||||||
 | 
					      :title="$t('page.function.tab.tabTitle.title')"
 | 
				
			||||||
 | 
					      :bordered="false"
 | 
				
			||||||
 | 
					      size="small"
 | 
				
			||||||
 | 
					      segmented
 | 
				
			||||||
 | 
					      class="card-wrapper"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <NList>
 | 
				
			||||||
 | 
					        <NListItem>
 | 
				
			||||||
 | 
					          <NThing :title="$t('page.function.tab.tabTitle.changeTitle')">
 | 
				
			||||||
 | 
					            <NInputGroup class="w-240px">
 | 
				
			||||||
 | 
					              <NInput v-model:value="tabLabel" />
 | 
				
			||||||
 | 
					              <NButton @click="changeTabLabel">{{ $t('page.function.tab.tabTitle.change') }}</NButton>
 | 
				
			||||||
 | 
					            </NInputGroup>
 | 
				
			||||||
 | 
					          </NThing>
 | 
				
			||||||
 | 
					        </NListItem>
 | 
				
			||||||
 | 
					        <NListItem>
 | 
				
			||||||
 | 
					          <NThing :title="$t('page.function.tab.tabTitle.resetTitle')">
 | 
				
			||||||
 | 
					            <NButton @click="resetTabLabel">{{ $t('page.function.tab.tabTitle.reset') }}</NButton>
 | 
				
			||||||
 | 
					          </NThing>
 | 
				
			||||||
 | 
					        </NListItem>
 | 
				
			||||||
 | 
					      </NList>
 | 
				
			||||||
 | 
					    </NCard>
 | 
				
			||||||
 | 
					  </NSpace>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped></style>
 | 
				
			||||||
		Reference in New Issue
	
	Block a user