755 lines
33 KiB
HTML
755 lines
33 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>AI讲故事 - 智能童话世界</title>
|
||
<link rel="stylesheet" href="../css/indexHome.css">
|
||
<link rel="stylesheet" href="../css/animate.min.css">
|
||
<link rel="stylesheet" href="../css/font-awesome.min.css">
|
||
<link rel="stylesheet" href="../css/ai_storytelling.css">
|
||
<meta name="description" content="AI智能讲故事平台,为孩子提供寓教于乐的阅读体验">
|
||
<meta name="keywords" content="AI讲故事,儿童教育,童话故事,语音朗读">
|
||
<meta name="theme-color" content="#0284c7">
|
||
</head>
|
||
|
||
<body>
|
||
<!-- 主容器 -->
|
||
<div class="ai-storytelling-container">
|
||
<!-- 页面头部 -->
|
||
<header class="story-header">
|
||
<div class="header-content">
|
||
<h1 class="animate__animated animate__fadeInDown">
|
||
<span class="header-icon">📚</span>
|
||
<span class="header-text">AI智能讲故事</span>
|
||
<img src="../asset/logo.png" alt="logo" class="header-logo">
|
||
</h1>
|
||
<p class="animate__animated animate__fadeInUp animate__delay-1s header-subtitle">
|
||
🌟 专为儿童设计的智能故事平台,结合AI技术与教育理念<br>
|
||
🎭 互动式分支剧情,让孩子参与故事创作<br>
|
||
🎵 专业语音朗读,提升语言表达能力<br>
|
||
📖 寓教于乐,在故事中学习成长
|
||
</p>
|
||
|
||
<!-- 搜索和统计信息 -->
|
||
<div class="header-features animate__animated animate__fadeInUp animate__delay-2s">
|
||
<div class="search-container">
|
||
<input type="text" id="storySearch" placeholder="搜索故事标题、内容或关键词..." class="search-input">
|
||
<button class="search-btn" id="searchBtn" title="搜索故事">
|
||
<img src="../asset/icon-sousuo.png" alt="搜索" class="search-icon">
|
||
</button>
|
||
</div>
|
||
<div class="stats-info">
|
||
<span class="stat-item" title="故事总数">
|
||
<img src="../asset/icon-gushi.png" alt="故事" class="stat-icon">
|
||
<span id="totalStories">5</span> 个故事
|
||
</span>
|
||
<span class="stat-item" title="总阅读时长">
|
||
<img src="../asset/icon-time.png" alt="时间" class="stat-icon">
|
||
<span id="totalDuration">19分钟</span> 阅读时间
|
||
</span>
|
||
<span class="stat-item" title="互动选择总数">
|
||
<img src="../asset/icon-xuanze.png" alt="选择" class="stat-icon">
|
||
<span id="totalChoices">12</span> 个选择
|
||
</span>
|
||
<span class="stat-item" title="教育价值评分">
|
||
<img src="../asset/icon-pinfen.png" alt="评分" class="stat-icon">
|
||
<span id="educationScore">4.8</span> 教育评分
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<!-- 故事库 -->
|
||
<main class="story-library">
|
||
<!-- 筛选和排序 -->
|
||
<div class="library-controls animate__animated animate__fadeInUp animate__delay-3s">
|
||
<div class="library-filter">
|
||
<button class="filter-btn active" data-category="all" title="显示所有故事">
|
||
<img src="../asset/icon-quanbu.png" icon-统计分析.pngalt="全部" class="filter-icon"> 全部故事
|
||
</button>
|
||
<button class="filter-btn" data-category="生活故事" title="日常生活相关故事">
|
||
<img src="../asset/icon-shenghuo.png" alt="生活" class="filter-icon"> 生活故事
|
||
<span class="filter-count">3</span>
|
||
</button>
|
||
<button class="filter-btn" data-category="经典故事" title="经典童话和寓言">
|
||
<img src="../asset/icon-经典.png" alt="经典" class="filter-icon"> 经典故事
|
||
<span class="filter-count">2</span>
|
||
</button>
|
||
<button class="filter-btn" data-category="数学故事" title="数学启蒙故事">
|
||
<img src="../asset/icon-xyz.png" alt="数学" class="filter-icon"> 数学故事
|
||
<span class="filter-count">4</span>
|
||
</button>
|
||
<button class="filter-btn" data-category="梦想故事" title="激发想象力的故事">
|
||
<img src="../asset/icon-mengxiang1.png" alt="梦想" class="filter-icon"> 梦想故事
|
||
<span class="filter-count">2</span>
|
||
</button>
|
||
<button class="filter-btn" data-category="成长故事" title="品格教育故事">
|
||
<img src="../asset/icon-chengzhang2.png" alt="成长" class="filter-icon"> 成长故事
|
||
<span class="filter-count">3</span>
|
||
</button>
|
||
</div>
|
||
|
||
<div class="sort-controls">
|
||
<label for="sortBy">排序:</label>
|
||
<select id="sortBy" class="sort-select" title="选择排序方式">
|
||
<option value="default">默认排序</option>
|
||
<option value="difficulty">难度等级</option>
|
||
<option value="duration">阅读时长</option>
|
||
<option value="popularity">受欢迎度</option>
|
||
<option value="education">教育价值</option>
|
||
<option value="interactive">互动程度</option>
|
||
</select>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<!-- 故事网格 -->
|
||
<div class="story-grid" id="storyGrid">
|
||
<!-- 故事卡片将通过JavaScript动态生成 -->
|
||
</div>
|
||
|
||
<!-- 故事详情对话框 -->
|
||
<div class="story-detail-modal" id="storyDetailModal" style="display: none;">
|
||
<div class="detail-backdrop" id="detailBackdrop"
|
||
style="position: fixed; inset: 0; background: rgba(0,0,0,.35);"></div>
|
||
<div class="detail-container" role="dialog" aria-modal="true" aria-labelledby="detailTitle"
|
||
style="position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%); width: min(92vw, 960px); background: #fff; border-radius: 14px; box-shadow: 0 20px 60px rgba(2,8,23,.25); overflow: hidden; z-index: 1003;">
|
||
<div class="detail-header"
|
||
style="display:flex; align-items:center; justify-content: space-between; padding: 14px 16px; border-bottom: 1px solid #eef2f7;">
|
||
<h3 id="detailTitle" style="margin:0; font-size: 18px; color:#0f172a;">故事详情</h3>
|
||
<button class="detail-close" id="closeDetail" title="关闭" aria-label="关闭"
|
||
style="border:none; background: transparent; font-size: 18px; cursor: pointer; color:#334155;">
|
||
<img src="../asset/icon-关 闭.png" alt="关闭" class="close-icon">
|
||
</button>
|
||
</div>
|
||
<div class="detail-content" style="display:grid; grid-template-columns: 320px 1fr; gap: 16px; padding: 16px;">
|
||
<div class="detail-cover" style="position: relative;">
|
||
<img id="detailImage" src="" alt="故事封面"
|
||
style="width:100%; height:auto; border-radius: 12px; box-shadow: 0 10px 24px rgba(2,8,23,.08);"
|
||
onerror="this.src='../asset/logo.png'">
|
||
</div>
|
||
<div class="detail-info" style="min-height: 220px;">
|
||
<div class="detail-meta"
|
||
style="display:flex; flex-wrap: wrap; gap:10px; color:#475569; margin-bottom: 8px;">
|
||
<span class="meta-item"><img id="detailCategoryIcon" src="" alt="类别" class="meta-icon"> <span
|
||
id="detailCategory">类别</span></span>
|
||
<span class="meta-item"><img src="../asset/icon-难度.png" alt="难度" class="meta-icon"> 难度 <span
|
||
id="detailDifficulty">⭐</span></span>
|
||
<span class="meta-item"><img src="../asset/icon-时间.png" alt="时长" class="meta-icon"> <span
|
||
id="detailDuration">时长</span></span>
|
||
<span class="meta-item"><img src="../asset/icon-年龄.png" alt="年龄" class="meta-icon"> <span
|
||
id="detailAge">年龄</span></span>
|
||
</div>
|
||
<div class="detail-description" id="detailDescription"
|
||
style="line-height:1.8; color:#334155; margin-bottom: 10px;"></div>
|
||
<div class="detail-actions" style="display:flex; gap:10px; flex-wrap: wrap;">
|
||
<button class="btn-story btn-primary" id="detailStart"><img src="../asset/icon-开始阅读 .png" alt="开始阅读"
|
||
class="btn-icon"> 开始阅读</button>
|
||
<button class="btn-story btn-secondary" id="detailFavorite"><img src="../asset/icon-收 藏.png" alt="收藏"
|
||
class="btn-icon"> 收藏</button>
|
||
<button class="btn-story btn-info" id="detailShare"><img src="../asset/icon-分享.png" alt="分享"
|
||
class="btn-icon"> 分享</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 故事预览模态框 -->
|
||
<div class="story-preview-modal" id="storyPreviewModal" style="display: none;">
|
||
<div class="preview-container">
|
||
<div class="preview-header">
|
||
<h3 id="previewTitle">故事预览</h3>
|
||
<button class="preview-close" id="closePreview">
|
||
<img src="../asset/icon-关 闭.png" alt="关闭" class="close-icon">
|
||
</button>
|
||
</div>
|
||
<div class="preview-content">
|
||
<div class="preview-cover">
|
||
<img id="previewImage" src="" alt="故事封面">
|
||
<div class="preview-overlay">
|
||
<button class="btn-story btn-large btn-primary" id="startFromPreview">
|
||
<i class="fa fa-play"></i> 开始阅读
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<div class="preview-info">
|
||
<div class="preview-meta">
|
||
<span class="meta-item">
|
||
<img src="../asset/icon-时间.png" alt="时间" class="meta-icon">
|
||
<span id="previewDuration">5分钟</span>
|
||
</span>
|
||
<span class="meta-item">
|
||
<i class="fa fa-star"></i>
|
||
<span id="previewRating">4.8</span>
|
||
</span>
|
||
<span class="meta-item">
|
||
<i class="fa fa-users"></i>
|
||
<span id="previewAge">3-8岁</span>
|
||
</span>
|
||
</div>
|
||
<div class="preview-description" id="previewDescription">
|
||
<!-- 故事描述 -->
|
||
</div>
|
||
<div class="preview-features">
|
||
<h4>故事特色</h4>
|
||
<ul id="previewFeatures">
|
||
<!-- 特色列表 -->
|
||
</ul>
|
||
</div>
|
||
<div class="preview-actions">
|
||
<button class="btn-story btn-medium btn-secondary" id="addToFavorites">
|
||
<i class="fa fa-heart-o"></i> 收藏
|
||
</button>
|
||
<button class="btn-story btn-medium btn-info" id="shareStory">
|
||
<i class="fa fa-share"></i> 分享
|
||
</button>
|
||
<button class="btn-story btn-medium btn-warning" id="readAloud">
|
||
<i class="fa fa-volume-up"></i> 试听
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 加载指示器 -->
|
||
<div class="loading-indicator" id="loadingIndicator">
|
||
<div class="loading-spinner"></div>
|
||
<span class="loading-text">正在为你准备精彩的故事...</span>
|
||
</div>
|
||
|
||
<!-- 空状态提示 -->
|
||
<div class="empty-state" id="emptyState" style="display: none;">
|
||
<div class="empty-icon">📚</div>
|
||
<h3>暂无匹配的故事</h3>
|
||
<p>尝试调整筛选条件或搜索关键词</p>
|
||
<button class="btn-story btn-primary" id="clearFilters">清除筛选</button>
|
||
</div>
|
||
|
||
<!-- 推荐故事区域 -->
|
||
<div class="recommended-stories" id="recommendedStories" style="display: none;">
|
||
<h3 class="recommended-title">
|
||
<i class="fa fa-star"></i> 为你推荐
|
||
</h3>
|
||
<div class="recommended-grid" id="recommendedGrid">
|
||
<!-- 推荐故事卡片 -->
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 阅读统计面板 -->
|
||
<div class="reading-stats-panel" id="readingStatsPanel" style="display: none;">
|
||
<div class="stats-header">
|
||
<h3>📊 阅读统计</h3>
|
||
<button class="stats-close" id="closeStats">
|
||
<img src="../asset/icon-关 闭.png" alt="关闭" class="close-icon">
|
||
</button>
|
||
</div>
|
||
<div class="stats-content">
|
||
<div class="stats-grid">
|
||
<div class="stat-card">
|
||
<div class="stat-icon">
|
||
<i class="fa fa-book"></i>
|
||
</div>
|
||
<div class="stat-info">
|
||
<span class="stat-number" id="totalReadStories">0</span>
|
||
<span class="stat-label">已读故事</span>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">
|
||
<img src="../asset/icon-时间.png" alt="阅读时长" class="stat-icon-img">
|
||
</div>
|
||
<div class="stat-info">
|
||
<span class="stat-number" id="totalReadingTime">0</span>
|
||
<span class="stat-label">阅读时长</span>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">
|
||
<i class="fa fa-magic"></i>
|
||
</div>
|
||
<div class="stat-info">
|
||
<span class="stat-number" id="totalChoicesMade">0</span>
|
||
<span class="stat-label">互动选择</span>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">
|
||
<i class="fa fa-trophy"></i>
|
||
</div>
|
||
<div class="stat-info">
|
||
<span class="stat-number" id="achievements">0</span>
|
||
<span class="stat-label">获得成就</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="reading-history">
|
||
<h4>最近阅读</h4>
|
||
<div class="history-list" id="historyList">
|
||
<!-- 阅读历史列表 -->
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 成就系统 -->
|
||
<div class="achievements-panel" id="achievementsPanel" style="display: none;">
|
||
<div class="achievements-header">
|
||
<h3>🏆 成就系统</h3>
|
||
<button class="achievements-close" id="closeAchievements">
|
||
<img src="../asset/icon-关 闭.png" alt="关闭" class="close-icon">
|
||
</button>
|
||
</div>
|
||
<div class="achievements-content">
|
||
<div class="achievements-grid" id="achievementsGrid">
|
||
<!-- 成就卡片 -->
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
|
||
<!-- 语音控制切换按钮 -->
|
||
<button class="voice-toggle-btn" id="voiceToggleBtn" title="显示语音控制" aria-label="显示语音控制面板">
|
||
<img src="../asset/icon-语音.png" alt="语音" class="voice-toggle-icon">
|
||
</button>
|
||
|
||
<!-- 浮动语音控制区域 -->
|
||
<div class="voice-controls" id="voiceControls" role="toolbar" aria-label="语音播放控制" style="display: none;">
|
||
<div class="voice-info">
|
||
<span class="voice-status" id="voiceStatus">语音已开启</span>
|
||
<span class="voice-progress" id="voiceProgress" style="display: none;">
|
||
<span class="progress-text">朗读进度: </span>
|
||
<span class="progress-percent">0%</span>
|
||
</span>
|
||
</div>
|
||
<div class="voice-buttons">
|
||
<button class="voice-btn" id="playPauseBtn" title="播放/暂停" aria-label="播放或暂停语音">
|
||
<i class="fa fa-play"></i>
|
||
</button>
|
||
<button class="voice-btn" id="stopBtn" title="停止" aria-label="停止语音播放">
|
||
<i class="fa fa-stop"></i>
|
||
</button>
|
||
<button class="voice-btn" id="voiceOnOffBtn" title="语音开关" aria-label="切换语音功能">
|
||
<i class="fa fa-volume-up"></i>
|
||
</button>
|
||
<button class="voice-btn" id="speedControl" title="语速控制" aria-label="调整语音播放速度">
|
||
<i class="fa fa-tachometer"></i>
|
||
</button>
|
||
<button class="voice-btn" id="repeatBtn" title="重复朗读" aria-label="重复当前内容">
|
||
<i class="fa fa-repeat"></i>
|
||
</button>
|
||
</div>
|
||
<button class="voice-close-btn" id="voiceCloseBtn" title="关闭语音控制" aria-label="关闭语音控制面板">
|
||
<img src="../asset/icon-关 闭.png" alt="关闭" class="voice-close-icon">
|
||
</button>
|
||
</div>
|
||
|
||
<!-- 快速导航 -->
|
||
<nav class="quick-nav" aria-label="快速导航">
|
||
<a href="#" class="nav-link" id="backToTop" title="返回页面顶部">
|
||
<img src="../asset/icon-返回顶部.png" alt="返回顶部" class="nav-icon">
|
||
<span>返回顶部</span>
|
||
</a>
|
||
<a href="#" class="nav-link" id="toggleFavorites" title="查看收藏的故事">
|
||
<img src="../asset/icon-收藏夹.png" alt="收藏夹" class="nav-icon">
|
||
<span>收藏夹</span>
|
||
<span class="nav-badge" id="favoriteCount">0</span>
|
||
</a>
|
||
<a href="#" class="nav-link" id="showHistory" title="查看阅读历史">
|
||
<img src="../asset/icon-阅读历史.png" alt="阅读历史" class="nav-icon">
|
||
<span>阅读历史</span>
|
||
</a>
|
||
<a href="#" class="nav-link" id="showStats" title="查看阅读统计">
|
||
<img src="../asset/icon-统计分析.png" alt="统计" class="nav-icon">
|
||
<span>统计</span>
|
||
</a>
|
||
<a href="#" class="nav-link" id="showAchievements" title="查看成就">
|
||
<img src="../asset/icon-成就.png" alt="成就" class="nav-icon">
|
||
<span>成就</span>
|
||
<span class="nav-badge" id="achievementCount">0</span>
|
||
</a>
|
||
<a href="#" class="nav-link" id="showSettings" title="设置和偏好">
|
||
<img src="../asset/icon-设置.png" alt="设置" class="nav-icon">
|
||
<span>设置</span>
|
||
</a>
|
||
</nav>
|
||
</div>
|
||
|
||
<!-- 故事阅读器模态框 -->
|
||
<div class="story-reader" id="storyReader" role="dialog" aria-labelledby="readerTitle" aria-modal="true">
|
||
<div class="reader-container">
|
||
<header class="reader-header">
|
||
<div class="reader-title-info">
|
||
<h2 class="reader-title" id="readerTitle">故事标题</h2>
|
||
<div class="reader-progress">
|
||
<div class="progress-bar" id="progressBar">
|
||
<div class="progress-fill" id="progressFill"></div>
|
||
</div>
|
||
<span class="progress-text" id="progressText">1/3</span>
|
||
</div>
|
||
</div>
|
||
<div class="reader-controls">
|
||
<button class="reader-btn" id="bookmarkBtn" title="收藏故事">
|
||
<img src="../asset/icon-收 藏.png" alt="收藏" class="reader-icon">
|
||
</button>
|
||
<button class="reader-btn" id="shareBtn" title="分享故事">
|
||
<img src="../asset/icon-分享.png" alt="分享" class="reader-icon">
|
||
</button>
|
||
<button class="reader-btn" id="closeReader" title="关闭阅读器">
|
||
<img src="../asset/icon-关 闭.png" alt="关闭" class="close-icon">
|
||
</button>
|
||
</div>
|
||
</header>
|
||
|
||
<main class="story-content" id="storyContent" role="main">
|
||
<!-- 故事内容将通过JavaScript动态生成 -->
|
||
|
||
<!-- 剧情选择区域 -->
|
||
<div class="story-choices" id="storyChoices" style="display: none;">
|
||
<div class="choices-header">
|
||
<h3>🎭 互动选择 - 决定故事走向</h3>
|
||
<p>请选择一个选项,这将决定故事的发展方向。你的选择会影响故事的结局!</p>
|
||
<div class="choice-tips">
|
||
<span class="tip-item">
|
||
<i class="fa fa-lightbulb-o"></i> 每个选择都有不同的教育意义
|
||
</span>
|
||
<span class="tip-item">
|
||
<i class="fa fa-magic"></i> 可以随时更改选择
|
||
</span>
|
||
</div>
|
||
</div>
|
||
<div class="choices-container" id="choicesContainer">
|
||
<!-- 选择按钮将通过JavaScript动态生成 -->
|
||
</div>
|
||
<div class="choice-feedback" id="choiceFeedback">
|
||
<!-- 选择反馈将通过JavaScript动态生成 -->
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 分支剧情内容区域 -->
|
||
<div class="branching-content" id="branchingContent" style="display: none;">
|
||
<div class="branching-header">
|
||
<h4>🌟 你的选择带来了新的故事发展:</h4>
|
||
</div>
|
||
<div class="branch-narrative" id="branchNarrative">
|
||
<!-- 分支剧情内容 -->
|
||
</div>
|
||
<div class="branching-actions">
|
||
<button class="btn-story btn-large btn-continue" id="continueFromBranch">
|
||
<i class="fa fa-arrow-right"></i> 继续故事
|
||
</button>
|
||
<button class="btn-story btn-medium btn-secondary" id="changeChoice" style="display: none;">
|
||
<i class="fa fa-undo"></i> 重新选择
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
|
||
<footer class="control-buttons">
|
||
<!-- 主要控制按钮 -->
|
||
<div class="main-controls">
|
||
<button class="btn-story btn-large btn-secondary" id="prevSection" title="上一段">
|
||
<img src="../asset/icon-上一段.png" alt="上一段" class="btn-icon"> 上一段
|
||
</button>
|
||
<button class="btn-story btn-large btn-voice" id="readCurrentSection" title="朗读当前段落">
|
||
<img src="../asset/朗读.png" alt="朗读" class="btn-icon">
|
||
<span class="btn-text">朗读本段</span>
|
||
</button>
|
||
<button class="btn-story btn-large btn-primary" id="nextSection" title="下一段">
|
||
下一段 <img src="../asset/icon-下一段.png" alt="下一段" class="btn-icon">
|
||
</button>
|
||
</div>
|
||
|
||
<!-- 辅助功能按钮 -->
|
||
<div class="secondary-controls">
|
||
<button class="btn-story btn-medium btn-info" id="autoPlayBtn" title="自动播放">
|
||
<img src="../asset/自动播放.png" alt="自动播放" class="btn-icon">
|
||
<span class="btn-text">自动播</span>
|
||
</button>
|
||
<button class="btn-story btn-medium btn-warning" id="bookmarkSection" title="收藏当前段落">
|
||
<img src="../asset/icon-收 藏.png" alt="收藏" class="btn-icon">
|
||
</button>
|
||
<button class="btn-story btn-medium btn-success" id="shareSection" title="分享当前段落">
|
||
<img src="../asset/icon-分享.png" alt="分享" class="btn-icon">
|
||
</button>
|
||
<button class="btn-story btn-medium btn-info" id="rateStory" title="为故事评分">
|
||
<img src="../asset/icon-pinfen.png" alt="评分" class="btn-icon">
|
||
</button>
|
||
<button class="btn-story btn-medium btn-warning" id="addNote" title="添加笔记">
|
||
<i class="fa fa-sticky-note"></i>
|
||
</button>
|
||
</div>
|
||
</footer>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 故事评分模态框 -->
|
||
<div class="rating-modal" id="ratingModal" style="display: none;">
|
||
<div class="rating-container">
|
||
<div class="rating-header">
|
||
<h3>为故事评分</h3>
|
||
<button class="rating-close" id="closeRating">
|
||
<img src="../asset/icon-关 闭.png" alt="关闭" class="close-icon">
|
||
</button>
|
||
</div>
|
||
<div class="rating-content">
|
||
<div class="rating-stars" id="ratingStars">
|
||
<span class="star" data-rating="1">★</span>
|
||
<span class="star" data-rating="2">★</span>
|
||
<span class="star" data-rating="3">★</span>
|
||
<span class="star" data-rating="4">★</span>
|
||
<span class="star" data-rating="5">★</span>
|
||
</div>
|
||
<div class="rating-feedback">
|
||
<textarea id="ratingComment" placeholder="分享你的想法..."></textarea>
|
||
</div>
|
||
<div class="rating-actions">
|
||
<button class="btn-story btn-primary" id="submitRating">提交评分</button>
|
||
<button class="btn-story btn-secondary" id="cancelRating">取消</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 笔记模态框 -->
|
||
<div class="note-modal" id="noteModal" style="display: none;">
|
||
<div class="note-container">
|
||
<div class="note-header">
|
||
<h3>添加笔记</h3>
|
||
<button class="note-close" id="closeNote">
|
||
<img src="../asset/icon-关 闭.png" alt="关闭" class="close-icon">
|
||
</button>
|
||
</div>
|
||
<div class="note-content">
|
||
<div class="note-section">
|
||
<label>笔记标题:</label>
|
||
<input type="text" id="noteTitle" placeholder="为你的笔记起个标题">
|
||
</div>
|
||
<div class="note-section">
|
||
<label>笔记内容:</label>
|
||
<textarea id="noteContent" placeholder="记录你的想法、感受或学到的东西..."></textarea>
|
||
</div>
|
||
<div class="note-actions">
|
||
<button class="btn-story btn-primary" id="saveNote">保存笔记</button>
|
||
<button class="btn-story btn-secondary" id="cancelNote">取消</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 语速控制面板 -->
|
||
<div class="speed-panel" id="speedPanel">
|
||
<div class="speed-content">
|
||
<h3>语速调节</h3>
|
||
<div class="speed-slider">
|
||
<label>语速</label>
|
||
<input type="range" id="speedSlider" min="0.5" max="2" step="0.1" value="0.8">
|
||
<span id="speedValue">0.8x</span>
|
||
</div>
|
||
<div class="speed-presets">
|
||
<button class="speed-preset" data-speed="0.7">慢速</button>
|
||
<button class="speed-preset" data-speed="0.8">正常</button>
|
||
<button class="speed-preset" data-speed="1.2">快速</button>
|
||
</div>
|
||
<button class="speed-close" id="closeSpeedPanel">完成</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 隐藏的音频元素 -->
|
||
<audio id="audioPlayer" preload="auto"></audio>
|
||
|
||
<!-- JavaScript 依赖 -->
|
||
<script src="../js/jquery-3.7.1.min.js"></script>
|
||
<script src="../js/virtualTeacher.js"></script>
|
||
<script src="../js/voiceBroadcast.js"></script>
|
||
<script src="../js/dataManager.js"></script>
|
||
<script src="../js/userManager.js"></script>
|
||
<script src="../js/aiStorytelling.js"></script>
|
||
|
||
<!-- 页面加载完成后的初始化脚本 -->
|
||
<script>
|
||
// 页面加载完成后的处理
|
||
document.addEventListener('DOMContentLoaded', function () {
|
||
// 显示加载动画
|
||
const loadingIndicator = document.getElementById('loadingIndicator');
|
||
if (loadingIndicator) {
|
||
setTimeout(() => {
|
||
loadingIndicator.style.display = 'none';
|
||
}, 2000);
|
||
}
|
||
|
||
// 平滑滚动到顶部
|
||
document.getElementById('backToTop')?.addEventListener('click', function (e) {
|
||
e.preventDefault();
|
||
window.scrollTo({ top: 0, behavior: 'smooth' });
|
||
});
|
||
|
||
// 搜索功能初始化
|
||
const searchInput = document.getElementById('storySearch');
|
||
const searchBtn = document.getElementById('searchBtn');
|
||
|
||
searchInput?.addEventListener('input', function () {
|
||
const query = this.value.trim();
|
||
if (query.length > 0) {
|
||
if (window.aiStorytelling && window.aiStorytelling.searchStories) {
|
||
window.aiStorytelling.searchStories(query);
|
||
}
|
||
} else {
|
||
// 清空搜索时显示所有故事
|
||
if (window.aiStorytelling && window.aiStorytelling.renderStoryGrid) {
|
||
window.aiStorytelling.renderStoryGrid();
|
||
}
|
||
}
|
||
});
|
||
|
||
searchBtn?.addEventListener('click', function () {
|
||
const query = searchInput?.value.trim() || '';
|
||
if (window.aiStorytelling && window.aiStorytelling.searchStories) {
|
||
window.aiStorytelling.searchStories(query);
|
||
}
|
||
});
|
||
|
||
|
||
// 清除筛选
|
||
document.getElementById('clearFilters')?.addEventListener('click', function () {
|
||
if (window.aiStorytelling && window.aiStorytelling.renderStoryGrid) {
|
||
window.aiStorytelling.renderStoryGrid();
|
||
}
|
||
});
|
||
|
||
// 故事预览功能
|
||
document.getElementById('closePreview')?.addEventListener('click', function () {
|
||
document.getElementById('storyPreviewModal').style.display = 'none';
|
||
});
|
||
|
||
document.getElementById('startFromPreview')?.addEventListener('click', function () {
|
||
const storyId = this.dataset.storyId;
|
||
if (storyId && window.aiStorytelling && window.aiStorytelling.openReader) {
|
||
document.getElementById('storyPreviewModal').style.display = 'none';
|
||
window.aiStorytelling.openReader(storyId);
|
||
}
|
||
});
|
||
|
||
// 阅读统计功能
|
||
document.getElementById('showStats')?.addEventListener('click', function () {
|
||
document.getElementById('readingStatsPanel').style.display = 'block';
|
||
if (window.aiStorytelling && window.aiStorytelling.updateReadingStats) {
|
||
window.aiStorytelling.updateReadingStats();
|
||
}
|
||
});
|
||
|
||
document.getElementById('closeStats')?.addEventListener('click', function () {
|
||
document.getElementById('readingStatsPanel').style.display = 'none';
|
||
});
|
||
|
||
// 成就系统功能
|
||
document.getElementById('showAchievements')?.addEventListener('click', function () {
|
||
document.getElementById('achievementsPanel').style.display = 'block';
|
||
if (window.aiStorytelling && window.aiStorytelling.updateAchievements) {
|
||
window.aiStorytelling.updateAchievements();
|
||
}
|
||
});
|
||
|
||
document.getElementById('closeAchievements')?.addEventListener('click', function () {
|
||
document.getElementById('achievementsPanel').style.display = 'none';
|
||
});
|
||
|
||
// 故事评分功能
|
||
document.getElementById('rateStory')?.addEventListener('click', function () {
|
||
document.getElementById('ratingModal').style.display = 'block';
|
||
});
|
||
|
||
document.getElementById('closeRating')?.addEventListener('click', function () {
|
||
document.getElementById('ratingModal').style.display = 'none';
|
||
});
|
||
|
||
document.getElementById('cancelRating')?.addEventListener('click', function () {
|
||
document.getElementById('ratingModal').style.display = 'none';
|
||
});
|
||
|
||
// 星级评分交互
|
||
const stars = document.querySelectorAll('.star');
|
||
stars.forEach(star => {
|
||
star.addEventListener('click', function () {
|
||
const rating = parseInt(this.dataset.rating);
|
||
stars.forEach((s, index) => {
|
||
s.classList.toggle('active', index < rating);
|
||
});
|
||
});
|
||
});
|
||
|
||
// 笔记功能
|
||
document.getElementById('addNote')?.addEventListener('click', function () {
|
||
document.getElementById('noteModal').style.display = 'block';
|
||
});
|
||
|
||
document.getElementById('closeNote')?.addEventListener('click', function () {
|
||
document.getElementById('noteModal').style.display = 'none';
|
||
});
|
||
|
||
document.getElementById('cancelNote')?.addEventListener('click', function () {
|
||
document.getElementById('noteModal').style.display = 'none';
|
||
});
|
||
|
||
// 键盘快捷键支持
|
||
document.addEventListener('keydown', function (e) {
|
||
// ESC键关闭模态框
|
||
if (e.key === 'Escape') {
|
||
const modals = document.querySelectorAll('[style*="display: block"]');
|
||
modals.forEach(modal => {
|
||
if (modal.id.includes('Modal') || modal.id.includes('Panel')) {
|
||
modal.style.display = 'none';
|
||
}
|
||
});
|
||
}
|
||
|
||
// 空格键播放/暂停
|
||
if (e.key === ' ' && !e.target.matches('input, textarea')) {
|
||
e.preventDefault();
|
||
const playPauseBtn = document.getElementById('playPauseBtn');
|
||
if (playPauseBtn) {
|
||
playPauseBtn.click();
|
||
}
|
||
}
|
||
});
|
||
|
||
// 离线支持检测
|
||
window.addEventListener('online', function () {
|
||
console.log('🌐 网络已连接');
|
||
if (window.aiStorytelling && window.aiStorytelling.onNetworkOnline) {
|
||
window.aiStorytelling.onNetworkOnline();
|
||
}
|
||
});
|
||
|
||
window.addEventListener('offline', function () {
|
||
console.log('📴 网络已断开');
|
||
if (window.aiStorytelling && window.aiStorytelling.onNetworkOffline) {
|
||
window.aiStorytelling.onNetworkOffline();
|
||
}
|
||
});
|
||
|
||
// 页面可见性API - 暂停/恢复语音
|
||
document.addEventListener('visibilitychange', function () {
|
||
if (document.hidden) {
|
||
// 页面隐藏时暂停语音
|
||
if (window.virtualTeacher && window.virtualTeacher.pauseSpeaking) {
|
||
window.virtualTeacher.pauseSpeaking();
|
||
}
|
||
} else {
|
||
// 页面显示时恢复语音(如果之前在播放)
|
||
if (window.virtualTeacher && window.virtualTeacher.resumeSpeaking) {
|
||
window.virtualTeacher.resumeSpeaking();
|
||
}
|
||
}
|
||
});
|
||
|
||
console.log('🎨 AI讲故事页面已加载完成');
|
||
});
|
||
</script>
|
||
</body>
|
||
|
||
</html> |