<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>AI Text Generator</title> <style> /* 基本 CSS 設定 */ body { font-family: Arial, sans-serif; background-color: #f4f4f4; margin: 0; padding: 20px; } .container { max-width: 800px; margin: 0 auto; background-color: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); } .translation-area { display: flex; flex-direction: column; gap: 20px; margin-bottom: 20px; } .input-section, .output-section { display: flex; flex-direction: column; gap: 10px; } textarea { width: 100%; height: 100px; padding: 10px; border: 1px solid #ccc; border-radius: 4px; resize: vertical; } .model-select { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; } .translate-btn { padding: 10px 20px; background-color: #007BFF; border: none; color: #fff; border-radius: 4px; cursor: pointer; } .translate-btn:disabled { background-color: #aaa; } .attribution { font-size: 0.9em; color: #555; } .disclaimer-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0,0,0,0.5); display: none; justify-content: center; align-items: center; } .disclaimer-content { background-color: #fff; padding: 20px; border-radius: 8px; max-width: 400px; text-align: center; } .disclaimer-buttons { display: flex; justify-content: space-around; margin-top: 20px; } .disclaimer-btn { padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; } .accept-btn { background-color: #28a745; color: #fff; } .reject-btn { background-color: #dc3545; color: #fff; } </style> </head> <body> <div class="container"> <h1>AI Text Generator</h1> <div class="translation-area"> <div class="input-section"> <select id="modelSelect" class="model-select"> <option value="ChatGPT">ChatGPT</option> <option value="Google Gemini">Google Gemini</option> <option value="Claude">Claude</option> <option value="DALL-E">DALL-E</option> <option value="GPT-4">GPT-4</option> </select> <textarea id="inputText" placeholder="Enter your prompt here..."></textarea> </div>
<div class="output-section"> <textarea id="outputText" placeholder="Generated text will appear here..." readonly></textarea> <div id="attribution" class="attribution"></div> </div> </div>
<button id="generateButton" class="translate-btn">Generate</button> </div>
<div id="disclaimerModal" class="disclaimer-modal"> <div class="disclaimer-content"> <h2>Disclaimer</h2> <p>The text you are about to generate is created by artificial intelligence. It may not be entirely accurate or reliable. Do you wish to proceed?</p> <div class="disclaimer-buttons"> <button id="acceptDisclaimer" class="disclaimer-btn accept-btn">Yes</button> <button id="rejectDisclaimer" class="disclaimer-btn reject-btn">No</button> </div> </div> </div>
<script> class TextGenerator { constructor() { this.inputText = document.getElementById('inputText'); this.outputText = document.getElementById('outputText'); this.generateButton = document.getElementById('generateButton'); this.modelSelect = document.getElementById('modelSelect'); this.disclaimerModal = document.getElementById('disclaimerModal'); this.attribution = document.getElementById('attribution'); this.init(); } init() { // 綁定按鈕事件 this.generateButton.addEventListener('click', () => this.showDisclaimer()); // Disclaimer 確認按鈕 document.getElementById('acceptDisclaimer').addEventListener('click', () => { this.disclaimerModal.style.display = 'none'; this.generate(); }); // Disclaimer 拒絕按鈕 document.getElementById('rejectDisclaimer').addEventListener('click', () => { this.disclaimerModal.style.display = 'none'; this.outputText.value = 'You must accept the disclaimer to generate text.'; }); } // 顯示 Disclaimer 視窗 showDisclaimer() { this.disclaimerModal.style.display = 'flex'; } // 與後端溝通並顯示結果 async generate() { // 如果沒有輸入任何文字,就不執行 if (!this.inputText.value.trim()) { return; } this.generateButton.disabled = true; this.generateButton.textContent = 'Generating...'; try { const response = await fetch('/api/ai_completion', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, // 將使用者輸入與選擇的模型傳給後端 body: JSON.stringify({ model: this.modelSelect.value, prompt: this.inputText.value }), }); // 解析後端回傳的 JSON const data = await response.json(); console.log('Response data:', data); // 檢查後端實際回傳的內容
// 確認是否有 generatedText if (data && data.generatedText) { this.outputText.value = data.generatedText; this.attribution.style.display = 'block'; this.attribution.textContent = `This text was generated by ${this.modelSelect.value}`; } else { this.outputText.value = 'No "generatedText" found in the response.'; } } catch (error) { console.error('Generation error:', error); this.outputText.value = 'An error occurred during text generation. Please try again.'; } finally { this.generateButton.disabled = false; this.generateButton.textContent = 'Generate'; } } } // 初始化 TextGenerator new TextGenerator(); </script> </body> </html>
|