From bac96fcbe6e8f6453137df46b6185ef8c5b744f4 Mon Sep 17 00:00:00 2001
From: sion123 <450702724@qq.com>
Date: Mon, 10 Nov 2025 00:59:40 +0800
Subject: [PATCH 1/4] =?UTF-8?q?=E5=89=8D=E7=AB=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 30 +
frontend/.cursorules/design.md | 63 +
frontend/.cursorules/vue.md | 87 ++
frontend/.gitignore | 28 +
frontend/app/web-gold/.editorconfig | 8 +
frontend/app/web-gold/.env.development | 6 +
frontend/app/web-gold/.env.production | 5 +
frontend/app/web-gold/.gitattributes | 1 +
frontend/app/web-gold/.gitignore | 30 +
frontend/app/web-gold/.prettierrc.json | 6 +
frontend/app/web-gold/.vscode/extensions.json | 9 +
frontend/app/web-gold/Dockerfile | 37 +
frontend/app/web-gold/eslint.config.js | 28 +
frontend/app/web-gold/index.html | 13 +
frontend/app/web-gold/jsconfig.json | 10 +
frontend/app/web-gold/nginx.conf | 23 +
frontend/app/web-gold/package.json | 56 +
frontend/app/web-gold/postcss.config.js | 6 +
frontend/app/web-gold/public/favicon.ico | Bin 0 -> 1940 bytes
frontend/app/web-gold/src/App.vue | 88 ++
frontend/app/web-gold/src/api/auth.js | 237 +++
frontend/app/web-gold/src/api/chat.js | 74 +
frontend/app/web-gold/src/api/common.js | 67 +
frontend/app/web-gold/src/api/http.js | 80 +
frontend/app/web-gold/src/api/tikhub.js | 5 +
.../app/web-gold/src/api/tikhub/README.md | 180 +++
frontend/app/web-gold/src/api/tikhub/index.js | 7 +
.../app/web-gold/src/api/tikhub/tikhub.js | 55 +
frontend/app/web-gold/src/api/tikhub/types.js | 87 ++
.../web-gold/src/components/LoginModal.vue | 1005 ++++++++++++
.../web-gold/src/components/SidebarNav.vue | 123 ++
.../web-gold/src/components/TokenInput.vue | 102 ++
.../app/web-gold/src/components/TopNav.vue | 106 ++
.../web-gold/src/components/icons/Icon.vue | 28 +
.../src/components/icons/SvgSprite.vue | 67 +
frontend/app/web-gold/src/env.d.ts | 29 +
frontend/app/web-gold/src/main.js | 19 +
frontend/app/web-gold/src/router/index.js | 51 +
frontend/app/web-gold/src/stores/prompt.js | 40 +
frontend/app/web-gold/src/stores/user.js | 152 ++
frontend/app/web-gold/src/stores/voiceCopy.js | 62 +
frontend/app/web-gold/src/style.css | 117 ++
frontend/app/web-gold/src/types/axios.d.ts | 17 +
frontend/app/web-gold/src/types/global.d.ts | 29 +
frontend/app/web-gold/src/types/vue-shim.d.ts | 6 +
frontend/app/web-gold/src/utils/auth.js | 42 +
frontend/app/web-gold/src/utils/markdown.js | 20 +
frontend/app/web-gold/src/utils/storage.js | 56 +
.../app/web-gold/src/utils/token-manager.js | 100 ++
frontend/app/web-gold/src/utils/url.js | 55 +
.../src/views/capcut/CapcutImport.vue | 15 +
.../src/views/content-style/Benchmark.vue | 1370 +++++++++++++++++
.../src/views/content-style/Copywriting.vue | 905 +++++++++++
frontend/app/web-gold/src/views/dh/Avatar.vue | 25 +
.../app/web-gold/src/views/dh/VoiceCopy.vue | 313 ++++
.../web-gold/src/views/dh/VoiceGenerate.vue | 146 ++
frontend/app/web-gold/src/views/home/Home.vue | 781 ++++++++++
.../app/web-gold/src/views/misc/Download.vue | 15 +
frontend/app/web-gold/src/views/misc/Help.vue | 15 +
.../app/web-gold/src/views/misc/Theme.vue | 15 +
.../app/web-gold/src/views/mix/MixEditor.vue | 22 +
.../src/views/realtime/RealtimeHot.vue | 15 +
.../web-gold/src/views/trends/Copywriting.vue | 16 +
.../web-gold/src/views/trends/Forecast.vue | 642 ++++++++
.../app/web-gold/src/views/trends/Heat.vue | 217 +++
frontend/app/web-gold/tailwind.config.js | 11 +
frontend/app/web-gold/tsconfig.json | 45 +
frontend/app/web-gold/tsconfig.node.json | 11 +
frontend/app/web-gold/vite.config.js | 87 ++
frontend/config/axios/config.js | 24 +
frontend/doc/readme.md | 146 ++
.../doc/金牌内容大师软件需求文档-合规版.md | 187 +++
frontend/hooks/web/useCache.js | 39 +
frontend/hooks/web/useVoiceText.ts | 87 ++
frontend/package.json | 18 +
frontend/pnpm-workspace.yaml | 7 +
76 files changed, 8726 insertions(+)
create mode 100644 frontend/.cursorules/design.md
create mode 100644 frontend/.cursorules/vue.md
create mode 100644 frontend/.gitignore
create mode 100644 frontend/app/web-gold/.editorconfig
create mode 100644 frontend/app/web-gold/.env.development
create mode 100644 frontend/app/web-gold/.env.production
create mode 100644 frontend/app/web-gold/.gitattributes
create mode 100644 frontend/app/web-gold/.gitignore
create mode 100644 frontend/app/web-gold/.prettierrc.json
create mode 100644 frontend/app/web-gold/.vscode/extensions.json
create mode 100644 frontend/app/web-gold/Dockerfile
create mode 100644 frontend/app/web-gold/eslint.config.js
create mode 100644 frontend/app/web-gold/index.html
create mode 100644 frontend/app/web-gold/jsconfig.json
create mode 100644 frontend/app/web-gold/nginx.conf
create mode 100644 frontend/app/web-gold/package.json
create mode 100644 frontend/app/web-gold/postcss.config.js
create mode 100644 frontend/app/web-gold/public/favicon.ico
create mode 100644 frontend/app/web-gold/src/App.vue
create mode 100644 frontend/app/web-gold/src/api/auth.js
create mode 100644 frontend/app/web-gold/src/api/chat.js
create mode 100644 frontend/app/web-gold/src/api/common.js
create mode 100644 frontend/app/web-gold/src/api/http.js
create mode 100644 frontend/app/web-gold/src/api/tikhub.js
create mode 100644 frontend/app/web-gold/src/api/tikhub/README.md
create mode 100644 frontend/app/web-gold/src/api/tikhub/index.js
create mode 100644 frontend/app/web-gold/src/api/tikhub/tikhub.js
create mode 100644 frontend/app/web-gold/src/api/tikhub/types.js
create mode 100644 frontend/app/web-gold/src/components/LoginModal.vue
create mode 100644 frontend/app/web-gold/src/components/SidebarNav.vue
create mode 100644 frontend/app/web-gold/src/components/TokenInput.vue
create mode 100644 frontend/app/web-gold/src/components/TopNav.vue
create mode 100644 frontend/app/web-gold/src/components/icons/Icon.vue
create mode 100644 frontend/app/web-gold/src/components/icons/SvgSprite.vue
create mode 100644 frontend/app/web-gold/src/env.d.ts
create mode 100644 frontend/app/web-gold/src/main.js
create mode 100644 frontend/app/web-gold/src/router/index.js
create mode 100644 frontend/app/web-gold/src/stores/prompt.js
create mode 100644 frontend/app/web-gold/src/stores/user.js
create mode 100644 frontend/app/web-gold/src/stores/voiceCopy.js
create mode 100644 frontend/app/web-gold/src/style.css
create mode 100644 frontend/app/web-gold/src/types/axios.d.ts
create mode 100644 frontend/app/web-gold/src/types/global.d.ts
create mode 100644 frontend/app/web-gold/src/types/vue-shim.d.ts
create mode 100644 frontend/app/web-gold/src/utils/auth.js
create mode 100644 frontend/app/web-gold/src/utils/markdown.js
create mode 100644 frontend/app/web-gold/src/utils/storage.js
create mode 100644 frontend/app/web-gold/src/utils/token-manager.js
create mode 100644 frontend/app/web-gold/src/utils/url.js
create mode 100644 frontend/app/web-gold/src/views/capcut/CapcutImport.vue
create mode 100644 frontend/app/web-gold/src/views/content-style/Benchmark.vue
create mode 100644 frontend/app/web-gold/src/views/content-style/Copywriting.vue
create mode 100644 frontend/app/web-gold/src/views/dh/Avatar.vue
create mode 100644 frontend/app/web-gold/src/views/dh/VoiceCopy.vue
create mode 100644 frontend/app/web-gold/src/views/dh/VoiceGenerate.vue
create mode 100644 frontend/app/web-gold/src/views/home/Home.vue
create mode 100644 frontend/app/web-gold/src/views/misc/Download.vue
create mode 100644 frontend/app/web-gold/src/views/misc/Help.vue
create mode 100644 frontend/app/web-gold/src/views/misc/Theme.vue
create mode 100644 frontend/app/web-gold/src/views/mix/MixEditor.vue
create mode 100644 frontend/app/web-gold/src/views/realtime/RealtimeHot.vue
create mode 100644 frontend/app/web-gold/src/views/trends/Copywriting.vue
create mode 100644 frontend/app/web-gold/src/views/trends/Forecast.vue
create mode 100644 frontend/app/web-gold/src/views/trends/Heat.vue
create mode 100644 frontend/app/web-gold/tailwind.config.js
create mode 100644 frontend/app/web-gold/tsconfig.json
create mode 100644 frontend/app/web-gold/tsconfig.node.json
create mode 100644 frontend/app/web-gold/vite.config.js
create mode 100644 frontend/config/axios/config.js
create mode 100644 frontend/doc/readme.md
create mode 100644 frontend/doc/金牌内容大师软件需求文档-合规版.md
create mode 100644 frontend/hooks/web/useCache.js
create mode 100644 frontend/hooks/web/useVoiceText.ts
create mode 100644 frontend/package.json
create mode 100644 frontend/pnpm-workspace.yaml
diff --git a/.gitignore b/.gitignore
index 49330ee16f..e6837029ce 100644
--- a/.gitignore
+++ b/.gitignore
@@ -45,6 +45,7 @@ nbdist/
!*/build/*.html
!*/build/*.xml
+
### JRebel ###
rebel.xml
@@ -52,3 +53,32 @@ application-my.yaml
/yudao-ui-app/unpackage/
**/.DS_Store
+
+
+
+node_modules
+.vscode-test/
+*.vsix
+
+.idea
+
+pnpm-lock.yaml
+
+.clineignore
+
+
+# Ignore coverage directories and files
+coverage
+coverage-unit
+.nyc_output
+# But don't ignore the coverage scripts in .github/scripts/
+!.github/scripts/coverage/
+
+*evals.env
+
+
+# E2E Tests
+test-results
+
+## CLI pre-release ##
+/cli
diff --git a/frontend/.cursorules/design.md b/frontend/.cursorules/design.md
new file mode 100644
index 0000000000..4e98c5df48
--- /dev/null
+++ b/frontend/.cursorules/design.md
@@ -0,0 +1,63 @@
+# 胶卷风格AI工具设计规范(二次创适用版)
+
+
+## **核心风格定位**
+「复古胶片暗调+现代代工具极简感」,以黑色基底为核心,叠加入胶片颗粒肌理,整体视觉克制而有质感,突出「剪辑工具的专业感」与「胶卷复古的氛围感」,避免与现有工具同质化。
+
+
+## **1. 颜色规范**
+- **主色**:
+ - 背景:#0D0D0D(深黑,带1%青灰调,区别纯黑)
+ - 主功能色:#00B030(低饱和苔藓绿,用于按钮/选中态,与已知品牌色差异明显)
+- **辅助色**:
+ - 交互蓝:#1A66E0(用于预览/保存等次级操作)
+ - 强调橙:#FF6A30(用于标记点/警告,低明度避免刺眼)
+- **中性色**:
+ - 模块底:#1A1A1A(比背景亮5%,区分层级)
+ - 文本:#F2F2F2(正文)、#CCCCCC(次要文本)
+ - 边框:#333333(1px细线条,弱化割裂感)
+
+
+## **2. 质感与阴影**
+- **肌理**:全局叠加原创胶片颗粒(3%灰度噪点,随机生成,非真实胶卷扫描图)
+- **阴影**:
+ - 卡片/模块:内阴影(0 2px 4px rgba(0,0,0,0.4)),无外阴影
+ - 按钮hover:轻微发光(0 0 6px rgba(0,176,48,0.3),主色低饱和光晕)
+
+
+## **3. 图标选型**
+- **风格**:线性几何风,线条粗细1.5px,圆角2px
+- **载体**:统一使用 SVG(图标文件与 SVG Sprite/Icon 组件),禁止使用位图作为图标
+- **禁用**:避免使用与知名剪辑工具高度相似的图标(如剪映、Pr的标志性符号)
+
+
+## **4. 卡片规范**
+- **形态**:圆角6px(非直角/大圆角),边框1px #333333
+- **内容区**:内边距16px,底部可加「胶片式参数条」(黑底白字小文本,如“1080p | 30fps”,纯装饰)
+- **状态**:
+ - 活跃态:边框改为主色#00B030
+ - hover态:背景色加深至#161616
+
+
+## **5. 布局规范**
+- **整体结构**:顶部导航(高52px)+ 左侧功能栏(宽60px图标/200px展开)+ 主内容区(占比70%)+ 右侧参数面板(占比30%)
+- **间距**:模块间margin 20px,元素内padding 12-16px,避免拥挤
+- **移动端**:左侧栏转为底部悬浮按钮组(4个核心功能+居中主按钮)
+
+
+## **6. 标题与文本**
+- **标题**:字体「Montserrat」(半粗体,20px),字间距0.5px,颜色#F2F2F2
+- **正文**:字体「Inter」(常规,14px),行高1.5,颜色#F2F2F2
+- **辅助文本**:字体「Inter」(常规,12px),颜色#CCCCCC
+
+
+## **7. 设计提示词(供生成式设计/插画参考)**
+- **总体风格**:复古胶片暗调、现代极简 UI、低饱和高级质感、专业剪辑工具氛围、控色节制
+- **质感**:微颗粒胶片噪点(3% 灰度随机)、内阴影层次、金属磨砂、磨光边缘
+- **配色**:深黑 #0D0D0D 背景、模块底 #1A1A1A、主色 #00B030、交互蓝 #1A66E0、强调橙 #FF6A30、细边界 #333333
+- **光影**:按钮 Hover 轻微发光(0 0 6px rgba(0,176,48,0.3))、卡片内阴影(inset 0 2px 4px rgba(0,0,0,0.4))
+- **形态**:圆角 6px、1px 细边、紧凑留白(内边距 12–16px,模块间距 20px)
+- **图标**:线性几何、1.5px 描边、统一 SVG、避免品牌相似符号
+- **插画/装饰**:暗色渐变+噪点、胶片孔洞/标尺式细节可点缀,勿喧宾夺主
+- **可用性**:高对比可读性、色弱可访问、交互状态清晰(禁用/加载/选中)
+
diff --git a/frontend/.cursorules/vue.md b/frontend/.cursorules/vue.md
new file mode 100644
index 0000000000..767fc359f0
--- /dev/null
+++ b/frontend/.cursorules/vue.md
@@ -0,0 +1,87 @@
+---
+description: 现代 Web 应用中的 Vue.js 最佳实践与模式
+globs: **/*.vue, **/*.ts, components/**/*
+---
+
+# Vue.js 最佳实践
+
+## 组件结构
+- 优先使用组合式 API 而非选项式 API
+- 保持组件小巧且功能专注
+- 采用恰当的 TypeScript 集成方案
+- 实现规范的 props 验证
+- 使用标准的 emit 声明
+- 保持模板逻辑简洁
+- 优先使用template 语法,而不是函数组件
+
+## 组合式 API
+- 正确使用 ref 与 reactive
+- 合理实现生命周期钩子
+- 通过组合式函数封装可复用逻辑
+- 保持 setup 函数整洁
+- 规范使用计算属性
+- 合理实现侦听器
+
+## 状态管理
+- 使用 Pinia 进行状态管理
+- 保持仓库模块化
+- 采用合理的状态组织方式
+- 规范实现操作逻辑
+- 正确使用获取器
+- 妥善处理异步状态
+
+## 性能优化
+- 实现组件懒加载
+- 配置恰当的缓存策略
+- 高效使用计算属性
+- 避免不必要的侦听器
+- 区分使用 v-show 与 v-if
+- 实现科学的 key 管理
+
+## 路由管理
+- 规范使用 Vue Router
+- 实现完整的导航守卫
+- 合理配置路由元字段
+- 正确处理路由参数
+- 实现路由懒加载
+- 使用标准的导航方法
+
+## 表单处理
+- 正确使用 v-model
+- 实现完善的验证机制
+- 规范处理表单提交
+- 展示合理的加载状态
+- 配置完整的错误处理
+- 实现表单重置功能
+
+## TypeScript 集成
+- 使用规范的组件类型定义
+- 实现完整的 props 类型声明
+- 规范 emit 类型声明
+- 处理类型推断
+- 使用标准的组合函数类型
+- 实现完整的仓库类型定义
+
+## 测试策略
+- 编写规范的单元测试
+- 实现完整的组件测试
+- 正确使用 Vue Test Utils
+- 全面测试组合式函数
+- 实现科学的模拟机制
+- 测试异步操作流程
+
+## 开发规范
+- 遵循 Vue 样式指南
+- 使用统一的命名约定
+- 保持组件结构清晰
+- 实现完整的错误处理
+- 规范事件处理机制
+- 为复杂逻辑添加文档注释
+
+## 构建与工具链
+- 使用 Vite 进行开发
+- 配置完整的构建方案
+- 规范使用环境变量
+- 实现代码分割方案
+- 正确处理静态资源
+- 配置完整的优化策略
diff --git a/frontend/.gitignore b/frontend/.gitignore
new file mode 100644
index 0000000000..2b960f3d2e
--- /dev/null
+++ b/frontend/.gitignore
@@ -0,0 +1,28 @@
+dist
+node_modules
+.vscode-test/
+*.vsix
+
+.DS_Store
+.idea
+
+pnpm-lock.yaml
+
+.clineignore
+
+
+# Ignore coverage directories and files
+coverage
+coverage-unit
+.nyc_output
+# But don't ignore the coverage scripts in .github/scripts/
+!.github/scripts/coverage/
+
+*evals.env
+
+
+# E2E Tests
+test-results
+
+## CLI pre-release ##
+/cli
\ No newline at end of file
diff --git a/frontend/app/web-gold/.editorconfig b/frontend/app/web-gold/.editorconfig
new file mode 100644
index 0000000000..3b510aa687
--- /dev/null
+++ b/frontend/app/web-gold/.editorconfig
@@ -0,0 +1,8 @@
+[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}]
+charset = utf-8
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+end_of_line = lf
+max_line_length = 100
diff --git a/frontend/app/web-gold/.env.development b/frontend/app/web-gold/.env.development
new file mode 100644
index 0000000000..bf834e9a94
--- /dev/null
+++ b/frontend/app/web-gold/.env.development
@@ -0,0 +1,6 @@
+VITE_TIKHUB_TIKTOK_TOKEN=lcsEHcw6x1awim+hDZyN9xH2EgXKd5NcvTvzvlqtav/qvGiFH0rSdQzODQ==
+VITE_TIKHUB_XHS_TOKEN=pZM4CJ484F+rxlyfLL+XmAzwMCKXVb5l2x7WsUOyCMu1rm61FiDcRQmPCQ==
+VITE_DEV_TOKEN=a498c8db4b4e4dbfb9e28ad2606713ec
+VITE_BASE_URL=/webApi
+# 接口地址
+VITE_API_URL=/admin-api
diff --git a/frontend/app/web-gold/.env.production b/frontend/app/web-gold/.env.production
new file mode 100644
index 0000000000..66ab5c72b4
--- /dev/null
+++ b/frontend/app/web-gold/.env.production
@@ -0,0 +1,5 @@
+VITE_TIKHUB_TIKTOK_TOKEN=lcsEHcw6x1awim+hDZyN9xH2EgXKd5NcvTvzvlqtav/qvGiFH0rSdQzODQ==
+VITE_TIKHUB_XHS_TOKEN=pZM4CJ484F+rxlyfLL+XmAzwMCKXVb5l2x7WsUOyCMu1rm61FiDcRQmPCQ==
+VITE_BASE_URL=/webApi
+# 接口地址
+VITE_API_URL=/admin-api
diff --git a/frontend/app/web-gold/.gitattributes b/frontend/app/web-gold/.gitattributes
new file mode 100644
index 0000000000..6313b56c57
--- /dev/null
+++ b/frontend/app/web-gold/.gitattributes
@@ -0,0 +1 @@
+* text=auto eol=lf
diff --git a/frontend/app/web-gold/.gitignore b/frontend/app/web-gold/.gitignore
new file mode 100644
index 0000000000..8ee54e8d34
--- /dev/null
+++ b/frontend/app/web-gold/.gitignore
@@ -0,0 +1,30 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+*.tsbuildinfo
diff --git a/frontend/app/web-gold/.prettierrc.json b/frontend/app/web-gold/.prettierrc.json
new file mode 100644
index 0000000000..29a2402ef0
--- /dev/null
+++ b/frontend/app/web-gold/.prettierrc.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://json.schemastore.org/prettierrc",
+ "semi": false,
+ "singleQuote": true,
+ "printWidth": 100
+}
diff --git a/frontend/app/web-gold/.vscode/extensions.json b/frontend/app/web-gold/.vscode/extensions.json
new file mode 100644
index 0000000000..3f841264e6
--- /dev/null
+++ b/frontend/app/web-gold/.vscode/extensions.json
@@ -0,0 +1,9 @@
+{
+ "recommendations": [
+ "Vue.volar",
+ "dbaeumer.vscode-eslint",
+ "EditorConfig.EditorConfig",
+ "oxc.oxc-vscode",
+ "esbenp.prettier-vscode"
+ ]
+}
diff --git a/frontend/app/web-gold/Dockerfile b/frontend/app/web-gold/Dockerfile
new file mode 100644
index 0000000000..20f6205d7d
--- /dev/null
+++ b/frontend/app/web-gold/Dockerfile
@@ -0,0 +1,37 @@
+FROM node:20-alpine AS builder
+
+# 使用 corepack 管理 pnpm,保持与仓库锁一致
+ENV PNPM_HOME=/root/.local/share/pnpm
+ENV PATH=$PNPM_HOME:$PATH
+RUN corepack enable
+
+WORKDIR /workspace
+
+
+# docker build -f app/web-gold/Dockerfile -t web-gold-nginx .
+# docker run -d --name web-gold -p 8088:8088 web-gold-nginx
+
+# 复制整个仓库(建议在仓库根目录作为构建上下文执行:
+# docker build -f app/web-gold/Dockerfile -t web-gold-nginx .
+# )
+COPY . .
+
+# 安装依赖(工作区模式),严格锁定版本
+RUN pnpm -w install --frozen-lockfile
+
+# 构建前端应用(工作区内的 app/web-gold)
+WORKDIR /workspace/app/web-gold
+RUN pnpm build
+
+FROM nginx:alpine
+
+# 覆盖默认站点配置(支持 Vite SPA 刷新与可选反代)
+COPY app/web-gold/nginx.conf /etc/nginx/conf.d/default.conf
+
+# 拷贝构建产物到 Nginx 根目录
+COPY --from=builder /workspace/app/web-gold/dist /usr/share/nginx/html
+
+EXPOSE 8088
+CMD ["nginx", "-g", "daemon off;"]
+
+
diff --git a/frontend/app/web-gold/eslint.config.js b/frontend/app/web-gold/eslint.config.js
new file mode 100644
index 0000000000..aaf1136b43
--- /dev/null
+++ b/frontend/app/web-gold/eslint.config.js
@@ -0,0 +1,28 @@
+import { defineConfig, globalIgnores } from 'eslint/config'
+import globals from 'globals'
+import js from '@eslint/js'
+import pluginVue from 'eslint-plugin-vue'
+import pluginOxlint from 'eslint-plugin-oxlint'
+import skipFormatting from '@vue/eslint-config-prettier/skip-formatting'
+
+export default defineConfig([
+ {
+ name: 'app/files-to-lint',
+ files: ['**/*.{js,mjs,jsx,vue}'],
+ },
+
+ globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']),
+
+ {
+ languageOptions: {
+ globals: {
+ ...globals.browser,
+ },
+ },
+ },
+
+ js.configs.recommended,
+ ...pluginVue.configs['flat/essential'],
+ ...pluginOxlint.configs['flat/recommended'],
+ skipFormatting,
+])
diff --git a/frontend/app/web-gold/index.html b/frontend/app/web-gold/index.html
new file mode 100644
index 0000000000..b19040a0e6
--- /dev/null
+++ b/frontend/app/web-gold/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/frontend/app/web-gold/jsconfig.json b/frontend/app/web-gold/jsconfig.json
new file mode 100644
index 0000000000..2b82f87095
--- /dev/null
+++ b/frontend/app/web-gold/jsconfig.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/frontend/app/web-gold/nginx.conf b/frontend/app/web-gold/nginx.conf
new file mode 100644
index 0000000000..36019457e8
--- /dev/null
+++ b/frontend/app/web-gold/nginx.conf
@@ -0,0 +1,23 @@
+server {
+ listen 8088;
+ server_name _;
+
+ root /usr/share/nginx/html;
+ index index.html;
+
+ # Vite SPA:刷新/直达路由回退到 index.html
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
+
+ # 如需在生产环境继续代理后端,可在此追加;示例:
+ # location /webApi/ {
+ # proxy_set_header Host $host;
+ # proxy_set_header X-Real-IP $remote_addr;
+ # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ # proxy_set_header X-Forwarded-Proto $scheme;
+ # proxy_pass http://8.155.172.147:9900/;
+ # }
+}
+
+
diff --git a/frontend/app/web-gold/package.json b/frontend/app/web-gold/package.json
new file mode 100644
index 0000000000..ffda06bb55
--- /dev/null
+++ b/frontend/app/web-gold/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "web-gold",
+ "version": "0.0.0",
+ "private": true,
+ "type": "module",
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "scripts": {
+ "dev": "vite --mode development",
+ "build": "vite build",
+ "preview": "vite preview",
+ "lint:oxlint": "oxlint . --fix -D correctness --ignore-path .gitignore",
+ "lint:eslint": "eslint . --fix",
+ "lint": "run-s lint:*",
+ "format": "prettier --write src/"
+ },
+ "dependencies": {
+ "@ant-design/icons-vue": "^7.0.1",
+ "@microsoft/fetch-event-source": "^2.0.1",
+ "@tailwindcss/vite": "^4.1.14",
+ "ant-design-vue": "^4.2.6",
+ "axios": "^1.12.2",
+ "dayjs": "^1.11.18",
+ "markdown-it": "^14.1.0",
+ "path-to-regexp": "^6.3.0",
+ "pinia": "^3.0.3",
+ "pinia-plugin-persistedstate": "^4.5.0",
+ "qs": "^6.14.0",
+ "vue": "^3.5.22",
+ "vue-router": "^4.5.1"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.33.0",
+ "@prettier/plugin-oxc": "^0.0.4",
+ "@tailwindcss/postcss": "^4.1.14",
+ "@vitejs/plugin-vue": "^6.0.1",
+ "@vitejs/plugin-vue-jsx": "^5.1.1",
+ "@vue/eslint-config-prettier": "^10.2.0",
+ "autoprefixer": "^10.4.21",
+ "eslint": "^9.33.0",
+ "eslint-plugin-oxlint": "~1.11.0",
+ "eslint-plugin-vue": "~10.4.0",
+ "globals": "^16.3.0",
+ "normalize.css": "^8.0.1",
+ "npm-run-all2": "^8.0.4",
+ "oxlint": "~1.11.0",
+ "postcss": "^8.5.6",
+ "prettier": "3.6.2",
+ "tailwindcss": "^4.1.14",
+ "typescript": "^5.7.3",
+ "vite": "^7.1.7",
+ "vite-plugin-vue-devtools": "^8.0.2",
+ "vue-tsc": "^2.1.28"
+ }
+}
diff --git a/frontend/app/web-gold/postcss.config.js b/frontend/app/web-gold/postcss.config.js
new file mode 100644
index 0000000000..14502dc1c2
--- /dev/null
+++ b/frontend/app/web-gold/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ "@tailwindcss/postcss": {},
+ autoprefixer: {},
+ },
+}
diff --git a/frontend/app/web-gold/public/favicon.ico b/frontend/app/web-gold/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..70b2389750f2bea64a0dbf542d77cc0ae135030a
GIT binary patch
literal 1940
zcmV;F2W$9=P)e&^hC@AJM2A94AZz*QsA)^7P!hvOLsa_)oJtyRBrMRxu#fj8Pyh9ds_VaMf>
zp$~$|DAPfUP=o>R!YDv;Ab>(|Dvn4-Q8SmZa>Zojzn(me&^=5
zI=7(J^6XZZxAEKMx`12gc%whNO{hXmUamCmGHG9Jz58J2v<65Fu*BX7P&fxKg^(UEU
zHRzek#`4USlSM=zA?^g>dvy+fIJgS0?psd(Y&k|EEIcAE^ou$wu^d^8AKk{ZaDpN!
zT%>SuK(+f_xZzFi$&~Z-`Y~{kk%)=V5gapqFjs+d0nMw?>eFKku?s{v@LZO_^*>2C
zhDOWMo`2O&42l>JECuwOpK>^T1$2pFpW9XfW@RNv!8wbaOBho}+f9qc6ZNl4k1j3r
z{oD`&%v|c6;$Pf;?!c`RuJN(-dP8ckxr>AOcd-r(oXcX;yh>>SBJof>Ps9P%2GYp1D#UTW09!|TS{EWl&nvrWSt{c*1wsf*lmX)k_X^fhihC`*IW?4?Hg*cC0
z^-S}}4rIGX;f~!=Bxum2vB=y`GK6rz+6
z@Y`58P7eXgD_!y`0+R64bDwjUsPqlL^!?+%DQoI>fzd4K4J$yq?_-Qxy#lZfPR0P|
z``Z>&7r-C=Q^b#*$nnnCQhww_%)3rlQR=hl-$evU?>cHnsIDRfuT;_;xdZ2C)oH^J
z1|T`vPi@HJ{>G;PiFYb{?n%KC9+=Syqa7dqdy==~;e?;>d;eHT5PFRru
z%TgvFk^0O%mi9bwE!{CKP_rghZOKi#lLZ+N1)Gy5W~`i3B_Lvjh#ID9)i5cfra2k3
z3sE0>;vC9LL_X*#B5>%1msWLrUD46Tj+>udLug&cICKxw^Nmc)r-aln+4~2S?#MZk
zd{9m!O%>QV>|c{gm=%b$=o*TXo^#ek{yxO^xn&xaF7Muzcd*3BTEy@cC|hv!}<3*1$7_K(OLP9uN=e-O}PZvNddACDR?q
z0kK5ja3et&$9Pc1TfD3r~!zh>
zYH)by!74Q0HyS%OeG(6Su^ivJzZA2_3{%zR!_=|Awe7;7q6YOLhDd3GoEU^*03}3~
zc7P4w;soir9A0cH!Gf_4H;pEw@*6W{t$X6Q*MfHpFH!K-SVpFlL6Fc7)2Jv53o!LJ
zPJFO1kWLYS+`bx>ldvU8iX;-iD2F7;$tTt#YN=Am)0JxO7%iU#qYM<7w9iGb^iQAd
zLfh%{IDf%H=@iNlLStZ*hGi#Emw(jYX(Hly-#FFPQqA2hRp{6=W^=A(oU(gI7wP#m
zr5UX%G69umj4I0nYFhOOHFM%8)cBF1N@0*l)iTNfz0l8ws}xRUaRG5?_xxEksI0RRC1|Gi<}nE(I)21!Ig
aR09C^1{ZF=YnE;R0000
+import { RouterView } from 'vue-router'
+import { ref, onMounted } from 'vue'
+import SidebarNav from './components/SidebarNav.vue'
+import TopNav from './components/TopNav.vue'
+import { theme } from 'ant-design-vue'
+import SvgSprite from '@/components/icons/SvgSprite.vue'
+
+function readCssVar(name) {
+ return getComputedStyle(document.documentElement).getPropertyValue(name).trim() || undefined
+}
+
+const themeToken = ref({
+ algorithm: theme.darkAlgorithm,
+ token: {
+ colorPrimary: '#3B82F6',
+ colorInfo: '#1A66E0',
+ colorBgBase: '#0D0D0D',
+ colorBgContainer: '#1A1A1A',
+ colorTextBase: '#F2F2F2',
+ colorTextSecondary: '#CCCCCC',
+ colorBorder: '#333333',
+ borderRadius: 6,
+ }
+})
+
+onMounted(() => {
+ // 运行时从 :root 读取,若存在则覆盖默认值
+ const next = { ...themeToken.value.token }
+ next.colorPrimary = readCssVar('--color-primary') || next.colorPrimary
+ next.colorInfo = readCssVar('--color-blue') || next.colorInfo
+ next.colorBgBase = readCssVar('--color-bg') || next.colorBgBase
+ next.colorBgContainer = readCssVar('--color-surface') || next.colorBgContainer
+ next.colorTextBase = readCssVar('--color-text') || next.colorTextBase
+ next.colorTextSecondary = readCssVar('--color-text-secondary') || next.colorTextSecondary
+ next.colorBorder = readCssVar('--color-border') || next.colorBorder
+ themeToken.value = { algorithm: theme.darkAlgorithm, token: next }
+})
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/app/web-gold/src/api/auth.js b/frontend/app/web-gold/src/api/auth.js
new file mode 100644
index 0000000000..72f30f880c
--- /dev/null
+++ b/frontend/app/web-gold/src/api/auth.js
@@ -0,0 +1,237 @@
+
+import api from '@/api/http'
+import { setToken, getRefreshToken } from '@/utils/auth'
+
+const SERVER_BASE = import.meta.env.VITE_BASE_URL + '/app-api/member'
+
+/**
+ * 保存 token 的辅助函数
+ * @param {Object} info - 包含 accessToken 和 refreshToken 的对象
+ */
+function saveTokens(info) {
+ if (info?.accessToken || info?.refreshToken) {
+ setToken({
+ accessToken: info.accessToken || '',
+ refreshToken: info.refreshToken || '',
+ })
+ }
+}
+
+/**
+ * 响应拦截(可选):统一错误处理
+ */
+// api.interceptors.response.use(
+// (resp) => resp,
+// (err) => {
+// // 统一错误日志/提示
+// return Promise.reject(err);
+// }
+// );
+
+/**
+ * 短信场景枚举(请与后端配置保持一致)
+ * - MEMBER_LOGIN: 会员短信登录场景
+ * - MEMBER_UPDATE_PASSWORD: 已登录用户修改密码(短信校验)场景
+ * - MEMBER_RESET_PASSWORD: 未登录用户忘记密码重置(短信校验)场景
+ * 如有"注册"独立场景,可在此添加:MEMBER_REGISTER: 13
+ */
+export const SMS_SCENE = {
+ MEMBER_LOGIN: 1,
+ MEMBER_UPDATE_PASSWORD: 3,
+ MEMBER_RESET_PASSWORD: 4,
+};
+
+/**
+ * 短信模板编码常量
+ */
+export const SMS_TEMPLATE_CODE = {
+ USER_REGISTER: 'muye-user-code', // 用户注册模板编码
+};
+
+/**
+ * 账号密码登录
+ * POST /member/auth/login
+ *
+ * @param {string} mobile - 手机号(必填)
+ * @param {string} password - 密码(必填,长度 4-16)
+ * @returns {Promise