手工技能学习应用


欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.1 应用简介

手工技能学习是一款手工艺术学习应用,帮助用户系统学习各种手工技能,从入门到精通,掌握一门手艺。应用涵盖编织、陶艺、木工、刺绣、剪纸、皮艺等多种手工技能,提供分级教程、视频教学、图文讲解、作品展示等功能。用户可以按步骤学习,记录学习进度,展示作品成果,获得技能认证。

应用以温暖的橙色为主色调,象征创造力与匠心精神。涵盖技能学习、教程中心、作品展示、个人中心四大模块。用户可以选择技能、观看教程、练习制作、上传作品,系统地掌握手工技能。

1.2 核心功能

功能模块功能描述实现方式
技能分类6种手工技能分类枚举定义
学习等级5级技能等级体系等级系统
教程中心分级教程内容教程列表
视频教学视频教程播放视频播放器
图文讲解详细步骤说明图文展示
学习进度记录学习进度进度追踪
作品展示上传展示作品图片上传
技能认证技能等级认证认证系统

1.3 技能分类定义

序号技能名称Emoji描述难度
1编织🧶毛线编织、钩针编织⭐⭐
2陶艺🏺陶器制作、瓷器工艺⭐⭐⭐
3木工🪵木制品制作、雕刻⭐⭐⭐⭐
4刺绣🧵传统刺绣、现代刺绣⭐⭐⭐
5剪纸✂️传统剪纸艺术⭐⭐
6皮艺👜皮革制品制作⭐⭐⭐⭐

1.4 学习等级定义

序号等级名称Emoji描述达成条件
1入门🌱了解基础知识完成5个教程
2初级📖掌握基本技能完成15个教程
3中级🎓熟练运用技能完成30个教程
4高级🏆精通技能技巧完成50个教程
5精通👑大师级水平完成80个教程

1.5 教程类型定义

序号类型名称Emoji描述时长
1视频教程📹视频教学5-30分钟
2图文教程📝图文讲解10-20页
3实践教程🔨动手实践1-3小时
4进阶教程🚀高级技巧2-4小时

1.6 作品状态定义

序号状态名称Emoji描述
1制作中🔨正在制作
2已完成制作完成
3已认证🏆通过认证

1.7 技术栈

技术领域技术选型版本要求
开发框架Flutter>= 3.0.0
编程语言Dart>= 2.17.0
设计规范Material Design 3-
状态管理setState-
数据存储SharedPreferences>= 2.0.0
视频播放video_player>= 2.7.0
图片选择image_picker>= 1.0.0
目标平台鸿蒙OS / WebAPI 21+

1.8 项目结构

lib/
└── main_craft_learning.dart
    ├── CraftLearningApp                 # 应用入口
    ├── CraftSkill                       # 技能分类枚举
    ├── SkillLevel                       # 学习等级枚举
    ├── TutorialType                     # 教程类型枚举
    ├── WorkStatus                       # 作品状态枚举
    ├── Tutorial                         # 教程模型
    ├── CraftWork                        # 作品模型
    ├── LearningProgress                 # 学习进度模型
    ├── CraftLearningHomePage           # 主页面(底部导航)
    ├── _buildSkillsPage                 # 技能页面
    ├── _buildTutorialsPage              # 教程页面
    ├── _buildWorksPage                  # 作品页面
    ├── _buildProfilePage                # 个人页面
    └── TutorialDetailPage               # 教程详情页

二、系统架构

2.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
CraftLearningHomePage

技能页

教程页

作品页

个人页

技能分类

技能详情

等级显示

教程列表

教程详情

视频播放

作品列表

作品上传

作品展示

学习统计

技能认证

设置选项

教程管理器
TutorialManager

进度管理器
ProgressManager

作品管理器
WorkManager

Tutorial
教程

CraftWork
作品

LearningProgress
学习进度

2.2 类图设计

belongs to

has

has

belongs to

tracks

has

CraftLearningApp

+Widget build()

«enumeration»

CraftSkill

+String label

+String emoji

+String description

+int difficulty

+knitting()

+pottery()

+woodworking()

+embroidery()

+paperCutting()

+leatherCraft()

«enumeration»

SkillLevel

+String label

+String emoji

+int minTutorials

+beginner()

+elementary()

+intermediate()

+advanced()

+master()

«enumeration»

TutorialType

+String label

+String emoji

+video()

+graphic()

+practice()

+advanced()

Tutorial

+String id

+String title

+CraftSkill skill

+SkillLevel level

+TutorialType type

+String description

+List<String> steps

+int duration

+int viewCount

+bool isCompleted

CraftWork

+String id

+String title

+CraftSkill skill

+String imagePath

+WorkStatus status

+DateTime createdAt

+String description

LearningProgress

+String id

+CraftSkill skill

+int completedTutorials

+SkillLevel currentLevel

+DateTime lastLearnTime

+int totalMinutes

2.3 页面导航流程

技能

教程

作品

我的

应用启动

技能页

底部导航

选择技能

浏览教程

查看作品

个人中心

查看技能详情

开始学习

教程列表

选择教程

教程详情

观看学习

标记完成

上传作品

展示作品

查看统计

技能认证

2.4 学习流程

进度管理器教程页技能页用户进度管理器教程页技能页用户选择技能显示技能详情开始学习打开教程列表显示教程选择教程显示教程内容完成学习更新进度显示进度更新

三、核心模块设计

3.1 数据模型设计

3.1.1 技能分类枚举
enum CraftSkill {
  knitting(label: '编织', emoji: '🧶', description: '毛线编织、钩针编织', difficulty: 2),
  pottery(label: '陶艺', emoji: '🏺', description: '陶器制作、瓷器工艺', difficulty: 3),
  woodworking(label: '木工', emoji: '🪵', description: '木制品制作、雕刻', difficulty: 4),
  embroidery(label: '刺绣', emoji: '🧵', description: '传统刺绣、现代刺绣', difficulty: 3),
  paperCutting(label: '剪纸', emoji: '✂️', description: '传统剪纸艺术', difficulty: 2),
  leatherCraft(label: '皮艺', emoji: '👜', description: '皮革制品制作', difficulty: 4);

  final String label;
  final String emoji;
  final String description;
  final int difficulty;
  const CraftSkill({
    required this.label,
    required this.emoji,
    required this.description,
    required this.difficulty,
  });
}
3.1.2 学习等级枚举
enum SkillLevel {
  beginner(label: '入门', emoji: '🌱', minTutorials: 5),
  elementary(label: '初级', emoji: '📖', minTutorials: 15),
  intermediate(label: '中级', emoji: '🎓', minTutorials: 30),
  advanced(label: '高级', emoji: '🏆', minTutorials: 50),
  master(label: '精通', emoji: '👑', minTutorials: 80);

  final String label;
  final String emoji;
  final int minTutorials;
  const SkillLevel({
    required this.label,
    required this.emoji,
    required this.minTutorials,
  });
}
3.1.3 教程模型
class Tutorial {
  final String id;              // 教程ID
  final String title;           // 标题
  final CraftSkill skill;       // 技能分类
  final SkillLevel level;       // 难度等级
  final TutorialType type;      // 教程类型
  final String description;     // 描述
  final List<String> steps;     // 步骤列表
  final int duration;           // 时长(分钟)
  final int viewCount;          // 浏览次数
  final bool isCompleted;       // 是否完成

  const Tutorial({
    required this.id,
    required this.title,
    required this.skill,
    required this.level,
    required this.type,
    required this.description,
    required this.steps,
    required this.duration,
    this.viewCount = 0,
    this.isCompleted = false,
  });
}
3.1.4 作品模型
class CraftWork {
  final String id;              // 作品ID
  final String title;           // 作品标题
  final CraftSkill skill;       // 技能分类
  final String imagePath;       // 图片路径
  final WorkStatus status;      // 作品状态
  final DateTime createdAt;     // 创建时间
  final String description;     // 作品描述

  const CraftWork({
    required this.id,
    required this.title,
    required this.skill,
    required this.imagePath,
    required this.status,
    required this.createdAt,
    required this.description,
  });
}
3.1.5 学习进度模型
class LearningProgress {
  final String id;              // 进度ID
  final CraftSkill skill;       // 技能分类
  final int completedTutorials; // 完成教程数
  final SkillLevel currentLevel;// 当前等级
  final DateTime lastLearnTime; // 最后学习时间
  final int totalMinutes;       // 总学习时长

  const LearningProgress({
    required this.id,
    required this.skill,
    required this.completedTutorials,
    required this.currentLevel,
    required this.lastLearnTime,
    required this.totalMinutes,
  });
}
3.1.6 技能学习分布
35%25%20%10%6%4%技能学习分布示例编织陶艺刺绣木工剪纸皮艺

3.2 页面结构设计

3.2.1 主页面布局

CraftLearningHomePage

IndexedStack

技能页

教程页

作品页

个人页

NavigationBar

技能 Tab

教程 Tab

作品 Tab

我的 Tab

3.2.2 技能页结构

技能页

SliverAppBar

技能分类卡片

学习进度

推荐教程

技能图标

技能名称

难度等级

学习人数

总进度条

各技能进度

热门教程

最新教程

3.2.3 教程页结构

教程页

SliverAppBar

筛选器

教程列表

技能筛选

等级筛选

类型筛选

教程卡片

教程标题

技能标签

难度等级

时长信息

完成状态

3.2.4 作品页结构

作品页

SliverAppBar

作品统计

作品网格

上传按钮

总作品数

认证作品

进行中作品

作品卡片

作品图片

作品标题

状态标签

3.3 学习进度逻辑

完成教程

更新完成数

计算新等级

等级提升?

显示升级提示

更新进度条

解锁新教程

保存进度

更新统计

检查成就

3.4 作品上传逻辑

点击上传

选择图片

填写信息

信息完整?

保存作品

提示补充

更新列表

申请认证?

提交认证

完成上传

等待审核


四、UI设计规范

4.1 配色方案

应用以温暖的橙色为主色调,象征创造力与匠心精神:

颜色类型色值用途
主色#FF9800 (Orange)导航、主题元素
辅助色#FFA726技能页面
第三色#FFB74D教程页面
强调色#FFCC80作品页面
背景色#FAFAFA页面背景
卡片背景#FFFFFF信息卡片
成功色#4CAF50完成状态
警告色#FF9800进行中状态

4.2 技能配色

技能色值视觉效果
编织#E91E63粉红色
陶艺#795548棕色
木工#8D6E63木色
刺绣#9C27B0紫色
剪纸#F44336红色
皮艺#6D4C41皮革色

4.3 字体规范

元素字号字重颜色
页面标题24pxBold主色
技能名称18pxBold#000000
教程标题16pxBold#000000
步骤文字14pxRegular#333333
描述文字12pxRegular#666666
统计数字20pxBold白色

4.4 组件规范

4.4.1 技能卡片
┌─────────────────────────────────────┐
│  🧶 编织                              │
│                                     │
│  毛线编织、钩针编织                    │
│  难度: ⭐⭐                           │
│                                     │
│  已学习: 15个教程                     │
│  ━━━━━━━━━━━●━━━━━━━━━  30%        │
│                                     │
│  [开始学习]                           │
└─────────────────────────────────────┘
4.4.2 教程卡片
┌─────────────────────────────────────┐
│  📹 基础编织入门                       │
│                                     │
│  🧶 编织 · 🌱 入门 · 15分钟            │
│                                     │
│  学习毛线编织的基本技巧...              │
│                                     │
│  浏览 1234次         ✅ 已完成        │
└─────────────────────────────────────┘
4.4.3 作品卡片
┌─────────────────────────────────────┐
│  ┌─────────────────────────────┐   │
│  │                             │   │
│  │         作品图片             │   │
│  │                             │   │
│  └─────────────────────────────┘   │
│                                     │
│  我的第一个编织作品                    │
│  🧶 编织 · ✅ 已完成                  │
│                                     │
│  2024-01-15                         │
└─────────────────────────────────────┘
4.4.4 学习进度卡片
┌─────────────────────────────────────┐
│  📊 学习进度                          │
│                                     │
│  总学习时长: 120小时                   │
│  完成教程: 45个                        │
│  当前等级: 🎓 中级                     │
│                                     │
│  距离下一级还需: 5个教程                │
│  ━━━━━━━━━━━●━━━━━━━━━  90%        │
└─────────────────────────────────────┘
4.4.5 教程详情页
┌─────────────────────────────────────┐
│  基础编织入门                          │
│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  │
│  🧶 编织 · 🌱 入门 · 📹 视频教程        │
│                                     │
│  📝 教程简介                          │
│  学习毛线编织的基本技巧,包括...        │
│                                     │
│  📋 学习步骤                          │
│  1. 准备材料                          │
│  2. 学习基本针法                       │
│  3. 练习简单图案                       │
│                                     │
│  [标记完成]                           │
└─────────────────────────────────────┘

五、核心功能实现

5.1 技能数据初始化

final List<Tutorial> _tutorials = [
  Tutorial(
    id: '1',
    title: '基础编织入门',
    skill: CraftSkill.knitting,
    level: SkillLevel.beginner,
    type: TutorialType.video,
    description: '学习毛线编织的基本技巧,包括起针、收针等基础操作。',
    steps: [
      '准备毛线和编织针',
      '学习起针方法',
      '练习基本针法',
      '完成简单作品',
    ],
    duration: 15,
    viewCount: 1234,
  ),
  // ... 更多教程
];

5.2 学习进度计算

class ProgressCalculator {
  static SkillLevel calculateLevel(int completedTutorials) {
    if (completedTutorials >= 80) return SkillLevel.master;
    if (completedTutorials >= 50) return SkillLevel.advanced;
    if (completedTutorials >= 30) return SkillLevel.intermediate;
    if (completedTutorials >= 15) return SkillLevel.elementary;
    return SkillLevel.beginner;
  }

  static double calculateProgress(int completed, int total) {
    if (total == 0) return 0;
    return (completed / total).clamp(0.0, 1.0);
  }
}

5.3 教程完成处理

void _completeTutorial(String tutorialId) {
  setState(() {
    final index = _tutorials.indexWhere((t) => t.id == tutorialId);
    if (index != -1) {
      _tutorials[index] = Tutorial(
        id: _tutorials[index].id,
        title: _tutorials[index].title,
        skill: _tutorials[index].skill,
        level: _tutorials[index].level,
        type: _tutorials[index].type,
        description: _tutorials[index].description,
        steps: _tutorials[index].steps,
        duration: _tutorials[index].duration,
        viewCount: _tutorials[index].viewCount,
        isCompleted: true,
      );

      _completedTutorials++;
      _currentLevel = ProgressCalculator.calculateLevel(_completedTutorials);

      if (_completedTutorials == 15 ||
          _completedTutorials == 30 ||
          _completedTutorials == 50 ||
          _completedTutorials == 80) {
        _showLevelUpDialog();
      }
    }
  });
}

5.4 作品上传实现

void _uploadWork(String title, CraftSkill skill, String description) {
  final work = CraftWork(
    id: 'work_${DateTime.now().millisecondsSinceEpoch}',
    title: title,
    skill: skill,
    imagePath: 'placeholder.jpg',
    status: WorkStatus.completed,
    createdAt: DateTime.now(),
    description: description,
  );

  setState(() {
    _works.insert(0, work);
  });
}

5.5 筛选功能实现

void _filterTutorials() {
  setState(() {
    _filteredTutorials = _tutorials.where((tutorial) {
      bool matchSkill = _selectedSkill == null || tutorial.skill == _selectedSkill;
      bool matchLevel = _selectedLevel == null || tutorial.level == _selectedLevel;
      bool matchType = _selectedType == null || tutorial.type == _selectedType;
      return matchSkill && matchLevel && matchType;
    }).toList();
  });
}

六、交互设计

6.1 学习流程

详情页教程页技能页用户详情页教程页技能页用户选择技能显示技能详情点击学习打开教程列表显示教程选择教程打开详情显示教程内容完成学习更新进度显示完成提示

6.2 作品上传流程

点击上传

选择图片

填写信息

信息完整?

保存作品

提示补充

更新列表

申请认证?

提交认证

完成上传

等待审核

6.3 等级提升流程

完成15个教程

完成30个教程

完成50个教程

完成80个教程

入门

初级

中级

高级

精通


七、扩展功能规划

7.1 后续版本规划

2024-01-072024-01-142024-01-212024-01-282024-02-042024-02-112024-02-182024-02-252024-03-032024-03-102024-03-172024-03-242024-03-31基础UI框架 技能分类系统 教程管理功能 视频播放功能 作品上传功能 进度追踪系统 社区交流功能 在线直播教学 技能认证系统 V1.0 基础版本V1.1 增强版本V1.2 进阶版本手工技能学习应用开发计划

7.2 功能扩展建议

7.2.1 社区交流

社区功能:

  • 作品分享交流
  • 评论点赞互动
  • 学习心得分享
  • 技艺交流群组
7.2.2 在线直播

直播功能:

  • 名师直播教学
  • 实时互动答疑
  • 直播回放
  • 课程预约
7.2.3 技能认证

认证功能:

  • 作品审核认证
  • 技能等级证书
  • 认证标识展示
  • 专业资质认证

八、注意事项

8.1 开发注意事项

  1. 视频播放:确保视频流畅播放,支持多种格式

  2. 图片上传:支持图片压缩和裁剪功能

  3. 进度保存:学习进度需及时保存,避免丢失

  4. 离线学习:支持教程离线下载学习

  5. 内容审核:用户上传内容需审核机制

8.2 常见问题

问题原因解决方案
视频加载慢网络问题提供多清晰度选择
图片上传失败文件过大自动压缩图片
进度丢失未及时保存增加自动保存
教程显示异常数据格式错误数据验证处理
筛选无结果条件过严提供默认选项

8.3 使用技巧

🎨 手工技能学习技巧 🎨

学习方法

  • 从基础开始,循序渐进
  • 多看教程,勤加练习
  • 记录学习心得
  • 展示作品成果

技能提升

  • 完成每个教程
  • 尝试不同难度
  • 参与社区交流
  • 申请技能认证

作品创作

  • 选择喜欢的技能
  • 准备充足材料
  • 耐心细致制作
  • 分享创作过程

九、运行说明

9.1 环境要求

环境版本要求
Flutter SDK>= 3.0.0
Dart SDK>= 2.17.0
鸿蒙OSAPI 21+
Web浏览器Chrome 90+

9.2 运行命令

# 查看可用设备
flutter devices

# 运行到Web服务器
flutter run -d web-server -t lib/main_craft_learning.dart --web-port 8154

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_craft_learning.dart

# 代码分析
flutter analyze lib/main_craft_learning.dart

十、总结

手工技能学习应用通过技能学习、教程中心、作品展示、个人中心四大模块,为用户提供了一个系统的手工技能学习平台。应用涵盖编织、陶艺、木工、刺绣、剪纸、皮艺等多种手工技能,提供分级教程、视频教学、图文讲解、作品展示等功能。

核心功能涵盖技能分类、教程学习、进度追踪、作品展示四大模块。技能分类从编织到皮艺,覆盖多种传统和现代手工艺;教程学习支持视频、图文、实践等多种形式;进度追踪记录学习历程和等级提升;作品展示让用户分享创作成果。

应用采用 Material Design 3 设计规范,以温暖的橙色为主色调,象征创造力与匠心精神。通过本应用,希望能够帮助用户系统学习手工技能,传承传统工艺,培养匠心精神,掌握一门手艺。

手工技能学习——传承匠心,掌握技艺


Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐