本周我们团队基础功能开发完成,拓展功能进行了一定的架构设计与初步开发。DeepSeek API调用成功,并尝试了对于Stable Diffusion进行LORA微调,对于app实现单词生成图片,故事生成四格漫画进行了初步的架构设计、技术学习与尝试。

一、功能开发

1.导航主页的开发:详细技术要点见VocabVerse背单词应用导航主页开发-CSDN博客

在主页,我们有两个区域:

topBar区: 在所有的安卓架构基本都是固定的,包含的要素就是:导航栏(或者返回键,本质也是一种导航),标题等。

mainBox区:由于初步开发界面,我们可以整点简单的:放图片或者logo、把导航放在桌面、整个通用组件。

我们把这两个区域封装在HomeContent里进行复用,content代码的设计结构如下:

HomeContent
├── Column (全屏)
│   ├── TopBar()
│   └── Box (居中)
│       └── Column
│           ├── Spacer (占位)
│           ├── Image (动态图片)
│           ├── HomeActionButtons (导航按钮)
│           └── CalendarExample (日历通用组件)

主页界面解析: 

(1) 整体布局
使用 Column 作为根布局,填充整个屏幕(fillMaxSize)。
通过 Modifier.background 设置背景色。
通过 windowInsetsPadding 避免内容被系统状态栏/导航栏遮挡。
(2)子组件
TopBar:顶部导航栏(就是顶端栏)。
动态图片显示:
用 Image 组件显示图片,并占满父容器的 3.5 份权重(weight(3.5f))。
HomeActionButtons:封装的动作按钮组,接收 navigateTo 回调以实现导航功能。
CalendarExample:日历组件(通用组件)。
(3)导航逻辑
通过 navigateTo: (String) -> Unit 回调函数,将导航控制权交给父组件(如 NavHost)。
点击 HomeActionButtons 中的按钮时,会触发 navigateTo 跳转到其他页面。

界面内Box设计:

│           ├── Image (动态图片)
│           ├── HomeActionButtons (导航按钮)
│           └── CalendarExample (日历通用组件)

关键设计亮点:

导航解耦通过 navigateTo: (String) -> Unit 回调将导航逻辑交给父组件(如 NavController),符合单一职责原则。
动态配置修改 buttonItems 列表即可增减按钮,无需改动 UI 逻辑。
无障碍支持Icon 的 contentDescription 设置为按钮标签,方便屏幕阅读器识别。
样式统一按钮尺寸、间距、字体样式均通过 Modifier 和 MaterialTheme 统一控制。

最终效果:

2.学习功能开发:

本周主要是对于单词列表、单词学习、单选练习、单词默写练习等功能的开发。详细技术要点见Vocabverse单词学习功能开发--第七周-CSDN博客

(1)设计架构如下所示:

(2)创新点设计:

状态驱动UI:根据是否最后一题、是否答对动态改变按钮功能和图标。

val lastOne = (uiState.current + 1) == uiState.totalNum
val rightActionInfo = if (uiState.learned && lastOne) {
    R.drawable.ic_start_24dp to { navigateToChoice() }  // 完成学习
} else {
    R.drawable.ic_double_arrow_right_24dp to getNextWord  // 下一题
}

协程动画控制:平滑处理分页切换,统一视觉风格,并通过底部操作栏设计便于用户使用。

InputButtonRow(
    leftButtonIconId = R.drawable.ic_submit_24dp,  // 提交/重置按钮
    rightButtonIconId = R.drawable.ic_double_arrow_right_24dp,  // 下一题/完成按钮
    playPron = { playPron(word.pronName) }  // 发音按钮
)

 设置缓存机制

sequenceDiagram
    ViewModel->>Repository: getWordList(start=0, size=10, BEGINNER)
    alt 缓存命中
        Repository-->>ViewModel: 返回缓存数据
    else 缓存未命中
        Repository->>DAO: 查询数据库
        DAO-->>Repository: 返回数据
        Repository->>Repository: 更新缓存
        Repository-->>ViewModel: 返回数据
    end

分页同步控制:触发时机:点击"下一题"时自动返回学习页(第0页)。

scope.launch {
    pagerState.animateScrollToPage(0)  // 切换到学习页
}

(3)部分页面展示:

3.帮助功能开发:

帮助功能模块设计,详细技术要点见VocabVerse背单词软件功能-帮助模块设计-CSDN博客

(1)主要架构:

数据层(ROOM数据框架+Repository):

HelpDAO-与数据库关联并与数据库中的数据进行交互

HelpRepository-获取帮助项

View层(相关UI):

HelpScreen-调用 HelpContent 渲染帮助页面

HelpContent-根据 UI 状态(加载中、成功、错误)渲染视图

HelpSection-渲染每个帮助分类下的帮助项

ViewModel 层(状态管理):

HelpViewModel通过 Repository 加载数据,并管理 UI 状态

(2)功能实现与实现方式:

二、AIGC架构设计

1.设计思路

将单独的一层负责把故事变成镜头语言。可以在领域层和表示层之间加一层“可视化故事板层”,专门处理语义理解到视觉语境的转换,即Story → Prompt。这一层将负责调用Deepseek接口,拆分故事为四个分镜描述,并将描述转换为供Stable Diffusion使用的prompt。这样一来,可视化数据板层充当了“翻译官”的角色,Deepseek写的故事Stable Diffusion看不懂,可视化数据板层作为翻译官把故事转成“画面描述”。

2.完整架构:

三、LoRA训练与推理模型搭建

1.训练模型:

(1)载入训练数据:使用数据添加器载入训练数据,支持不同分辨率。

(2)载入模型并初始化:载入Flux模型,设置统一桶分辨率,并在StringConstantMultiline模块中设置prompt。

(3)训练:使用LoRA模型迭代训练,并在每500次迭代完后预览图像。

(4)完整工作流:(2000次迭代)

2.模型推理:

只需要在标准工作流(详情见山东大学创新项目实训(2)本地部署Stable Diffusion模型-CSDN博客)的加载层和CLIP层之间添加一层LoRA层:

详细技术要点见山东大学创新项目实训(4)AIGC架构设计、LoRA训练模型搭建与可视化故事板层构想-CSDN博客

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐