新增資料庫、用戶註冊、登入的功能

This commit is contained in:
2025-08-05 10:56:22 +08:00
parent 94e3763402
commit a288a966ba
41 changed files with 4362 additions and 289 deletions

379
DATABASE_GUIDE.md Normal file
View File

@@ -0,0 +1,379 @@
# 🗄️ AI展示平台資料庫指南
## 📋 資料庫概述
AI展示平台使用 **MySQL** 作為主要資料庫支援完整的競賽管理、用戶認證、評審系統和AI助手功能。
### 🔗 連接資訊
- **主機**: mysql.theaken.com
- **埠號**: 33306
- **資料庫**: db_AI_Platform
- **用戶**: AI_Platform
- **密碼**: Aa123456
## 🏗️ 資料庫結構
### 📊 核心資料表 (18個)
#### 1. 用戶管理
- **users** - 用戶基本資料
- **user_favorites** - 用戶收藏
- **user_likes** - 用戶按讚記錄
#### 2. 競賽系統
- **competitions** - 競賽基本資料
- **competition_participants** - 競賽參與者
- **competition_judges** - 競賽評審分配
#### 3. 團隊管理
- **teams** - 團隊基本資料
- **team_members** - 團隊成員
#### 4. 作品管理
- **apps** - AI應用程式
- **proposals** - 提案作品
#### 5. 評審系統
- **judges** - 評審基本資料
- **judge_scores** - 評審評分
#### 6. 獎項系統
- **awards** - 獎項記錄
#### 7. AI助手
- **chat_sessions** - 聊天會話
- **chat_messages** - 聊天訊息
- **ai_assistant_configs** - AI配置
#### 8. 系統管理
- **system_settings** - 系統設定
- **activity_logs** - 活動日誌
## 🚀 快速開始
### 1. 環境設定
```bash
# 複製環境變數範例
cp env.example .env.local
# 編輯環境變數
nano .env.local
```
### 2. 安裝依賴
```bash
# 安裝新依賴
pnpm install
```
### 3. 建立資料庫
```bash
# 建立資料庫和資料表
pnpm run db:setup
```
### 4. 測試連接
```bash
# 測試資料庫連接
pnpm run db:test
```
## 📊 資料表詳細說明
### users 表
```sql
CREATE TABLE users (
id VARCHAR(36) PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
avatar VARCHAR(500),
department VARCHAR(100) NOT NULL,
role ENUM('user', 'developer', 'admin') DEFAULT 'user',
join_date DATE NOT NULL,
total_likes INT DEFAULT 0,
total_views INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
```
**用途**: 儲存所有用戶資料
**角色**:
- `user`: 一般用戶 (瀏覽、投票)
- `developer`: 開發者 (提交作品、參賽)
- `admin`: 管理員 (系統管理、數據分析)
### competitions 表
```sql
CREATE TABLE competitions (
id VARCHAR(36) PRIMARY KEY,
name VARCHAR(200) NOT NULL,
year INT NOT NULL,
month INT NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
status ENUM('upcoming', 'active', 'judging', 'completed') DEFAULT 'upcoming',
description TEXT,
type ENUM('individual', 'team', 'mixed', 'proposal') NOT NULL,
evaluation_focus TEXT,
max_team_size INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
```
**競賽狀態流程**: `upcoming``active``judging``completed`
**競賽類型**:
- `individual`: 個人賽
- `team`: 團隊賽
- `mixed`: 混合賽
- `proposal`: 提案賽
### judge_scores 表
```sql
CREATE TABLE judge_scores (
id VARCHAR(36) PRIMARY KEY,
judge_id VARCHAR(36) NOT NULL,
app_id VARCHAR(36),
proposal_id VARCHAR(36),
scores JSON NOT NULL,
comments TEXT,
submitted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
**評分維度** (JSON格式):
```json
{
"innovation": 8, // 創新性 (1-10)
"technical": 7, // 技術性 (1-10)
"usability": 9, // 實用性 (1-10)
"presentation": 8, // 展示效果 (1-10)
"impact": 7 // 影響力 (1-10)
}
```
## 🔍 查詢範例
### 1. 獲取用戶統計
```sql
SELECT
u.name,
u.department,
u.role,
COUNT(DISTINCT a.id) as total_apps,
COUNT(DISTINCT f.app_id) as total_favorites,
u.total_likes,
u.total_views
FROM users u
LEFT JOIN apps a ON u.id = a.creator_id
LEFT JOIN user_favorites f ON u.id = f.user_id
GROUP BY u.id;
```
### 2. 獲取競賽統計
```sql
SELECT
c.name,
c.status,
c.type,
COUNT(DISTINCT cp.user_id) as participant_count,
COUNT(DISTINCT cp.team_id) as team_count,
COUNT(DISTINCT cp.app_id) as app_count
FROM competitions c
LEFT JOIN competition_participants cp ON c.id = cp.competition_id
GROUP BY c.id;
```
### 3. 獲取應用排行榜
```sql
SELECT
a.name,
u.name as creator_name,
t.name as team_name,
a.likes_count,
a.views_count,
a.rating,
ROW_NUMBER() OVER (ORDER BY a.likes_count DESC) as popularity_rank
FROM apps a
LEFT JOIN users u ON a.creator_id = u.id
LEFT JOIN teams t ON a.team_id = t.id;
```
## 🛠️ 存儲過程
### GetUserPermissions
```sql
CALL GetUserPermissions('user@example.com');
```
**用途**: 獲取用戶權限和基本資料
### GetCompetitionStats
```sql
CALL GetCompetitionStats('comp-2025-01');
```
**用途**: 獲取競賽統計資料
### CalculateAwardRankings
```sql
CALL CalculateAwardRankings('comp-2025-01');
```
**用途**: 計算獎項排名
## 👁️ 視圖 (Views)
### user_statistics
顯示用戶統計資料,包含作品數、收藏數、按讚數等
### competition_statistics
顯示競賽統計資料,包含參與者數、團隊數、作品數等
### app_rankings
顯示應用排行榜,包含人氣排名和評分排名
## 🔧 觸發器 (Triggers)
### update_user_total_likes
當用戶按讚時,自動更新用戶總按讚數
### update_app_likes_count
當應用被按讚時,自動更新應用按讚數
### update_user_total_views
當應用瀏覽數更新時,自動更新用戶總瀏覽數
## 📈 索引優化
### 主要索引
- `users.email` - 用戶郵箱查詢
- `users.role` - 角色權限查詢
- `competitions.status` - 競賽狀態查詢
- `apps.likes_count` - 人氣排序
- `apps.rating` - 評分排序
### 複合索引
- `competitions.year, competitions.month` - 時間範圍查詢
- `competitions.start_date, competitions.end_date` - 日期範圍查詢
## 🔒 安全性
### 密碼加密
使用 bcrypt 進行密碼雜湊,鹽值輪數為 10
### 外鍵約束
所有關聯表都設定了適當的外鍵約束,確保資料完整性
### 唯一約束
- 用戶郵箱唯一
- 用戶每日按讚限制
- 評審對同一作品只能評分一次
## 📊 性能監控
### 查詢統計
```sql
-- 查看慢查詢
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
-- 查看連接數
SHOW STATUS LIKE 'Threads_connected';
SHOW STATUS LIKE 'Max_used_connections';
```
### 資料表大小
```sql
SELECT
table_name,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'db_AI_Platform'
ORDER BY (data_length + index_length) DESC;
```
## 🚨 故障排除
### 常見問題
#### 1. 連接失敗
```bash
# 檢查網路連接
ping mysql.theaken.com
# 檢查埠號
telnet mysql.theaken.com 33306
```
#### 2. 權限錯誤
```sql
-- 檢查用戶權限
SHOW GRANTS FOR 'AI_Platform'@'%';
```
#### 3. 資料表不存在
```bash
# 重新執行建立腳本
pnpm run db:setup
```
#### 4. 密碼錯誤
```bash
# 檢查環境變數
echo $DB_PASSWORD
```
## 📝 維護指南
### 定期備份
```bash
# 建立備份
mysqldump -h mysql.theaken.com -P 33306 -u AI_Platform -p db_AI_Platform > backup_$(date +%Y%m%d).sql
```
### 資料清理
```sql
-- 清理過期的活動日誌 (保留30天)
DELETE FROM activity_logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- 清理過期的聊天會話 (保留7天)
DELETE FROM chat_sessions WHERE updated_at < DATE_SUB(NOW(), INTERVAL 7 DAY);
```
### 性能優化
```sql
-- 分析資料表
ANALYZE TABLE users, competitions, apps;
-- 優化資料表
OPTIMIZE TABLE users, competitions, apps;
```
## 🔄 版本更新
### 新增欄位
```sql
-- 範例:為 users 表新增欄位
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
```
### 修改欄位
```sql
-- 範例:修改欄位類型
ALTER TABLE users MODIFY COLUMN department VARCHAR(150);
```
### 新增索引
```sql
-- 範例:新增複合索引
CREATE INDEX idx_user_department_role ON users(department, role);
```
---
**最後更新**: 2025年1月
**維護者**: AI展示平台開發團隊