diff --git a/src/assets/js/naive-ui.js b/src/assets/js/naive-ui.js
index 2a53aba..f80633e 100644
--- a/src/assets/js/naive-ui.js
+++ b/src/assets/js/naive-ui.js
@@ -1,6 +1,9 @@
-// Naive UI 配置
+// Naive UI 配置和功能
-import { dateZhCN, zhCN } from 'naive-ui';
+import {
+ createDiscreteApi,
+ dateZhCN, zhCN,
+} from 'naive-ui';
/** @type { import('naive-ui').ConfigProviderProps } */
export const configProviderProps = {
@@ -44,3 +47,22 @@ export const configProviderProps = {
},
};
+
+export const {
+ message: $message,
+ notification: $notification,
+} = createDiscreteApi(
+ [
+ 'message',
+ 'notification',
+ ],
+ {
+ configProviderProps: configProviderProps,
+ messageProviderProps: {
+ closable: true,
+ duration: 2000,
+ keepAliveOnHover: true,
+ placement: 'top',
+ },
+ },
+);
diff --git a/src/assets/js/search-engine.js b/src/assets/js/search-engine.js
new file mode 100644
index 0000000..7444290
--- /dev/null
+++ b/src/assets/js/search-engine.js
@@ -0,0 +1,210 @@
+// 搜索引擎
+
+import {
+ ref,
+} from 'vue';
+
+import {
+ SKEY_SEARCH_ENGINE_NAME,
+} from '@/config/storage';
+
+import {
+ useLocalStorage,
+} from '@vueuse/core';
+
+import {
+ $message,
+} from './naive-ui';
+
+/** 打开搜索结果页面 */
+export function openSearchResult() {
+
+ let engine = searchEngineName.value;
+ let keyword = searchKeyword.value;
+ let baseURL = '';
+ let useURL = '';
+
+ // 获取搜索引擎 URL
+ for (let i = 0; i < searchEngineList.length; i++) {
+
+ let category = searchEngineList[i];
+ let engines = category.list;
+
+ for (let j = 0; j < engines.length; j++) {
+ let item = engines[j];
+ if (item.name === engine) {
+ baseURL = item.url;
+ }
+ }
+
+ if (baseURL) {
+ break;
+ }
+
+ }
+
+ if (baseURL) {
+ useURL = baseURL.replace(/%keyword%/, keyword);
+ }
+
+ if (useURL) {
+ window.open(useURL, '_blank');
+ } else {
+ $message.error('搜索失败:找不到对应的搜索引擎');
+ }
+
+}
+
+/** 搜索引擎列表 */
+export const searchEngineList = [
+ {
+ title: '搜索',
+ list: [
+ {
+ name: '百度',
+ desc: 'www.baidu.com',
+ url: 'https://www.baidu.com/s?wd=%keyword%',
+ icon: 'baidu.svg',
+ show: true,
+ },
+ {
+ name: '必应',
+ desc: 'cn.bing.com',
+ url: 'https://cn.bing.com/search?q=%keyword%',
+ icon: 'bing.svg',
+ show: true,
+ },
+ {
+ name: '搜狗',
+ desc: 'www.sogou.com',
+ url: 'https://www.sogou.com/web?query=%keyword%',
+ icon: 'sogou.svg',
+ show: true,
+ },
+ {
+ name: '360',
+ desc: 'www.so.com',
+ url: 'https://www.so.com/s?q=%keyword%',
+ icon: '360.svg',
+ show: true,
+ },
+ {
+ name: 'Google',
+ desc: 'www.google.com',
+ url: 'https://www.google.com/search?q=%keyword%',
+ icon: 'google.svg',
+ show: true,
+ },
+ {
+ name: 'Yandex',
+ desc: 'yandex.com',
+ url: 'https://yandex.com/search/?text=%keyword%',
+ icon: 'yandex.svg',
+ show: true,
+ }
+ ]
+ },
+ {
+ title: '多媒体',
+ list: [
+ {
+ name: '网易云音乐',
+ desc: 'music.163.com',
+ url: 'https://music.163.com/#/search/m/?s=%keyword%',
+ icon: 'netease_music.svg',
+ show: true,
+ },
+ {
+ name: 'AcFun',
+ desc: 'www.acfun.cn',
+ url: 'https://www.acfun.cn/search/?keyword=%keyword%',
+ icon: 'acfun.svg',
+ show: true,
+ },
+ {
+ name: 'bilibili',
+ desc: 'search.bilibili.com',
+ url: 'https://search.bilibili.com/all?keyword=%keyword%',
+ icon: 'bilibili.svg',
+ show: true,
+ },
+ {
+ name: 'QQ音乐',
+ desc: 'y.qq.com',
+ url: 'https://y.qq.com/n/ryqq/search?w=%keyword%',
+ icon: 'qq_music.svg',
+ show: true,
+ }
+ ]
+ },
+ {
+ title: '技术',
+ list: [
+ {
+ name: '博客园',
+ desc: 'zzk.cnblogs.co',
+ url: 'https://zzk.cnblogs.com/s?w=%keyword%',
+ icon: 'cnblogs.svg',
+ show: true,
+ },
+ {
+ name: 'CSDN',
+ desc: 'so.csdn.net',
+ url: 'https://so.csdn.net/so/search/all?q=%keyword%',
+ icon: 'csdn.svg',
+ show: true,
+ },
+ {
+ name: 'GitHub',
+ desc: 'github.com',
+ url: 'https://github.com/search?q=%keyword%',
+ icon: 'github.svg',
+ show: true,
+ },
+ {
+ name: 'MDN',
+ desc: 'developer.mozilla.org',
+ url: 'https://developer.mozilla.org/zh-CN/search?q=%keyword%',
+ icon: 'mdn.svg',
+ show: true,
+ }
+ ]
+ },
+ {
+ title: '设计',
+ list: [
+ {
+ name: '站酷',
+ desc: 'www.zcool.com.cn',
+ url: 'https://www.zcool.com.cn/search/content?word=%keyword%',
+ icon: 'zcool.svg',
+ show: true,
+ },
+ {
+ name: 'Iconfont',
+ desc: 'www.iconfont.cn',
+ url: 'https://www.iconfont.cn/search/index?searchType=icon&q=%keyword%',
+ icon: 'iconfont.svg',
+ show: true,
+ }
+ ]
+ },
+ {
+ title: '社区',
+ list: [
+ {
+ name: '知乎',
+ desc: 'www.zhihu.com',
+ url: 'https://www.zhihu.com/search?type=content&q=%keyword%',
+ icon: 'zhihu.svg',
+ show: true,
+ }
+ ]
+ },
+];
+
+/** 搜索引擎名称 */
+export const searchEngineName = useLocalStorage(SKEY_SEARCH_ENGINE_NAME, '必应');
+
+/** 搜索关键词 */
+export const searchKeyword = ref('');
diff --git a/src/assets/js/utils.js b/src/assets/js/utils.js
index 94a15eb..f85de1b 100644
--- a/src/assets/js/utils.js
+++ b/src/assets/js/utils.js
@@ -1,6 +1,19 @@
// 工具函数
-import { description as appDesc } from '@package-json';
+import {
+ description as appDesc,
+} from '@package-json';
+
+/** 当前模块 URL */
+const META_URL = import.meta.url;
+
+/**
+ * @description 获取资源文件 URL
+ * @param {string} path 文件相对于 assets 目录的路径
+ */
+export function getAssetsUrl(path = '') {
+ return new URL(`../${path}`, META_URL).href;
+}
/**
* @description 更新页面标题
diff --git a/src/assets/website-icon/360.svg b/src/assets/website-icon/360.svg
new file mode 100644
index 0000000..8bdb52c
--- /dev/null
+++ b/src/assets/website-icon/360.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/acfun.svg b/src/assets/website-icon/acfun.svg
new file mode 100644
index 0000000..fe1a3c0
--- /dev/null
+++ b/src/assets/website-icon/acfun.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/baidu.svg b/src/assets/website-icon/baidu.svg
new file mode 100644
index 0000000..9b82c14
--- /dev/null
+++ b/src/assets/website-icon/baidu.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/bilibili.svg b/src/assets/website-icon/bilibili.svg
new file mode 100644
index 0000000..544082e
--- /dev/null
+++ b/src/assets/website-icon/bilibili.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/bing.svg b/src/assets/website-icon/bing.svg
new file mode 100644
index 0000000..2dcd9d0
--- /dev/null
+++ b/src/assets/website-icon/bing.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/cnblogs.svg b/src/assets/website-icon/cnblogs.svg
new file mode 100644
index 0000000..7055f4c
--- /dev/null
+++ b/src/assets/website-icon/cnblogs.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/csdn.svg b/src/assets/website-icon/csdn.svg
new file mode 100644
index 0000000..54c3a24
--- /dev/null
+++ b/src/assets/website-icon/csdn.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/default.svg b/src/assets/website-icon/default.svg
new file mode 100644
index 0000000..69a1f45
--- /dev/null
+++ b/src/assets/website-icon/default.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/github.svg b/src/assets/website-icon/github.svg
new file mode 100644
index 0000000..546926a
--- /dev/null
+++ b/src/assets/website-icon/github.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/google.svg b/src/assets/website-icon/google.svg
new file mode 100644
index 0000000..aace472
--- /dev/null
+++ b/src/assets/website-icon/google.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/iconfont.svg b/src/assets/website-icon/iconfont.svg
new file mode 100644
index 0000000..732fb43
--- /dev/null
+++ b/src/assets/website-icon/iconfont.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/mdn.svg b/src/assets/website-icon/mdn.svg
new file mode 100644
index 0000000..2e7ccd2
--- /dev/null
+++ b/src/assets/website-icon/mdn.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/mijisou.svg b/src/assets/website-icon/mijisou.svg
new file mode 100644
index 0000000..1e17476
--- /dev/null
+++ b/src/assets/website-icon/mijisou.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/netease_music.svg b/src/assets/website-icon/netease_music.svg
new file mode 100644
index 0000000..2eb5284
--- /dev/null
+++ b/src/assets/website-icon/netease_music.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/qq_music.svg b/src/assets/website-icon/qq_music.svg
new file mode 100644
index 0000000..ac37f66
--- /dev/null
+++ b/src/assets/website-icon/qq_music.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/sogou.svg b/src/assets/website-icon/sogou.svg
new file mode 100644
index 0000000..72fa75d
--- /dev/null
+++ b/src/assets/website-icon/sogou.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/tianya.svg b/src/assets/website-icon/tianya.svg
new file mode 100644
index 0000000..1fae0d3
--- /dev/null
+++ b/src/assets/website-icon/tianya.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/yandex.svg b/src/assets/website-icon/yandex.svg
new file mode 100644
index 0000000..cb467c6
--- /dev/null
+++ b/src/assets/website-icon/yandex.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/zcool.svg b/src/assets/website-icon/zcool.svg
new file mode 100644
index 0000000..79539f2
--- /dev/null
+++ b/src/assets/website-icon/zcool.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/assets/website-icon/zhihu.svg b/src/assets/website-icon/zhihu.svg
new file mode 100644
index 0000000..f4a43d7
--- /dev/null
+++ b/src/assets/website-icon/zhihu.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/src/config/modules.js b/src/config/modules.js
index bdae3c1..06097c0 100644
--- a/src/config/modules.js
+++ b/src/config/modules.js
@@ -9,7 +9,7 @@ export const ENABLE_MC_CTRL_MODULE = IS_DEV;
export const ENABLE_NAV_MODULE = IS_DEV;
/** 启用“搜索”模块 */
-export const ENABLE_SEARCH_MODULE = IS_DEV;
+export const ENABLE_SEARCH_MODULE = true;
/** 启用“工具箱”模块 */
export const ENABLE_TOOLBOX_MODULE = IS_DEV;
diff --git a/src/config/storage.js b/src/config/storage.js
new file mode 100644
index 0000000..71472ca
--- /dev/null
+++ b/src/config/storage.js
@@ -0,0 +1,7 @@
+// 本地储存 key 信息
+
+/** 储存 key 前缀 */
+const PREFIX = 'frost-navigation/';
+
+/** 当前使用的搜索引擎名称 */
+export const SKEY_SEARCH_ENGINE_NAME = PREFIX + 'search-engine-name';
diff --git a/src/views/SearchView/SearchView.vue b/src/views/SearchView/SearchView.vue
index 4d9144f..ea1cca2 100644
--- a/src/views/SearchView/SearchView.vue
+++ b/src/views/SearchView/SearchView.vue
@@ -1,9 +1,199 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ categoryItem.title }}
+
+
+
+
+ {{ engineItem.name }}
+ {{ engineItem.desc }}
+
+
+
+
+
+
+
+
+