# 武术赛事通 - 前端项目

基于 Vue 3 + Vite + Element Plus 构建

## 🌐 在线访问

- **生产环境**: https://martial.johnsion.club
- **后端 API**: https://martial-api.johnsion.club
- **API 文档**: https://martial-doc.johnsion.club

## 📦 技术栈

- **框架**: Vue 3.4 (Composition API)
- **构建工具**: Vite 5
- **UI 组件**: Element Plus
- **表单/表格**: Avue
- **HTTP 库**: Axios
- **路由**: Vue Router 4
- **状态管理**: Vuex 4
- **样式**: Sass/SCSS

## 📁 项目结构

```
martial-web/
├── src/
│   ├── main.js              # 应用入口
│   ├── App.vue              # 根组件
│   ├── router/              # 路由配置
│   ├── store/               # Vuex 状态管理
│   ├── views/               # 页面组件
│   ├── components/          # 通用组件
│   ├── api/                 # API 接口
│   └── utils/               # 工具函数
├── public/                  # 静态资源
├── .env.development         # 开发环境配置
├── .env.production          # 生产环境配置
├── vite.config.js           # Vite 配置
├── nginx.conf               # Nginx 配置（生产环境容器使用）
├── Dockerfile               # 完整构建 Dockerfile
├── Dockerfile.deploy        # 部署 Dockerfile
└── .drone.yml               # Drone CI/CD 配置
```

## 🚀 本地开发

### 环境要求

- Node.js >= 18
- npm >= 9

### 安装依赖

```bash
npm install
```

### 开发运行

```bash
npm run dev
```

访问 http://localhost:5173

### 生产构建

```bash
npm run build
```

构建产物在 `dist/` 目录

### 预览生产构建

```bash
npm run serve
```

## 🐳 Docker 部署

### 方法一：完整构建（开发/测试）

```bash
docker build -t martial/frontend:latest -f Dockerfile .
docker run -d -p 80:80 martial/frontend:latest
```

### 方法二：部署已构建产物（生产推荐）

```bash
# 先本地构建
npm run build

# 使用 Dockerfile.deploy 轻量化部署
docker build -t martial/frontend:latest -f Dockerfile.deploy .

# 运行容器
docker run -d \
  --name martial-frontend \
  --restart always \
  -p 5173:80 \
  --network martial_martial-network \
  -e TZ=Asia/Shanghai \
  martial/frontend:latest
```

## 🔄 CI/CD 自动部署

项目使用 Drone CI/CD 进行自动化部署。

### 部署流程

当推送到 `main` 分支时，自动触发：

1. **安装依赖** - `npm install`
2. **构建项目** - `npm run build`
3. **传输文件** - SCP 上传 dist、Dockerfile.deploy、nginx.conf 到服务器
4. **构建镜像** - 在服务器上执行 `docker build -f Dockerfile.deploy`
5. **部署容器** - 停止旧容器，启动新容器
6. **健康检查** - 验证服务可访问

### 查看构建状态

访问 https://martial-ci.johnsion.club

## ⚙️ 配置说明

### 环境变量

**开发环境** (`.env.development`)：
```env
VITE_APP_API=/api              # API 前缀（开发时走 Vite 代理）
```

**生产环境** (`.env.production`)：
```env
VITE_APP_API=                  # 留空（因为 BladeX 端点路径已完整）
```

### Nginx 配置

生产环境 nginx 配置（`nginx.conf`）：

```nginx
# 前端路由（Vue Router history 模式）
location / {
    try_files $uri $uri/ /index.html;
}

# API 代理到后端（通过宿主机网关地址）
location /blade-auth/ {
    proxy_pass http://172.21.0.1:8123/blade-auth/;
}

location /blade-system/ {
    proxy_pass http://172.21.0.1:8123/blade-system/;
}

location /api/ {
    proxy_pass http://172.21.0.1:8123/api/;
}
```

### Vite 配置

开发环境代理配置（`vite.config.js`）：

```js
server: {
  proxy: {
    '/api': {
      target: 'http://localhost:8123',
      changeOrigin: true
    }
  }
}
```

## 🔧 常见问题

### 问题1: "No endpoint POST /api/blade-auth/oauth/token"

**原因**: 错误配置 `VITE_APP_API` 为 `/api` 前缀，导致请求 `/api/blade-auth/oauth/token`

**解决**: 检查 `.env.production` 中 `VITE_APP_API=`（留空）

### 问题2: 容器启动报 "host not found in upstream martial-backend"

**原因**: nginx.conf 中使用 Docker 服务名 `martial-backend`，但容器无法解析

**解决**: 使用宿主机网关地址 `172.21.0.1:8123` 代替

### 问题3: 端口 80 占用

**原因**: 宿主机 Caddy 已占用 80 端口

**解决**: 前端容器使用其他端口（如 5173），由 Caddy 反向代理

## 📝 开发规范

### 代码风格

- 使用 ESLint + Prettier
- 遵循 Vue 3 组合式 API 最佳实践
- 组件命名使用PascalCase
- 文件命名使用kebab-case

### Git 提交规范

```
feat: 新功能
fix: 修复 Bug
docs: 文档更新
style: 代码格式调整
refactor: 重构
perf: 性能优化
test: 测试相关
chore: 构建/工具配置
```

## 🏗️ 生产架构

### 部署拓扑

```
互联网
  ↓
Cloudflare CDN
  ↓
Caddy (80/443端口，自动 HTTPS)
  ↓
martial.johnsion.club → localhost:5173 (前端 Nginx 容器)
  ├── 静态文件 → 直接返回 Vue 应用
  └── /blade-auth, /blade-system, /api → 代理到后端 172.21.0.1:8123
```

### 网络架构

```
Docker Network: martial_martial-network (bridge)
├── martial-frontend (172.21.0.x) - 端口映射 5173:80
├── martial-mysql (172.21.0.x) - 端口映射 33066:3306
└── martial-redis (172.21.0.x) - 端口映射 63379:6379

宿主机:
├── Caddy (80/443) - 反向代理服务
├── Java 后端 (8123) - martial-master 应用
└── Drone CI/CD (8080) - 自动化部署
```

## 🔐 安全考虑

- 生产环境启用 HTTPS 证书（Caddy 自动签发）
- API 接口通过 Nginx 代理，隔离后端
- 敏感配置通过 Drone Secrets 管理
- 容器间网络隔离，仅暴露必要端口

## 📚 相关链接

- [后端仓库](https://git.waypeak.work/martial/martial-master)
- [BladeX 框架](https://bladex.cn)
- [Vue 3 文档](https://cn.vuejs.org/)
- [Element Plus](https://element-plus.org/)
- [Vite 文档](https://vitejs.dev/)

## 👥 贡献者

- **开发者**: JohnSion
- **AI 助手**: Claude Code
