2025-10-21 16:50:33 +08:00
|
|
|
|
# AIGC Demo - Vue.js 前端
|
|
|
|
|
|
|
|
|
|
|
|
这是一个基于 Vue.js 3 + Element Plus 的现代化前端应用,为 AIGC Demo 项目提供用户界面。
|
|
|
|
|
|
|
|
|
|
|
|
## 🚀 技术栈
|
|
|
|
|
|
|
|
|
|
|
|
- **Vue.js 3** - 渐进式 JavaScript 框架
|
|
|
|
|
|
- **Element Plus** - Vue 3 组件库
|
|
|
|
|
|
- **Vue Router** - 官方路由管理器
|
|
|
|
|
|
- **Pinia** - Vue 状态管理库
|
|
|
|
|
|
- **Axios** - HTTP 客户端
|
|
|
|
|
|
- **Vite** - 现代化构建工具
|
|
|
|
|
|
|
|
|
|
|
|
## 📁 项目结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
frontend/
|
|
|
|
|
|
├── src/
|
|
|
|
|
|
│ ├── components/ # 公共组件
|
|
|
|
|
|
│ │ ├── NavBar.vue # 导航栏
|
|
|
|
|
|
│ │ └── Footer.vue # 页脚
|
|
|
|
|
|
│ ├── views/ # 页面组件
|
|
|
|
|
|
│ │ ├── Home.vue # 首页
|
|
|
|
|
|
│ │ ├── Login.vue # 登录页
|
|
|
|
|
|
│ │ ├── Register.vue # 注册页
|
|
|
|
|
|
│ │ ├── Orders.vue # 订单列表
|
|
|
|
|
|
│ │ └── ...
|
|
|
|
|
|
│ ├── router/ # 路由配置
|
|
|
|
|
|
│ │ └── index.js
|
|
|
|
|
|
│ ├── stores/ # 状态管理
|
|
|
|
|
|
│ │ ├── user.js # 用户状态
|
|
|
|
|
|
│ │ └── orders.js # 订单状态
|
|
|
|
|
|
│ ├── api/ # API 接口
|
|
|
|
|
|
│ │ ├── request.js # Axios 配置
|
|
|
|
|
|
│ │ ├── auth.js # 认证接口
|
|
|
|
|
|
│ │ ├── orders.js # 订单接口
|
|
|
|
|
|
│ │ └── payments.js # 支付接口
|
|
|
|
|
|
│ ├── assets/ # 静态资源
|
|
|
|
|
|
│ ├── utils/ # 工具函数
|
|
|
|
|
|
│ ├── App.vue # 根组件
|
|
|
|
|
|
│ └── main.js # 入口文件
|
|
|
|
|
|
├── index.html # HTML 模板
|
|
|
|
|
|
├── package.json # 依赖配置
|
|
|
|
|
|
├── vite.config.js # Vite 配置
|
|
|
|
|
|
└── README.md # 说明文档
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🛠️ 安装和运行
|
|
|
|
|
|
|
|
|
|
|
|
### 前置要求
|
|
|
|
|
|
|
|
|
|
|
|
- Node.js 16+
|
|
|
|
|
|
- npm 或 yarn
|
|
|
|
|
|
|
|
|
|
|
|
### 安装依赖
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd frontend
|
|
|
|
|
|
npm install
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 开发模式
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npm run dev
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
访问 http://localhost:3000
|
|
|
|
|
|
|
|
|
|
|
|
### 构建生产版本
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npm run build
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 预览生产版本
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npm run preview
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🔧 配置说明
|
|
|
|
|
|
|
|
|
|
|
|
### Vite 配置
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
// vite.config.js
|
|
|
|
|
|
export default defineConfig({
|
|
|
|
|
|
plugins: [vue()],
|
|
|
|
|
|
resolve: {
|
|
|
|
|
|
alias: {
|
|
|
|
|
|
'@': resolve(__dirname, 'src')
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
server: {
|
|
|
|
|
|
port: 3000,
|
|
|
|
|
|
proxy: {
|
|
|
|
|
|
'/api': {
|
|
|
|
|
|
target: 'http://localhost:8080', // 后端服务地址
|
|
|
|
|
|
changeOrigin: true
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### API 代理
|
|
|
|
|
|
|
|
|
|
|
|
前端开发服务器会自动将 `/api` 请求代理到后端服务器 `http://localhost:8080`,这样避免了跨域问题。
|
|
|
|
|
|
|
|
|
|
|
|
## 📱 功能特性
|
|
|
|
|
|
|
|
|
|
|
|
### 🎨 现代化 UI
|
|
|
|
|
|
- **Element Plus** 组件库,提供丰富的 UI 组件
|
|
|
|
|
|
- **响应式设计**,支持桌面、平板、手机
|
|
|
|
|
|
- **主题定制**,统一的视觉风格
|
|
|
|
|
|
- **图标支持**,Element Plus Icons
|
|
|
|
|
|
|
|
|
|
|
|
### 🔐 用户认证
|
|
|
|
|
|
- **登录/注册**,完整的用户认证流程
|
|
|
|
|
|
- **表单验证**,实时验证用户输入
|
|
|
|
|
|
- **状态管理**,Pinia 管理用户状态
|
|
|
|
|
|
- **路由守卫**,保护需要认证的页面
|
|
|
|
|
|
|
|
|
|
|
|
### 📋 订单管理
|
|
|
|
|
|
- **订单列表**,分页、筛选、搜索
|
|
|
|
|
|
- **订单详情**,完整信息展示
|
|
|
|
|
|
- **订单创建**,动态表单
|
|
|
|
|
|
- **状态管理**,订单状态流转
|
|
|
|
|
|
|
|
|
|
|
|
### 💳 支付集成
|
|
|
|
|
|
- **多种支付方式**,支付宝、PayPal
|
|
|
|
|
|
- **支付状态跟踪**,实时状态更新
|
|
|
|
|
|
- **支付记录**,完整的支付历史
|
|
|
|
|
|
|
|
|
|
|
|
### 👨💼 管理功能
|
|
|
|
|
|
- **用户管理**,用户列表和操作
|
|
|
|
|
|
- **订单管理**,管理员订单管理
|
|
|
|
|
|
- **权限控制**,基于角色的访问控制
|
|
|
|
|
|
|
|
|
|
|
|
## 🔄 状态管理
|
|
|
|
|
|
|
|
|
|
|
|
### 用户状态 (stores/user.js)
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
export const useUserStore = defineStore('user', () => {
|
|
|
|
|
|
const user = ref(null)
|
|
|
|
|
|
const token = ref(localStorage.getItem('token'))
|
|
|
|
|
|
const isAuthenticated = computed(() => !!token.value && !!user.value)
|
|
|
|
|
|
|
|
|
|
|
|
const loginUser = async (credentials) => { /* ... */ }
|
|
|
|
|
|
const registerUser = async (userData) => { /* ... */ }
|
|
|
|
|
|
const logoutUser = async () => { /* ... */ }
|
|
|
|
|
|
|
|
|
|
|
|
return { user, token, isAuthenticated, loginUser, registerUser, logoutUser }
|
|
|
|
|
|
})
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 订单状态 (stores/orders.js)
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
export const useOrderStore = defineStore('orders', () => {
|
|
|
|
|
|
const orders = ref([])
|
|
|
|
|
|
const currentOrder = ref(null)
|
|
|
|
|
|
const loading = ref(false)
|
|
|
|
|
|
|
|
|
|
|
|
const fetchOrders = async (params) => { /* ... */ }
|
|
|
|
|
|
const createNewOrder = async (orderData) => { /* ... */ }
|
|
|
|
|
|
const updateOrder = async (id, status) => { /* ... */ }
|
|
|
|
|
|
|
|
|
|
|
|
return { orders, currentOrder, loading, fetchOrders, createNewOrder, updateOrder }
|
|
|
|
|
|
})
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🌐 API 接口
|
|
|
|
|
|
|
|
|
|
|
|
### 认证接口
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
// 登录
|
|
|
|
|
|
POST /api/auth/login
|
|
|
|
|
|
{
|
|
|
|
|
|
"username": "user",
|
|
|
|
|
|
"password": "password"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 注册
|
|
|
|
|
|
POST /api/auth/register
|
|
|
|
|
|
{
|
|
|
|
|
|
"username": "newuser",
|
|
|
|
|
|
"email": "user@example.com",
|
|
|
|
|
|
"password": "password"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取当前用户
|
|
|
|
|
|
GET /api/auth/me
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 订单接口
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
// 获取订单列表
|
|
|
|
|
|
GET /api/orders?page=0&size=10&status=PENDING
|
|
|
|
|
|
|
|
|
|
|
|
// 获取订单详情
|
|
|
|
|
|
GET /api/orders/{id}
|
|
|
|
|
|
|
|
|
|
|
|
// 创建订单
|
|
|
|
|
|
POST /api/orders/create
|
|
|
|
|
|
{
|
|
|
|
|
|
"orderType": "PRODUCT",
|
|
|
|
|
|
"currency": "CNY",
|
|
|
|
|
|
"orderItems": [...]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 更新订单状态
|
|
|
|
|
|
POST /api/orders/{id}/status
|
|
|
|
|
|
{
|
|
|
|
|
|
"status": "PAID",
|
|
|
|
|
|
"notes": "备注"
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🎯 路由配置
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
const routes = [
|
|
|
|
|
|
{
|
|
|
|
|
|
path: '/',
|
|
|
|
|
|
name: 'Home',
|
|
|
|
|
|
component: Home,
|
|
|
|
|
|
meta: { title: '首页' }
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
path: '/login',
|
|
|
|
|
|
name: 'Login',
|
|
|
|
|
|
component: Login,
|
|
|
|
|
|
meta: { title: '登录', guest: true }
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
path: '/orders',
|
|
|
|
|
|
name: 'Orders',
|
|
|
|
|
|
component: Orders,
|
|
|
|
|
|
meta: { title: '订单管理', requiresAuth: true }
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
path: '/admin/orders',
|
|
|
|
|
|
name: 'AdminOrders',
|
|
|
|
|
|
component: AdminOrders,
|
|
|
|
|
|
meta: { title: '订单管理', requiresAuth: true, requiresAdmin: true }
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🔒 权限控制
|
|
|
|
|
|
|
|
|
|
|
|
### 路由守卫
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
router.beforeEach((to, from, next) => {
|
|
|
|
|
|
const userStore = useUserStore()
|
|
|
|
|
|
|
|
|
|
|
|
// 检查是否需要认证
|
|
|
|
|
|
if (to.meta.requiresAuth && !userStore.isAuthenticated) {
|
|
|
|
|
|
next('/login')
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 检查是否需要管理员权限
|
|
|
|
|
|
if (to.meta.requiresAdmin && !userStore.isAdmin) {
|
|
|
|
|
|
next('/')
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
next()
|
|
|
|
|
|
})
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### API 拦截器
|
|
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
|
// 请求拦截器 - 添加认证头
|
|
|
|
|
|
api.interceptors.request.use((config) => {
|
|
|
|
|
|
const token = localStorage.getItem('token')
|
|
|
|
|
|
if (token) {
|
|
|
|
|
|
config.headers.Authorization = `Bearer ${token}`
|
|
|
|
|
|
}
|
|
|
|
|
|
return config
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// 响应拦截器 - 处理错误
|
|
|
|
|
|
api.interceptors.response.use(
|
|
|
|
|
|
(response) => response.data,
|
|
|
|
|
|
(error) => {
|
|
|
|
|
|
if (error.response?.status === 401) {
|
|
|
|
|
|
// 未授权,跳转到登录页
|
|
|
|
|
|
localStorage.removeItem('token')
|
|
|
|
|
|
window.location.href = '/login'
|
|
|
|
|
|
}
|
|
|
|
|
|
return Promise.reject(error)
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 📱 响应式设计
|
|
|
|
|
|
|
|
|
|
|
|
### 断点配置
|
|
|
|
|
|
|
|
|
|
|
|
```css
|
|
|
|
|
|
/* 移动端 */
|
|
|
|
|
|
@media (max-width: 768px) {
|
|
|
|
|
|
.page-header {
|
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* 平板 */
|
|
|
|
|
|
@media (min-width: 769px) and (max-width: 1024px) {
|
|
|
|
|
|
.content {
|
|
|
|
|
|
padding: 20px;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* 桌面端 */
|
|
|
|
|
|
@media (min-width: 1025px) {
|
|
|
|
|
|
.container {
|
|
|
|
|
|
max-width: 1200px;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🚀 部署
|
|
|
|
|
|
|
|
|
|
|
|
### 构建生产版本
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npm run build
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
构建完成后,`dist` 目录包含所有静态文件。
|
|
|
|
|
|
|
|
|
|
|
|
### Nginx 配置
|
|
|
|
|
|
|
|
|
|
|
|
```nginx
|
|
|
|
|
|
server {
|
|
|
|
|
|
listen 80;
|
|
|
|
|
|
server_name your-domain.com;
|
|
|
|
|
|
|
|
|
|
|
|
location / {
|
|
|
|
|
|
root /path/to/dist;
|
|
|
|
|
|
try_files $uri $uri/ /index.html;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
location /api {
|
|
|
|
|
|
proxy_pass http://localhost:8080;
|
|
|
|
|
|
proxy_set_header Host $host;
|
|
|
|
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🔧 开发工具
|
|
|
|
|
|
|
|
|
|
|
|
### VS Code 推荐插件
|
|
|
|
|
|
|
|
|
|
|
|
- **Vue Language Features (Volar)** - Vue 3 支持
|
|
|
|
|
|
- **TypeScript Vue Plugin (Volar)** - TypeScript 支持
|
|
|
|
|
|
- **ESLint** - 代码检查
|
|
|
|
|
|
- **Prettier** - 代码格式化
|
|
|
|
|
|
- **Auto Rename Tag** - 自动重命名标签
|
|
|
|
|
|
- **Bracket Pair Colorizer** - 括号配对着色
|
|
|
|
|
|
|
|
|
|
|
|
### 调试工具
|
|
|
|
|
|
|
|
|
|
|
|
- **Vue DevTools** - Vue 开发者工具
|
|
|
|
|
|
- **Pinia DevTools** - Pinia 状态管理工具
|
|
|
|
|
|
- **Element Plus DevTools** - Element Plus 组件调试
|
|
|
|
|
|
|
|
|
|
|
|
## 📝 开发规范
|
|
|
|
|
|
|
|
|
|
|
|
### 组件命名
|
|
|
|
|
|
|
|
|
|
|
|
- 组件文件名使用 PascalCase:`UserProfile.vue`
|
|
|
|
|
|
- 组件名使用 PascalCase:`UserProfile`
|
|
|
|
|
|
|
|
|
|
|
|
### 文件结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
components/
|
|
|
|
|
|
├── common/ # 通用组件
|
|
|
|
|
|
├── layout/ # 布局组件
|
|
|
|
|
|
└── business/ # 业务组件
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 代码风格
|
|
|
|
|
|
|
|
|
|
|
|
- 使用 Composition API
|
|
|
|
|
|
- 优先使用 `<script setup>` 语法
|
|
|
|
|
|
- 使用 TypeScript 类型定义
|
|
|
|
|
|
- 遵循 ESLint 规则
|
|
|
|
|
|
|
|
|
|
|
|
## 🤝 贡献指南
|
|
|
|
|
|
|
|
|
|
|
|
1. Fork 项目
|
|
|
|
|
|
2. 创建功能分支:`git checkout -b feature/new-feature`
|
|
|
|
|
|
3. 提交更改:`git commit -am 'Add new feature'`
|
|
|
|
|
|
4. 推送分支:`git push origin feature/new-feature`
|
|
|
|
|
|
5. 提交 Pull Request
|
|
|
|
|
|
|
|
|
|
|
|
## 📄 许可证
|
|
|
|
|
|
|
|
|
|
|
|
MIT License
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
**注意**: 这是一个演示项目,生产环境使用前请进行充分的安全测试和性能优化。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-10-22 09:50:11 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-10-23 09:59:54 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-10-24 09:31:26 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-10-27 10:46:49 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-10-29 10:16:03 +08:00
|
|
|
|
|
|
|
|
|
|
|