-
+
-
-
-
+
+
+
+
+ {{ t('popper.support') }}
+
-
-
-
+ trigger="hover" placement="top">
+
+
+
+ {{ t('popper.history') }}
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ {{ t('popper.setting') }}
+
+
+
+
+
+
+ 第三方APi
+
+
+
+
+
+
+ {{ timeStore.timeZones }}
+
+
+
+
+
+
+ {{ t('popper.theme') }}
+
+
+
+
+
+
+ {{ t('popper.language') }}
+
+
diff --git a/composables/DomainFormat.ts b/composables/DomainFormat.ts
new file mode 100644
index 0000000..15de656
--- /dev/null
+++ b/composables/DomainFormat.ts
@@ -0,0 +1,43 @@
+export const trimDomain = (domain: string): string => {
+ return domain.trim().toLowerCase(); // 确保域名为小写
+};
+
+export const splitDomain = (domain: string): string[] => {
+ return domain.split('.');
+};
+//
+// const SupportedTLDs = new Set(Object.keys(domainStore.SupportedTLDs));
+//
+// export const updateDomainForTLD = (parts: string[]): string => {
+// const potentialTLD = parts.slice(-2).join('.').toLowerCase(); // 确保为小写
+// let domainToKeep: string;
+// if (SupportedTLDs.has(potentialTLD)) {
+// domainToKeep = parts.length > 2 ? parts.slice(-3).join('.') : parts.join('.');
+// } else {
+// domainToKeep = parts.slice(-2).join('.');
+// }
+// return domainToKeep;
+// };
+//
+//
+// export const validateDomain = (parts: string[]): boolean => {
+// if (parts.length < 2) {
+// const message = useMessage()
+// message.warning('域名格式不正确')
+// return false;
+// }
+// return true;
+// };
+//
+//
+// const isTLDValid = (parts: string[]): boolean => {
+// const lastPart = parts[parts.length - 1].toLowerCase(); // 获取最后一部分,并确保为小写
+// const potentialTLD = parts.slice(-2).join('.').toLowerCase(); // 获取可能的多部分TLD,并确保为小写
+//
+// if (!SupportedTLDs.has(lastPart) && !SupportedTLDs.has(potentialTLD)) {
+// const message = useMessage()
+// message.warning('域名后缀不合法')
+// return false;
+// }
+// return true;
+// };
diff --git a/layouts/components/tab/ContextMenu.vue b/layouts/components/tab/ContextMenu.vue
new file mode 100644
index 0000000..e24da53
--- /dev/null
+++ b/layouts/components/tab/ContextMenu.vue
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
diff --git a/layouts/components/tab/index.vue b/layouts/components/tab/index.vue
new file mode 100644
index 0000000..da203b9
--- /dev/null
+++ b/layouts/components/tab/index.vue
@@ -0,0 +1,95 @@
+
+
+
+
+ tabStore.removeTab(path)"
+ >
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
diff --git a/layouts/default.vue b/layouts/default.vue
index 7a7f47a..c4a4330 100644
--- a/layouts/default.vue
+++ b/layouts/default.vue
@@ -1,89 +1,60 @@
{
-
+
-
+
+
+
+
-
-
+
+
{{ t('index.onSubmit') }}
-
-
+
+
-
-
-
+
+
+
+
+
+
-
+
diff --git a/layouts/empty/index.vue b/layouts/empty/index.vue
new file mode 100644
index 0000000..28f533a
--- /dev/null
+++ b/layouts/empty/index.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/layouts/full/header/index.vue b/layouts/full/header/index.vue
new file mode 100644
index 0000000..73b348e
--- /dev/null
+++ b/layouts/full/header/index.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ isDark ? '夜间模式' : '日间模式' }}
+
+
+
+
+
+
+
+
+
+
+ {{ isFullscreen ? '退出全屏' : '全屏模式' }}
+
+
+
+
+
+
+
+
diff --git a/layouts/full/index.vue b/layouts/full/index.vue
new file mode 100644
index 0000000..5d2ad29
--- /dev/null
+++ b/layouts/full/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
diff --git a/layouts/full/sidebar/index.vue b/layouts/full/sidebar/index.vue
new file mode 100644
index 0000000..65cb85b
--- /dev/null
+++ b/layouts/full/sidebar/index.vue
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/nuxt.config.ts b/nuxt.config.ts
index 05b7acc..81f93aa 100644
--- a/nuxt.config.ts
+++ b/nuxt.config.ts
@@ -1,14 +1,20 @@
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
devtools: { enabled: true },
+ routeRules:{
+ '/admin/**':{ ssr : false }
+ },
modules: [
- '@nuxt/devtools',
- '@nuxt/ui',
- '@nuxtjs/i18n',
- 'nuxt-headlessui',
- '@pinia/nuxt', // needed
- '@pinia-plugin-persistedstate/nuxt',
+ '@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,
@@ -47,4 +53,14 @@ export default defineNuxtConfig({
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'
+ }
})
diff --git a/package.json b/package.json
index d9a0d5c..21edce9 100644
--- a/package.json
+++ b/package.json
@@ -11,18 +11,25 @@
},
"dependencies": {
"@nuxt/ui": "^2.14.2",
- "@nuxtjs/tailwindcss": "^6.11.4",
"@pinia/nuxt": "^0.5.1",
- "nuxt": "^3.11.0",
+ "lucide-vue-next": "^0.363.0",
+ "nuxt": "^3.11.1",
"socks": "^2.8.1",
"vue": "^3.4.21",
- "vue-router": "^4.3.0"
+ "vue-router": "^4.3.0",
+ "vuedraggable": "^4.1.0"
},
"devDependencies": {
+ "@bg-dev/nuxt-naiveui": "^1.10.4",
+ "@nuxtjs/color-mode": "^3.3.3",
"@nuxtjs/i18n": "^8.2.0",
+ "@nuxtjs/tailwindcss": "^6.11.4",
"@pinia-plugin-persistedstate/nuxt": "^1.2.0",
+ "less": "^4.2.0",
"nuxt-headlessui": "^1.1.5",
- "nuxt-simple-robots": "4.0.0-rc.14",
- "typescript": "5.4.2"
+ "nuxt-icon": "^0.6.10",
+ "nuxt-simple-robots": "4.0.0-rc.15",
+ "sass": "^1.72.0",
+ "typescript": "5.4.3"
}
}
diff --git a/pages/admin/dashboard/index.vue b/pages/admin/dashboard/index.vue
new file mode 100644
index 0000000..256f7c2
--- /dev/null
+++ b/pages/admin/dashboard/index.vue
@@ -0,0 +1,179 @@
+
+
+
+
+
+
+
+
+ 一个人几乎可以在任何他怀有无限热忱的事情上成功。
+ —— 查尔斯·史考伯
+
+
+
+
+ isme.top
+
+
+
+
+ 这是一款极简风格的后台管理模板,包含前后端解决方案,前端使用 Vite + Vue3 + Pinia +
+ Unocss,后端使用 Nestjs + TypeOrm +
+ MySql,简单易用,赏心悦目,历经十几次重构和细节打磨,诚意满满!!
+
+
+
+
+
+
+
+ 👏 历经十几次重构和细节打磨
+
+
+
+ -
+ 🆒 使用
+ Vue3
+ 主流技术栈:
+ Vite + Vue3 + Pinia
+
+ -
+ 🍇 使用
+ 原子CSS
+ 框架:
+ Unocss
+ ,优雅、轻量、易用
+
+ -
+ 🤹 使用主流的
+ iconify + unocss
+ 图标方案,支持自定义图标,支持动态渲染
+
+ -
+ 🎨 使用 Naive UI,
+ 极致简洁的代码风格和清爽的页面设计
+ ,审美在线,主题轻松定制
+
+ -
+ 👏 先进且易于理解的文件结构设计,多个模块之间
+ 零耦合
+ ,单个业务模块删除不影响其他模块
+
+ -
+ 🚀
+ 扁平化路由
+ 设计,每一个组件都可以是一个页面,告别多级路由 KeepAlive 难实现问题
+
+
+ -
+ 🍒
+ 基于权限动态生成路由
+ ,无需额外定义路由,
+ 403和404可区分
+ ,而不是无权限也跳404
+
+ -
+ 🔐 基于Redis集成
+ 无感刷新
+ ,用户登录态可控,安全与体验缺一不可
+
+ -
+ ✨ 基于 Naive UI 封装
+ message
+ 全局工具方法,支持批量提醒,支持跨页面共享实例
+
+ -
+ ⚡️ 基于 Naive UI 封装常用的业务组件,包含
+ Page
+ 组件、
+ CRUD
+ 表格组件及
+ Modal
+ 组件,减少大量重复性工作
+
+
+
+
+
+ 👉点击
+
+ 更多
+
+ 查看更多实用功能,持续开发中...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/admin/user/Login.vue b/pages/admin/user/Login.vue
new file mode 100644
index 0000000..a3d4d3e
--- /dev/null
+++ b/pages/admin/user/Login.vue
@@ -0,0 +1,104 @@
+
+
+
+
+
![login-pic]()
+
+
+
+
+
Admin Pro 中后台前端/设计解决方案
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 登录
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/dns/[domain].html.vue b/pages/dns/[domain].html.vue
index 0b67c78..bb3f217 100644
--- a/pages/dns/[domain].html.vue
+++ b/pages/dns/[domain].html.vue
@@ -1,20 +1,18 @@
+
+
+
+
+
+
+ 域名信息
+
+ Api来源:{{ domainStore.getFirstNewDomainShown?.name }}
+
+
+
+
域名: {{ domainInfo.domain }}
+
货币: {{
+ domainInfo.currency
+ }} ({{ domainInfo.currency_symbol }})
+
新注册价格: {{ domainInfo.currency_symbol }}{{ domainInfo.new }}
+
+
续费价格: {{
+ domainInfo.currency_symbol
+ }}{{ domainInfo.renew }}
+
溢价:{{ domainInfo.premium ? '支持' : '不支持' }}
+
溢价功能:{{ domainInfo.premium ? '支持' : '不支持' }}
+
+
+
+
+
+
+
提示
+
当前没有可用的 Domain 服务器。
+
+
请检查您的Domain设置或稍后再试。
+
+
+
+
+
+
+
diff --git a/pages/settings/api/index.vue b/pages/settings/api/index.vue
new file mode 100644
index 0000000..1c5655c
--- /dev/null
+++ b/pages/settings/api/index.vue
@@ -0,0 +1,298 @@
+
+
+
+
+
+
+
+
+ Whois第三方API
+
+ 拖拽以排序,开关用以控制在页面中的显示状态
+
+
+
+
+ 恢复默认
+
+ 确认将排序恢复到默认状态?
+
+
+
+
+
+
+
![logo]()
+
+
+
+
+
+
+
+
+
+
+
+ Dns第三方API
+
+ 拖拽以排序,开关用以控制在页面中的显示状态
+
+
+
+
+ 恢复默认
+
+ 确认将Dns排序恢复到默认状态?
+
+
+
+
+
+
+
![logo]()
+
+
+
+
+
+
+
+
+
+
+
+ 域名第三方API
+
+ 拖拽以排序,开关用以控制在页面中的显示状态
+
+
+
+
+ 恢复默认
+
+ 确认将排序恢复到默认状态?
+
+
+
+
+
+
+
![logo]()
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/settings/index.vue b/pages/settings/index.vue
index 14cf4d6..41a1eed 100644
--- a/pages/settings/index.vue
+++ b/pages/settings/index.vue
@@ -1,7 +1,7 @@
-
-
{{ t('settings.title') }}
-
-
-
{{ t('settings.history') }}
-
-
-
+
+
基础设置
+
+
+
+ {{ t('settings.title') }}
+ {{ t('settings.history') }}
-
-
+
-
-
{{ t('settings.suffixSetting') }}
-
-
-
{{ t('settings.customSuffix') }}
-
- {{ t('settings.suffixDesc') }}
+
+ 公告设置
+ 是否开启首页公告功能
-
-
{{ t('settings.manage') }}
+
+
+
+ 支持列表
+ 是否开启支持列表功能
+
+
-
- 杂项设置
+
+
+
+ 重置所有数据
+
+ 重置所有数据,你的自定义设置都将会丢失
+
+
+
-
-
-
- {{ t('settings.suffixManage') }}
-
-
-
+
+ {{ t('common.actions.reset') }}
-
-
-
-
-
-
-
-
-
-
{{ t('settings.linkOpenType') }}
-
-
-
{{ t('settings.linkOpenTypeDesc') }}
-
-
-
-
-
+ 确认重置所有数据?你的自定义设置都将会丢失!
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
{{ t('settings.miscellaneous') }}
-
-
-
{{ t('settings.reset') }}
-
- {{ t('settings.resetDesc') }}
-
-
- {{ t('common.actions.reset') }}
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
- Modal
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
- {{ t('settings.resetConfirm') }}
-
-
-
- {{ t('common.actions.confirm') }}
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pages/whois/[domain].html.vue b/pages/whois/[domain].html.vue
index 1f8dd4a..4eeef3e 100644
--- a/pages/whois/[domain].html.vue
+++ b/pages/whois/[domain].html.vue
@@ -1,8 +1,6 @@