commit 0d82386f8f056a111f3736b390058c6f096592d2 Author: 赵忠林 <170083662@qq.com> Date: Wed Apr 29 01:33:33 2026 +0800 新版官网模板 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5e791aa --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.nuxt/ diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml new file mode 100644 index 0000000..6e50d12 --- /dev/null +++ b/.idea/sqldialects.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..8894a98 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,334 @@ + + + + + + + + + + + + + { + "associatedIndex": 6 +} + + + + + + + { + "keyToString": { + "RunOnceActivity.ShowReadmeOnStart": "true", + "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", + "RunOnceActivity.git.unshallow": "true", + "git-widget-placeholder": "master", + "junie.onboarding.icon.badge.shown": "true", + "last_opened_file_path": "/Users/gxwebsoft/VUE/template-10398", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "npm.build.executor": "Run", + "npm.dev.executor": "Run", + "settings.editor.selected.configurable": "preferences.fileTypes", + "to.speed.mode.migration.done": "true", + "ts.external.directory.path": "/Users/gxwebsoft/VUE/template-10398/node_modules/typescript/lib", + "vue.rearranger.settings.migration": "true" + }, + "keyToStringList": { + "vue.recent.templates": [ + "Vue Composition API Component" + ] + } +} + + + + + + + + + + + + + + + + + + + + + diff --git a/app/assets/css/admin-common.css b/app/assets/css/admin-common.css new file mode 100644 index 0000000..c159606 --- /dev/null +++ b/app/assets/css/admin-common.css @@ -0,0 +1,100 @@ +/** + * Admin 平台管理公共样式 + * 所有 /admin/* 页面共用 + */ + +/* -------- 页面头部 -------- */ +.page-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + flex-wrap: wrap; + gap: 12px; +} +.page-title { + font-size: 18px; + font-weight: 700; + color: #1f2937; + margin: 0; +} +.page-desc { + font-size: 13px; + color: #9ca3af; + margin: 2px 0 0; +} + +/* -------- 统计卡片 -------- */ +.stat-card { + display: flex; + align-items: center; + gap: 12px; + padding: 16px; + border-radius: 12px; + border: 2px solid transparent; + transition: all 0.2s; +} +.stat-card[class*="cursor"], .stat-card.clickable { cursor: pointer; } +.stat-card:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,0.08); } +.stat-card.active { box-shadow: 0 4px 12px rgba(0,0,0,0.12); } + +.stat-card.blue { background: #eff6ff; border-color: #dbeafe; } +.stat-card.green { background: #f0fdf4; border-color: #bbf7d0; } +.stat-card.orange { background: #fff7ed; border-color: #fed7aa; } +.stat-card.red { background: #fff1f2; border-color: #fecdd3; } +.stat-card.purple { background: #faf5ff; border-color: #e9d5ff; } +.stat-card.gold { background: #fffbeb; border-color: #fde68a; } +.stat-card.gray { background: #f9fafb; border-color: #e5e7eb; } + +.stat-card.active.blue { border-color: #3b82f6; } +.stat-card.active.green { border-color: #22c55e; } +.stat-card.active.orange { border-color: #f97316; } +.stat-card.active.red { border-color: #ef4444; } +.stat-card.active.purple { border-color: #a855f7; } + +.stat-icon { font-size: 28px; flex-shrink: 0; } +.stat-value { font-size: 22px; font-weight: 700; color: rgba(0,0,0,0.85); line-height: 1.2; } +.stat-label { font-size: 12px; color: rgba(0,0,0,0.45); margin-top: 2px; } + +/* -------- Panel 面板 -------- */ +.panel { + background: #fff; + border: 1px solid #f0f0f0; + border-radius: 12px; + overflow: hidden; +} +.panel-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 14px 18px; + border-bottom: 1px solid #f5f5f5; + flex-wrap: wrap; + gap: 10px; +} +.panel-title { + font-size: 14px; + font-weight: 600; + color: rgba(0,0,0,0.85); +} + +/* -------- 通用间距 -------- */ +.mb-4 { margin-bottom: 16px; } +.mb-6 { margin-bottom: 24px; } + +/* -------- 通用文字 -------- */ +.text-sm { font-size: 12px; } +.text-gray { color: rgba(0,0,0,0.45); } +.text-gray-400 { color: #9ca3af; } + +/* -------- 危险操作按钮 -------- */ +.danger-item { color: #ff4d4f !important; } + +/* -------- 域名链接 -------- */ +.domain-link { font-size: 13px; color: #4f46e5; text-decoration: none; } +.domain-link:hover { text-decoration: underline; } + +/* -------- Ant Design 覆盖 -------- */ +.ant-btn.ant-btn-sm.ant-btn-icon-only { + width: 32px; +} diff --git a/app/assets/css/tailwind.css b/app/assets/css/tailwind.css new file mode 100644 index 0000000..61e0c35 --- /dev/null +++ b/app/assets/css/tailwind.css @@ -0,0 +1,12 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* 阿里妈妈数黑体 */ +@font-face { + font-family: 'Alimama ShuHeiTi'; + src: url('/fonts/AlimamaShuHeiTi-Bold.woff2') format('woff2'); + font-weight: 700; + font-style: normal; + font-display: swap; +} diff --git a/app/assets/mp4/websopy-intro.mp4 b/app/assets/mp4/websopy-intro.mp4 new file mode 100644 index 0000000..f34a34c Binary files /dev/null and b/app/assets/mp4/websopy-intro.mp4 differ diff --git a/app/components/ArticleListPage.vue b/app/components/ArticleListPage.vue new file mode 100644 index 0000000..34b91b5 --- /dev/null +++ b/app/components/ArticleListPage.vue @@ -0,0 +1,368 @@ + + + + + diff --git a/app/components/NotificationBell.vue b/app/components/NotificationBell.vue new file mode 100644 index 0000000..9404f6b --- /dev/null +++ b/app/components/NotificationBell.vue @@ -0,0 +1,383 @@ + + + + + + + diff --git a/app/components/QrCodeModal.vue b/app/components/QrCodeModal.vue new file mode 100644 index 0000000..ffe5cc9 --- /dev/null +++ b/app/components/QrCodeModal.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/app/components/QrLogin.vue b/app/components/QrLogin.vue new file mode 100644 index 0000000..ddbcc7c --- /dev/null +++ b/app/components/QrLogin.vue @@ -0,0 +1,327 @@ + + + + + diff --git a/app/components/SiteFooter.vue b/app/components/SiteFooter.vue new file mode 100644 index 0000000..dc2b2b6 --- /dev/null +++ b/app/components/SiteFooter.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/app/components/SiteHeader.vue b/app/components/SiteHeader.vue new file mode 100644 index 0000000..94f053a --- /dev/null +++ b/app/components/SiteHeader.vue @@ -0,0 +1,370 @@ + + + + + diff --git a/app/components/admin/MarkdownEditor.vue b/app/components/admin/MarkdownEditor.vue new file mode 100644 index 0000000..1087dfd --- /dev/null +++ b/app/components/admin/MarkdownEditor.vue @@ -0,0 +1,609 @@ +