🚩 修复暗黑模式 增加自动填充

This commit is contained in:
7836246 2024-03-26 09:44:00 +08:00
parent f718f8b6c9
commit de0ec3536a
17 changed files with 304 additions and 229 deletions

27
app.config.ts Normal file
View File

@ -0,0 +1,27 @@
import {_colors, _fontFamily} from "#tailwind-config/theme.mjs";
export default defineAppConfig({
naiveui: {
themeConfig: {
shared: {
common: {
fontFamily: _fontFamily.sans.join(", "),
},
},
light: {
common: {
primaryColor: _colors.blue[600],
primaryColorHover: _colors.blue[500],
primaryColorPressed: _colors.blue[700],
},
},
dark: {
common: {
primaryColor: _colors.blue[500],
primaryColorHover: _colors.blue[400],
primaryColorPressed: _colors.blue[600],
},
},
},
},
});

37
app.vue
View File

@ -1,5 +1,11 @@
<template>
<n-config-provider>
<n-config-provider
:theme="theme"
:theme-overrides="themeOverrides"
inline-theme-disabled
preflight-style-disabled
>
<n-global-style/>
<n-modal-provider>
<n-message-provider>
<NuxtLayout>
@ -10,9 +16,17 @@
</n-message-provider>
</n-modal-provider>
</n-config-provider>
</template>
<script setup lang="ts">
import {darkTheme, lightTheme} from 'naive-ui'
import {naiveThemeOverrides} from "~/settings/settings";
const colorMode = useColorMode()
const themeOverrides = naiveThemeOverrides
const theme = computed(() => {
return colorMode.value === 'system' ? (colorMode.value ? lightTheme : darkTheme) : colorMode.value === 'light' ? lightTheme : darkTheme
})
const whoisStore = useWhoisStore()
const dnsStore = useDnsStore()
const domainStore = useDomainStore()
@ -21,24 +35,5 @@ dnsStore.newDnsList()
domainStore.newDomainList()
</script>
<style>
body {
background-color: #fff;
color: rgba(0, 0, 0, 0.8);
}
.dark-mode body {
background-color: #091a28;
color: #18181c;
}
.sepia-mode body {
background-color: #f1e7d0;
color: #433422;
}
.light-mode body {
background-color: #F1F3F4;
color: #433422;
}
</style>

View File

@ -6,14 +6,14 @@ defineProps({
<template>
<!-- 公告部分 -->
<div class="bg-gray-200 p-3 rounded-md mb-5 dark:bg-[#5b77af]">
<div class="bg-gray-200 p-3 rounded-md mb-5 dark:bg-[#000000FF]">
<div class="flex items-center">
<i aria-hidden="true" class="icon fas fa-bullhorn mr-3"></i>
</div>
<div class="flex-grow">
<div class="text-sm text-gray-800 dark:text-white">
{{ text }}
<slot name="text" />
<slot name="text"/>
</div>
</div>
</div>

View File

@ -33,7 +33,7 @@ const availableColor = ref([
<div
class="flex h-10 w-10 items-center justify-center rounded-lg bg-gray-100 dark:bg-gray-700"
>
<Icon name="ph:palette-duotone" class=" text-lg dark:text-white" />
<Icon name="ph:palette-duotone" class=" text-lg dark:text-white"/>
</div>
</HeadlessListboxButton>
<HeadlessListboxOptions
@ -55,7 +55,7 @@ const availableColor = ref([
{{ color.name }}
</span>
<span class="flex items-center justify-center text-sm">
<Icon :name="color.icon" class="text-base" />
<Icon :name="color.icon" class="text-base"/>
</span>
</HeadlessListboxOption>
</HeadlessListboxOptions>

View File

@ -1,9 +1,10 @@
<script setup lang="ts">
const domainStore = useDomainListStore();
const SupportedTLDs = new Set(Object.keys(domainStore.SupportedTLDs));
const domainListStore = useDomainListStore();
const SupportedTLDs = domainListStore.getSupportedTLDKeys
const isOpen = ref(false)
const {t} = useI18n()
</script>
<template>

View File

@ -3,15 +3,15 @@ const localePath = useLocalePath()
const {t} = useI18n()
</script>
<template>
<footer class="text-gray-800 h-[10vh] bg-[#F1F3F4] dark:text-white dark:bg-[#5b77af]">
<footer class="text-gray-800 h-[10vh] bg-[#F1F3F4] dark:text-white dark:bg-[#000000FF]">
<div class="max-w-5xl mx-auto py-4 px-4 flex justify-between items-center">
<div class="text-sm">
{{ t('footer.text')}}
{{ t('footer.text') }}
</div>
<div class="flex items-center space-x-4">
<NuxtLink :to="localePath('/api.html')" class="hover:underline">{{ t('footer.api') }}</NuxtLink>
<NuxtLink to="https://github.com/7836246/Nuxt-Whois" class="hover:underline">
<Icon name="ant-design:github-outlined" class="h-6 w-6" />
<Icon name="ant-design:github-outlined" class="h-6 w-6"/>
</NuxtLink>
</div>
</div>

View File

@ -65,7 +65,7 @@ export default defineI18nLocale(async locale => {
formatDomain: '域名格式错误',
//域名必须包含有效的顶级域
validDomain: '域名必须包含有效的顶级域',
notFound: '未找到域名信息',
notFound: '未找到域名信息,可能是后缀不支持,也可能是当前 Api 不支持,请更换尝试!',
},
result: {
result: '查询结果',

View File

@ -1,6 +1,4 @@
<script setup lang="ts">
import {useApisStore} from "~/stores/api";
const {t} = useI18n()
const router = useRouter();
const runtimeConfig = useRuntimeConfig()
@ -8,7 +6,7 @@ const localePath = useLocalePath()
const settingsStore = useSettingsStore()
const styleStore = useStyleStore()
const clientMounted = ref(false);
const apisStore = useApisStore()
const message = useMessage()
const handleAction = async (url: any) => {
@ -29,10 +27,6 @@ const handleAction = async (url: any) => {
}
onMounted(() => {
clientMounted.value = true;
});
const selectOptions = ref([
{
label: 'Whois',
@ -45,23 +39,49 @@ const selectOptions = ref([
value: 'domain'
}
])
const {selectedOption} = storeToRefs(settingsStore)
const {selectedOption, domainSearch} = storeToRefs(settingsStore)
const handleSelectOptions = (value: any) => {
settingsStore.setSelectedOption(value);
console.log(selectedOption.value)
}
const domainListStore = useDomainListStore();
//
const supportedTLDs = ['com', 'net', 'org', 'io', 'tech', 'co', 'info', 'biz', 'edu', 'gov'];
//
const domainOptions = computed(() => {
if (!domainSearch.value) return [];
//
const prefix = domainSearch.value.split('.')[0];
//
return supportedTLDs.map(suffix => {
const value = `${prefix}.${suffix}`;
return {label: value, value};
});
});
const getShow = (value: any) => {
// value '.'
return typeof value === 'string' && value.endsWith('.');
}
onMounted(() => {
clientMounted.value = true;
});
</script>
<template>
<div
class="w-full text-xs dark:bg-transparent"
class="w-full text-xs bg-[#F1F3F4] dark:bg-transparent"
:class="{ 'h-[90vh]': !styleStore.getIsPage && clientMounted }"
>
<div
class=" max-w-screen-lg mx-auto px-[1em] pb-[10vh] "
:class="{ 'pt-[25vh]': !styleStore.getIsPage && clientMounted, 'pt-[5vh]': styleStore.getIsPage || !clientMounted }"
>
<nav class=" w-full text-[#464747] h-5 dark:bg-gray-700">
<nav class=" w-full text-[#464747] h-5 ">
<NuxtLink class="mb-3 font-bold text-2xl inline-block text-current no-underline dark:text-white"
:to="localePath('/')"
>
@ -70,37 +90,43 @@ const handleSelectOptions = (value: any) => {
</NuxtLink>
</nav>
<div class="mt-6">
<div class="flex items-center space-x-2 mb-3 dark:text-white"
>
<!-- 容器div用于水平布局 -->
<div class="flex-grow">
<NInputGroup>
<n-select
:style="{ width: '20%' }"
size="large"
v-model:value="selectedOption"
:options="selectOptions"
@update:value="handleSelectOptions"
/>
<NInput
v-model:value="settingsStore.domainSearch"
@keyup.enter="handleAction(settingsStore.selectedOption)"
type="text"
:placeholder="t('index.placeholder')"
size="large"
clearable
autofocus
class="w-full "/>
</NInputGroup>
<ClientOnly>
<div class="flex items-center space-x-2 mb-3 dark:text-white"
>
<!-- 容器div用于水平布局 -->
<div class="flex-grow">
<NInputGroup>
<n-select
:style="{ width: '20%' }"
size="large"
v-model:value="selectedOption"
:options="selectOptions"
@update:value="handleSelectOptions"
/>
<NAutoComplete
v-model:value="domainSearch"
@keyup.enter="handleAction(settingsStore.selectedOption)"
:input-props="{ autocomplete: 'off' }"
:options="domainOptions"
:get-show="getShow"
type="text"
:placeholder="t('index.placeholder')"
size="large"
clearable
autofocus
class="w-full ">
</NAutoComplete>
</NInputGroup>
</div>
<!-- 使用v-if基于state.domain的值来控制按钮的显示 -->
<NButton type="primary"
size="large"
@click="handleAction(settingsStore.selectedOption)"
v-if="settingsStore.domainSearch">
{{ t('index.onSubmit') }}
</NButton>
</div>
<!-- 使用v-if基于state.domain的值来控制按钮的显示 -->
<NButton type="primary"
size="large"
@click="handleAction(settingsStore.selectedOption)"
v-if="settingsStore.domainSearch">
{{ t('index.onSubmit') }}
</NButton>
</div>
</ClientOnly>
</div>
<ClientOnly>

View File

@ -1,66 +1,67 @@
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
devtools: { enabled: true },
routeRules:{
'/admin/**':{ ssr : false }
},
modules: [
'@nuxt/devtools', // Devtools开发工具
'@nuxtjs/i18n', // 多语言
'@pinia/nuxt', // Pinia 持久化状态管理
'@pinia-plugin-persistedstate/nuxt', // Pinia 持久化状态管理插件
'nuxt-simple-robots',
'nuxt-headlessui', // 组件库
'@bg-dev/nuxt-naiveui', // 组件库
'@nuxtjs/tailwindcss', // 组件库
'nuxt-icon',
'@nuxtjs/color-mode',
],
features:{
inlineStyles: true,
} ,
runtimeConfig: {
public: {
Domain: process.env.WebSiteDomain || 'Nuxt Whois',
DomainSuffix: process.env.WebSiteDomainSuffix || 'Dns',
}
},
app:{
head: {
title: process.env.WebSiteTitle || 'Nuxt Whois',
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
],
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
]
}
},
i18n: {
strategy: 'prefix_except_default',
defaultLocale: 'zh',
detectBrowserLanguage: {
useCookie: true,
devtools: {enabled: true},
routeRules: {
'/admin/**': {ssr: false}
},
locales: [
{ code: 'zh', iso: 'zh-Hans', file: 'zh.ts' },
{ code: 'en', iso: 'en-US', file: 'en.ts' },
{ code: 'tw', iso: 'zh-Hant', file: 'tw.ts' },
modules: [
'@nuxt/devtools', // Devtools开发工具
'@nuxtjs/i18n', // 多语言
'@pinia/nuxt', // Pinia 持久化状态管理
'@pinia-plugin-persistedstate/nuxt', // Pinia 持久化状态管理插件
'nuxt-simple-robots',
'nuxt-headlessui', // 组件库
'@bg-dev/nuxt-naiveui', // 组件库
'@nuxtjs/tailwindcss', // 组件库
'nuxt-icon',
'@nuxtjs/color-mode',
],
langDir: 'lang/',
},
headlessui: {
prefix: 'Headless'
},
naiveui:{
},
colorMode: {
preference: 'system', // default value of $colorMode.preference
fallback: 'light', // fallback value if not system preference found
classPrefix: '',
classSuffix: '-mode',
storageKey: 'nuxt-color-mode'
}
features: {
inlineStyles: true,
},
runtimeConfig: {
public: {
Domain: process.env.WebSiteDomain || 'Nuxt Whois',
DomainSuffix: process.env.WebSiteDomainSuffix || 'Dns',
}
},
app: {
head: {
title: process.env.WebSiteTitle || 'Nuxt Whois',
meta: [
{charset: 'utf-8'},
{name: 'viewport', content: 'width=device-width, initial-scale=1'},
],
link: [
{rel: 'icon', type: 'image/x-icon', href: '/favicon.ico'}
]
}
},
i18n: {
strategy: 'prefix_except_default',
defaultLocale: 'zh',
detectBrowserLanguage: {
useCookie: true,
},
locales: [
{code: 'zh', iso: 'zh-Hans', file: 'zh.ts'},
{code: 'en', iso: 'en-US', file: 'en.ts'},
{code: 'tw', iso: 'zh-Hant', file: 'tw.ts'},
],
langDir: 'lang/',
},
headlessui: {
prefix: 'Headless'
},
naiveui: {
colorModePreference: "light",
},
colorMode: {
classSuffix: '',
},
tailwindcss: {
exposeConfig: {
write: true,
}
}
})

View File

@ -28,7 +28,7 @@
"less": "^4.2.0",
"nuxt-headlessui": "^1.1.5",
"nuxt-icon": "^0.6.10",
"nuxt-simple-robots": "4.0.0-rc.15",
"nuxt-simple-robots": "4.0.0-rc.16",
"sass": "^1.72.0",
"typescript": "5.4.3"
}

View File

@ -27,7 +27,7 @@ const handleReset = async () => {
</script>
<template>
<div class="setting mt-5 settings-grid">
<div class="setting mt-8 settings-grid">
<n-h6 prefix="bar"> 基础设置</n-h6>
<n-card class="set-item">
<div class="top grid grid-cols-2 gap-4">

View File

@ -7,13 +7,13 @@ const {domain} = route.params;
const {t} = useI18n()
const domainData = domain.replace(/_/g, '.')
const domainData = typeof domain === "string" ? domain?.replace(/_/g, '.') : "";
const showRawData = ref(false);
const timeStore = useTimeStore()
const styleStore = useStyleStore()
const settingsStore = useSettingsStore()
styleStore.setIsPage(true)
const localePath = useLocalePath()
const {data, pending, error, refresh} = await useAsyncData(
@ -36,17 +36,17 @@ if (!error.value && settingsStore.getHistory) {
)
}
const parsedInfo = ParseWhois(data.value);
styleStore.setIsPage(true)
const parsedInfo = data.value ? ParseWhois(data.value) : {};
useHead({
title: `${domainData} - ${t('whois.title')}`,
meta: [
{
name: 'description',
content: t('whois.description', { domain: domainData })
},{
content: t('whois.description', {domain: domainData})
}, {
name: 'keywords',
content: t('whois.keywords', { domain: domainData })
content: t('whois.keywords', {domain: domainData})
}
]
})
@ -54,6 +54,7 @@ useHead({
<template>
<table
v-if="data != ''"
class="w-full bg-[#fffffe] p-4 shadow-lg rounded-lg mt-5 dark:bg-gray-800 dark:text-gray-200 text-white hover:bg-none">
<tbody class="divide-y divide-gray-200 dark:divide-gray-700">
<tr v-if="parsedInfo.domainName"
@ -131,23 +132,23 @@ useHead({
class="hover:bg-gray-100 text-gray-900 dark:hover:bg-gray-700 text-gray-200">
<th class="p-4 text-left font-semibold text-gray-900 dark:text-gray-200">{{ t('result.rawData') }}</th>
<td class="p-4 text-gray-900 dark:text-gray-200">
<NSwitch v-model:value="showRawData"/>
<NSwitch v-model:value="showRawData"/>
</td>
</tr>
</tbody>
</table>
<!-- 公告部分 -->
<CommonBulletin v-if="error" class="mt-5" >
<CommonBulletin v-if="data == ''" class="mt-5">
<template #text>
<Icon name="bx:error" size="16px" color="red" />
<Icon name="bx:error" size="16px" color="red"/>
{{ t('error.notFound') }}
</template>
</CommonBulletin>
<div
class="w-full bg-[#fffffe] mt-5 p-4 shadow-lg rounded-lg whitespace-pre-wrap dark:text-gray-200 dark:bg-gray-800"
v-if="showRawData">
>
{{ data }}
</div>
</template>

View File

@ -0,0 +1,14 @@
export default defineNuxtPlugin((nuxtApp) => {
const colorMode = useColorMode()
// 页面加载完毕,如果是暗色模式则重新加载,见: https://github.com/tusen-ai/naive-ui/issues/3765#issuecomment-1283356344
nuxtApp.hook('page:finish', () => {
setTimeout(() => {
colorMode.value = 'light'
setTimeout(() => {
colorMode.value = colorMode.preference
}, 0)
}, 0)
})
})

162
pnpm-lock.yaml generated
View File

@ -56,8 +56,8 @@ devDependencies:
specifier: ^0.6.10
version: 0.6.10(nuxt@3.11.1)(rollup@4.13.0)(vite@5.2.6)(vue@3.4.21)
nuxt-simple-robots:
specifier: 4.0.0-rc.15
version: 4.0.0-rc.15(@nuxt/devtools@1.1.3)(@vue/compiler-core@3.4.21)(nuxt@3.11.1)(postcss@8.4.38)(rollup@4.13.0)(vite@5.2.6)(vue@3.4.21)(webpack@5.91.0)
specifier: 4.0.0-rc.16
version: 4.0.0-rc.16(@nuxt/devtools@1.1.3)(@vue/compiler-core@3.4.21)(nuxt@3.11.1)(postcss@8.4.38)(rollup@4.13.0)(vite@5.2.6)(vue@3.4.21)(webpack@5.91.0)
sass:
specifier: ^1.72.0
version: 1.72.0
@ -766,8 +766,8 @@ packages:
'@iconify/types': 2.0.0
dev: true
/@iconify/collections@1.0.407:
resolution: {integrity: sha512-1Wn5xz6tsuXFWLyxc4RUoSMMC/WhOgnTd0uiRsRsIEp3HPPGT69vFmdfDamsZi8q3H4olgpkKGwMcY9W3uQ+3w==}
/@iconify/collections@1.0.408:
resolution: {integrity: sha512-huq0rgLQveO5DeWw4SQpq69GwU2xBuC9UPw664Mh/yruc1BYYNvyfvWowQ2ZG4mpBO1BUmIB/T/EtTcLoCeuAA==}
dependencies:
'@iconify/types': 2.0.0
@ -1100,7 +1100,7 @@ packages:
'@npmcli/node-gyp': 3.0.0
'@npmcli/package-json': 5.0.0
'@npmcli/promise-spawn': 7.0.1
node-gyp: 10.0.1
node-gyp: 10.1.0
which: 4.0.0
transitivePeerDependencies:
- bluebird
@ -1201,9 +1201,9 @@ packages:
'@nuxt/devtools-kit': 1.1.3(nuxt@3.11.1)(rollup@4.13.0)(vite@5.2.6)
'@nuxt/devtools-wizard': 1.1.3
'@nuxt/kit': 3.11.1(rollup@4.13.0)
'@vue/devtools-applet': 7.0.20(@unocss/reset@0.58.6)(floating-vue@5.2.2)(unocss@0.58.6)(vite@5.2.6)(vue@3.4.21)
'@vue/devtools-core': 7.0.20(vite@5.2.6)(vue@3.4.21)
'@vue/devtools-kit': 7.0.20(vue@3.4.21)
'@vue/devtools-applet': 7.0.21(@unocss/reset@0.58.6)(floating-vue@5.2.2)(unocss@0.58.6)(vite@5.2.6)(vue@3.4.21)
'@vue/devtools-core': 7.0.21(vite@5.2.6)(vue@3.4.21)
'@vue/devtools-kit': 7.0.21(vue@3.4.21)
birpc: 0.2.17
consola: 3.2.3
cronstrue: 2.48.0
@ -1395,7 +1395,7 @@ packages:
autoprefixer: 10.4.19(postcss@8.4.38)
clear: 0.1.0
consola: 3.2.3
cssnano: 6.1.1(postcss@8.4.38)
cssnano: 6.1.2(postcss@8.4.38)
defu: 6.1.4
esbuild: 0.20.2
escape-string-regexp: 5.0.0
@ -1923,8 +1923,8 @@ packages:
dependencies:
'@sigstore/protobuf-specs': 0.3.0
/@sigstore/core@1.0.0:
resolution: {integrity: sha512-dW2qjbWLRKGu6MIDUTBuJwXCnR8zivcSpf5inUzk7y84zqy/dji0/uahppoIgMoKeR+6pUZucrwHfkQQtiG9Rw==}
/@sigstore/core@1.1.0:
resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==}
engines: {node: ^16.14.0 || >=18.0.0}
/@sigstore/protobuf-specs@0.3.0:
@ -1936,14 +1936,14 @@ packages:
engines: {node: ^16.14.0 || >=18.0.0}
dependencies:
'@sigstore/bundle': 2.2.0
'@sigstore/core': 1.0.0
'@sigstore/core': 1.1.0
'@sigstore/protobuf-specs': 0.3.0
make-fetch-happen: 13.0.0
transitivePeerDependencies:
- supports-color
/@sigstore/tuf@2.3.1:
resolution: {integrity: sha512-9Iv40z652td/QbV0o5n/x25H9w6IYRt2pIGbTX55yFDYlApDQn/6YZomjz6+KBx69rXHLzHcbtTS586mDdFD+Q==}
/@sigstore/tuf@2.3.2:
resolution: {integrity: sha512-mwbY1VrEGU4CO55t+Kl6I7WZzIl+ysSzEYdA1Nv/FTrl2bkeaPXo5PnWZAVfcY2zSdhOpsUTJW67/M2zHXGn5w==}
engines: {node: ^16.14.0 || >=18.0.0}
dependencies:
'@sigstore/protobuf-specs': 0.3.0
@ -1951,12 +1951,12 @@ packages:
transitivePeerDependencies:
- supports-color
/@sigstore/verify@1.1.0:
resolution: {integrity: sha512-1fTqnqyTBWvV7cftUUFtDcHPdSox0N3Ub7C0lRyReYx4zZUlNTZjCV+HPy4Lre+r45dV7Qx5JLKvqqsgxuyYfg==}
/@sigstore/verify@1.1.1:
resolution: {integrity: sha512-BNANJms49rw9Q5J+fJjrDqOQSzjXDcOq/pgKDaVdDoIvQwqIfaoUriy+fQfh8sBX04hr4bkkrwu3EbhQqoQH7A==}
engines: {node: ^16.14.0 || >=18.0.0}
dependencies:
'@sigstore/bundle': 2.2.0
'@sigstore/core': 1.0.0
'@sigstore/core': 1.1.0
'@sigstore/protobuf-specs': 0.3.0
/@sindresorhus/merge-streams@2.3.0:
@ -2074,38 +2074,38 @@ packages:
/@types/web-bluetooth@0.0.20:
resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
/@unhead/dom@1.8.20:
resolution: {integrity: sha512-TXRQSVbqBOQc02m3wxgj55m93U8a3WBHV9xJi2zVX/iHEJgeQbZMJ+rV0YJkHy2OHAC0MfjVQA5NDLaVwtromw==}
/@unhead/dom@1.9.1:
resolution: {integrity: sha512-5YVT8pyg7Mw8niWwklP8nFKK9WLIvaK4O3tXvqpW9OxSAexJG576bh6FR0hEtSDLBkJh+pI8mMMMIuzSdK/whA==}
dependencies:
'@unhead/schema': 1.8.20
'@unhead/shared': 1.8.20
'@unhead/schema': 1.9.1
'@unhead/shared': 1.9.1
/@unhead/schema@1.8.20:
resolution: {integrity: sha512-n0e5jsKino8JTHc4wpr4l8MXXIrj0muYYAEVa0WSYkIVnMiBr1Ik3l6elhCr4fdSyJ3M2DQQleea/oZCr11XCw==}
/@unhead/schema@1.9.1:
resolution: {integrity: sha512-wCJKNx4l837NEVMWP3MnUfkgsnMyuXwYs7+5VvbYzAWbnZSvQt/K10xDV0N7ft9RSlPfgukVVG+gtARm1kGVHQ==}
dependencies:
hookable: 5.5.3
zhead: 2.2.4
/@unhead/shared@1.8.20:
resolution: {integrity: sha512-J0fdtavcMtXcG0g9jmVW03toqfr8A0G7k+Q6jdpwuUPhWk/vhfZn3aiRV+F8LlU91c/AbGWDv8T1MrtMQbb0Sg==}
/@unhead/shared@1.9.1:
resolution: {integrity: sha512-rZgzXzOeF4vu2bJJAkHJckgPgWGfpDA3/vesPhJIZGs2NkGYi9lDwMUeJ90HKCMJv1+JRAcPOokjRi6vRlnQpg==}
dependencies:
'@unhead/schema': 1.8.20
'@unhead/schema': 1.9.1
/@unhead/ssr@1.8.20:
resolution: {integrity: sha512-Cq1NcdYZ/IAkJ0muqdOBxJXb5dn+uV+RvIXDykRb9lGgriU/S0fzUw8XYTYMwLlvW6rSMrtRx319hz2D3ZrBkA==}
/@unhead/ssr@1.9.1:
resolution: {integrity: sha512-ojY5umX2rtEvmsAFX935DPxk+rZfmgLOEMP1etJGYmCh2GQskK4USjUp9uYJyf0DP0xh+42R4a06e5602CIWHQ==}
dependencies:
'@unhead/schema': 1.8.20
'@unhead/shared': 1.8.20
'@unhead/schema': 1.9.1
'@unhead/shared': 1.9.1
/@unhead/vue@1.8.20(vue@3.4.21):
resolution: {integrity: sha512-Lm6cnbX/QGCh+pxGN1Tl6LVXxYs5bLlN8APfI2rQ5kMNRE6Yy7r2eY5wCZ0SfsSRonqJxzVlgMMh8JPEY5d4GQ==}
/@unhead/vue@1.9.1(vue@3.4.21):
resolution: {integrity: sha512-clSKIkwtw26Lx5tR7ecJ/zvyFJkghvJU+jt2liQ4XYQb/Qaveh8L7gqsI1RKUuKaXAjlo2Z4Jpp1v9nHxA0heg==}
peerDependencies:
vue: '>=2.7 || >=3'
dependencies:
'@unhead/schema': 1.8.20
'@unhead/shared': 1.8.20
'@unhead/schema': 1.9.1
'@unhead/shared': 1.9.1
hookable: 5.5.3
unhead: 1.8.20
unhead: 1.9.1
vue: 3.4.21(typescript@5.4.3)
/@unocss/astro@0.58.6(rollup@4.13.0)(vite@5.2.6):
@ -2481,15 +2481,15 @@ packages:
/@vue/devtools-api@6.6.1:
resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==}
/@vue/devtools-applet@7.0.20(@unocss/reset@0.58.6)(floating-vue@5.2.2)(unocss@0.58.6)(vite@5.2.6)(vue@3.4.21):
resolution: {integrity: sha512-q48RtnhFmC0kd4N+3Edfctv6oL2neN6crUapBydSr6szjR87dQJygTEYKlpyx0SHmVLVwq4mcgFuf1ftAKjd/w==}
/@vue/devtools-applet@7.0.21(@unocss/reset@0.58.6)(floating-vue@5.2.2)(unocss@0.58.6)(vite@5.2.6)(vue@3.4.21):
resolution: {integrity: sha512-XqMeZrRoMJBSybg0Lu1777UZzI3nzApPlT4ZgupGkcFWQqoUkuhDaGYDqxer/yQgg4hOZsZQnB9nOmIk+GjGPA==}
peerDependencies:
vue: ^3.0.0
dependencies:
'@vue/devtools-core': 7.0.20(vite@5.2.6)(vue@3.4.21)
'@vue/devtools-kit': 7.0.20(vue@3.4.21)
'@vue/devtools-shared': 7.0.20
'@vue/devtools-ui': 7.0.20(@unocss/reset@0.58.6)(floating-vue@5.2.2)(unocss@0.58.6)(vue@3.4.21)
'@vue/devtools-core': 7.0.21(vite@5.2.6)(vue@3.4.21)
'@vue/devtools-kit': 7.0.21(vue@3.4.21)
'@vue/devtools-shared': 7.0.21
'@vue/devtools-ui': 7.0.21(@unocss/reset@0.58.6)(floating-vue@5.2.2)(unocss@0.58.6)(vue@3.4.21)
perfect-debounce: 1.0.0
splitpanes: 3.1.5
vue: 3.4.21(typescript@5.4.3)
@ -2512,11 +2512,11 @@ packages:
- unocss
- vite
/@vue/devtools-core@7.0.20(vite@5.2.6)(vue@3.4.21):
resolution: {integrity: sha512-JefAn0ljTUPtoEJ47PjEfcLQb9BVt3OH1R6aD8qZ7bNYwZH+xystXpVJ3pW+1iDnOXjfpLgc3bsHUZoxlfobpw==}
/@vue/devtools-core@7.0.21(vite@5.2.6)(vue@3.4.21):
resolution: {integrity: sha512-t5U1+lBZ9KmscJgcVtpZru2Le0fjckOBDwjodmqxccYEidj/7zst0bLbPwH9bYsNK6h6mtfZ6MtbcgTUcvNKsg==}
dependencies:
'@vue/devtools-kit': 7.0.20(vue@3.4.21)
'@vue/devtools-shared': 7.0.20
'@vue/devtools-kit': 7.0.21(vue@3.4.21)
'@vue/devtools-shared': 7.0.21
mitt: 3.0.1
nanoid: 3.3.7
pathe: 1.1.2
@ -2525,25 +2525,25 @@ packages:
- vite
- vue
/@vue/devtools-kit@7.0.20(vue@3.4.21):
resolution: {integrity: sha512-FgFuPuqrhQ51rR/sVi52FnGgrxJ3X1bvNra/SkBzPhxJVhfyL5w2YUJZI1FgCvtLAyPSomJNdvlG415ZbJsr6w==}
/@vue/devtools-kit@7.0.21(vue@3.4.21):
resolution: {integrity: sha512-tNDtcQkPHfLDH1wtZuSZ2ZfE+r/aGswkBmKmXjwfpZTsOTk/YXsgrMnBKtHOL6dpsG3GyP09gIgNkCkA5lBIPQ==}
peerDependencies:
vue: ^3.0.0
dependencies:
'@vue/devtools-shared': 7.0.20
'@vue/devtools-shared': 7.0.21
hookable: 5.5.3
mitt: 3.0.1
perfect-debounce: 1.0.0
speakingurl: 14.0.1
vue: 3.4.21(typescript@5.4.3)
/@vue/devtools-shared@7.0.20:
resolution: {integrity: sha512-E6CiCaYr6ZWOCYJgWodXcPCXxB12vgbUA1X1sG0F1tK5Bo5I35GJuTR8LBJLFHV0VpwLWvyrIi9drT1ZbuJxlg==}
/@vue/devtools-shared@7.0.21:
resolution: {integrity: sha512-wuIakRkSqwsk9+Y4z5QTdsmhTJRAt4aX0ROXyOOEPL+ROrN26YsPbXyqlzroU5uoOoAvx81iObIlmwZWtZztgw==}
dependencies:
rfdc: 1.3.1
/@vue/devtools-ui@7.0.20(@unocss/reset@0.58.6)(floating-vue@5.2.2)(unocss@0.58.6)(vue@3.4.21):
resolution: {integrity: sha512-0Jy+9l8gQKnEPitOBthib6bZPdf2FipPIpMZPZ90xH4z1nWGN2aHBqOHH3dMpNgnymlkgAR5QDvodj5RcxiUGw==}
/@vue/devtools-ui@7.0.21(@unocss/reset@0.58.6)(floating-vue@5.2.2)(unocss@0.58.6)(vue@3.4.21):
resolution: {integrity: sha512-hYLhMAKoTJ2/Lbol0pbZW0jq49x/fYheTqa6zpLw1Qti5eOD+sOS9WGQZL/T8nBuOG/yZJswI+R0qaUrJXiLrA==}
peerDependencies:
'@unocss/reset': '>=0.50.0-0'
floating-vue: '>=2.0.0-0'
@ -3472,8 +3472,8 @@ packages:
uWebSockets.js:
optional: true
/css-declaration-sorter@7.1.1(postcss@8.4.38):
resolution: {integrity: sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==}
/css-declaration-sorter@7.2.0(postcss@8.4.38):
resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==}
engines: {node: ^14 || ^16 || >=18}
peerDependencies:
postcss: ^8.0.9
@ -3519,14 +3519,14 @@ packages:
engines: {node: '>=4'}
hasBin: true
/cssnano-preset-default@6.1.1(postcss@8.4.38):
resolution: {integrity: sha512-XW/dYN2p8Jdkp1lovFd0UVRh6RB0iMyXJbAE9Qm+taR3p2LGu492AW34lVaukUrXoK9IxK5aK3CUmFpUorU4oA==}
/cssnano-preset-default@6.1.2(postcss@8.4.38):
resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==}
engines: {node: ^14 || ^16 || >=18.0}
peerDependencies:
postcss: ^8.4.31
dependencies:
browserslist: 4.23.0
css-declaration-sorter: 7.1.1(postcss@8.4.38)
css-declaration-sorter: 7.2.0(postcss@8.4.38)
cssnano-utils: 4.0.2(postcss@8.4.38)
postcss: 8.4.38
postcss-calc: 9.0.1(postcss@8.4.38)
@ -3565,13 +3565,13 @@ packages:
dependencies:
postcss: 8.4.38
/cssnano@6.1.1(postcss@8.4.38):
resolution: {integrity: sha512-paTFZuiVohpaXJuau8l7buFt9+FTmfjwEO70EKitzYOQw3frib/It4sb6cQ+gJyDEyY+myDSni6IbBvKZ0N8Lw==}
/cssnano@6.1.2(postcss@8.4.38):
resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==}
engines: {node: ^14 || ^16 || >=18.0}
peerDependencies:
postcss: ^8.4.31
dependencies:
cssnano-preset-default: 6.1.1(postcss@8.4.38)
cssnano-preset-default: 6.1.2(postcss@8.4.38)
lilconfig: 3.1.1
postcss: 8.4.38
@ -4274,7 +4274,7 @@ packages:
destr: 2.0.3
iron-webcrypto: 1.1.0
ohash: 1.1.3
radix3: 1.1.1
radix3: 1.1.2
ufo: 1.5.3
uncrypto: 0.1.3
unenv: 1.9.0
@ -5300,7 +5300,7 @@ packages:
perfect-debounce: 1.0.0
pkg-types: 1.0.3
pretty-bytes: 6.1.1
radix3: 1.1.1
radix3: 1.1.2
rollup: 4.13.0
rollup-plugin-visualizer: 5.12.0(rollup@4.13.0)
scule: 1.3.0
@ -5361,8 +5361,8 @@ packages:
resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==}
hasBin: true
/node-gyp@10.0.1:
resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==}
/node-gyp@10.1.0:
resolution: {integrity: sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==}
engines: {node: ^16.14.0 || >=18.0.0}
hasBin: true
dependencies:
@ -5514,7 +5514,7 @@ packages:
/nuxt-icon@0.6.10(nuxt@3.11.1)(rollup@4.13.0)(vite@5.2.6)(vue@3.4.21):
resolution: {integrity: sha512-S9zHVA66ox4ZSpMWvCjqKZC4ZogC0s2z3vZs+M4D95YXGPEXwxDZu+insMKvkbe8+k7gvEmtTk0eq3KusKlxiw==}
dependencies:
'@iconify/collections': 1.0.407
'@iconify/collections': 1.0.408
'@iconify/vue': 4.1.1(vue@3.4.21)
'@nuxt/devtools-kit': 1.1.3(nuxt@3.11.1)(rollup@4.13.0)(vite@5.2.6)
'@nuxt/kit': 3.11.1(rollup@4.13.0)
@ -5525,8 +5525,8 @@ packages:
- vite
- vue
/nuxt-simple-robots@4.0.0-rc.15(@nuxt/devtools@1.1.3)(@vue/compiler-core@3.4.21)(nuxt@3.11.1)(postcss@8.4.38)(rollup@4.13.0)(vite@5.2.6)(vue@3.4.21)(webpack@5.91.0):
resolution: {integrity: sha512-+kAk1MFUfDZWo29Py40cLTmt+of+QH7XB+aA3c5woAS/jdFb5WBq6c80H8XjnBiel3v/c5KXCw+0sHak/SsTmg==}
/nuxt-simple-robots@4.0.0-rc.16(@nuxt/devtools@1.1.3)(@vue/compiler-core@3.4.21)(nuxt@3.11.1)(postcss@8.4.38)(rollup@4.13.0)(vite@5.2.6)(vue@3.4.21)(webpack@5.91.0):
resolution: {integrity: sha512-jRgDvjRrRgTAC4WOLs1dx3mHlVa5VHATgDhk8+0Mp5H4WjBipZGrZs9WOWX5Jymh17oTIESVKGHZRhaRiP+AKA==}
dependencies:
'@nuxt/devtools-kit': 1.1.3(nuxt@3.11.1)(rollup@4.13.0)(vite@5.2.6)
'@nuxt/kit': 3.11.1(rollup@4.13.0)
@ -5643,9 +5643,9 @@ packages:
'@nuxt/telemetry': 2.5.3(rollup@4.13.0)
'@nuxt/ui-templates': 1.3.1
'@nuxt/vite-builder': 3.11.1(less@4.2.0)(rollup@4.13.0)(sass@1.72.0)(typescript@5.4.3)(vue@3.4.21)
'@unhead/dom': 1.8.20
'@unhead/ssr': 1.8.20
'@unhead/vue': 1.8.20(vue@3.4.21)
'@unhead/dom': 1.9.1
'@unhead/ssr': 1.9.1
'@unhead/vue': 1.9.1(vue@3.4.21)
'@vue/shared': 3.4.21
acorn: 8.11.3
c12: 1.10.0
@ -5674,7 +5674,7 @@ packages:
pathe: 1.1.2
perfect-debounce: 1.0.0
pkg-types: 1.0.3
radix3: 1.1.1
radix3: 1.1.2
scule: 1.3.0
std-env: 3.7.0
strip-literal: 2.0.0
@ -6420,8 +6420,8 @@ packages:
/queue-tick@1.0.1:
resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==}
/radix3@1.1.1:
resolution: {integrity: sha512-yUUd5VTiFtcMEx0qFUxGAv5gbMc1un4RvEO1JZdP7ZUl/RHygZK6PknIKntmQRZxnMY3ZXD2ISaw1ij8GYW1yg==}
/radix3@1.1.2:
resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
/randombytes@2.1.0:
resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
@ -6747,11 +6747,11 @@ packages:
engines: {node: ^16.14.0 || >=18.0.0}
dependencies:
'@sigstore/bundle': 2.2.0
'@sigstore/core': 1.0.0
'@sigstore/core': 1.1.0
'@sigstore/protobuf-specs': 0.3.0
'@sigstore/sign': 2.2.3
'@sigstore/tuf': 2.3.1
'@sigstore/verify': 1.1.0
'@sigstore/tuf': 2.3.2
'@sigstore/verify': 1.1.1
transitivePeerDependencies:
- supports-color
@ -7259,12 +7259,12 @@ packages:
node-fetch-native: 1.6.4
pathe: 1.1.2
/unhead@1.8.20:
resolution: {integrity: sha512-IJOCYact/7Za3M7CeeCWs8Vze53kHvKDUy/EXtkTm/an5StgqOt2uCnS3HrkioIMKdHBpy/qtTc6E3BoGMOq7Q==}
/unhead@1.9.1:
resolution: {integrity: sha512-qTyA0V6xjUrIJp6KWs0CqAayw4K2DE7rh0GO0vmcC2YuF0HITO/3zkVtG7zhJUd5VeGgGCO/82zatDOOhMyneA==}
dependencies:
'@unhead/dom': 1.8.20
'@unhead/schema': 1.8.20
'@unhead/shared': 1.8.20
'@unhead/dom': 1.9.1
'@unhead/schema': 1.9.1
'@unhead/shared': 1.9.1
hookable: 5.5.3
/unicorn-magic@0.1.0:

View File

@ -6,6 +6,6 @@ export default defineEventHandler(async (event) => {
const res = await whois(body.domain)
return res._raw
} catch (e) {
return e
return new Error("接口不支持或者查询有误")
}
})

View File

@ -4,12 +4,14 @@ import serversData from '~/server/whois/json/whois-servers.json';
// 定义接口来描述state的结构
interface DomainState {
SupportedTLDs: Record<string, string>;
supportedTLDKeys: Set<string>;
}
export const useDomainListStore = defineStore('useDomainListStore', {
// 使用箭头函数和类型注解定义state
state: (): DomainState => ({
SupportedTLDs: {...serversData},
supportedTLDKeys: new Set(Object.keys(serversData)) as any,
}),
actions: {
async addSuffix(suffix: string, server: string) {
@ -43,6 +45,14 @@ export const useDomainListStore = defineStore('useDomainListStore', {
}
}
},
getters: {
getSupportedTLDs(state: any) {
return state.SupportedTLDs;
},
getSupportedTLDKeys(state: any) {
return state.supportedTLDKeys;
}
},
persist: {
storage: persistedState.localStorage,
}

View File

@ -27,5 +27,5 @@ export default {
corePlugins: {
preflight: true,
},
darkMode: 'class',
darkMode: "class"
}