欢迎加入开源鸿蒙PC社区:
https://harmonypc.csdn.net/

atomgit仓库地址: https://atomgit.com/ai_lingshi/sanguorenwuzhuanji
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、项目概述

三国演义人物志是一款展示三国时期主要人物信息的百科应用,包含48位经典人物的详细资料。该应用采用现代化的深色主题设计,提供人物筛选、搜索、详情查看等功能。

1.1 系统架构设计

┌─────────────────────────────────────────────────────────────┐
│                   三国演义人物志应用                        │
├─────────────────────────────────────────────────────────────┤
│                    UI层 (index.html)                        │
│  ┌───────────┬───────────┬───────────┬───────────┐        │
│  │ 人物筛选  │ 人物卡片  │ 详情弹窗  │ 故事展示  │        │
│  └───────────┴───────────┴───────────┴───────────┘        │
├─────────────────────────────────────────────────────────────┤
│                  业务逻辑层 (app.js)                         │
│  ┌────────────┬────────────┬────────────┬────────────┐     │
│  │ 数据管理   │ 筛选搜索   │ 详情展示   │ 故事渲染   │     │
│  └────────────┴────────────┴────────────┴────────────┘     │
├─────────────────────────────────────────────────────────────┤
│                    数据层 (内置数据)                        │
│  ┌──────────────────────────────────────────────────────┐  │
│  │ 人物数据 · 故事数据 · 势力数据                       │  │
│  └──────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────┘

1.2 功能模块

模块 功能描述 技术要点
人物展示 48位三国人物卡片展示 响应式网格布局
势力筛选 按蜀汉/魏国/吴国/其他筛选 按钮切换、数据过滤
人物搜索 按姓名搜索人物 实时搜索、模糊匹配
详情弹窗 人物详细信息展示 模态框、动态数据填充
经典故事 三国经典故事介绍 卡片列表渲染
势力分布 三国势力地图展示 CSS定位布局

二、数据模型设计

2.1 人物数据结构

{
    id: 1,
    name: '刘备',
    style: '玄德',
    faction: 'shu',
    birthplace: '涿郡涿县',
    position: '昭烈皇帝',
    weapon: '双股剑',
    force: 75,
    intelligence: 80,
    leadership: 95,
    politics: 85,
    description: '刘备,字玄德,蜀汉开国皇帝...',
    stories: ['桃园三结义', '三顾茅庐', '白帝城托孤'],
    relations: ['关羽', '张飞', '诸葛亮', '刘禅']
}

2.2 数据字段说明

字段 类型 说明
id number 唯一标识
name string 人物姓名
style string
faction string 势力(shu/wei/wu/other)
birthplace string 籍贯
position string 官职
weapon string 使用武器
force number 武力值(0-100)
intelligence number 智力值(0-100)
leadership number 统率值(0-100)
politics number 政治值(0-100)
description string 人物简介
stories array 相关故事列表
relations array 人物关系列表

2.3 势力编码表

编码 势力名称 颜色标识
shu 蜀汉 🔴 红色
wei 魏国 🔵 蓝色
wu 吴国 🟢 绿色
other 其他 ⚪ 灰色

三、核心代码实现详解

3.1 应用类设计

class ThreeKingdomsApp {
    constructor() {
        this.characters = this.getCharactersData();
        this.stories = this.getStoriesData();
        this.currentFaction = 'all';
        this.searchQuery = '';
        this.init();
    }

    init() {
        this.initDOMReferences();
        this.bindEventListeners();
        this.renderCharacters();
        this.renderStories();
    }
}

初始化流程:

  1. 加载人物数据和故事数据
  2. 设置默认筛选条件
  3. 初始化DOM引用
  4. 绑定事件监听器
  5. 渲染人物列表和故事列表

3.2 人物数据加载

getCharactersData() {
    return [
        {
            id: 1,
            name: '刘备',
            style: '玄德',
            faction: 'shu',
            birthplace: '涿郡涿县',
            position: '昭烈皇帝',
            weapon: '双股剑',
            force: 75,
            intelligence: 80,
            leadership: 95,
            politics: 85,
            description: '刘备,字玄德,蜀汉开国皇帝...',
            stories: ['桃园三结义', '三顾茅庐', '白帝城托孤'],
            relations: ['关羽', '张飞', '诸葛亮', '刘禅']
        },
        // ... 其他47位人物
    ];
}

数据特点:

  • 包含48位三国时期主要人物
  • 涵盖蜀汉、魏国、吴国三大势力及其他群雄
  • 每个人物包含完整的属性数据

3.3 人物卡片渲染

renderCharacters() {
    let filtered = this.characters;

    if (this.currentFaction !== 'all') {
        filtered = filtered.filter(c => c.faction === this.currentFaction);
    }

    if (this.searchQuery) {
        const query = this.searchQuery.toLowerCase();
        filtered = filtered.filter(c => 
            c.name.toLowerCase().includes(query) ||
            c.style.toLowerCase().includes(query)
        );
    }

    if (filtered.length === 0) {
        this.charactersGrid.innerHTML = `<p style="text-align: center; color: rgba(255,255,255,0.5); padding: 40px;">未找到匹配的人物</p>`;
        return;
    }

    this.charactersGrid.innerHTML = filtered.map(character => {
        return `
            <div class="character-card ${character.faction}" onclick="app.showCharacterDetail(${character.id})">
                <div class="character-header">
                    <div class="character-icon">👤</div>
                    <div class="character-name">
                        <h3>${character.name}</h3>
                        <span class="faction-badge ${character.faction}">${this.getFactionName(character.faction)}</span>
                    </div>
                </div>
                <div class="character-stats">
                    <div class="stat-item">
                        <span class="label">武力</span>
                        <span class="value ${this.getStatClass(character.force)}">${character.force}</span>
                    </div>
                    <div class="stat-item">
                        <span class="label">智力</span>
                        <span class="value ${this.getStatClass(character.intelligence)}">${character.intelligence}</span>
                    </div>
                    <div class="stat-item">
                        <span class="label">统率</span>
                        <span class="value ${this.getStatClass(character.leadership)}">${character.leadership}</span>
                    </div>
                    <div class="stat-item">
                        <span class="label">政治</span>
                        <span class="value ${this.getStatClass(character.politics)}">${character.politics}</span>
                    </div>
                </div>
            </div>
        `;
    }).join('');
}

渲染流程:

  1. 应用筛选条件(势力筛选)
  2. 应用搜索条件(姓名/字搜索)
  3. 处理空结果情况
  4. 生成人物卡片HTML

3.4 属性值颜色编码

getStatClass(value) {
    if (value >= 85) return 'high';
    if (value >= 60) return 'medium';
    return 'low';
}

颜色等级划分:

  • 高(85-100):绿色
  • 中(60-84):黄色
  • 低(0-59):红色

3.5 人物详情弹窗

showCharacterDetail(id) {
    const character = this.characters.find(c => c.id === id);
    if (!character) return;

    this.modalIcon.textContent = '👤';
    this.modalName.textContent = character.name;
    this.modalFaction.textContent = this.getFactionName(character.faction);
    this.modalFaction.className = `faction-badge ${character.faction}`;
    this.modalStyle.textContent = character.style;
    this.modalBirthplace.textContent = character.birthplace;
    this.modalPosition.textContent = character.position;
    this.modalWeapon.textContent = character.weapon;
    
    this.modalForce.style.width = `${character.force}%`;
    this.modalIntelligence.style.width = `${character.intelligence}%`;
    this.modalLeadership.style.width = `${character.leadership}%`;
    this.modalPolitics.style.width = `${character.politics}%`;
    
    this.modalDescription.textContent = character.description;
    
    this.modalStories.innerHTML = character.stories.map(story => 
        `<li>${story}</li>`
    ).join('');
    
    this.modalRelations.innerHTML = character.relations.map(relation => 
        `<span class="relation-tag">${relation}</span>`
    ).join('');
    
    this.modalOverlay.style.display = 'flex';
}

弹窗内容:

  • 人物基本信息(姓名、字、籍贯、官职、武器)
  • 属性进度条(武力、智力、统率、政治)
  • 人物简介
  • 相关故事列表
  • 人物关系标签

3.6 势力筛选功能

this.filterButtons.forEach(btn => {
    btn.addEventListener('click', (e) => {
        this.filterButtons.forEach(b => b.classList.remove('active'));
        e.target.classList.add('active');
        this.currentFaction = e.target.dataset.faction;
        this.renderCharacters();
    });
});

筛选逻辑:

  1. 移除所有按钮的active状态
  2. 添加当前按钮的active状态
  3. 更新当前筛选的势力
  4. 重新渲染人物列表

3.7 人物搜索功能

this.searchBtn.addEventListener('click', () => {
    this.searchQuery = this.searchInput.value.trim();
    this.renderCharacters();
});

this.searchInput.addEventListener('keyup', (e) => {
    if (e.key === 'Enter') {
        this.searchQuery = this.searchInput.value.trim();
        this.renderCharacters();
    }
});

搜索特性:

  • 支持点击搜索按钮
  • 支持回车键搜索
  • 支持按姓名或字搜索
  • 支持模糊匹配

3.8 故事数据加载

getStoriesData() {
    return [
        {
            id: 1,
            title: '桃园三结义',
            description: '刘备、关羽、张飞在桃园结拜为异姓兄弟...'
        },
        // ... 其他故事
    ];
}

故事卡片渲染:

renderStories() {
    this.storiesGrid.innerHTML = this.stories.map(story => {
        return `
            <div class="story-card">
                <h3>${story.title}</h3>
                <p>${story.description}</p>
            </div>
        `;
    }).join('');
}

四、UI设计与样式

4.1 深色主题背景

body {
    background: linear-gradient(135deg, #1a1a2e 0%, #16213e 30%, #0f3460 60%, #1a1a2e 100%);
}

配色方案:

  • 深蓝紫色渐变背景
  • 营造历史厚重感
  • 适合三国主题

4.2 人物卡片样式

.character-card {
    background: rgba(255, 255, 255, 0.05);
    border-radius: 16px;
    padding: 20px;
    cursor: pointer;
    transition: all 0.3s ease;
    border: 1px solid rgba(255, 255, 255, 0.1);
}

.character-card:hover {
    transform: translateY(-5px);
    background: rgba(255, 255, 255, 0.1);
}

.character-card.shu {
    border-left: 4px solid #dc143c;
}

.character-card.wei {
    border-left: 4px solid #4a90d9;
}

.character-card.wu {
    border-left: 4px solid #2ecc71;
}

设计特点:

  • 半透明背景卡片
  • 左侧势力颜色标识条
  • 悬停上移动画效果

4.3 属性进度条样式

.stat-bar {
    flex: 1;
    height: 12px;
    background: rgba(255, 255, 255, 0.1);
    border-radius: 6px;
    overflow: hidden;
}

.stat-fill {
    height: 100%;
    border-radius: 6px;
    background: linear-gradient(90deg, #e74c3c 0%, #f39c12 100%);
}

.stat-fill.intelligence {
    background: linear-gradient(90deg, #9b59b6 0%, #8e44ad 100%);
}

.stat-fill.leadership {
    background: linear-gradient(90deg, #3498db 0%, #2980b9 100%);
}

.stat-fill.politics {
    background: linear-gradient(90deg, #1abc9c 0%, #16a085 100%);
}

进度条配色:

  • 武力:红橙渐变
  • 智力:紫色渐变
  • 统率:蓝色渐变
  • 政治:青绿渐变

4.4 势力分布图

.faction-area.wei {
    top: 20px;
    left: 5%;
    width: 40%;
    height: 70%;
    background: linear-gradient(135deg, rgba(74, 144, 217, 0.3) 0%, rgba(53, 122, 189, 0.2) 100%);
}

.faction-area.shu {
    top: 30%;
    right: 5%;
    width: 35%;
    height: 60%;
    background: linear-gradient(135deg, rgba(220, 20, 60, 0.3) 0%, rgba(255, 68, 68, 0.2) 100%);
}

.faction-area.wu {
    bottom: 20px;
    left: 35%;
    width: 30%;
    height: 40%;
    background: linear-gradient(135deg, rgba(46, 204, 113, 0.3) 0%, rgba(39, 174, 96, 0.2) 100%);
}

布局特点:

  • 魏国在左上(北方)
  • 蜀汉在右上(西川)
  • 吴国在下方(江东)

4.5 响应式设计

@media (max-width: 768px) {
    .characters-grid {
        grid-template-columns: 1fr;
    }
    
    .faction-area {
        position: static;
        width: 100% !important;
        height: auto !important;
    }
}

@media (max-width: 480px) {
    .stats-section {
        grid-template-columns: repeat(2, 1fr);
    }
    
    .search-section {
        flex-direction: column;
    }
}

适配策略:

  • 桌面端:多列网格布局
  • 平板端:单列布局
  • 移动端:紧凑布局

五、功能扩展建议

5.1 人物对比功能

compareCharacters(ids) {
    const characters = ids.map(id => this.characters.find(c => c.id === id));
    
    // 生成对比表格
    const html = `
        <table>
            <tr>
                <th>属性</th>
                ${characters.map(c => `<th>${c.name}</th>`).join('')}
            </tr>
            <tr>
                <td>武力</td>
                ${characters.map(c => `<td>${c.force}</td>`).join('')}
            </tr>
            <!-- 其他属性... -->
        </table>
    `;
    
    this.compareModal.innerHTML = html;
    this.compareModal.style.display = 'flex';
}

5.2 人物收藏功能

toggleFavorite(id) {
    if (!this.favorites) {
        this.favorites = [];
    }
    
    const index = this.favorites.indexOf(id);
    if (index >= 0) {
        this.favorites.splice(index, 1);
    } else {
        this.favorites.push(id);
    }
    
    localStorage.setItem('threeKingdomsFavorites', JSON.stringify(this.favorites));
}

5.3 故事详情页

showStoryDetail(id) {
    const story = this.stories.find(s => s.id === id);
    // 显示故事详细内容、相关人物、历史背景等
}

六、总结

三国演义人物志应用通过完整的功能实现,为用户提供了一个全面了解三国人物的平台。核心功能包括:

  1. 人物展示:48位三国人物卡片展示
  2. 势力筛选:按蜀汉/魏国/吴国/其他筛选
  3. 人物搜索:按姓名或字搜索
  4. 详情查看:人物完整信息展示
  5. 经典故事:16个三国故事介绍
  6. 势力分布:三国势力地图

技术亮点

  • 数据驱动设计:所有人物和故事数据均采用数据驱动
  • 响应式布局:适配各种设备尺寸
  • 深色主题:营造历史厚重感
  • 交互丰富:悬停效果、弹窗动画、进度条动画

未来扩展方向

  1. 人物对比:支持多人对比
  2. 收藏功能:收藏喜欢的人物
  3. 故事详情:详细的故事介绍
  4. 历史时间线:三国历史时间线展示
  5. 人物关系图:可视化人物关系
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐