游乐游手机版
首页/AI教程/文章详情

Flutter背单词APP开发:设计稿与AI数据库设计

时间:2026-07-10 11:08
使用树莓派搭建低成本服务器后,手绘设计稿并借助AI完成数据库设计,共包含用户、单词库、单词本、关联表、学习进度、每日记录和设置七张表,其中学习进度表采用SM-2算法实现间隔复习。

上集回顾

上一篇文章提到,服务器方案已经敲定——用树莓派搭建了一台“丐中丐私有云”,每月电费仅6毛钱,比云服务商划算太多。

不过,服务器只是地基,房子的模样还没确定呢。

所以这一篇,咱们聊聊设计稿和数据库的构建过程。

设计稿:确实画了,虽然不太好看

你可能会好奇:上一回不是说AI帮忙生成了设计稿吗?直接拿来用不就好了?

答案是:AI生成的那东西,充其量算“灵感草图”,根本称不上“设计稿”。

它提供了方向,但如果真的照着做,App最终的效果恐怕会像“买家秀”——不能说多丑,只能说“AI尽力了”。

于是,还是老老实实拿起笔亲自画。

按照《Refactoring UI》这本书的思路,先在纸上画草图。

这本书AI帮我浓缩成了500字,喝杯咖啡的时间就“看完了”。
(AI:你管这叫看?这叫扫一眼。)

不过不得不承认,在纸上画草图这件事,确实很有价值。

在脑子里构思时,总觉得“嗯,这个功能得有,那个也不能少,全都安排上”。
一旦落到纸上,你就会发现:

  • 这个按钮放在哪里都不合适
  • 那个页面根本用不着
  • 这个功能和那个功能互相冲突
  • 到底想做背单词App还是想做社交软件?

草图的作用,就是把脑海里的“我觉得挺好”变成纸上的“这到底是什么玩意儿”。

这个过程虽然痛苦,但非常值得。

然后打开Figma,一页一页地画。

不敢说有多好看,但至少比AI生成的那个“赛博坦拼贴画”强了那么一点点。

有了设计稿,下一步:数据库怎么设计?

这时候就得请出老朋友——AI。

把设计稿截图发给AI,然后说:

AI输出了一大堆表结构。
接着继续追问:

就这样来回沟通了好几个回合。

在讨论的过程中,会发现很多“之前没想到”的问题。

比如:

哪个字段应该放在A表还是B表?
用户背完的单词该如何记录?
复习计划怎么安排?

这些问题如果等到写代码时再考虑,那就等着“返工三连”吧。

所以这一步,尽量多花些时间。
后期再改也不是不行,但改起来就像在行驶的车上换轮胎——能换,但很容易翻车。

数据库设计:7张表,构建一个背单词宇宙

沟通完之后,AI生成了这套数据库设计方案。

一共7张表,基本覆盖了一个背单词App的核心功能。

逐一来看(不感兴趣的可以跳过,但最好别跳,万一以后也要用呢):

1. users — 用户表

CREATE TABLE users (idBIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,nicknameVARCHAR(50)NOT NULL DEFAULT '' COMMENT '昵称',a vatarVARCHAR(500) NULL COMMENT '头像 URL',created_atDATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_atDATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '用户表';

极简风格,没有密码和邮箱——因为采用手机号一键登录,后续再补全。
头像URL预留了500个字符,足够存一张高清无码大头照。

2. words — 单词库

CREATE TABLE words (idBIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,wordVARCHAR(200)NOT NULL COMMENT '单词/词组/句型',phoneticVARCHAR(200)NULL COMMENT '音标',pos VARCHAR(20) NULL COMMENT '词性/phrase/pattern',definitionTEXTNOT NULL COMMENT '释义',example TEXTNULL COMMENT '例句',audio_url VARCHAR(500)NULL COMMENT '音频 URL',typeVARCHAR(20) NOT NULL DEFAULT 'word' COMMENT '类型: word/phrase/pattern',is_custom TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否用户自定义',created_atDATETIMENOT NULL DEFAULT CURRENT_TIMESTAMP,updated_atDATETIMENOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,UNIQUE KEY uk_word_pos (word, pos),INDEX idx_word (word)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '单词库';

这是整个系统的核心。

注意type字段——不仅要背单词,还要背词组和句型。

这也是当初吐槽“市面上App没有这个功能”的原因,
现在自己设计,想加什么就加什么。

is_custom字段表示“这个单词是否由用户自行添加”,
系统词库导入的标记为0,用户手动录入的标记为1。

3. wordbooks — 单词本

CREATE TABLE wordbooks (idBIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,user_id BIGINT UNSIGNED NOT NULL COMMENT '所属用户',nameVARCHAR(100)NOT NULL COMMENT '单词本名称',description VARCHAR(500)NULL COMMENT '描述',created_atDATETIMENOT NULL DEFAULT CURRENT_TIMESTAMP,updated_atDATETIMENOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,INDEX idx_user_id (user_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '单词本';

每个用户可以创建N个单词本,
比如“四级高频”、“考研核心”、“工作中遇到的神奇词汇”……

4. wordbook_words — 单词本与单词的关联表

CREATE TABLE wordbook_words (idBIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,wordbook_id BIGINT UNSIGNED NOT NULL COMMENT '单词本 ID',word_id BIGINT UNSIGNED NOT NULL COMMENT '单词 ID',added_atDATETIMENOT NULL DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (wordbook_id) REFERENCES wordbooks(id) ON DELETE CASCADE,FOREIGN KEY (word_id) REFERENCES words(id) ON DELETE CASCADE,UNIQUE KEY uk_wordbook_word (wordbook_id, word_id),INDEX idx_wordbook_id (wordbook_id),INDEX idx_word_id (word_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '单词本单词关联';

多对多关系,一个单词本可以包含N个单词,一个单词也能属于N个单词本。

中间表,经典设计。

5. user_word_progress — 用户单词学习进度

这张表最为复杂,也是整个App的灵魂所在。

CREATE TABLE user_word_progress (idBIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,user_id BIGINT UNSIGNED NOT NULL COMMENT '用户 ID',word_id BIGINT UNSIGNED NOT NULL COMMENT '单词 ID',statusTINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '状态: 0未学/1学习中/2已掌握',is_simple TINYINT(1)NOT NULL DEFAULT 0 COMMENT '是否标记为简单词',correct_streak INT UNSIGNEDNOT NULL DEFAULT 0 COMMENT '连续答对次数',easiness_factorDECIMAL(3,2)NOT NULL DEFAULT 2.50 COMMENT 'SM-2 容易度系数,最小1.3',review_times INT UNSIGNEDNOT NULL DEFAULT 0 COMMENT 'SM-2 成功复习次数(答错重置)',last_interval_days INT UNSIGNEDNOT NULL DEFAULT 0 COMMENT 'SM-2 上次复习间隔天数',next_review_at DATETIMENULL COMMENT '下次复习时间',source VARCHAR(20)NOT NULL DEFAULT 'new' COMMENT '来源: new/review/simple',mastered_atDATETIMENULL COMMENT '掌握时间',review_count INT UNSIGNEDNOT NULL DEFAULT 0 COMMENT '复习次数(含答错)',last_reviewed_at DATETIME NULL COMMENT '上次复习时间',created_atDATETIMENOT NULL DEFAULT CURRENT_TIMESTAMP,updated_atDATETIMENOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,FOREIGN KEY (word_id) REFERENCES words(id) ON DELETE CASCADE,UNIQUE KEY uk_user_word (user_id, word_id),INDEX idx_user_id (user_id),INDEX idx_word_id (word_id),INDEX idx_status (status),INDEX idx_next_review (next_review_at)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '用户单词学习进度';

看到easiness_factorcorrect_streakreview_times这些字段了吗?

这就是SM-2算法的标配。

可能有人会问:为什么不用更高级的SM-4、SM-5?
因为SM-2勉强能看懂,
SM-4的论文看了三遍,最后还是决定:用SM-2吧,人要对自己诚实。

6. daily_records — 每日学习记录

CREATE TABLE daily_records (idBIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,user_id BIGINT UNSIGNED NOT NULL COMMENT '用户 ID',record_date DATENOT NULL COMMENT '记录日期',learned_count INT UNSIGNEDNOT NULL DEFAULT 0 COMMENT '今日已学单词数',created_atDATETIMENOT NULL DEFAULT CURRENT_TIMESTAMP,updated_atDATETIMENOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,UNIQUE KEY uk_user_date (user_id, record_date),INDEX idx_user_id (user_id),INDEX idx_record_date (record_date)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '每日学习记录';

用于统计“今天背了多少个单词”,
方便实现打卡、热力图,以及“你今天又没背单词”的推送提醒。

7. user_settings — 用户设置

CREATE TABLE user_settings (idBIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,user_id BIGINT UNSIGNED NOT NULL COMMENT '用户 ID',wordbook_id BIGINT UNSIGNED NULL COMMENT '指定的默写单词本',daily_goalINT UNSIGNED NOT NULL DEFAULT 20COMMENT '每日目标单词数',wrong_review_timesINT UNSIGNED NOT NULL DEFAULT 5COMMENT '错词复习次数',new_words_per_day INT UNSIGNED NOT NULL DEFAULT 10COMMENT '每日新词数量',review_interval INT UNSIGNED NOT NULL DEFAULT 1COMMENT '复习间隔(天)',theme VARCHAR(20)NOT NULL DEFAULT 'light' COMMENT '主题: light / dark / auto',notification_enabledTINYINT(1)NOT NULL DEFAULT 1COMMENT '是否开启推送提醒',notification_time TIMENOT NULL DEFAULT '09:00:00' COMMENT '每日提醒时间',makeup_chances INT UNSIGNED NOT NULL DEFAULT 0COMMENT '补签机会次数',created_atDATETIMENOT NULL DEFAULT CURRENT_TIMESTAMP,updated_atDATETIMENOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,FOREIGN KEY (wordbook_id) REFERENCES wordbooks(id) ON DELETE SET NULL,UNIQUE KEY uk_user_id (user_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '用户设置表';

注意makeup_chances——补签机会。

这玩意儿是干嘛用的?

你懂的,总有那么几天忘记背单词,
然后看着日历上的“漏打卡”心疼不已。
有了补签卡,就能挽回一点尊严。

写在最后

设计稿画完了,数据库也设计好了。

这一篇没什么代码,全是规划和设计,
可能看起来没那么“硬核”,
但想说的是——

再牛逼的代码,也得从一张草稿纸开始。

你看到的这7张表,
背后是和AI反复讨论了好几个来回,
推翻重来了好几次,
才最终确定下来的。

虽然现在看起来还挺像那么回事,
但等到真正写代码的时候,
说不定又得改。

没关系,改就改呗。
反正又不是给别人打工,
自己的项目,想怎么改就怎么改。

如果你觉得有帮助,不妨亲自试试看。

来源:https://juejin.cn/post/7660092510581293094
上一篇MaxCompute原生向量能力助力多模态检索与大数据处理 下一篇CodeGraph让AI秒懂你的项目代码
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
AI如何从聊天能力进化到做事能力 Skill的实践之路
AI教程 · 2026-07-10

AI如何从聊天能力进化到做事能力 Skill的实践之路

让AI从“会聊天”转向“会做事”的关键在于Skill(技能包)。Skill由可执行代码、精确的说明书(如JSONSchema描述)及结果翻译器构成。通过精细定义参数与边界,AI能稳定调用接口完成重启服务、查询数据等操作,从而从空谈顾问变为可靠的数字员工。

零基础看懂Agent Skill MCP三层关系解读
AI教程 · 2026-07-10

零基础看懂Agent Skill MCP三层关系解读

智能体是自主执行任务的实体,技能是被封装的原子能力,MCP协议是智能体与技能间的标准化通信协议。智能体通过MCP协议发现并调用技能,灵活组合完成复杂任务。三者解耦,实现即插即用,降低了系统集成复杂度。

AI编码时代UI自动化测试智能化演进之路—中国平安人寿蔡雪
AI教程 · 2026-07-10

AI编码时代UI自动化测试智能化演进之路—中国平安人寿蔡雪

AI编码时代,UI自动化测试面临效率断层。平安人寿蔡雪基于自研“女娲”平台,分享从可视化录制到AI智能录制、基于EventDOM的智能感知与自愈机制的演进路径,实现用例创建降本、维护减负、执行提稳,推动测试工具从自动化向智能化升级。

一文讲清Agent、Skill、MCP到底什么关系:零基础小白三层拆解
AI教程 · 2026-07-10

一文讲清Agent、Skill、MCP到底什么关系:零基础小白三层拆解

Agent是自主执行任务的数字打工人,Skill为原子化能力函数,MCP是标准协议接口。Agent通过MCP发现并调用Skill,实现即插即用,解耦技能与智能体,让大模型能力安全、统一、可扩展地集成。

文生图同一提示词为何每次不同?随机性与可复现解析
AI教程 · 2026-07-10

文生图同一提示词为何每次不同?随机性与可复现解析

文生图每次结果不同源于从随机噪声开始去噪。固定种子(seed)可锁定初始噪声,但还需采样步数、引导强度、采样器、尺寸、提示词、模型等参数一致才能复现。通过控制变量法调参,先固定种子再逐一调整其他参数,可精确归因差异。