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 0000000000..70b2389750
Binary files /dev/null and b/frontend/app/web-gold/public/favicon.ico differ
diff --git a/frontend/app/web-gold/src/App.vue b/frontend/app/web-gold/src/App.vue
new file mode 100644
index 0000000000..68730f4bf7
--- /dev/null
+++ b/frontend/app/web-gold/src/App.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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