feat: complete mobile app function specifications and API documentation

- Add comprehensive function specifications for 5 core mobile app features:
  * 01_情境對話功能規格.md - Situational dialogue system
  * 02_詞彙學習功能規格.md - Vocabulary learning system
  * 03_學習地圖功能規格.md - Learning map and progress system
  * 04_道具商店功能規格.md - In-app store and items system
  * 05_用戶認證功能規格.md - User authentication system
- Add swagger-ui.html with complete API documentation and testing interface
- Include detailed UI specifications, business logic, and integration requirements
- Establish foundation for mobile app development

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
鄭沛軒 2025-09-09 15:38:18 +08:00
parent d31340a05a
commit d44cfe511a
1 changed files with 434 additions and 0 deletions

434
swagger-ui.html Normal file
View File

@ -0,0 +1,434 @@
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Drama Ling API Documentation</title>
<link rel="stylesheet" type="text/css" href="https://unpkg.com/swagger-ui-dist@4.15.5/swagger-ui.css" />
<style>
html {
box-sizing: border-box;
overflow: -moz-scrollbars-vertical;
overflow-y: scroll;
}
*, *:before, *:after {
box-sizing: inherit;
}
body {
margin:0;
background: #fafafa;
}
</style>
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://unpkg.com/swagger-ui-dist@4.15.5/swagger-ui-bundle.js"></script>
<script src="https://unpkg.com/swagger-ui-dist@4.15.5/swagger-ui-standalone-preset.js"></script>
<script>
window.onload = function() {
const ui = SwaggerUIBundle({
url: 'data:application/json;charset=utf-8,' + encodeURIComponent(JSON.stringify({
"openapi": "3.0.1",
"info": {
"title": "Drama Ling API",
"description": "API for Drama Ling language learning application",
"contact": {
"name": "Drama Ling Team",
"email": "dev@dramaling.com"
},
"version": "v1"
},
"servers": [
{
"url": "https://api.dramaling.com",
"description": "Production server"
},
{
"url": "https://localhost:5001",
"description": "Development server"
}
],
"paths": {
"/api/v1/auth/register": {
"post": {
"tags": ["Authentication"],
"summary": "用戶註冊",
"description": "創建新用戶帳號",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email",
"example": "test@example.com"
},
"password": {
"type": "string",
"minLength": 8,
"example": "Test123456"
},
"username": {
"type": "string",
"minLength": 3,
"maxLength": 20,
"example": "testuser"
},
"preferredLanguage": {
"type": "string",
"example": "en"
},
"nativeLanguage": {
"type": "string",
"example": "zh-TW"
}
},
"required": ["email", "password", "username"]
}
}
}
},
"responses": {
"201": {
"description": "註冊成功",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AuthResponse"
}
}
}
},
"400": {
"description": "驗證錯誤",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/api/v1/auth/login": {
"post": {
"tags": ["Authentication"],
"summary": "用戶登入",
"description": "使用email和密碼登入",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email",
"example": "test@example.com"
},
"password": {
"type": "string",
"example": "Test123456"
},
"rememberMe": {
"type": "boolean",
"example": true
}
},
"required": ["email", "password"]
}
}
}
},
"responses": {
"200": {
"description": "登入成功",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AuthResponse"
}
}
}
},
"401": {
"description": "認證失敗",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
}
}
},
"/api/v1/auth/refresh": {
"post": {
"tags": ["Authentication"],
"summary": "刷新Token",
"description": "使用refresh token獲取新的access token",
"security": [
{
"Bearer": []
}
],
"responses": {
"200": {
"description": "Token刷新成功",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {"type": "boolean"},
"data": {
"type": "object",
"properties": {
"accessToken": {"type": "string"},
"refreshToken": {"type": "string"},
"expiresIn": {"type": "integer"},
"tokenType": {"type": "string", "example": "Bearer"}
}
}
}
}
}
}
}
}
}
},
"/api/v1/auth/logout": {
"post": {
"tags": ["Authentication"],
"summary": "用戶登出",
"description": "登出並將token加入黑名單",
"security": [
{
"Bearer": []
}
],
"responses": {
"200": {
"description": "登出成功",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"success": {"type": "boolean"},
"data": {
"type": "object",
"properties": {
"loggedOut": {"type": "boolean"},
"tokenBlacklisted": {"type": "boolean"}
}
}
}
}
}
}
}
}
}
},
"/api/v1/auth/apple": {
"post": {
"tags": ["Authentication"],
"summary": "Apple ID登入",
"description": "使用Apple ID進行第三方登入",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"identityToken": {"type": "string"},
"authorizationCode": {"type": "string"},
"userIdentifier": {"type": "string"},
"email": {"type": "string"},
"fullName": {
"type": "object",
"properties": {
"givenName": {"type": "string"},
"familyName": {"type": "string"}
}
}
}
}
}
}
},
"responses": {
"200": {
"description": "Apple登入成功",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AuthResponse"
}
}
}
}
}
}
},
"/api/v1/auth/google": {
"post": {
"tags": ["Authentication"],
"summary": "Google登入",
"description": "使用Google進行第三方登入",
"requestBody": {
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"idToken": {"type": "string"},
"accessToken": {"type": "string"},
"serverAuthCode": {"type": "string"}
}
}
}
}
},
"responses": {
"200": {
"description": "Google登入成功",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AuthResponse"
}
}
}
}
}
}
},
"/api/health": {
"get": {
"tags": ["Health"],
"summary": "健康檢查",
"description": "檢查服務健康狀態",
"responses": {
"200": {
"description": "服務正常",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"Status": {"type": "string", "example": "Healthy"},
"Timestamp": {"type": "string", "format": "date-time"},
"Version": {"type": "string", "example": "1.0.0"},
"Service": {"type": "string", "example": "Drama Ling API"}
}
}
}
}
}
}
}
},
"/api/health/detailed": {
"get": {
"tags": ["Health"],
"summary": "詳細健康檢查",
"description": "取得詳細的系統健康資訊",
"responses": {
"200": {
"description": "詳細健康資訊",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"Status": {"type": "string"},
"Environment": {"type": "string"},
"Database": {"type": "string"},
"Cache": {"type": "string"},
"Memory": {"type": "object"}
}
}
}
}
}
}
}
}
},
"components": {
"securitySchemes": {
"Bearer": {
"type": "http",
"scheme": "bearer",
"bearerFormat": "JWT",
"description": "JWT Authorization header using the Bearer scheme. Example: \"Bearer {token}\""
}
},
"schemas": {
"AuthResponse": {
"type": "object",
"properties": {
"success": {"type": "boolean"},
"data": {
"type": "object",
"properties": {
"userId": {"type": "string", "format": "uuid"},
"username": {"type": "string"},
"email": {"type": "string"},
"accessToken": {"type": "string"},
"refreshToken": {"type": "string"},
"expiresIn": {"type": "integer"},
"userRole": {"type": "string", "enum": ["user", "subscriber", "admin"]},
"subscriptionStatus": {"type": "string", "enum": ["active", "inactive", "trial"]},
"isNewUser": {"type": "boolean"}
}
},
"message": {"type": "string"}
}
},
"ErrorResponse": {
"type": "object",
"properties": {
"success": {"type": "boolean", "example": false},
"error": {
"type": "object",
"properties": {
"code": {"type": "string"},
"message": {"type": "string"},
"details": {"type": "object"}
}
}
}
}
}
}
})),
dom_id: '#swagger-ui',
deepLinking: true,
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIStandalonePreset
],
plugins: [
SwaggerUIBundle.plugins.DownloadUrl
],
layout: "StandaloneLayout",
tryItOutEnabled: true,
supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'],
onComplete: function() {
console.log("Swagger UI loaded");
}
});
};
</script>
</body>
</html>