前端
快来分享你的内容吧~
- AI 答题应用平台项目后端拼接 userPrompt 问题Bug 描述前端提交的答题答案只有选项字母(A/B/C/D),后端组装给 AI 的 prompt 也只传了题干和用户选的字母,没带选项具体文字,但 AI 输出的分析却和实际选项内容对应上了。请问这是 AI 靠常识脑补的,还是我哪里漏传了选项信息?用户答案截图详细完整的报错信息和错误日志,请勿使用模糊不清、缺斤少两的截图...查看全文leikooo:是的,没有提供完整的上下文,这个是一个小 bug,debug 可以发现发送给 AI 的信息是:可以修复一下,我本地修改好了你可以参考一下:https://github.com/lieeew/yudada/commit/d2a858313dcae6dd29a8d02b665c7f234d66972d修改好之后 debug 的信息,如下:
- 4 天前·Java后端
- 08-06 17:26绘意Reverie - 个人博客系统-开源 各位鱼友,有人加友链吗,不过我域名还没下来 在线链接 http://120.48.82.119/(个人博客) 域名ICP还没下来 欢迎联系:webziyuan.top 开源链接:仓库地址 开源需要的话点点start 参考封面: !在这里插入图片描述 !在这里插入图片描述 !在这里插入图片描述 !在这里插入图片描述 一个基于前后端分离架构的个人博客系统,支查看全文加油鸭:开源博客系统做得真扎实!前后端分离清晰,技术栈前沿,还带Live2D和ECharts,细节满分~期待域名上线!582分享
- 08-03 10:16·前端开发长期依赖 AI 写代码会出现编程技能萎缩,也就是 AI Atrophy。作者总结五大退化问题:排错、读代码、工程搭建、原生 API 记忆、方案设计能力下滑,并整理了自测清单。AI 是效率工具而非替代品,建议每周脱离 AI 手动编码,维持编程基本功。查看全文sunshine:我感觉自己现在也处于这样的状态。我并不是想劝大家节制使用 AI,恰恰相反,我非常鼓励大家主动去拥抱 AI。放在当下这个时代,主动借助 AI 去拓宽自己的知识边界、提升自己的技能,是一件非常重要的事情。只有不断学习、不断成长,我们未来才能走得更稳、更远。但真正重要的,不是成为依赖 AI 的人,而是成为能够驾驭 AI、让 AI 为自己创造价值的人。让 AI 成为放大能力的工具,而不是替代思考的拐杖。在261116分享
- 07-27 14:22·前端开发最近我给一些前端方向的实习生做内推,看了不少简历。投递里常能看出一种预设,找实习只要把前端做熟,页面和接口能啃下来,似乎就踩对了主线。初筛读多了会有另一种感受,当业务和岗位已经大量贴上大模型、RAG 或 Agent 时,纯前端技术栈写得再工整,也很难在一叠写法雷同的简历里单独把人托起来。 我想写的不是简历技巧,评审更常问的是,你有没有把智能接进一条可维护、可观测、也能和人协作的链路,还是只在项目名查看全文加油鸭:太棒了!这篇对Agent系统本质的剖析深刻又务实,把工程落地的骨架讲得清清楚楚——不是炫技,而是真正在构建可交付、可维护、可演进的智能系统。为你点赞!333分享
- 07-27 12:46·外卖员1.1 项目概述 这是一个将词汇学习、AI 辅助与学习复盘结合起来的英语学习平台。平台以英语单词学习为核心,提供词库查询、课程选择、单词练习、智能复习、AI 对话以及学习报告等功能。用户既可以通过词库和全局搜索快速查找单词,也可以选择适合自己的课程进行系统学习。项目并不是简单地把词典、背单词和 AI 对话放在同一个网站中,而是希望将这些功能连接起来,形成一套从学习、练习到复盘的完整流程。 项目主要查看全文加油鸭:这个英语学习平台的设计太棒了!将词汇学习、AI辅助与复盘闭环深度融合,真正做到了以用户掌握效果为中心。553分享
- 07-26 15:02·后端开发Django 的设计哲学 Django 的设计哲学是一组指导框架演进与开发者使用方式的核心原则,源自官方文档《Design Philosophies》。这些原则决定了 Django 为何"重"、为何"显式"、为何"安全"。 一、六大核心哲学 松耦合(Loose Coupling) 核心思想:各层(Model / View / Template / URL)之间尽量不互相依赖,可独立替换。 | 体现查看全文加油鸭:这篇 Django 设计哲学总结得太扎实了!逻辑清晰、对比精准、代码示例到位,看得出下了真功夫钻研和梳理。为你点赞!332分享
- 07-26 15:01·后端开发Django 是什么 Django 是一个基于 Python 的高级、免费开源的 Web 框架,遵循 MVT(Model-View-Template)架构,由 Adrian Holovaty 和 Simon Willison 于 2003 年创建,2005 年正式开源,由 Django Software Foundation(DSF)维护。 一、核心定位 | 维度 | 说明 | ||| | 语言查看全文加油鸭:这份 Django 介绍太全面了!结构清晰、要点精准,连 MVT 和对比表格都讲得透彻,绝对是新手入门的宝藏笔记~231分享
- 07-23 15:5324届二本毕业后一直在老家(四线城市)一个小公司呆了2年时间,想转AI全栈,如果本地找不到有计划到厦门去,推荐学python还是java查看全文凌一:想走ai应用,学python想走传统业务,学java其实语言一通百通,不用纠结330分享
AI 答题应用平台项目后端拼接 userPrompt 问题
### Bug 描述 前端提交的答题答案只有选项字母(A/B/C/D),后端组装给 AI 的 prompt 也只传了题干和用户选的字母,没带选项具体文字,但 AI 输出的分析却和实际选项内容对应上了。请问这是 AI 靠常识脑补的,还是我哪里漏传了选项信息? ### 用户答案截图 详细完整的报错信息和错误日志,请勿使用模糊不清、缺斤少两的截图  
也是利用vibe coding ,一行代码没改过做出一个小程序了
# 也是利用vide coding ,一行代码没改过做出一个小程序了 前段时间,我用 AI 做了一个前额叶训练小游戏的网页版。最初只是想把自己感兴趣的几个训练游戏放到一起,没想到越做越多,最后凑出了十几个项目。 网页版现在还在线,有兴趣可以直接玩:[前额叶训练小游戏网页版](https://cosmic-shortbread-3c93aa.netlify.app/)。 做完网页版以后,我又冒出一个想法:既然游戏已经有了,能不能干脆做成微信小程序?这样不用记网址,打开微信就能练一会儿。再往后想,我又觉得只放一堆小游戏有点单薄,最好还能有首次测评、每日训练、个人档案、历史趋势这些东西。 就这样,原本只是“把网页版搬到小程序里”,慢慢变成了一个比预想大不少的项目。 比较特别的是,整个过程中我没有亲手改过一行代码。不是说我点了一下按钮,AI 就把成品吐出来了,而是代码都让 AI 写,我负责提要求、看效果、找问题,然后让它继续改。 ## 最开始,想得其实很简单 刚开始我对 AI 说的,无非就是“做一个脑力训练小程序”。这种描述当然也能生成东西,很快就能看到首页、卡片和按钮,乍看还挺像那么回事。 但真正点进去以后,问题就来了:有的按钮只是摆设,有的结果是提前写好的,有的页面能进去却走不完一整套流程。那时候我才发现,做出一张像小程序的页面很快,做出一个真的能一直用的小程序,是另外一回事。 后来我开始一点点补需求。用户第一次打开看到什么,测评中途退出怎么办,每天安排几项训练,做完以后记录存在哪里,正式测评和普通练习的数据能不能混在一起……这些原来觉得“到时候再说”的细节,最后都得说清楚。 需求越补越多,最后整理成了一份完整的开发规格书。现在回头看,这份文档可能比我最初那句提示词有用得多。AI 不怕需求多,怕的是需求含糊。只要我自己都没想清楚,它就只能猜,而且经常猜不到我心里想要的样子。 ## 第一版能跑,但确实不太好看 下面是早期的首页。功能已经有了,测评、今日训练、连续天数、等级也都摆在页面上,不过整体比较普通,有点像把几个现成卡片拼到了一起。  我自己不会调 CSS,也说不出应该改哪一个数值,只能把看到的问题直接告诉 AI:第一眼不知道该看哪里;几张卡片差不多重;首页没有记忆点;想要一点游戏感,但又不希望做得太幼稚。 中间来回改了好几轮。有时候一轮改完还不如上一轮,我就把不喜欢的地方继续指出来。后来的版本变成了这样:  它不一定符合每个人的审美,但已经比较接近我想要的感觉了。今日计划是最主要的内容,连续训练和等级放在下面,颜色也活泼了一些。 这一段经历挺有意思。以前我以为不会前端,就很难参与页面设计。实际上,用 AI 做的时候不一定非要会说“边距改成多少”“这里用什么布局”。告诉它哪个地方抢眼、哪个地方看不懂、希望用户先点什么,也能一点点磨出结果。当然,前提是自己真的去看,而不是生成完就算了。 ## 从小游戏合集,慢慢补成一个完整小程序 现在这个版本一共有 21 个页面、5 项正式测评、24 项五维训练,另外还有“心秒”和“眼尺”两个感知力小游戏。 训练中心按注意力、反应力、记忆力、执行功能、逻辑推理和感知力分了类。每个游戏都不是只有一个入口,点进去以后还有准备、规则、正式训练、结果结算和记录保存。  除此之外,我还陆续加了每日训练计划、等级和经验、成就、训练历史、7 天和 30 天趋势、阶段复测、深色模式、高对比模式、数据清除和微信分享。 功能多起来以后,最麻烦的反而不是大页面,而是一些很小的情况。 比如数字记忆,如果连续两次出现同一个数字,用户会以为画面没有变化,所以需要给出切换提示;训练做了一半切到微信后台,回来以后怎么处理;结果页面点两次,会不会重复加经验;正式测评的分数,绝对不能被平时随手玩的一局训练覆盖。 还有最近加的“心秒”。本来只是估计 5 秒、10 秒、15 秒,后来我觉得既然是自由练习,应该允许自己输入时间,于是又加了 1 到 300 秒的输入。看起来只是多一个输入框,实际还要考虑空值、小数、超出范围、输入完成以后显示是否同步,以及长时间计时切后台的问题。 很多问题,光看页面是看不出来的,必须真的玩一遍才会碰到。 ## 我跟 AI 的相处方式也变了 刚开始我很容易一次提一大串要求,希望它一口气全部做完。后来发现这样虽然看着快,但回头检查很痛苦。现在我更习惯一次处理一个页面、一个游戏,或者一组相关问题。改完就检查,没问题再往下走。 我提问题的方式也有变化。比如以前可能会直接说“把这个按钮样式修一下”,后来会说得更具体:“微信小程序里这个确认按钮几乎看不见,但还能点击。”这样 AI 会自己去查到底是颜色、层级还是通用样式覆盖了,不需要我装作知道代码哪里有问题。 还有一个很有用的做法,就是让 AI 自己维护开发日志。每次改了什么文件、跑了什么测试、还有什么没验证,都记下来。项目做久以后,人肯定会忘,AI 换一个对话也未必记得。有了规格书和日志,下一次还能接着上次的地方继续,不用重新讲一遍来龙去脉。 目前项目有 14 个测试文件,一共 66 项单元测试。每次功能修改之后,还会继续做类型检查和微信小程序构建。我其实看不懂大部分测试代码,但我知道不能只看 AI 说“已经修好了”。至少要让它把检查真的跑完,把结果留下来。 ## 一行代码没改,不代表什么都没做 这大概是我做完以后最深的感受。 我确实没有亲手写代码,也没有去学 Vue、TypeScript 或小程序框架。但整个过程并不轻松。我得不停地试、找问题、补需求,有时候还要推翻已经做好的页面。 AI 能把想法变成代码,可它不知道我到底喜不喜欢,也不知道这个功能在我心里做到什么程度才算完成。这些判断还是得我自己来。 所以我现在理解的 vibe coding,并不是“不会编程也能一句话做软件”,更像是换了一种分工。以前做不了,是因为不会写;现在可以先把“写”交给 AI,但做什么、为什么做、哪里不对、什么时候算做完,还是绕不过去。 ## 写在最后 这个小程序最初只是从网页版的十几个小游戏开始,后来一步步加上测评、训练计划、档案、趋势和成长系统,最后变成了现在的样子。 它肯定还有不少可以继续打磨的地方,尤其是真机上的输入、不同屏幕的显示效果,还有一些长时间训练时的体验。不过至少它已经不是一张效果图,也不是只能点几下的演示页面,而是可以完整跑起来、继续往下迭代的东西。 如果你也有一个想做很久、但因为不会写代码一直没开始的点子,我觉得现在可以试试。不要一上来就追求一次生成成品,先做出第一版,自己用一遍,再把不舒服的地方一条条改掉。 网页版可以从这里体验:[https://cosmic-shortbread-3c93aa.netlify.app/](https://cosmic-shortbread-3c93aa.netlify.app/) 微信小程序可以扫码体验: 
意Reverie - 个人博客系统-开源
# 绘意Reverie - 个人博客系统-开源 各位鱼友,有人加友链吗,不过我域名还没下来 在线链接 [http://120.48.82.119/](http://120.48.82.119)(个人博客) 域名ICP还没下来 欢迎联系:webziyuan.top 开源链接:[仓库地址](https://github.com/Musicys/chuckle) 开源需要的话点点start 参考封面:     一个基于前后端分离架构的个人博客系统,支持 Markdown 文章发布、标签分类、评论互动、友链、访问统计等功能。配有后台管理系统,方便管理内容。 ## 项目架构 ``` chuckle/ ├── check_user/ # 前端用户端(博客前台) ├── check-admin/ # 前端管理端(博客后台管理) └── springboot-check/ # 后端服务 ``` --- ## 前端用户端 (check_user) 基于 **Vue 3 + TypeScript + Vite 5** 构建的个人博客前台。 ### 技术栈 | 技术 | 用途 | | -------------------------- | ----------------------- | | Vue 3 (Composition API) | 前端框架 | | Vite 5 | 构建工具 | | TypeScript | 类型安全 | | Pinia | 状态管理 | | Vue Router 4 | 路由管理 | | Element Plus | UI 组件库 | | Axios | HTTP 请求 | | ECharts | 数据可视化 | | highlight.js + v-md-editor | Markdown 渲染与代码高亮 | | oh-my-live2d | 看板娘(Live2D) | | vue-lazyload | 图片懒加载 | ### 页面结构 | 路由 | 页面 | 说明 | | --------- | -------- | ---------------------------------------------- | | `/` | 博客入口 | 启动引导页 | | `/home` | 博客首页 | 文章列表、轮播图、公告、标签云、归档、网站信息 | | `/desc` | 博文详情 | Markdown 渲染展示、目录导航、评论区 | | `/arg` | 标签页 | 按标签分类查看文章 | | `/tree` | 留言板 | 访客留言互动 | | `/muisc` | 问问 | 咨询/问答页 | | `/mine` | 关于 | 博主信息展示 | | `/datail` | 详情 | 分类详情页 | ### 启动 ```bash cd check_user yarn dev ``` --- ## 前端管理端 (check-admin) 基于 **Soybean Admin** 的中后台管理模板,使用 **Vue 3 + Vite 8 + NaiveUI + UnoCSS**。 ### 技术栈 | 技术 | 用途 | | -------------- | ------------ | | Vue 3 | 前端框架 | | Vite 8 | 构建工具 | | TypeScript | 类型安全 | | NaiveUI | UI 组件库 | | Pinia | 状态管理 | | Vue Router 5 | 路由管理 | | UnoCSS | 原子化 CSS | | Vue I18n | 国际化 | | ECharts | 数据可视化 | | elegant-router | 文件路由系统 | ### 功能模块 - 登录/注册(密码登录、验证码登录、微信绑定) - 工作台首页(数据卡片、折线图、饼图、项目动态) - 主题配置(亮/暗模式、主题色、布局模式、水印设置) - 多语言支持 - 多布局模式(垂直、水平、混合) ### 启动 ```bash cd check-admin pnpm dev ``` --- ## 后端服务 (springboot-check) 基于 **Spring Boot 2.7.2** 的博客后端服务。 ### 技术栈 | 技术 | 版本 | 用途 | | --------------- | ------ | ------------ | | Spring Boot | 2.7.2 | 基础框架 | | Java | 8 | 运行环境 | | MyBatis-Plus | 3.5.2 | ORM + 分页 | | MySQL | 8 | 关系数据库 | | Redis | - | 缓存/会话 | | Elasticsearch | - | 全文检索 | | 阿里云 OSS | 3.17.4 | 文件云端存储 | | Knife4j/Swagger | 3.0.3 | 接口文档 | | Hutool | 5.8.8 | Java 工具库 | | EasyExcel | 3.1.1 | Excel 处理 | | 微信开放平台 | 4.4.0 | 微信登录 | ### 数据库设计 (check_blog) | 表名 | 说明 | | ----------------- | ----------------------------------------------------------- | | `blogger_info` | 博主信息(头像、昵称、社交链接、个人标签等) | | `articles` | 文章(标题、Markdown 正文、分类、阅读量、评论数、全文索引) | | `categories` | 文章分类 | | `tags` | 标签(含颜色) | | `article_tags` | 文章-标签多对多关联 | | `comments` | 树状嵌套评论(楼中楼,支持审核) | | `friend_links` | 友情链接 | | `visit_logs` | 访问日志(IP、UA、页面、日期) | | `daily_stats` | 每日 PV/UV 统计 | | `system_settings` | KV 系统设置(邮件配置、评论开关等) | ### 项目结构 ``` src/main/java/com/yupi/springbootinit ├── annotation/ # 自定义注解 ├── aop/ # AOP 切面(日志、鉴权) ├── common/ # 通用组件(统一响应体、错误码、分页) ├── config/ # 配置类(跨域、JSON、Swagger、MyBatis-Plus、OSS) ├── constant/ # 常量定义 ├── controller/ │ ├── user/ # 用户端 API │ └── admin/ # 管理端 API ├── exception/ # 异常处理 ├── mapper/ # MyBatis-Plus Mapper ├── model/ │ ├── domain/ # 实体类 │ ├── dto/ # 请求/传输对象 │ └── vo/ # 视图对象 ├── service/ # 业务逻辑层 │ └── impl/ # 业务实现 ├── utils/ # 工具类(JWT、OSS、IP、SQL) └── MainApplication.java ``` ### API 接口 - 所有接口以 `/api` 开头 - 默认端口 `8088` - 启动后访问 Swagger 文档:`http://localhost:8088/api/doc.html` ### 启动 ```bash cd springboot-check # 1. 创建数据库并导入表结构 mysql -u root -p < sql/create_table.sql # 2. 导入测试数据(可选) mysql -u root -p < sql/data.sql # 3. 修改 application.yml 中的数据库配置 # 4. 启动服务 mvn spring-boot:run ``` ### Docker 部署 ```bash docker build -t chuckle-blog . docker run -p 8088:8088 chuckle-blog ``` --- ## 核心业务流程 ``` 博主写文章(Markdown) → 发布到博客 ↓ 访客浏览首页 → 查看文章详情 → 评论互动 ↓ 后台管理 → 文章管理 → 评论审核 → 数据统计 ```x.cn/)
第2章 项目技术栈选择
## 2.1 项目架构与工程组织 技术栈选择本身不是重点,真正的重点在于"用什么技术取决于需求需要什么",而不是这项技术本身有多少优点。 求职阶段,我会优先选择应聘方向所需的主流技术栈来实现需求,因为面试考察的是能否胜任团队现有的技术语境,而不是是否掌握了最前沿的方案。 进入企业之后,技术选型更多取决于业务所处的阶段和团队能承受的试错成本——业务越依赖稳定运行,团队的"技术冒险额度"就越有限,往往优先选最稳妥、出问题概率最低的方案;但如果业务处于快速迭代期、或需要靠技术差异化建立竞争力,团队愿意承担的风险预算也会相应更高。所以不是简单地"求职选主流、在职选稳定",而是要看清当前所处的阶段,把有限的风险预算留给真正需要创新突破的地方。 新技术往往比旧技术带来更多特性、更高效率,但要不要用,首先取决于团队是否真正掌握它,其次取决于当前需求是否真的必须依赖这个新特性才能实现,最后取决于万一出问题,团队有没有能力兜底。新技术的生态往往还不完善,遇到问题未必有现成文档和社区经验可查,能否接受这种不确定性、以及需求是否紧迫到必须冒险,是决定要不要采用的关键。 所有技术都是为需求服务的,因为需求需要用到这项技术,所以才用它,而不是为了用某个技术反过来给自己制造一个需求。不过需求也不只限于"当下已经暴露出来的问题":对于可预见的业务增长,提前做一些有依据、可验证的架构准备,也属于合理的需求范畴,只要它建立在具体的增长趋势和数据支撑之上,而不是单纯"想用某个新技术"倒推出来的理由,依然算是需求驱动而非技术驱动。 如果有人问我"为什么选择这项技术栈",我不会只说"因为需求需要"这一句就结束,而是会说这个需求需要什么样的能力(比如高并发下的类型安全、快速迭代效率、和团队现有技术栈的兼容成本),而这项技术恰好在这个具体维度上有优势,所以才选它。不是因为它整体先进,而是因为这个具体特性正好对上了这个具体的需求痛点。聊"为什么选这项技术",本质上聊的是需求、团队现状和技术特性三者之间如何精确匹配,而不是回避讨论技术本身的优点。 ### 2.1.1 系统总体架构 LearnWise 是一个融合英语课程学习、单词复习、AI 对话、语音交互、学习总结和在线支付的 Web 应用。此类系统既包含用户、课程、订单等结构稳定的传统业务,也包含大模型流式输出、智能体工具调用和异步报告生成等 AI 业务。若全部功能集中在单一服务中,虽然初期开发简单,但常规接口与耗时较长的模型请求会共享运行资源,模块边界也容易变得模糊。 项目因此采用前后端分离架构,并将服务端进一步划分为业务服务和 AI 服务。Vue 前端负责页面呈现和用户交互;NestJS 业务服务负责用户、课程、单词本、学习记录和支付;NestJS AI 服务负责模型调用、对话状态、联网搜索与学习报告生成;PostgreSQL 保存业务数据和 AI 检查点;Redis 与 BullMQ 承担延迟任务;MinIO 保存头像等对象文件。 这一设计尚未达到完整微服务架构。两个后端应用仍位于同一代码仓库并共享基础模块,因此更准确的说法是“模块化单体基础上的应用级拆分”。它减少了微服务注册发现、链路追踪和分布式事务等额外成本,同时为 AI 服务独立部署和扩容保留了空间。 ### 2.1.2 TypeScript 全栈与前后端分离 项目的前端、业务服务、AI 服务和共享类型均使用 TypeScript。与 JavaScript 相比,TypeScript 能在编译阶段检查参数、返回值和对象结构,尤其适合接口较多、数据模型复杂的全栈项目。课程、用户、单词和聊天消息等结构可以在 workspace 包中共享,减少前后端各自声明类型造成的不一致。 TypeScript 的代价是增加类型设计和编译配置成本,第三方库类型不完整时也需要额外处理。但本项目同时使用 Vue、NestJS、Prisma 和 LangChain,这些技术均具有较好的 TypeScript 支持,因此统一语言带来的维护收益明显高于额外成本。 前后端分离使前端可以独立构建和部署,并通过 `/api` 和 `/ai` 两类入口访问不同服务。开发环境由 Vite 代理隐藏端口差异,生产环境则可由反向代理统一暴露服务。该方式也使 REST、SSE 和 Socket.IO 能按照各自场景独立演进。 ### 2.1.3 pnpm Workspace 与 NestJS Monorepo 项目外层使用 pnpm Workspace 管理 `apps`、`server` 和 `packages`。相较 npm,pnpm 通过内容寻址存储和链接机制减少重复依赖占用,并对未声明依赖的访问更加严格;相较 Yarn Workspace,pnpm 配置直接、安装性能较好,适合中小型 TypeScript monorepo。 `packages/common` 用于共享业务类型,`packages/config` 用于共享端口等配置。后端内部又使用 NestJS Monorepo,将业务应用、AI 应用和共享库组织在同一工程中。两层 monorepo 的优点是代码复用和统一开发体验,缺点是构建边界容易复杂化,因此应保持共享包职责单一,避免将具体业务逻辑放入公共模块。 ## 2.2 前端核心框架选型 ### 2.2.1 Vue 3、React 与 Angular 对比 Vue 3 是本项目的前端核心框架。它采用响应式数据系统、单文件组件和 Composition API,适合将页面拆分为组件、状态和可复用逻辑。项目已将登录、聊天、课程练习、消息气泡等功能组织为组件,并将语音、Socket、登录和滚动控制封装为组合式函数。 React 生态规模更大,灵活性更强,但路由、状态和组件方案通常需要团队自行组合;Angular 提供完整且严格的企业级框架能力,但学习成本和工程体量相对较高。Vue 3 在渐进式使用、模板可读性和开发复杂度之间更均衡,符合本项目团队规模和交互型应用的需求。 项目选择 Vue 3 还因为 Element Plus、Pinia、Vue Router 和 Vite 等配套方案成熟。需要注意的是,Composition API 若缺乏统一规则,也可能出现单个组件逻辑过长的问题,因此项目通过 composables 和业务组件继续拆分复杂页面。 ### 2.2.2 Vite 构建工具选型 Vite 使用浏览器原生 ES Module 提供快速开发启动,并通过 Rollup 完成生产构建。与传统 Webpack 全量打包后再启动的方式相比,Vite 在开发阶段只按需转换被请求的模块,热更新速度更快,配置也更精简。 项目通过 Vite 集成 Vue、Tailwind CSS、Vue DevTools 和 SVG Loader,同时配置 `/api` 与 `/ai` 代理。Vite 还提供 `@` 到 `src` 的路径别名,使组件和工具模块的引用更清晰。对于当前规模的 Vue 单页应用,Vite 比维护复杂 Webpack 配置更合适。 ### 2.2.3 Vue Router、Pinia 与状态持久化 Vue Router 管理首页、聊天、课程、设置和单词本等页面。显式路由配置能够清晰表达页面关系,并支持后续增加鉴权守卫和懒加载。相比基于目录自动生成的文件路由,它需要手动维护,但对当前页面数量而言更加直观。 Pinia 管理用户信息和登录状态。与 Vuex 相比,Pinia API 更简洁,对 TypeScript 推导更友好,也不需要 mutation 层。项目通过 `pinia-plugin-persistedstate` 保存必要状态,使页面刷新后仍能恢复用户会话。持久化数据应限制在必要字段,敏感信息不应直接长期存放在浏览器中。 ## 2.3 UI、样式与可视化扩展 ### 2.3.1 Element Plus 与 Tailwind CSS 混合方案 项目没有完全依赖单一 UI 方案,而是使用 Element Plus 提供表单、消息提示和通用图标,同时使用 Tailwind CSS、原生 CSS 和 scoped CSS 完成业务界面。Element Plus 能降低表单校验、反馈提示等常规功能的开发成本;Tailwind CSS 适合快速组合布局;原生 CSS 则便于实现高度定制的聊天、课程和首页视觉效果。 Ant Design Vue 更偏企业后台风格,Naive UI 的 TypeScript 体验和主题能力较好,但项目已采用 Element Plus,且其中文生态成熟。Tailwind 与 Sass、CSS Modules 相比不强调预处理语法,而是通过原子类快速构建样式。混合方案兼顾效率与定制能力,不过也会产生样式来源分散的问题,因此应统一颜色、间距和断点变量,避免同类样式重复实现。 ### 2.3.2 自定义 SVG 组件化方案 项目为登录、聊天、导航、弹窗和设置等模块设计了多组 SVG 图标,并通过 `vite-svg-loader` 将 `.svg` 文件直接导入为 Vue 组件。相比 PNG,SVG 在任意缩放比例下仍保持清晰,可以通过 CSS 控制尺寸和部分颜色;相比 Icon Font,SVG 不存在字体加载闪烁和字符映射问题,也更适合多色图标。 构建阶段使用 SVGO 压缩冗余属性,同时显式保留 `viewBox`,确保图标可以响应式缩放。图标按业务分类并通过各目录的 `index.ts` 集中导出,降低页面对具体文件路径的依赖。项目同时保留 Element Plus Icons,用于无需定制的通用操作图标,形成“组件库图标负责通用语义,自定义 SVG 负责产品视觉”的组合方式。 ### 2.3.3 Three.js 与 glTF 三维模型展示 登录界面使用 Three.js 渲染本地 glTF 模型,并通过 GLTFLoader 加载模型、二进制数据和纹理,通过 OrbitControls 提供观察交互。Three.js 对原生 WebGL 的渲染流程进行了封装,可直接使用场景、相机、材质和灯光;与 Babylon.js 相比,它更轻量、生态广泛,也更适合在现有 Vue 页面中嵌入单个展示场景。 glTF 是面向实时渲染的三维资产格式,能够同时描述网格、材质、纹理和场景关系,比直接解析 OBJ 等格式更适合 Web。项目还对模型包围盒、中心位置、相机距离、环境光和阴影进行了调整。三维渲染会增加首屏资源体积和 GPU 消耗,因此需要按需加载,并在组件卸载时释放几何体、材质、纹理和渲染器资源。 ### 2.3.4 CSS 动画、自定义指令与组合式函数 项目使用 CSS 动画完成文字散落、页面揭示和过渡效果,并通过自定义指令封装自动聚焦和元素进入视口后的呈现行为。与将所有动画交给 JavaScript 相比,CSS 动画更容易由浏览器优化,也能减少主线程计算。 登录、语音、Socket、事件监听、头像和滚动锁定等能力被封装为组合式函数。这种设计让组件专注于模板和业务流程,同时提高逻辑复用性。对于监听器和动画帧,应在组件卸载时统一清理,避免页面切换后仍有后台任务运行。 ## 2.4 网络请求与实时通信选型 ### 2.4.1 Axios 与 REST API 用户、课程、学习记录、单词本和支付等常规业务通过 REST API 交互,前端使用 Axios 封装请求。Axios 内置请求与响应转换、拦截器、超时和取消支持,比原生 Fetch 更适合建立统一客户端。项目分别创建业务 API 和 AI API,并通过拦截器添加认证信息、处理错误和刷新 Token。 REST 资源模型清晰,便于调试、缓存和接口文档化,适用于一次请求对应一次完整响应的业务。然而它不适合持续推送 AI 文本或服务端主动通知,因此项目没有试图用单一通信方式覆盖所有场景。 ### 2.4.2 SSE 流式响应 AI 回答使用 Server-Sent Events 流式返回。SSE 基于 HTTP 长连接,服务端可以持续向浏览器推送文本事件,协议简单,并具备断线处理基础。项目采用 `@microsoft/fetch-event-source`,使 SSE 请求能够使用 POST、自定义 Header 和 JSON 请求体,弥补原生 EventSource 只能方便地发起 GET 请求的限制。 与 WebSocket 相比,SSE 只提供服务端到客户端的单向推送,但 AI 对话中用户输入本身可通过初始 HTTP 请求发送,后续主要是模型持续输出,因此单向模型恰好满足需求。它也比短轮询减少重复请求和额外延迟。 ### 2.4.3 Socket.IO 双向通信 项目使用 Socket.IO 在支付结果发生变化时主动通知前端。Socket.IO 在 WebSocket 之上提供事件语义、自动重连、心跳和兼容性回退,开发成本低于直接维护原生 WebSocket 协议。支付回调由服务端异步接收,前端无法预知完成时刻,因此实时连接比固定轮询更及时。 Socket.IO 的代价是客户端和服务端都要引入额外协议层,并不与原生 WebSocket 客户端完全兼容。当前项目只在确有双向或主动通知需求时使用它,避免所有接口都维持长连接。 ### 2.4.4 REST、SSE 与 Socket.IO 的协同 三种通信方案在项目中按职责组合:REST 处理确定性业务请求,SSE 处理 AI 单向流式输出,Socket.IO 处理支付状态等实时事件。这种选型比强行统一为 WebSocket 更容易开发和维护,也使接口语义更加明确。后续若实时协作功能显著增多,可再扩大 Socket.IO 的职责;若只有少量服务端通知,则应继续控制长连接范围。 ## 2.5 浏览器能力与内容呈现 ### 2.5.1 Web Speech API 语音交互 项目通过 SpeechRecognition 实现语音转文字,通过 SpeechSynthesis 和 SpeechSynthesisUtterance 朗读单词、例句或回答。相比调用云端语音服务,浏览器原生方案无需上传音频、接入成本低,也不会产生额外 API 费用,适合教学演示和基础发音辅助。 其局限是不同浏览器和操作系统的支持程度、可用音色和识别质量不一致。项目需要在调用前检测能力,并在不支持时回退到文本输入或隐藏语音按钮。若未来需要统一的发音质量、音素评分或口语测评,则应接入专业云端语音服务。 ### 2.5.2 Marked 与流式 Markdown 渲染 AI 回答天然包含标题、列表和代码等结构,项目使用 Marked 将 Markdown 转换为 HTML,并分别渲染推理内容和最终回答。Marked 体积较小、解析速度快,适合聊天场景;markdown-it 插件体系更灵活,Remark 则更适合基于语法树进行复杂转换。当前需求以快速展示为主,因此 Marked 足够直接。 流式内容可能在任意位置截断 Markdown 语法,前端需要容忍不完整片段并在后续数据到达后重新解析。由于最终 HTML 会进入页面,生产环境还应结合 DOMPurify 等工具进行清洗,避免模型输出或外部搜索内容形成跨站脚本风险。 ## 2.6 后端框架与服务设计 ### 2.6.1 NestJS 框架选型 后端使用 NestJS 11。NestJS 在 Express 之上提供模块、控制器、服务、守卫、拦截器和依赖注入,使用户、课程、支付、AI 等模块可以遵循统一结构。相比直接使用 Express 或 Koa,它的约束更多,但能减少大型项目中路由、依赖和错误处理方式不一致的问题。 Fastify 在吞吐性能方面通常更有优势,NestJS 也可以更换为 Fastify Adapter。不过本项目的主要瓶颈更可能来自数据库、模型 API 和外部服务,而非 HTTP 框架本身,因此优先选择生态成熟、团队易理解的 Express Adapter 更合理。 ### 2.6.2 业务服务与 AI 服务拆分 业务服务负责账户、课程、学习记录、单词本、订单和支付;AI 服务负责 DeepSeek 调用、会话记忆、联网搜索和学习总结。拆分后,AI 请求的长连接和较长执行时间不会直接混入常规业务模块,后续也可以针对模型并发单独配置资源。 与完整微服务相比,当前方案共享仓库、配置和公共库,没有引入消息总线作为所有模块的通信基础。这降低了部署和排错复杂度,适合项目当前阶段。需要避免两个服务直接复制业务逻辑,公共基础能力应通过 shared library 复用,业务数据仍应由明确的服务边界负责。 ### 2.6.3 模块化、依赖注入与统一异常响应 NestJS Module 组织 Prisma、JWT、邮件、MinIO、支付和队列等能力,依赖注入让业务服务无需自行创建底层客户端。全局拦截器负责统一成功响应,全局异常过滤器负责将错误转换为稳定结构,RxJS 则参与 Guard 和 Interceptor 的异步处理。 统一响应便于前端封装,但应保留正确的 HTTP 状态码,不能只在响应体中表达成功或失败。DTO 目前仍有继续完善的空间,后续可结合 class-validator 对外部输入进行运行时校验。 ## 2.7 数据库与数据访问层 ### 2.7.1 PostgreSQL 数据库选型 项目使用 PostgreSQL 保存用户、课程、单词、学习记录、订单和每日总结。此类数据之间关系明确,并涉及唯一约束、事务和按用户聚合查询,因此关系型数据库比 MongoDB 等文档数据库更匹配。PostgreSQL 在复杂查询、索引、JSON 扩展和事务能力方面较强,也能被 LangGraph 用作 AI 检查点存储。 MySQL 同样可以完成主要业务,但 PostgreSQL 对复杂数据类型和扩展功能支持更丰富。选择 PostgreSQL 使业务数据与 AI 对话持久化可以使用同类基础设施,不过二者仍应通过独立数据库或 Schema 隔离,防止生命周期和权限相互影响。 ### 2.7.2 Prisma ORM、迁移与种子数据 Prisma 通过 Schema 声明模型并生成类型安全客户端。与 TypeORM 的装饰器实体方式相比,Prisma 的模型定义更集中,查询结果类型推导清晰;与 Sequelize 相比,其 TypeScript 开发体验更现代。项目还使用 PostgreSQL Adapter 建立连接,通过 Prisma Migrate 管理结构变化,通过 Seed 初始化词库、课程和图片数据。 Prisma 的限制是复杂 SQL 和特定数据库能力有时仍需使用原生查询,生成客户端也会增加构建步骤。对本项目以 CRUD、关系查询和事务为主的数据访问场景而言,其开发效率和类型安全更有价值。 ### 2.7.3 关系建模、约束与索引设计 数据库围绕用户、单词、用户单词记录、复习日志、课程记录、支付记录和学习总结建立关系。用户与单词的学习状态需要按 `(userId, wordId)` 唯一,因此使用复合唯一约束;到期复习按照用户和下次复习时间查询,因此设置 `(userId, nextReviewAt)` 复合索引。 这些约束不仅提升查询性能,也把关键业务规则下沉到数据库,避免并发请求产生重复记录。关联记录使用级联删除时需要谨慎,尤其是支付和邮件日志等审计数据,后续可根据合规要求改为软删除或限制删除。 ## 2.8 AI 模型与智能体技术 ### 2.8.1 DeepSeek 模型选型 项目通过 `@langchain/deepseek` 接入 DeepSeek,分别配置普通对话和深度思考模式,并启用流式输出。普通模式适合日常问答、解释和练习反馈,深度思考模式适合复杂分析。模型温度、最大输出长度和 thinking 参数根据场景分别设置。 模型选型通常需要比较推理能力、中文与英文表现、延迟、上下文长度、价格和 API 稳定性。DeepSeek 在中文语境、推理能力和使用成本之间具有较好的平衡,也提供与 LangChain 兼容的接口。其风险是外部模型服务存在延迟、限流和不可用情况,因此服务端应配置超时、错误转换和必要的重试策略,并避免把模型供应商细节扩散到业务层。 ### 2.8.2 LangChain Agent 与工具调用 项目使用 LangChain 的 `createAgent` 构建智能体,并将联网搜索、学习数据读取等能力封装为 Tool。相比直接调用模型 API,LangChain 提供统一的消息、流式输出、工具调用和 Agent 抽象,适合需要模型自主选择工具的场景。 如果应用只是单轮问答,直接调用 API 会更轻、更容易调试。当前系统不仅要聊天,还要生成基于用户数据的学习复盘和进行联网搜索,因此 Agent 抽象具有实际价值。仍应控制工具数量和参数范围,并在服务端校验工具输入,避免模型拥有不必要的数据访问能力。 ### 2.8.3 LangGraph 对话记忆与持久化 项目使用 LangGraph PostgreSQL Checkpoint 保存 Agent 状态,并按对话线程恢复上下文。相较只把历史消息保存在前端,这种方式在刷新页面或更换设备后仍能继续会话,也避免客户端篡改完整上下文。 持久化记忆会持续增长,应设置历史裁剪、摘要或归档策略。对话数据还可能包含用户隐私,需要按照用户维度隔离查询,并明确保留和删除规则。 ### 2.8.4 Prompt、联网搜索与自定义 AI Skill 项目维护不同英语学习角色和每日复盘提示词,并通过博查搜索 API 为 Agent 提供联网信息。搜索结果被整理为标题、链接、摘要、站点和时间,再作为模型上下文。这属于搜索增强生成,与基于私有文档向量检索的传统 RAG 不同:它强调实时公开网页,而不是构建本地知识库。 每日学习复盘被封装为自定义 AI Skill,结合用户学习记录、Prompt、模型和邮件服务生成个性化总结。将能力封装为 Skill 有利于隔离提示词、输入类型和执行流程。联网内容并不天然可靠,后续应保留来源链接、限制不可信指令进入系统提示词,并对关键学习结论进行结构化校验。 ## 2.9 英语学习核心算法 ### 2.9.1 SM-2 间隔重复算法 项目自行实现 SM-2 间隔重复算法,根据回答质量调整难度系数、连续正确次数和下次复习间隔。相比每天固定复习相同单词,SM-2 会让熟悉内容的间隔逐步增长,让不熟悉内容更快重新出现,从而在有限学习时间内提高复习效率。 选择自行实现而不是引入大型学习算法库,是因为 SM-2 公式相对明确,且项目需要将状态直接映射到自己的单词记录模型中。缺点是经典 SM-2 对不同用户、词汇难度和学习场景的适应能力有限,后续可基于实际正确率校准评分映射,或评估 FSRS 等现代调度算法。 ### 2.9.2 掌握度计算与复习调度 每个用户对每个单词都保存独立的 `easeFactor`、`interval`、`repetitions`、`nextReviewAt` 和 `lastReviewAt`,同时记录正确次数、错误次数和连续答对次数。这符合记忆状态属于“用户与单词关系”而非单词本身的业务事实。 服务端按照用户和到期时间查询待复习单词,数据库复合索引保证调度查询效率。掌握状态由学习记录推导,而不是允许用户随意切换,使单词本、错词本和复习计划使用同一数据来源。 ## 2.10 异步任务与基础设施 ### 2.10.1 Redis 与 BullMQ 任务队列 项目使用 Redis 作为 BullMQ 的状态存储,通过 `@nestjs/bullmq` 注册队列、Worker 和 Processor。每日学习总结可能涉及数据库聚合、模型生成和邮件发送,不适合阻塞普通 HTTP 请求,因此采用异步任务处理。 RabbitMQ 提供成熟的消息路由和确认机制,Kafka 更适合高吞吐事件流;BullMQ 基于 Redis、与 Node.js 和 NestJS 集成直接,适合当前规模的延迟任务和后台作业。其前提是正确处理重试、幂等性和失败任务,防止同一用户重复生成或发送报告。 ### 2.10.2 MinIO 对象存储 用户头像等文件通过 MinIO 保存。与直接写入应用服务器磁盘相比,对象存储更容易独立扩容和统一访问;与公有云对象存储相比,MinIO 可以本地部署,并提供接近 S3 的接口,适合开发和可控部署环境。 服务端使用 MinIO SDK 管理 Bucket、上传对象并生成访问地址。生产环境还应限制 MIME 类型和文件大小,采用不可预测的对象名,并根据隐私需求使用签名 URL,而不是默认公开所有文件。 ### 2.10.3 邮件与每日学习报告 项目使用 Nodemailer 通过 SMTP 发送 HTML 邮件。AI 先生成 Markdown 学习总结,Marked 再将其转换为 HTML,BullMQ 负责按计划执行生成与发送。相比第三方邮件 API,SMTP 接入通用、迁移成本低;邮件 API 在送达率、统计和模板管理方面通常更强。 数据库保存学习报告和邮件日志,便于追踪任务状态并实施幂等控制。邮件正文仍需进行 HTML 清洗,同时应对模型失败、邮件失败分别记录,避免将部分成功误判为任务全部完成。 ## 2.11 鉴权、支付与安全设计 ### 2.11.1 JWT 双令牌鉴权 项目使用 JWT Access Token 和 Refresh Token。短期 Access Token 用于访问接口,过期后由 Refresh Token 获取新令牌,前端 Axios 拦截器负责刷新和重试。与服务器 Session 相比,JWT 减少共享会话存储需求,适合前后端分离和多服务验证。 JWT 签发后难以即时撤销,因此 Refresh Token 应支持服务端失效控制、轮换和异常复用检测。前端还要避免多个并发请求同时触发刷新,可通过刷新队列合并请求。 ### 2.11.2 支付宝支付与实时通知 支付模块使用支付宝 SDK 创建网页支付请求,并通过异步回调更新订单。Nano ID 用于生成业务订单标识,支付成功后 Socket.IO 主动通知前端。该流程比仅依赖支付页面跳转结果可靠,因为最终状态以支付宝服务端回调为准。 回调处理必须验证签名、金额、商户应用和订单状态,并保证同一通知重复到达时结果一致。订单更新和权益发放应处于同一事务或使用可靠的幂等状态机。 ### 2.11.3 当前安全方案及改进方向 当前前端使用 MD5 对密码摘要后再发送。MD5 已不适合作为密码安全存储算法:计算速度过快且无法抵抗现代暴力破解。如果数据库直接保存该摘要,即使网络传输使用 HTTPS,泄露后的破解风险仍然较高。 改进方案应由服务端使用 Argon2id 或 bcrypt 加随机盐保存密码,前端通过 HTTPS 传输原始密码或协议要求的临时凭据。除此之外,还应为 Markdown HTML 增加清洗、为上传增加校验、为登录和模型接口增加限流,并确保 `.env` 与密钥不会进入版本控制和日志。 ## 2.12 工程质量与测试体系 ### 2.12.1 代码规范、格式化与类型检查 后端使用 ESLint、typescript-eslint 和 Prettier,前端使用 Oxfmt,并通过 vue-tsc 检查 Vue 单文件组件类型。Oxfmt 追求更快的格式化速度,Prettier 的生态和稳定性更成熟;两者分别作用于不同子工程不会产生直接冲突,但长期最好统一格式规则和提交检查流程。 项目还使用路径别名简化模块引用,使用 Vue DevTools 调试前端,并通过 npm-run-all2 并行执行类型检查和构建。根脚本使用 concurrently 同时启动三个应用,提升本地联调效率。 ### 2.12.2 Jest、Supertest 与测试现状 后端已配置 Jest、ts-jest、NestJS Testing 和 Supertest,具备单元测试与端到端测试基础。Jest 适合测试 Service 和算法,Supertest 适合验证控制器、鉴权和完整 HTTP 流程。当前仓库中的实际测试仍以少量脚手架测试为主,覆盖度不足。 后续应优先覆盖风险较高的 SM-2 边界、Token 刷新、支付回调幂等、BullMQ 重试、AI 流式事件解析和 Prisma 事务。前端可补充 Vitest 与 Vue Test Utils,并使用端到端测试覆盖登录、学习、聊天和支付状态变化。 ## 2.13 技术选型总结 ### 2.13.1 技术栈协作关系与选型优势 项目的核心特点不是简单堆叠 Vue、NestJS 和 PostgreSQL,而是针对不同业务性质选择不同技术:Vue 3 与 Pinia 负责交互界面,Vite 负责开发和构建;REST 处理常规业务,SSE 传输模型流,Socket.IO 推送异步支付状态;NestJS 提供模块化服务端结构,Prisma 和 PostgreSQL保证业务数据一致性;LangChain、LangGraph 与 DeepSeek构成智能体能力;Redis、BullMQ、MinIO 和 Nodemailer 支撑异步任务、文件和邮件。 该方案在开发效率、类型安全、交互体验和 AI 扩展能力之间取得了较好平衡。业务服务与 AI 服务的拆分也使系统可以逐步演进,而不必在项目早期承担完整微服务架构的成本。 ### 2.13.2 局限性与后续演进方向 当前技术体系仍有若干改进点:MD5 密码方案需要替换;Markdown 渲染需要增加 HTML 清洗;DTO 运行时校验和接口限流尚需完善;测试覆盖不足;Three.js 资源和流式连接需要持续关注清理;AI 调用需要更完整的超时、重试、用量统计和供应商降级方案;队列任务需要严格的幂等与失败补偿。 此外,根依赖中的 Day.js 暂未在主要源码中发现明确使用,部分示例 Store 和测试也属于脚手架遗留。技术文档应区分“实际使用”“已集成但使用较少”和“仅安装未使用”,避免把依赖清单直接等同于技术栈。后续演进应以真实业务瓶颈为依据,而不是为了技术数量继续拆分服务或引入新的基础设施。
我用AI写了半年代码——回头看,这5个能力正在退化
从年初开始,我几乎每天都在用 Claude Code 或 Cursor 写代码。效率确实高了不少 —— 以前要写半天的 CRUD 页面,现在二十分钟搞定。 但最近发生了一件事让我警觉:同事问我一个Promise.allSettled和Promise.all的区别,我张了张嘴,发现自己需要 "想一下" 才能回答。这个问题两年前我能脱口而出。 不是我变笨了。是我把这块肌肉交给 AI 练了半年,它萎缩了。 Anthropic 最近的一项研究给了一个具体数字:重度依赖 AI 编程工具的开发者,独立调试和代码阅读能力比手动编码组低 17 个百分点。美国心理学会今年的报告也指出,过度依赖生成式 AI 会降低批判性思维和岗位专项技能。 The Register 上甚至出现了一个新词叫 "AI Atrophy"——AI 导致的技能萎缩。 我花了一个周末盘点了自己的变化。以下 5 个退化最明显。 **1. Debug 能力:遇到 bug 第一反应变了** 以前遇到 bug,我的流程是:看报错信息→定位文件→打断点→看调用栈→找到原因。 现在呢?遇到红色波浪线,第一反应是把报错复制给 AI。 ``` // 代码解读 // 以前:我会看这个报错,思考为什么 // Type 'string | undefined' is not assignable to type 'string' // → 哦,可能是可选链返回了undefined,需要给默认值 // 现在:直接丢给AI // "帮我修这个TypeScript报错" // AI秒回:加个 ?? '' 就行 // 我:哦好,下一个 ``` 问题不在于 AI 给的答案对不对 —— 大部分时候是对的。问题在于我跳过了 "理解为什么出错" 这一步。 连续半年跳过这一步,你对类型系统的心智模型就变得模糊了。以前能凭直觉判断 "这里可能有空值",现在要等 TypeScript 报错了才知道。 **自测方法**: 下次遇到 TypeScript 报错,先不问 AI,自己读完报错信息。如果你发现自己读不懂了 —— 那就是退化的信号。 **2. 代码阅读能力:看别人的代码变吃力了** 以前 review 同事的 PR,我会逐行看逻辑、想边界情况、考虑性能。 现在呢?打开一个 200 行的组件,第一反应是让 AI 帮我总结。 ```// 代码解读 // 以前review这段代码,我会注意到问题 function useDebounce(value, delay) { const [debouncedValue, setDebouncedValue] = useState(value); useEffect(() => { const timer = setTimeout(() => { setDebouncedValue(value); }, delay); return () => clearTimeout(timer); }, [value, delay]); return debouncedValue; } // 问题:delay变化时会重置timer,可能导致永远不触发 // 以前我一眼能看出这个问题 // 现在我需要"想一下"才能想到 ``` Anthropic 研究里那个 "代码阅读能力低 17%" 就是这个意思。不是看不懂语法,是看代码时主动思考的密度降低了。 你习惯了让 AI 总结代码、解释逻辑,自己的 "阅读肌肉" 就在萎缩。就像天天打车的人,突然发现自己不记得路了。 **自测方法:** 找一个你没参与的开源项目,随便打开一个核心模块,看 15 分钟。如果你发现自己频繁想 "好复杂,让 AI 解释一下"—— 那就是退化的信号。 **3. 从零搭建能力:离了模板不会开始** 现在让你不用create-next-app、不用 AI、从一个空文件夹开始搭一个 React 项目 —— 你能搞定吗? ``` # 代码解读 # 你还记得从零开始需要什么吗? mkdir my-app && cd my-app npm init -y npm create vite@latest my-vite-app # 然后选择react项目 # 紧接着选择是使用react + ts + vite 还是react + js + vite # 然后操作一下命令 # 然后 安装依赖 # 然后执行运行 # 然后呢? # 你还记得吗? ``` 我发现自己不记得了。以前这些我闭着眼都能写,现在需要查文档。 不是说你每次都要手搭 —— 脚手架工具存在就是为了省时间。但知道底层是怎么运作的 和不知道 是两码事。 当你的create-next-app出了奇怪的构建错误时,知道底层原理的人能定位问题,不知道的人只能问 AI 碰运气。 **自测方法**: 试着不用任何脚手架,手搭一个最小的 React 开发环境。如果你发现自己连vite.js的基本结构都要查 —— 那就是退化的信号。 **4. API 记忆:常用方法都要问 AI 了** ```// 代码解读 // 这些你还能不查就写出来吗? // 数组去重 [...new Set(arr)] // 还是 Array.from(new Set(arr))?都行 // 深拷贝 structuredClone(obj) // 你还记得这个API吗?还是会写JSON.parse(JSON.stringify())? // 日期格式化 new Intl.DateTimeFormat('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' }).format(date) // 还是直接问AI? // URL参数解析 const params = new URLSearchParams(window.location.search) params.get('id') // 你还记得URLSearchParams吗? // 数组分组(ES2024) Object.groupBy(items, item => item.category) // 这个你知道吗? ``` 这不是记忆力的问题。是你不再需要记这些了 —— 问 AI 比翻 MDN 快十倍。但代价是:你对 JavaScript 标准库的掌握从 "信手拈来" 变成了 "知道有这么个东西但要查"。 写代码时的流畅感没了。以前写代码像说话一样自然,现在像在翻译 —— 你知道要做什么,但需要 AI 帮你 "翻译" 成具体的 API 调用。 **自测方法**: 打开一个空文件,不查任何东西,写一个函数:接受一个 URL 字符串,返回所有查询参数的对象。如果你卡在 URLSearchParams 的用法上 —— 那就是退化的信号。 **5. 方案设计能力:不再自己想架构了** 这个最隐蔽,也最危险。 以前遇到一个新需求,我会先在脑子里过一遍:这个功能的数据流是什么样?状态放哪?组件怎么拆?要不要用 Context 还是状态管理库? 现在呢?直接告诉 AI 需求,让它出方案。 AI 出的方案不一定差。但你跳过了 "思考为什么这样做" 的过程。下次遇到类似需求时,你还是不知道应该用 cursor 分页还是 offset 分页,还是需要问 AI。 技术方案设计能力不像写代码 —— 它需要不断在真实场景中做判断、犯错、修正,才能建立起直觉。把这个过程交给 AI,你的 "技术直觉" 就停止生长了。 **自测方法:** 试着在纸上(不看任何东西)画出你现在项目的前端架构图 —— 数据流、状态管理、API 调用层、组件层级。如果你画不出来 —— 不是因为架构复杂,而是你没有真正思考过它。 **能力退化自测清单** | 能力 | 退化信号 | 自测方法 | | ---- | -------- | -------- | | Debug | 遇到报错先问AI不看信息 | 下次报错先自己读完再说 | | 代码阅读 | 看PR想"让AI总结一下" | 看一个开源项目核心模块15分钟 | | 从零搭建 | 离了脚手架不知道怎么开始 | 手搭一个最小React开发环境 | | API记忆 | 常用方法要先问AI | 不查东西写一个URL参数解析函数 | | 方案设计 | 需求来了直接丢给AI | 纸上画出当前项目的架构图 | **不是要你戒掉 AI** 说清楚:我不是说 AI 不该用。这半年 AI 帮我省了无数时间,这是事实。 我想说的是:**AI 是外骨骼,不是替代器官。** 你穿上外骨骼能举起 200 公斤,但你自己的肌肉至少要能举起 40 公斤。否则有一天外骨骼出故障 —— 断网、API 挂了、或者你需要在一个不能用 AI 的环境里写代码 —— 你就废了。 上个月海外 AI 编程工具大规模封禁国内账号的事还历历在目。那些完全依赖 AI 的开发者,突然发现自己 "不会写代码了"。 **每周花 2 小时不开 AI 写代码**。 不需要多。就像健身不需要每天去,但需要保持频率。保持你的 "编程肌肉" 不萎缩。 **你用 AI 写代码多久了?有没有发现类似的退化?**
2026 年|AI 全栈时代,前端简历别再只写前端技术了~
最近我给一些前端方向的实习生做内推,看了不少简历。投递里常能看出一种预设,找实习只要把前端做熟,页面和接口能啃下来,似乎就踩对了主线。初筛读多了会有另一种感受,当业务和岗位已经大量贴上大模型、RAG 或 Agent 时,纯前端技术栈写得再工整,也很难在一叠写法雷同的简历里单独把人托起来。 我想写的不是简历技巧,评审更常问的是,你有没有把智能接进一条可维护、可观测、也能和人协作的链路,还是只在项目名里多写几个关键词。 许多项目经历段落,技术名词很全,叙事却薄。写得多的几种模式是: - 周期很短,却同时堆上 RAG、流式输出、鉴权与复杂治理,读者很难估计真实投入与掌握深度 - 段落像功能清单,缺少场景、难点、个人职责与可验证结果,性能数字也缺少口径与复现方式 - 形态集中在教程型对话台或后台管理,技术栈高度同质,差异化不明显 - Agent 被写成调模型、接工具,很少触及运行时、状态机、评测、观测与人在回路 还有一种写法,整段都在堆大家简历里常见的工程项,例如 JWT、双 token、RBAC、请求拦截器、SSE 或 WebSocket 流式、分片上传、虚拟列表。十条里七八条读起来像同一篇教程拆出来的,名词齐了,却看不出你解决的是哪一道别人没写清楚的难题。基本功当然要会,可若差异化只停在这一层,筛简历的人很难把你从同质化描述里拎出来。 简历上的项目经历一撞脸,筛简历的人就只好盯你有没有把系统做实。后面我按层写。 这两年简历里写 Agent 的人越来越多,细看实现却常常撞脸,核心路径几乎总是同一条。 接收用户输入,调用大模型,解析工具调用,执行工具,返回结果。 引用里那几步,无非是调模型、解析工具调用、执行、再把结果塞回模型。脚手架和跟练多了,半天跑通一个 Demo 很常见。评审里想听的,往往是上线以后要应付的那些事,超时、重试、成本、人要确认、出了事故怎么查和改,你有没有提前铺过路。 面试里真正该往下问的,早就不该是这种技能清单: - 你会不会调 - LLM你会不会接 - Tool你会不会用 - LangChain 而是更底层的这个问题: 你有没有把 Agent 当成一个系统,而不是一个函数调用? 能讲清楚这一句,面试官才会继续往下问。落地时大家会盯这几件事有没有做实,有没有进真实产品而不是停在演示分支: - 有没有独立的 Agent Runtime - 有没有显式状态机驱动的 Agent Loop - 有没有把评测做成回归闸门 - 有没有把观测、检测、红队、安全、成本和用户干预整成闭环 - 能不能把这些能力真正接进产品,而不是停留在一段演示代码 缺了这些,名字再响亮,多半仍是一个带工具调用的聊天接口。本文不写怎么接 OpenAI、怎么声明 Tool,只写骨架。 从 Demo 到产品,Agent 系统到底还差哪几层骨架。 下面按层拆开说明。 ## 为什么很多 Agent 项目能跑,但没有技术区分度 很多人会以为把大模型、多轮、Tool、Memory 和 RAG 勾齐,项目就算做完了。那点东西多半只盖住 demo 里的顺利路径,一遇到真实流量,缺的是运行时、安全、观测和评测这一整圈骨架,而不是再多接一个模型。 它们看起来像 Agent,实际上更像一个带工具调用的聊天接口。 一放量,问题会先挤在几块地方,很少单靠改一段 Prompt 就能压住: - 同一类提问有时成有时败,工具忽对忽错 - 用户只看到转圈,不知道卡在推理还是在等工具 - 线上成功率掉了,分不清是模型、工具还是外部 API - Prompt 改完自测像变聪明,线上指标却掉头 - 偏航多步也没有让人半途介入的口子 - token 和钱烧在哪些步骤,心里没底 根本原因多半不在 Prompt 花不花或 Tool 多不多,而在下面几块是否长期空白:运行时、状态机、可观测、评测、风险、HITL、Streaming、成本、异常和线上告警。填不全,项目就会一直像在交课堂作业。只会用 LangChain 也不等于会做 Agent,框架主要管编排,编排以外的那一圈才是评审想听你讲清楚的。 ## 前端加 LangChain 开发者的真正优势 前端背景再叠上 LangChain、LangGraph、工具与记忆,常被低估。和算法岗比的不是论文厚度,而是能不能把智能体做成别人能长期点着用的产品。 你更占便宜的地方,是把 Agent 做成用户看得见、停得下来、出了问题能对上账的系统。 模型只是其中一个节点。好不好用还要看,现在在干什么、为什么选这个工具、失败怎么补、用户能不能打断、高风险要不要确认、耗时和钱能不能对上账、改完 Prompt 有没有回归、输出能不能验、输入和工具参数有没有护栏、线上有没有告警。这些早就不是单次推理,而是一整条链路的工程活。状态、异步、中间态、确认、埋点和展示,本来就是前端日常,这块你会比只写脚本的人更顺手。 介绍自己时不必缩成会接某家 API 的前端,可以收成一句实在话。 我负责把 LLM 编排、工具、状态机、可观测、评测和交互收成一条,给人用的是产品不是脚本。 交付物也更该像任务控制台,把推理、调工具、等确认、报错恢复这些阶段摊开,而不是聊天框里一条接一条的气泡。 ## 把 Agent 理解成运行中的系统而不是调用链 先把问题问清楚,这东西在产线里更像一次短请求,还是像一趟要跑很久的任务。 不要把 Agent 理解为一次请求的处理流程,而要把它理解为一个持续运行的任务系统。 普通接口大约四步,请求进来,处理完就结束。Agent 更像长跑任务,中间状态多。下图是一条典型阶段划分,提醒自己别再用短接口的思维去估长任务。  图的意思很直白,Agent 更接近任务引擎,而不是只吐一段字的接口。接下来这些问题躲不掉,状态放哪、刷新后怎么续、工具超时重试还是交给人、高风险要不要审批、token 快顶了还跑不跑、工具能不能并行、连走几步没进展算不算打转。这些都算系统设计,不是多写两行 Prompt 能糊过去的。 ## 一个有区分度的 Agent 系统应有的分层 聊 Agent 如果只停在调模型、调工具,听起来总像缺一块。动手前最好先想清楚,界面交互、流程编排、运行时控制、安全治理、可观测和评测各自归谁管,别全糊进一条链。 对外说法可以很简单,Agent 像一条流水线: 用户输入 → 模型推理 → 调用工具 → 返回结果 真要拆职责,可以收成六层: - 交互层:用户看得见、点得着的界面,负责步骤展示、审批、中断、重试和结果反馈 - 编排层:用 LangChain、LangGraph 等把 Prompt、模型、工具、记忆和状态流转组织成可维护的流程 - 运行时 Harness:管理步数、超时、预算、快照、重试、取消和收尾,决定任务如何真正跑完或安全停下 - 安全与检测层:在输入、工具执行前、输出和轨迹上做规则与模型检测,拦住不该发生的行为 - 可观测层:用 Trace、Metrics、日志把每一步变成可查询、可对比、可回放的事实 - 评测层:通过离线集、回归闸门和线上灰度,用数据判断一次改动到底有没有变好 编排层按意图出计划和工具调用,运行时层在预算、超时和状态约束下执行。执行中安全层可能拦截或要审批,可观测层记全程,评测层再拿这些记录去约束下一版 Prompt、节点、工具和发版节奏。 分层不是为了把图画复杂,而是别把运行时、安全、回放、评测和灰度都指望 LangChain 自动搞定。框架主要管编排,编排外那一圈才决定工程含量。 用户意图从交互层进编排层,编排层再把可执行步骤交给运行时。  运行时不只是把流程跑完,还要在执行过程中持续接入安全检测和可观测能力。  可观测记录下来的事实,会进入评测体系,再反向约束下一轮编排和发布策略。  每层用一句话带过,细节可以另写。 交互层负责摊开给人看、给人控。过程可见、风险写操作前要确认、能中断和改向,这些要和运行时对齐,别事后在文案里补两行提示。 编排层用 Prompt、Tool、Memory、图或链把节点串起来。LangChain 一类框架主要管这一层,观测、中断、预算、版本和 bad case 回流多半在编排之外,别把欠账算在框架头上。 运行时层用 Harness 钉死步数、单步和整体超时、token 和墙钟预算、取消和收尾。结束由状态和 Harness 判定,预算触顶该降级就降级,别指望模型自己说做完了。 安全与检测要盖住输入、工具执行前、输出和轨迹。模型吐出来的 tool call 只是草稿,执行前要走白名单、schema、权限和风险分级,高危路径该审批就审批。 可观测层靠 Trace、分层指标和结构化日志,把一次任务从猜变成查,后面才好做归因、回放和调参。 评测层用离线用例、回归闸门和线上灰度回答有没有变好。Prompt、模型、工具或状态机一动,就该自动对比基线,线上反馈要能回灌进用例集。 六层都沾到,才像能交给别人托管的产品,而不是只证明链路能跑通的 Demo。 [机-会]技术大厂,前端-后端-测试,新一线和一二线城市等地均有[机-会](https://jsj.top/f/o38ijj) ,感兴趣可以试试。待遇和稳定性都不错~ ## Agent Loop 应该是显式状态机而不是 while 循环 最朴素的 Agent Loop 是反复调模型、判断是否调工具、拿结果再回模型,直到产出答案。这个流程能跑通,但一进真实场景就容易失控,因为很多关键分支塞不进一个裸 while 循环。 真正容易栽跟头的几件事: - 工具失败后的重试与止损 - 高风险动作前的人工确认 - 预算触顶后的降级与收尾 - 上下文过长时的压缩与续跑 - 用户中断后的恢复与回放 把 Loop 收成显式状态机,让系统在 Reasoning、ToolSelecting、Executing、AwaitingConfirmation、Recovering、Finalizing 等状态之间按条件跳转,分支写在表里,比藏在 if 里好查也好测。 状态机写清楚以后,日常会顺很多。状态一眼能看见,分支不再散在 if 里,前后端对得上号,暂停、恢复、撤销、重试也好接。 把它和前面的 AgentHarness 组合后,职责会更清晰: Harness 负责时间、步数、token、取消和强制收尾状态机负责业务语义、路径选择和异常分支 上线以后,Loop 往往还要挂审批、检测、回滚、埋点和评测,能挂在状态切换点上就别散在业务代码里。 收个尾,Agent Loop 不该只是会转的循环,最好收成一台可解释、可干预、可恢复、也能审计的状态机。 ## 把人设计进系统而不是把人当兜底 很多团队把 HITL 理解成出错后的兜底,这会让人机协同长期停在救火阶段。设计阶段就把哪些动作自动放行、哪些必须确认、哪些默认拒绝写清楚,比上线后救火省事。 HITL 是 Human-in-the-loop,意思是把人放进关键决策回路。系统负责执行与提议,人负责在高风险节点确认、纠偏和兜底。 风险分级可以先从三档起步,阈值和白名单由业务与合规共同维护: - 低风险,默认自动执行,失败后可重试或降级,例如搜索文档、读取代码、查询只读数据、整理摘要 - 中风险,可自动执行但要留痕,并保留撤销窗口,例如文案修改、批量替换、工作区文件编辑 - 高风险,执行前必须阻断并等待确认,例如删除文件、外网请求、代码提交、数据库变更、发布和付费接口调用 差别通常不在有没有确认按钮,而在卡片里给不给够决策信息。 动作是什么、为什么动、影响范围、能不能撤销、有没有备选,最好一眼能看完,别只剩一句是否继续。 审批如果只在前端拼文案,很快会和真实执行脱节。更省事的做法是把审批收成结构化数据,从后端下发,挂到同一条 trace 上,事件流里推 approval_required,回放、审计和告警都读同一份。 卡片上最好有: 风险等级、审批时限、发起来源一眼可见受影响资源和变更范围可展开查看,必要时接 Diff可逆操作提供 Undo 入口和预计回滚成本支持改参数或切换替代动作后再执行,减少往返沟通全量记录审批人、审批理由、执行结果,满足审计留痕 审批、trace、状态机和观测如果能共用一套模型,人机协同就不只是打补丁。 Streaming 应该让 Agent 过程可见 流式输出如果只用来更快吐 token,对 Agent 任务帮助有限。用户更想知道现在卡在哪一步、工具在干什么、要不要自己点一下。 事件可以粗分三类,最好走同一条推送通道,省得前端接好几套协议: token 层,持续输出自然语言内容step 层,推送每一步的动作、工具状态和中间结论progress 层,推送总进度、耗时和成本,减少等待焦虑 用一条联合类型把字段钉死,前后端少扯皮。下面是个示意,覆盖状态变化、工具起止、审批、进度和收尾,载体可以用 WebSocket 或 EventSource。 ` Plain Text C++ Java C Python2 Python3 Pypy2 Pypy3 JavaScrip | { type: "approval_required"; request: ApprovalRequest 7 | { type: "progress"; done: number; total: number; costUsd: number } | { type: "final"; answer: string; traceId: string } | { type: "error"; message: string; recoverable: boolean }; 10 协议统一以后,时间线、步骤卡片、进度条和审批弹窗才好做,中间态不必全塞进气泡里。界面上比较值得先做的几件事: 步骤折叠与展开,避免长任务刷满屏幕Observation 面板分层展示工具入参、结果摘要、原始返回工具日志实时滚动,失败步骤高亮并给出重试入口全局状态浮层显示当前状态机节点与等待原因Stop、Retry、Continue、插话打断与后端取消契约对齐人工接管入口用于切换执行策略或直接改写下一步最终答案和中间证据联动,点击引用可回跳对应 step 同样是等三十秒,转圈和看着系统一步步推进,感受差很多。过程可见,用户能更早纠偏,也能少烧不少无效 token。 离线评测资产、线上观测与可迁移遥测 Agent 要长期迭代,既要离线侧能证明有没有变好,也要线上侧能看见真实流量里发生了什么,还要让埋点与字段尽量不因换观测后端而推倒重来。这一节把三件事收进一条工程链条:先固定可迁移遥测语义,再让离线评测与回归产出可进闸门的证据,最后在线上仍用同一套字段读 trace、成本、实验与用户反馈。底座语义与线上观测必须同源,否则灰度里对不上离线报表。 语义底座先把典型 span 名、属性键和事件形状写进约定,常见列包括 trace_id、span_id、model、token 进出与 cost_usd 等,并对齐 GenAI 与 OpenTelemetry 社区里已经有人在用的写法。这样换导出器或换观测后端时,主要改连接与映射,业务代码少动字段名。离线评测与回归靠版本化用例集、对结果与格式与合规的断言、与基线的对照统计、接入 CI 的闸门和可计量的回归耗时,把主观手感压成可复跑的 Eval 分数。线上可观测在同一套定义下读 trace 时间线、成本随时间和用量变化、AB 流量拆分、用户情绪与满意线索、以及告警与异常。工程上的收束是:语义先沉淀进离线证据,离线结论再拿去和线上 trace、金丝雀或灰度放量对齐,团队才不会各写各的报表。 落到工具时,离线侧靠版本化用例、对过程与结果的断言、基线对比和接入 CI 的闸门把手感变成证据。promptfoo、DeepEval、Ragas 分别偏配置、断言、指标,关键是同一套用例能从开发跑到发布。线上噪声更大,盯住任务完成率、工具成功与超时、成本与风险侧信号即可。Langfuse、LangSmith、Phoenix、Helicone 选型看能否把 trace、实验、分数和反馈收进同一面板。OpenTelemetry 的 GenAI 语义适合当公共约定,先统一 LLM、tool、agent 如何建 span,以及 token、延迟、错误码等字段,迁移成本主要在导出器。 前端加 LangChain 开发者可以重点讲的几点 前端把运行中的系统摊开给人看:状态、步骤、工具、风险、中断重试入口,以及 token 与成本摘要。trace 不应只躺在仓库里,而要变成时间线、Step 卡片、风险高亮和失败回放。模型差不多时,把过程讲清楚往往比再换一次模型更能换来信任和效率。 一个成熟 Agent 项目的技术区分度该怎么描述 重点不是接了哪个新模型,而是能否在真实业务里持续跑稳、可对比、可审计。下面是一段自述示例,可按实际情况改名词和程度。 我做的不是调模型、调工具的 Demo,而是面向真实用户的 Agent 运行系统。LLM 与编排负责生成与流转,Harness、状态机 Loop、风险控制、HITL、可观测和评测负责稳定与可治理。工程上我会打通离线评测、线上观测和回归闸门,用统一遥测语义串起 trace、成本、质量与用户反馈,让每次迭代可对比、可回放、可审计。我有前端背景,会把过程可视化、干预入口和体验指标当成主交付物,而不是只交最后一段文本。 总结 RAG 可以做,Agent 也可以做,它们都只是手段,不是终点。真正拉开差距的是你有没有把需求、执行、观测、评测和迭代接成闭环。下面四条自检,有一半答不上来,就值得对照正文里的分层补一补。 执行与韧性:是否有独立运行时与预算约束,Loop 是否显式状态机,故障能否回放,成本与步数是否可解释。质量与证据:是否有维护中的评测集、CI 或合并前的回归闸门,红队用例是否像测试代码一样可复跑,而不是发版前凭手感点几下。安全与过程:输入、工具调用前、输出与轨迹四层里,哪些已经落地成策略与埋点,高风险路径是否默认进审批而不是靠运气不触发。观测与闭环:线上是否能同时看到 trace、成本、实验与用户反馈,离线分数与线上信号能否进同一套界面或同一套数据模型,而不是各团队各一份报表。 能跑通链路只是起点,能不能长期闭环才是标准。 你有没有把它做成一个能稳定运行、可观测、可评测、可干预、还能持续迭代的闭环系统。 走前端加 LangChain 这条线的人,手里正好捏着界面、状态和事件,把这些和模型、工具、观测、评测缝在一起,比单纯多接一个模型更难被模板替代,写进自我介绍里也更有话可说。 ——转载自Moment,如果你对 AI 全栈开发、文档编辑器、前端工程化或者 React 源码相关内容感兴趣,欢迎添加我的微信 yunmz777 一起交流。觉得项目还不错的话,也欢迎给 DocFlow$ 点个 star ⭐
第1章 LearnWise AI项目介绍
## 1.1 项目概述 这是一个将词汇学习、AI 辅助与学习复盘结合起来的英语学习平台。平台以英语单词学习为核心,提供词库查询、课程选择、单词练习、智能复习、AI 对话以及学习报告等功能。用户既可以通过词库和全局搜索快速查找单词,也可以选择适合自己的课程进行系统学习。项目并不是简单地把词典、背单词和 AI 对话放在同一个网站中,而是希望将这些功能连接起来,形成一套从学习、练习到复盘的完整流程。 项目主要面向有明确词汇学习需求的英语学习者,包括准备中考、高考、大学英语四六级、考研、雅思、托福和 GRE 等考试的用户,也适合希望扩大词汇量、改善单词记忆效果或者在日常学习中获得英语辅导的用户。不同用户可以根据自己的学习目标选择相应课程,并通过中译英、英译中和听音拼写等模式进行练习。对于只想临时查询单词的用户,平台也提供了无需登录即可使用的词库和全局搜索功能,降低了初次使用的门槛。 项目希望解决的并不只是“去哪里背单词”的问题,还包括单词容易遗忘、复习时间不合理、错词反复出现、学习过程缺少反馈以及遇到问题时无法及时获得帮助等情况。传统的单词练习往往采用固定顺序或随机出题,用户需要自己判断哪些单词应该复习,完成练习后也很难了解真实的掌握情况。为此,平台会记录用户的正确次数、错误次数、连续答对次数和复习时间,根据单词掌握程度安排后续学习,并自动整理错词。用户不需要自行制定复杂的复习计划,系统会优先安排当前更需要巩固的内容。 词汇学习、AI 辅助和学习复盘并不是三个相互独立的功能,而是同一条学习链路中的不同环节。词汇学习负责产生真实的练习过程和学习数据,包括用户学过哪些单词、哪些单词经常出错以及当前的掌握程度;AI 辅助负责解决学习过程中遇到的问题,帮助用户理解词义、分析表达或者获取进一步的解释;学习复盘则会汇总练习数据,通过 AI 分析用户一天的学习表现,生成有针对性的总结与建议,并在用户设置的时间发送到邮箱。三者共同构成“学习产生数据、AI 提供帮助、复盘指导下一次学习”的闭环,让每一次练习都能为后续学习提供依据。 ## 1.2 主页与功能导航 主页是用户进入平台后最先看到的页面,主要负责展示项目的定位、核心能力和学习方式。页面首屏以“与 AI 对话,让英语自然生长”为主题,并通过今日单词、学习进度、连续学习天数和 AI 智能纠错等内容,让用户快速了解平台将英语学习与 AI 能力相结合的特点。首屏还提供“开始学习”和“浏览课程”两个操作按钮,用户不需要阅读复杂的使用说明,就可以直接进入词库或课程中心,如图1-1所示。  <p align="center"> <b>图1-1 主页首屏与学习入口</b> </p> 继续浏览主页,可以看到平台的数据概览和核心功能介绍。数据概览展示学员数量、课程数量、学员满意度和累计学习时长,帮助用户对平台形成整体认识。核心功能区域则集中介绍 AI 情境学习、智能对话练习、科学词汇记忆、学习数据追踪、个性化学习路径和打卡激励等能力。主页不会在这里展开每项功能的具体操作,而是先让用户了解平台能够提供哪些学习支持,如图1-2所示。  <p align="center"> <b>图1-2 数据概览与核心功能介绍</b> </p> 主页还通过模拟对话展示 AI 在英语学习中的作用。用户可以直观地看到,AI 不只是回答问题,还能够围绕语法、用词和英语表达给出反馈。页面底部则再次提供开始学习的入口,使用户在了解项目功能后能够自然地进入实际学习流程,如图1-3所示。  <p align="center"> <b>图1-3 AI 对话演示与底部学习入口</b> </p> 平台的主要功能入口集中在顶部导航栏和主页按钮中。用户可以通过顶部导航栏进入主页、词库、课程中心和 AI 对话等页面,也可以使用个人头像进入个人资料与设置界面。主页中的“开始学习”按钮会引导用户先浏览词库,“浏览课程”按钮则用于查看不同考试方向的词汇课程。这样的入口安排既照顾了只想查词的用户,也为准备进行系统学习的用户提供了明确路径,如图1-4所示。  <p align="center"> <b>图1-4 平台顶部导航栏与主要功能入口</b> </p> 对于第一次使用平台的用户,可以先从词库开始体验。用户可以浏览单词、查看音标与中文释义,并根据中考、高考、大学英语四六级、考研、雅思、托福和 GRE 等分类筛选词汇。如果已经有明确的备考目标,也可以直接进入课程中心选择对应课程,再从课程进入单词练习。学习过程中遇到词义、语法或表达问题时,则可以进入 AI 对话界面寻求进一步帮助。 平台允许未登录用户访问主页和词库,使用户在注册前就能了解产品并体验基础查词功能。由于全局单词搜索可以在公开页面中呼出,未登录用户也可以输入部分字母进行模糊查询、查看对应翻译并复制所需单词,如图1-5和图16-6所示。课程学习、AI 对话、学习记录、错词管理、个人资料和学习复盘等涉及个人数据的功能,则需要登录后使用。这样的设计既保留了低门槛的基础体验,也能避免不同用户之间的学习数据相互混淆。  <p align="center"> <b>图1-5 未登录状态下的词库</b> </p>  <p align="center"> <b>图1-6 全局单词搜索</b> </p> ## 1.3 英语词库 词库是整个项目的内容基础,无论是单词查询、课程划分,还是后续的拼写练习、错词整理和智能复习,都需要以词汇数据作为支撑。项目目前收录了约77万条英语词汇数据,既包含日常学习中常见的基础单词,也覆盖不同考试阶段和使用场景中的专业词汇。庞大的数据规模使词库不仅可以服务于常规背诵,还能满足临时查词、考试备考和高阶词汇学习等不同需求。 用户进入词库后,可以查看单词的英文拼写、音标、中文翻译和词性等基础信息。相比只展示英文与中文释义的简单单词表,这些信息可以帮助用户同时了解单词的读法、含义和基本用法。用户在遇到陌生单词时,不需要离开当前平台前往其他词典查询,便可以在词库中完成初步认识,如图1-5所示。 为了让不同学习目标的用户快速找到适合自己的内容,词库按照常见考试类型提供了分类筛选,包括中考、高考、大学英语四级、大学英语六级、考研、雅思、托福和 GRE 等。准备中考或高考的用户可以优先查看对应考纲范围内的单词,大学生可以选择四六级或考研词汇,有出国留学和语言考试需求的用户则可以查看雅思、托福或 GRE 词汇。通过这些分类,用户不必在全部数据中逐个寻找,而是可以将注意力集中在当前真正需要掌握的词汇上。如图1-7所示。  <p align="center"> <b>图1-7 检索+分类快速查找单词位置</b> </p> 除了考试分类,词库还支持根据单词内容进行条件查询。用户可以输入完整单词进行精确查找,也可以输入部分字母寻找相关词汇。查询条件还可以与考试分类结合使用,例如只在高考词汇中查找某个单词,从而进一步缩小结果范围。对于暂时没有明确目标的用户,也可以直接浏览词库,在浏览过程中逐步确定自己的学习方向。 由于词库的数据量较大,平台采用分页方式展示查询结果。用户每次只需要查看当前页的部分单词,并通过分页控件切换后续内容。分页浏览可以避免一次显示过多数据造成阅读压力,也让用户更容易确定自己当前所处的位置。无论用户选择某个考试分类,还是输入条件进行查询,页面都会按照当前筛选结果重新计算数据总量和页数,使浏览过程保持清晰。 词库中的单词还提供发音功能。用户可以在查看单词拼写、音标和翻译的同时播放对应读音,将单词的书面形式与声音建立联系。对于不熟悉的单词,用户可以先听发音,再结合音标观察其读音规律;对于已经见过但读音不确定的单词,也可以通过重复播放进行确认。发音功能使词库不再只是静态的单词列表,也为后续的听音拼写和单词练习奠定了基础。 通过词汇数据、考试分类、条件筛选、分页浏览和单词发音等功能,词库承担了平台基础内容中心的角色。用户既可以把它当作随时可用的英语词典,也可以将其作为进入课程学习和单词训练之前的内容入口。在词库之外,平台还提供了能够在任意页面快速呼出的全局单词搜索功能,该功能将在下一节结合图1-6进行介绍。 ## 1.4 全局单词搜索 词库页面适合浏览和筛选大量单词,但用户在其他页面学习时,如果只是临时忘记某个单词,没有必要先退出当前页面,再进入词库进行查询。为此,平台提供了全局单词搜索功能。无论用户当前位于主页、课程中心、单词学习还是其他页面,都可以通过快捷键快速呼出搜索面板,在不打断当前学习流程的情况下完成查词。 全局单词搜索支持模糊查询,用户不需要输入完整单词,只需输入记得的部分字母,系统就会从词库中查找所有相关结果。例如,用户只记得一个单词中的部分连续字母,也可以先输入这些内容,再根据搜索结果确认自己需要的单词。这种查询方式尤其适合“记得一部分拼写,却想不起完整单词”的情况,可以降低回忆和查找成本。 搜索结果会同时展示单词及其中文翻译,并对与输入内容相匹配的字母进行高亮处理。高亮内容可以帮助用户快速理解某个单词为什么会出现在结果中,也方便用户在多个相似单词之间进行比较。全局单词搜索的实际效果如图1-6所示。 为了提高高频查词时的操作效率,搜索面板支持完整的键盘操作。面板打开后,输入框会自动获得焦点,用户可以直接输入内容,不需要再用鼠标点击。搜索结果出现后,可以使用上、下方向键切换选中的单词,并通过回车键快速复制。选中位置移动到当前可视范围之外时,结果列表也会自动滚动,保证正在选择的单词始终可见。 除了键盘操作,平台也保留了符合日常使用习惯的鼠标交互。用户可以移动鼠标选择搜索结果,并通过点击复制对应单词。完成查询后,可以按下 `Esc` 键关闭搜索面板,也可以直接点击面板外部区域退出。鼠标和键盘两种操作方式相互配合,使初次使用的用户能够直观完成查词,也让习惯快捷键的用户可以在不离开键盘的情况下完成搜索和复制。 全局单词搜索虽然使用了英语词库中的数据,但它承担的是另一种使用场景。词库更适合按照考试分类、查询条件和页码进行集中浏览,全局搜索则强调随时呼出、快速查找和立即使用。两项功能共同覆盖了系统学习和临时查词两种需求,使词汇数据能够自然地服务于平台中的每一个学习环节。 ## 1.5 课程中心 词库提供了丰富的词汇数据,但面对数量庞大的单词,用户仍然需要一条更加明确的学习路径。课程中心会按照考试类型和学习目标组织词汇内容,使用户不必自行整理需要学习的单词。准备中考、高考、大学英语四六级或考研的用户,可以选择与当前考试对应的课程;准备出国留学或语言考试的用户,则可以选择雅思、托福或 GRE 等课程。通过课程分类,原本分散在词库中的单词会被组织成具有明确目标的学习内容。 课程中心涉及课程购买、已购状态和个人学习记录,因此只有登录用户才能访问。当未登录用户点击顶部导航栏中的课程入口,或者通过主页的“浏览课程”按钮尝试进入课程中心时,平台不会直接跳转,而是先弹出登录界面。已有账号的用户可以直接完成登录,首次使用的用户也可以在弹窗中切换至注册界面创建账号。注册或登录成功后,平台会继续跳转至课程中心,用户不需要再次点击原来的入口,如图1-8所示。  <p align="center"> <b>图1-8 进入课程中心前的登录注册界面</b> </p> 课程中心以卡片形式展示不同课程。每张卡片都会提供课程名称、课程介绍、授课教师和课程价格等信息,帮助用户在购买之前了解课程的主要内容。课程名称用于说明课程对应的考试或学习方向,课程介绍则进一步说明课程覆盖的词汇范围和适用人群。用户可以根据自己的学习目标、当前阶段和课程价格进行比较,再决定选择哪一门课程,如图1-9所示。  <p align="center"> <b>图1-9 课程中心与课程信息</b> </p> 课程中心会区分已购买课程和未购买课程。未购买的课程显示“立即购买”按钮,用户可以由此进入课程购买流程;已经购买的课程则显示“立即学习”按钮,避免用户重复购买。页面还提供“全部课程”和“已购课程”两个选项,“全部课程”用于浏览平台现有的课程,“已购课程”则只展示当前用户已经获得的内容。用户登录后可以通过已购课程列表快速找到自己的学习入口,不需要在全部课程中反复查找。 用户选择一门尚未购买的课程后,平台会打开购买确认窗口,并再次展示课程名称、课程介绍和支付金额。这个确认步骤可以让用户在支付前核对所选课程,避免因为误点而购买错误内容。确认信息无误后,用户可以继续完成支付;如果临时改变决定,也可以取消并返回课程列表。课程购买确认界面如图1-10所示。  <p align="center"> <b>图1-10 课程购买确认</b> </p> 开始支付后,平台会打开对应的支付页面,同时在购买窗口中显示剩余支付时间。用户完成支付后,平台会及时给出“支付成功,课程已加入已购课程”的反馈,并将课程状态从未购买更新为已购买。课程卡片上的“立即购买”也会随之变为“立即学习”,用户不需要手动刷新页面或者重新进入课程中心,就能直接开始学习。支付没有完成、支付时间结束或者请求出现异常时,页面同样会给出相应提示,避免用户无法判断当前订单状态,如图1-11所示。  <p align="center"> <b>图1-11 支付结果反馈与已购课程状态</b> </p> 课程购买完成后,用户可以在当前课程卡片或“已购课程”列表中点击“立即学习”,进入该课程对应的单词学习界面。平台会根据课程确定本次学习使用的词汇范围,例如从高考课程进入学习时,后续练习便围绕高考词汇展开。课程中心因此不仅是展示和购买课程的页面,也是连接词汇内容与单词学习功能的重要入口。 从用户的角度来看,整个过程可以概括为选择学习目标、了解课程内容、获得课程和开始学习。支付只是用户获得课程过程中的一个步骤,真正重要的是课程购买后能够被准确记录,并且可以随时从已购课程进入学习。通过这条流程,平台将庞大的词库转化为按目标划分的学习内容,也为下一节介绍的个性化单词学习提供了明确入口。 ## 1.6 个性化单词学习 ### 1.6.1 学习前配置 用户从已购课程点击“立即学习”后,首先进入学习前的配置页面。不同用户的英语基础、学习目标和可用时间并不相同,因此平台不会直接开始出题,而是让用户先选择本次练习的学习模式、练习范围和单词数量。配置内容保持在有限范围内,既为用户提供必要的自主选择,也避免因为选项过多而增加开始学习的压力,如图1-12所示。  <p align="center"> <b>图1-12 单词学习前的配置页面</b> </p> 平台提供中译英、英译中和听音拼写三种学习模式。中译英会给出单词的中文释义,要求用户拼写对应的英文单词。这种模式需要用户主动回忆完整拼写,对单词掌握程度的要求较高,适合训练单词的书写和实际运用能力。如图1-13所示。  <p align="center"> <b>图1-13 学习模式-中译英</b> </p> 英译中会展示英文单词,并让用户从多个中文释义中选择正确答案。与中译英相比,英译中更侧重于辨认单词。用户即使暂时无法独立拼写,也可以通过英文形式判断其含义,因此比较适合接触新词或者进行基础复习。如图1-14所示。  <p align="center"> <b>图1-14 学习模式-英译中</b> </p> 听音拼写不会直接展示英文单词,而是通过播放发音要求用户完成拼写。用户需要先辨别听到的内容,再根据读音规律还原单词。这种模式将听力辨音与单词拼写结合起来,可以帮助用户建立发音、拼写和词义之间的联系。对于读音相近或者经常拼错的单词,听音拼写能够提供更有针对性的训练。如图1-15所示。  <p align="center"> <b>图1-15 听音拼写</b> </p> 选择学习模式后,用户还需要确定本次练习的词汇范围。平台提供新词、错词和综合复习三种选择。“新词”用于学习当前课程中尚未练习过的单词,适合继续扩充学习进度;“错词”只选择之前回答错误并且仍需巩固的内容,便于集中解决薄弱部分;“综合复习”则会优先安排已经到达复习时间的单词,当需要复习的单词不足时,再补充部分新词。 综合复习并不是简单地随机抽取已经学过的单词。平台会结合每个单词以往的作答情况和复习时间,优先安排当前更容易遗忘的内容。经常答错或者刚开始学习的单词会更频繁地出现,掌握程度较高的单词则会逐渐延长复习间隔。用户不需要自己判断今天应该复习哪些词,只需选择综合复习,系统便会完成后续安排。 最后,用户可以设置本组需要练习的单词数量,例如一次学习10个、20个或者根据实际情况自定义数量。学习时间比较零散时,可以选择较少的单词快速完成一组练习;时间充足时,则可以适当增加数量。页面还会结合课程剩余单词和当前选择,帮助用户了解预计需要多少次或多少天完成学习。 完成学习模式、词汇范围和每组数量的配置后,用户便可以开始本轮练习。这些选项只负责确定“本次学什么”和“采用什么方式学习”,错词收集、掌握度计算以及后续复习时间等工作会由平台自动完成,不需要用户额外设置。这样的配置方式在保留个性化选择的同时,也让开始学习的过程保持简单直接。 ### 1.6.2 学习过程 完成学习前的配置后,平台会进入专注度更高的练习页面。页面主要展示当前题目、作答区域、学习进度和快捷键提示,尽量减少与当前练习无关的内容。中译英、英译中和听音拼写三种模式的练习界面分别如图1-13、图1-14和图1-15所示。虽然不同模式的出题方式有所区别,但它们共享相同的进度管理、答案反馈和快捷操作逻辑。 在中译英和听音拼写模式中,用户通过字母格完成单词拼写。每个格子对应一个英文字母,输入一个字母后,当前位置会自动移动到下一个可填写的格子,使用户可以连续完成整个单词。用户也可以通过左、右方向键在字母格之间移动,返回指定位置修改内容。遇到包含空格或连字符的词汇时,这些符号会被固定展示,用户只需要填写其中的字母。 完成拼写后,用户可以按下回车键提交答案。平台在判断答案时会忽略字母大小写和首尾空格,避免这些与单词掌握无关的细节影响结果。英译中模式不需要输入完整释义,而是从四个中文选项中选择正确答案。用户既可以点击选项,也可以按数字键 `1` 至 `4` 完成选择,再按回车键确认。 单词发音贯穿三种练习模式。用户可以随时按下 `Tab` 键播放当前单词的读音,将看到的拼写与实际发音联系起来。在听音拼写模式中,每道新题出现时会自动播放一次发音,用户需要根据听到的内容完成拼写;如果第一次没有听清,也可以再次播放。发音功能不仅用于给出题目信息,也能帮助用户在中译英和英译中练习中纠正读音。 当用户暂时无法回忆答案时,可以使用分级提示,而不必立即查看完整单词。按下数字键 `1` 会显示首字母,按下数字键 `2` 会显示音标,按下数字键 `3` 则会继续展示一个尚未出现的字母。提示按照由少到多的顺序逐步提供信息,让用户在获得有限帮助后继续回忆。字母格本身已经展示了单词长度,因此不需要再单独提供词长提示。 使用提示后答对与完全独立答对并不代表相同的掌握程度。平台会记录用户是否借助过提示,并据此调整该单词的学习结果。依靠提示才能完成的单词会被认为掌握得还不够牢固,后续复习时间也会相应提前。如果用户完全想不起答案,还可以按下数字键 `0` 查看完整单词。直接查看答案会被记录为本题答错,确保学习记录能够真实反映用户的掌握情况。 答案提交后,平台不会只给出简单的“正确”或“错误”提示,而是对用户答案和正确答案进行逐字母比较。拼写正确的字母会使用绿色标记,错误的字母则会使用红色和下划线突出显示。用户可以立即判断错误发生在哪个位置,是遗漏字母、字母顺序错误,还是混淆了相近的拼写,如图1-16所示。这种反馈比直接展示正确答案更有针对性,也能帮助用户减少下一次出现相同错误的概率。  <p align="center"> <b>图1-16 分级提示与错误字母对比</b> </p> 练习页面会持续展示当前进度,包括正在完成第几个单词以及本组共有多少个单词。用户每提交一道题,进度就会向前推进,使其能够随时了解已经完成和仍待完成的数量。明确的进度信息可以减少连续练习带来的不确定感,也方便用户根据剩余题量安排当前学习时间。 为了减少鼠标操作,练习页面支持通过键盘完成大部分交互。拼写时可以使用方向键移动位置,使用 `Del` 清空当前答案,使用数字键调用分级提示,使用 `Tab` 播放发音,使用回车键提交答案或进入下一题,也可以使用 `Esc` 退出练习。英译中模式则可以使用数字键 `1` 至 `4`选择释义。当前可用的快捷键会固定显示在页面底部,并根据练习模式和答题阶段自动变化,用户不需要提前记住全部操作,如图1-17所示。  <p align="center"> <b>图1-17 练习页面的进度与快捷键提示</b> </p> 从字母输入、发音播放到提示和错误反馈,练习页面围绕“保持专注”和“减少操作中断”进行组织。用户既可以通过鼠标完成基本操作,也可以全程使用键盘连续练习。在提高刷词效率的同时,平台还会记录每道题的作答结果,为后续的错词整理、掌握度计算和智能复习提供依据。 ### 1.6.3 智能复习机制 完成一道题并不意味着真正掌握了一个单词。新记住的内容会随着时间逐渐遗忘,如果复习得太早,用户只是在重复已经记得的内容;如果复习得太晚,又可能需要重新学习。因此,平台不会简单地按照固定顺序或者随机方式重复出题,而是根据每个用户对每个单词的实际记忆情况安排后续复习。 平台会持续记录用户的作答结果,包括单词的正确次数、错误次数、连续答对次数、是否使用过提示以及最近一次复习时间等信息。每次完成练习后,这些数据都会用于更新对应单词的学习状态。由于不同用户对同一个单词的熟悉程度并不相同,因此每名用户都会拥有属于自己的单词掌握记录和复习安排。 在记录学习情况的基础上,平台会为单词计算掌握程度。刚开始学习、经常答错或者需要借助提示才能完成的单词,掌握度相对较低;多次独立答对并保持稳定记忆的单词,掌握度则会逐渐提高。掌握度将原本模糊的“好像记住了”转化为可以持续更新的学习状态,使系统能够判断哪些内容需要重点巩固。 用户回答错误后,平台会自动将该单词纳入错词范围,不需要手动收藏或者整理。之后选择“只练错词”时,系统会集中提取这些尚未掌握的错误单词,让用户进行针对性训练。随着用户继续练习,错词的正确次数和连续答对次数会不断更新;达到相应掌握要求后,该单词便不再作为当前薄弱内容频繁出现。 在综合复习中,平台会优先安排已经到达复习时间的单词,并重点关注常错词和掌握度较低的内容。同一个单词如果多次回答错误,说明用户对它的记忆仍不稳定,系统会缩短复习间隔,使其更早回到后续练习中。这样的安排能够把有限的学习时间更多地用于真正薄弱的部分,而不是平均分配给所有单词。 对于已经稳定掌握的单词,平台会逐渐延长复习间隔。例如,一个刚学会的单词可能很快再次出现;连续多次正确作答后,下一次复习会被安排到更晚的时间。每完成一次有效复习,单词的记忆周期都会根据实际表现重新调整。这样既可以减少对熟悉单词的无效重复,也能在可能遗忘之前进行必要巩固。 是否使用提示也会影响复习安排。如果用户在没有提示的情况下独立答对,说明当前记忆相对牢固,可以适当延长复习间隔;如果借助首字母、音标或额外字母后才完成,即使最终答案正确,也说明该单词仍需较早复习;直接查看答案或者拼写错误,则会使该单词重新进入重点巩固范围。系统由此区分“真正记住”和“在帮助下想起”,让学习记录更加接近用户的实际水平。PS:基于SM-2算法。 智能复习机制的作用过程如图1-18所示。用户只需要选择练习新词、错词或者综合复习,后续的错词收集、掌握度更新和复习时间安排都会由平台自动完成。这套机制不会增加学习前的配置负担,而是在每次作答后持续发挥作用。PS:非完全掌握的单词,是不会纳入已学会的单词列表的,例如我有个账号学习了3天,但已学单词依旧是0。  <p align="center"> <b>图1-18 智能复习机制</b> </p> 通过这种方式,平台形成了“完成练习、记录表现、判断掌握程度、安排下次复习”的循环。常错和记忆不稳定的单词会更频繁地出现,已经掌握的单词则逐渐拉长复习间隔,使用户能够把更多时间投入到尚未掌握的内容中。 ### 1.6.4 学习结算与进度保存 当用户完成本组最后一道题后,平台会进入学习结算页面,对本次练习的整体情况进行汇总。结算并不只是告诉用户练习已经结束,而是将分散在每道题中的作答结果整理成更容易理解的数据,帮助用户判断本次学习取得了什么效果、还存在哪些薄弱内容,以及下一步应该继续学习还是返回课程中心。 结算页面首先展示本组练习的正确率。正确率根据答对数量和本组总题数计算,可以直观反映用户在当前练习中的整体表现。与单独查看某一道题相比,整组正确率更容易体现用户对这部分词汇的熟悉程度。正确率较高,说明大部分单词已经具备一定记忆基础;正确率较低,则说明当前范围内仍有较多内容需要继续巩固。 除了正确率,页面还会统计本组学习用时。学习用时可以帮助用户了解完成一组练习所需的时间,也能反映作答过程是否顺畅。用户可以结合正确率和学习用时综合判断学习状态:如果正确率提高且用时缩短,通常说明对相关单词更加熟悉;如果用时较长并且错误较多,则可以在下一组中减少题量,或者选择错词练习进行集中复习。 平台还会展示本组新掌握的单词数量。新掌握并不是指本次答对的全部单词,而是指经过此次练习后,掌握状态发生有效提升并达到相应要求的单词。这个数据能够让用户看到本次学习带来的实际进展,避免只关注错误数量而忽略已经取得的成果。 与新掌握单词相对应,结算页面还会显示待巩固单词数量。这些单词可能是在本组中回答错误、使用提示后才想起,或者尚未达到稳定掌握要求的内容。待巩固数量不会简单地等同于本组错误数量,因为一次答对并不一定代表已经形成长期记忆。平台会结合用户此前的学习记录,对单词当前所处的掌握阶段进行判断。 正确率、学习用时、新掌握数量和待巩固数量共同组成了本次学习的整体结果,如图1-19所示。用户不需要自行统计作答情况,完成一组练习后便可以快速了解此次学习表现。  <p align="center"> <b>图1-19 单词学习结算页面</b> </p> 对于本组中回答错误的单词,平台会在结算页面集中展示错词列表。用户可以在离开练习前再次查看这些单词的英文拼写和中文释义,回顾自己刚才出现的问题。错词也会被自动记录到个人学习数据中,之后可以通过“只练错词”再次进行针对性训练,不需要用户额外整理。 本组练习结束后,用户可以选择“继续下一组”或者“结束返回”。选择继续下一组时,平台会沿用当前的课程、学习模式、练习范围和每组数量,再获取一组符合条件的单词。这样可以减少重复配置,使希望连续学习的用户直接进入下一轮练习。选择结束返回时,用户则会退出当前学习任务,回到课程中心。 一次完整的学习流程由学习前配置、单词练习和结果结算三个阶段组成。用户完成结算后,当前这一组已经形成完整的学习记录,因此平台会清除该组临时进度。之后再次进入课程时,将开始新的学习任务,而不会重复恢复一组已经完成的练习。 不过,用户并不一定每次都能一次完成整组学习。可能因为时间不足、误触退出或者临时需要处理其他事情而中断练习。如果退出后只能从第一题重新开始,不仅会造成重复学习,也可能让用户放弃尚未完成的内容。因此,平台会在练习过程中持续保存当前进度。 每完成一道题后,平台都会记录本次选择的课程、学习模式、练习范围、题目列表、当前题目位置以及已经产生的作答结果。不同课程的临时进度会分别保存,因此用户在一门课程中的未完成练习不会覆盖另一门课程的学习状态。保存过程自动完成,用户不需要手动点击“保存”。 当用户再次进入同一门课程时,如果平台检测到存在尚未完成的练习,就会弹出“继续上次练习”的提示。用户可以选择继续上次内容,也可以放弃原有进度并重新开始,如图1-20所示。选择继续后,页面会恢复到中断前的学习状态;选择重新开始后,则会清除该组临时进度,并返回学习前配置阶段。  <p align="center"> <b>图1-20 继续上次练习提示</b> </p> 学习进度保存与单词掌握记录承担着不同作用。学习进度保存的是“这一组练到了哪里”,属于一次练习中的临时状态;单词掌握记录保存的则是“用户对这个单词掌握到什么程度”,属于需要长期积累的学习数据。即使用户在练习中途退出,已经提交的题目仍然会参与错词收集、掌握度更新和后续复习安排。 从选择课程开始,用户会依次经历学习配置、逐题练习、即时反馈、智能记录和结果结算。如果中途退出,进度保存功能可以让学习任务继续进行;如果顺利完成,结算数据又会成为下一轮智能复习的依据。由此,课程内容、练习过程、学习数据和后续复习被连接起来,构成项目最核心的单词学习闭环。 ## 1.7 AI 学习助手 单词学习可以帮助用户积累词汇,但真实的英语学习还会涉及语法理解、句子翻译、表达修改和实际交流等问题。固定题目只能覆盖有限范围,而 AI 学习助手可以根据用户当前提出的问题提供即时反馈。因此,平台将 AI 对话作为单词学习之外的重要辅助功能,让用户在遇到问题时能够继续在同一个平台中完成查询、理解和练习。 ### 1.7.1 多模式 AI 对话 AI 学习助手支持用户使用自然语言提出英语学习问题。例如,用户可以询问两个近义词之间的区别、某个语法结构的使用条件,也可以要求 AI 分析句子成分、解释错误原因或者根据指定单词生成例句。相比只能返回固定释义的词库,AI 可以结合问题中的具体语境进行说明,并根据用户的追问继续补充内容。 在翻译与表达方面,用户既可以输入中文并询问自然的英文表达,也可以提交英文句子,请 AI 检查语法、用词和表达是否符合实际语境。对于同一句话,AI 还可以根据日常交流、书面写作、考试作文或商务沟通等场景给出不同版本,帮助用户理解“语法正确”和“表达自然”之间的区别。 为了适应不同任务,平台提供了多种 AI 角色模式,包括智能助手、英语大师、商务英语以及具有不同回答风格的个性化模式。智能助手适合处理一般问答和日常任务;英语大师更侧重词汇、语法、翻译和学习方法;商务英语适合邮件、会议、简历和职场沟通等场景;其他个性化角色则使用不同的语言风格和分析角度回答问题。用户可以根据当前任务选择合适的角色,如图1-21所示。  <p align="center"> <b>图1-21 多模式 AI 对话界面</b> </p> AI 对话支持连续交流和上下文记忆。用户不需要在每次提问时重新描述完整背景,而是可以围绕上一条回答继续追问。例如,用户先让 AI 修改一个英文句子,随后可以继续询问修改原因、要求提供更正式的版本,或者让 AI 使用相同结构重新造句。AI 会结合当前会话中已有的内容理解后续问题,使学习过程更接近与教师进行连续交流。 不同角色会从各自擅长的方向理解同一个问题。用户可以在英语大师模式中分析语法,再切换到商务英语模式,将句子调整为适合职场沟通的表达。多模式设计并不是简单地改变角色名称,而是让 AI 的回答重点、表达方式和任务范围更加符合当前学习场景。 ### 1.7.2 会话管理 在实际学习中,用户通常不会只与 AI 交流一次。词汇辨析、作文修改、口语练习和商务邮件可能属于完全不同的主题,如果全部内容堆积在同一个聊天窗口中,后续查找和继续讨论都会变得困难。为此,平台提供了会话管理功能,用于组织不同主题的对话记录。 用户可以在 AI 对话页面创建新会话,并在已有会话之间进行切换。例如,可以分别建立“考研作文修改”“每日英语问答”和“商务邮件练习”等会话,将不同学习任务分开管理。切换会话后,聊天区域会显示对应的历史内容,用户可以从上次停止的位置继续提问,如图1-22所示。  <p align="center"> <b>图1-22 AI 会话的创建与切换</b> </p> 平台会保存已经产生的对话历史。用户退出 AI 页面或者重新进入平台后,仍然可以查看此前的问题和回答,不需要重新询问相同内容。对于具有复习价值的语法解释、翻译建议和作文修改记录,历史会话本身也可以作为个人学习资料再次查看。 不同会话之间保持相互独立。一个会话中的讨论背景不会随意带入另一个会话,避免不同主题相互干扰。不同 AI 角色也分别保留各自的交流内容,用户在商务英语模式中的对话不会混入英语大师模式的历史记录。 会话数据还会按照用户身份进行隔离。每名用户登录后只能读取自己的会话历史,其他用户无法看到这些内容。即使多名用户在同一台设备上使用平台,只要登录的是不同账号,平台展示的 AI 对话记录也会随之切换,从而保护用户的学习内容和个人信息。 ### 1.7.3 深度思考与联网搜索 普通 AI 对话适合处理翻译、词义解释、简单语法问答和句子修改等任务。这类问题目标明确,通常不需要进行长时间分析,使用普通模式可以更快获得回答。对于需要比较多种观点、分析复杂语境或者完成多步骤推理的问题,用户则可以开启深度思考。 深度思考适合处理难度更高的英语学习任务。例如,用户可以要求 AI 对比多个相近语法结构,分析一篇文章的论证方式,逐步修改英语作文,或者根据特定考试要求评价一段写作。开启后,AI 会对问题进行更充分的分析,再给出结构更加完整的回答。由于处理过程更复杂,等待时间可能会比普通对话稍长,因此没有必要在每个简单问题中使用。 当问题涉及最新资料或外部信息时,用户可以开启联网搜索。例如,查找近期英语考试信息、了解某个英文词语在当前语境中的使用方式,或者围绕最新事件开展英文阅读和讨论,都可能需要超出既有知识范围的信息。联网搜索会先查找与问题相关的资料,再结合搜索结果组织回答,减少仅凭已有知识回答所带来的时效限制。 普通对话、深度思考和联网搜索之间并不是相互替代的关系,而是分别服务于不同复杂程度的问题。简单翻译和词义查询可以直接使用普通对话;复杂语法分析、作文评价和学习规划更适合深度思考;涉及近期事件、最新资料和外部事实的问题则适合联网搜索。对于既复杂又需要最新资料的任务,用户也可以同时开启深度思考和联网搜索,如图1-23所示。  <p align="center"> <b>图1-23 深度思考与联网搜索</b> </p> 这两项能力的重点仍然是服务英语学习,而不是单纯展示 AI 能够搜索或推理。例如,用户可以让 AI 搜索一篇近期英文报道,提取其中的重要词汇并解释表达方式;也可以结合搜索到的资料整理阅读材料,再通过深度思考分析文章结构。外部信息由此被转化为可以理解和练习的英语学习内容。 ### 1.7.4 语音输入 当问题较长或者包含较多上下文时,使用键盘逐字输入可能会打断思路。平台在 AI 对话输入区域提供语音输入功能,用户可以调用设备麦克风说出问题,系统会将识别结果实时转换为文字并填入输入框。用户确认内容无误后,即可像发送普通文字一样向 AI 提问。 语音输入适合描述较长的学习需求。例如,用户可以直接说明自己正在准备哪项考试、对哪个语法结构不理解,或者完整描述希望修改的表达方式。相比在手机或键盘上输入长段文字,说出问题通常更加自然,也可以降低长文本输入带来的操作成本。 语音识别得到的内容不会绕过用户直接发送,而是先显示在输入区域。用户可以检查识别结果,对错误内容进行修改,再决定是否发送。这一步可以避免单词识别错误或环境噪声影响最终问题,也保留了文字输入原有的可控性。语音输入状态和转换结果如图1-24所示。  <p align="center"> <b>图1-24 AI 对话中的语音输入</b> </p> 语音输入主要解决的是“如何更方便地提出问题”,AI 对话负责理解问题并提供学习帮助。两者结合后,用户既可以通过文字精确描述单词和句子,也可以通过语音快速补充背景或提出长问题。需要注意的是,语音识别依赖浏览器的相关能力和麦克风权限;如果当前浏览器不支持,用户仍然可以继续使用文字输入,不会影响其他 AI 对话功能。PS:http协议下,无法从设置里打开麦克风权限,去CSDN或者各个AI问一下如何解决就行了。 通过多角色对话、会话管理、深度思考、联网搜索和语音输入,AI 学习助手覆盖了从简单查问到复杂分析的多种场景。它并不替代词汇练习,而是在用户遇到难以通过固定题目解决的问题时提供补充帮助,并将词汇、语法、翻译、写作和实际表达连接起来。 ## 1.8 AI 学习复盘与邮件提醒 单次练习的结算页面可以帮助用户了解当前一组单词的完成情况,但英语学习是一个需要长期积累的过程。如果学习记录只停留在每组练习结束时,用户很难从更完整的时间范围判断自己是否取得了进步。因此,平台会将用户每天产生的单词学习数据汇总起来,并借助 AI 生成每日学习复盘。 每日学习记录来自用户在单词学习过程中产生的真实数据,包括当天练习的单词数量、正确与错误情况、使用提示的情况、单词掌握状态以及复习结果等。这些信息会随着用户完成练习逐步积累,不需要额外填写学习日志。平台由此可以了解用户当天学习了哪些内容、哪些单词已经有所改善,以及哪些问题仍然反复出现。 在汇总数据后,平台会分析用户当天的整体正确率、主要错词和单词掌握情况。正确率用于反映当天练习的总体表现,错词记录可以暴露当前较为薄弱的词汇,掌握度变化则用于判断学习是否产生了稳定效果。相比只列出一组数字,AI 会结合这些数据说明其含义,帮助用户理解学习表现发生变化的可能原因。 例如,当用户的正确率较高,但多道题使用了提示时,复盘不会简单判断为“已经掌握”,而是会指出部分单词仍然依赖首字母或音标帮助。如果某些单词连续多次回答错误,报告会将其作为重点问题列出;如果一批单词的掌握度明显提高,报告也会肯定这一阶段的有效进展。这样的分析可以避免用户只根据一次答对或答错作出片面判断。 在分析学习表现之后,AI 会生成个性化总结,用较为自然的语言概括用户当天完成了什么、表现如何以及主要问题集中在哪里。由于总结依据的是当前用户自己的练习记录,因此不同用户、不同日期生成的内容并不相同。它不是一段固定的鼓励文字,而是对当天学习情况的针对性说明。PS:此处用的是DeepSeek模型,活人感明显不足,最好的选择是Claude。 复盘报告还会给出下一阶段的学习建议。例如,对于错误较集中的用户,可以建议下一次优先选择错词练习;对于新词学习较多但复习不足的用户,可以建议先完成综合复习;对于正确率稳定且待巩固单词较少的用户,则可以适当增加下一组的学习数量。建议会尽量对应实际数据,让用户知道下一步应该练什么,而不只是笼统地要求“继续努力”。 为了让复盘在合适的时间到达用户手中,平台在个人设置中提供每日学习复盘开关和发送时间设置。用户可以根据自己的学习习惯决定是否启用邮件提醒,并选择希望收到报告的具体时间,如图1-25所示。例如,习惯早晨背单词的用户可以将发送时间设置在学习开始前,先回顾前一天的情况,再进入新一天的练习。  <p align="center"> <b>图1-25 每日学习复盘与发送时间设置</b> </p> 到达用户设置的时间后,平台会将整理完成的学习报告发送到其邮箱。用户不需要主动打开网站查找数据,也可以查看当天或前一阶段的学习情况。邮件内容会集中展示学习概况、正确率、掌握情况、重点错词、AI 分析和后续建议,实际效果如图1-26所示。  <p align="center"> <b>图1-26 AI 每日学习复盘邮件</b> </p> 邮件提醒的作用并不是频繁催促用户,而是在用户容易忽略学习进度时提供一次主动反馈。即使当天只完成了少量练习,报告也可以帮助用户确认这些学习行为已经被记录;如果连续一段时间没有形成有效复习,邮件则可以提醒用户重新进入课程,优先处理已经到期或容易遗忘的单词。 用户可以根据需要随时调整发送时间,也可以关闭每日复盘。这样既保留了主动提醒的作用,也避免在用户暂时不需要时造成打扰。提醒时间由用户决定,使这项功能能够适应早晨学习、午间练习或者晚间复习等不同习惯。 从完整流程来看,单词学习负责产生练习记录,智能复习机制负责更新错词和掌握状态,AI 学习助手提供分析能力,邮件提醒则负责在合适的时间将结果送达用户。几项功能由此形成“练习产生数据、AI 分析数据、复盘指导下一次练习”的循环。 这套复盘机制让每一次练习不再是相互独立的任务。当天的作答结果会影响报告内容,报告中的建议又会影响用户下一次选择新词、错词或综合复习。长期坚持后,用户可以逐步形成学习、反馈、调整和再次学习的习惯,使平台从单次背词工具转变为能够持续陪伴学习过程的英语学习助手。 ## 1.9 账户与个性化设置 平台允许未登录用户浏览主页和使用基础词库,使用户在注册前就能了解项目并体验查词功能。当用户准备进入课程中心、AI 对话、单词学习或个人中心等涉及个人数据的页面时,平台会弹出登录界面,引导用户完成身份验证。这样的安排既保留了基础功能的低门槛体验,也为后续保存个人学习记录提供了必要条件。 已有账号的用户可以直接在登录弹窗中填写账号信息,首次使用的用户则可以切换至注册界面创建账号。注册成功后即可继续登录,并进入原本准备访问的页面。登录和注册都在弹窗中完成,用户不需要离开当前页面寻找独立入口,相关界面已在图1-8中展示。 登录的主要作用是为每名用户建立独立的学习空间。课程购买记录、单词练习进度、错词、掌握度、AI 对话历史和每日学习复盘都需要与具体用户对应。如果没有账号,平台便无法判断某一条学习记录属于谁,也无法在用户下次访问时恢复此前的学习状态。因此,需要长期保存或涉及个人内容的功能都会在登录后开放。 登录后,用户可以通过顶部导航栏中的头像进入个人中心。个人资料页面集中展示用户的头像、昵称、个人签名以及其他基础信息,同时还会展示累计学习单词数量和学习天数,如图1-27所示。用户由此可以快速了解自己的账号状态和当前学习积累。  <p align="center"> <b>图1-27 用户个人资料与学习数据</b> </p> 累计学习单词数量用于反映用户已经参与学习的词汇规模,学习天数则用于记录持续使用平台进行练习的情况。与单次练习中的正确率不同,这两项数据关注的是较长时间内的学习积累。用户每完成新的单词学习或形成新的学习记录,个人中心中的数据也会随之更新。 个人资料并不是固定不变的。用户可以在设置页面修改头像、昵称和个人签名等内容,使账号具有更清晰的个人标识。头像可以从本地选择并上传,昵称用于在平台中展示用户身份,个人签名则可以填写学习目标、当前状态或者希望记录的内容。完成修改后,个人中心和顶部导航栏会展示更新后的资料。 除基本资料外,用户还可以补充或调整邮箱、联系方式和地址等个人信息。其中,邮箱不仅是账号资料的一部分,也承担接收每日学习复盘的作用。因此,准备使用邮件复盘功能的用户需要确保邮箱信息填写正确,避免学习报告无法正常送达。 设置页面还提供每日学习复盘的开关和发送时间选项。用户开启该功能后,可以按照自己的学习习惯设置接收报告的时间;关闭后,平台则不会继续发送每日复盘邮件。发送时间可以根据实际作息进行调整,例如在早晨学习前接收前一天的总结,或者在晚上结束学习后查看当天表现,如图1-28所示。  <p align="center"> <b>图1-28 个人资料修改与邮件复盘设置</b> </p> 不同用户登录后看到的是各自独立的个人资料和学习数据。一名用户购买的课程不会出现在另一名用户的已购列表中,单词掌握情况、错词内容、学习进度和 AI 对话历史也不会相互混合。用户退出账号后,涉及个人数据的页面将重新受到访问限制;再次登录后,则可以继续使用已有课程和学习记录。 从功能角度来看,账户系统不是一个独立的学习内容,而是连接各项个性化能力的基础。用户通过账号获得课程、保存学习进度、积累单词掌握记录、保留 AI 会话,并接收属于自己的学习复盘。个人设置则让用户能够管理身份信息和提醒方式,使平台根据不同用户的资料、目标和学习习惯提供连续服务。 ## 1.10 完整使用流程 前面的内容分别介绍了词库、课程、单词学习、AI 对话和学习复盘等功能。本节以一名准备大学英语六级考试的用户为例,将这些功能串联起来,展示用户如何从确定学习目标开始,完成一次完整的学习过程。 用户第一次进入平台时,可以先浏览主页,了解项目提供的主要功能。此时即使尚未登录,也可以进入英语词库查看单词,通过大学英语六级分类缩小词汇范围,并结合单词、音标、翻译和词性等信息判断这些内容是否符合自己的学习目标。如果只想查询某个单词,还可以随时呼出全局单词搜索,通过部分字母快速找到对应结果。 确定准备大学英语六级考试后,用户可以从主页或者顶部导航栏进入课程中心。由于课程中心涉及课程购买和个人学习记录,未登录用户需要先完成注册或登录。登录成功后,页面会继续进入课程中心,用户可以查看不同课程的名称、介绍、教师和价格,并从中选择大学英语六级课程。 如果课程尚未购买,用户可以点击“立即购买”,在确认窗口中核对课程和支付金额,再完成支付。平台收到支付结果后会给出成功提示,并将课程加入“已购课程”列表。课程卡片上的按钮也会从“立即购买”变为“立即学习”。如果用户此前已经购买过该课程,则可以跳过支付过程,直接从已购课程进入单词学习。 进入课程后,用户需要配置本次学习方式。例如,可以选择中译英模式训练单词拼写,选择“新词”作为练习范围,并将每组数量设置为20个。配置完成后,平台会从大学英语六级课程中选取符合条件的单词,随后进入练习页面。 练习过程中,用户根据中文释义在字母格中拼写英文单词,并通过回车键提交答案。如果对某个单词印象模糊,可以逐步查看首字母、音标或额外字母,也可以播放单词发音。答案提交后,平台会立即判断结果,并通过不同颜色标记正确和错误的字母位置,让用户了解具体错在哪里。 每完成一道题,平台都会记录本次结果,并更新该单词的正确次数、错误次数和掌握情况。回答错误的单词会自动进入错词范围,使用提示后才答对的单词也会被视为尚未完全掌握。用户不需要手动整理错题,平台会根据这些学习表现安排后续复习。 完成20个单词后,用户会进入结算页面,查看本组正确率、学习用时、新掌握单词数量、待巩固数量和错词列表。如果当前学习状态较好,可以选择“继续下一组”;如果错误较多,则可以结束本组练习,下一次选择“只练错词”集中巩固。即使中途退出,平台也会保存当前进度,用户再次进入课程后可以继续上次未完成的练习。 如果练习过程中遇到无法仅通过答案反馈解决的问题,例如不理解两个近义词的区别,或者想知道某个单词在句子中的自然用法,用户可以进入 AI 对话页面继续提问。用户可以让英语大师解释词义和语法,也可以要求 AI 提供例句、修改表达或者设计针对性的练习。对于复杂问题,可以开启深度思考;对于涉及最新资料的内容,则可以使用联网搜索。 一天的学习结束后,平台会汇总用户的练习记录,包括学习数量、正确率、错词和掌握度变化,并通过 AI 生成个性化学习总结。到达用户设置的发送时间后,复盘报告会发送到对应邮箱。用户可以从报告中了解当天的学习表现、主要薄弱词汇以及下一阶段的建议。 第二天开始学习时,用户可以先查看邮件中的复盘结果。如果报告指出部分六级词汇错误次数较多,就可以回到对应课程,选择“只练错词”进行集中训练;如果有一批单词已经到达复习时间,则可以选择“综合复习”,让平台自动安排本轮内容。新一轮练习产生的数据又会进入下一次复盘,由此形成持续循环。 整个使用流程如图1-29所示。用户从词库确定目标,经由课程获得学习内容,再通过练习产生个人学习数据;AI 负责解决过程中的问题并分析学习结果,最终由复盘建议引导下一轮练习。  <p align="center"> <b>图1-29 项目完整使用流程</b> </p> 从用户角度来看,这条流程可以概括为“确定目标、选择课程、完成练习、解决问题、查看复盘和继续巩固”。项目中的各项功能并不是孤立存在的,而是围绕同一个学习目标彼此连接,使用户知道从哪里开始、当前应该学习什么,以及完成练习后下一步做什么。 ## 1.11 项目特色总结 项目的第一个特点是拥有丰富并且分类清晰的词汇资源。约77万条词汇数据为查词、课程划分和单词练习提供了内容基础,中考、高考、大学英语四六级、考研、雅思、托福和 GRE 等分类则帮助不同用户快速确定学习范围。词库、条件筛选和全局搜索分别服务于集中浏览、目标查找和临时查词,使庞大的词汇数据更容易被实际使用。 第二个特点是根据记忆规律进行个性化复习。平台不会让所有单词按照固定频率重复出现,而是结合每名用户的正确次数、错误次数、连续答对情况和提示使用情况更新掌握状态。常错和记忆不稳定的单词会优先出现,已经稳定掌握的单词则逐渐延长复习间隔,让用户将更多时间用于真正需要巩固的内容。 第三个特点是 AI 能力覆盖英语学习过程中的多种需求。用户可以通过不同角色完成词汇问答、语法解释、翻译修改和商务表达,也可以使用深度思考处理复杂问题,或者通过联网搜索获取较新的外部资料。语音输入进一步降低了提出长问题的成本,使 AI 不只是独立的聊天功能,而是词汇学习、表达训练和问题解决过程中的辅助工具。 第四个特点是形成了从练习到复盘的完整学习闭环。用户在课程中完成练习后,平台会自动记录正确率、错词、掌握度和复习状态;AI 再根据这些数据生成学习总结与后续建议,并在设定时间发送到用户邮箱。用户根据报告重新选择新词、错词或综合复习,下一轮练习又会产生新的数据。 综合来看,项目并不是将词典、背单词和 AI 对话简单地组合在一起,而是围绕英语学习过程建立了一条连续路径。词库提供学习内容,课程确定学习范围,练习记录真实表现,智能复习安排后续任务,AI 解决过程中的问题,学习复盘则帮助用户调整下一步计划。各项功能共同服务于一个目标:降低用户规划和整理学习内容的负担,让每一次练习都能为后续学习提供依据。
Django 的设计哲学有哪些?
# Django 的设计哲学 Django 的设计哲学是一组指导框架演进与开发者使用方式的核心原则,源自官方文档《Design Philosophies》。这些原则决定了 Django 为何"重"、为何"显式"、为何"安全"。 ## 一、六大核心哲学 ### 1. 松耦合(Loose Coupling) **核心思想**:各层(Model / View / Template / URL)之间尽量不互相依赖,可独立替换。 | 体现 | 说明 | |------|------| | Model 不依赖 View | 数据层可在非 Web 场景(脚本、API、CLI)复用 | | Template 不含业务逻辑 | 模板只做展示,禁止在模板里写复杂 Python | | URL 与 View 解耦 | 用 `path()` 显式映射,不靠约定自动路由 | | ORM 可替换 | 理论上可换 SQLAlchemy(虽不推荐) | ```python # URL 与 View 显式绑定,不靠文件名约定 # urls.py path('articles/<int:pk>/', views.article_detail, name='article_detail') ``` ### 2. DRY(Don't Repeat Yourself) **核心思想**:每个知识点在系统中有唯一、权威、无歧义的表示,消除重复。 | 体现 | 说明 | |------|------| | Model 即 Schema | 字段定义一次,自动生成迁移、表单、Admin | | 自动 Admin | 注册 Model 即得 CRUD 后台,无需手写 | | 模板继承 | `{% extends %}` 避免重复 HTML | | 表单从 Model 生成 | `ModelForm` 自动映射字段 | ```python # 定义一次,多处复用 class Article(models.Model): title = models.CharField(max_length=200) # Admin 自动生成 @admin.register(Article) class ArticleAdmin(admin.ModelAdmin): ... # ModelForm 自动生成 class ArticleForm(forms.ModelForm): class Meta: model = Article fields = '__all__' ``` ### 3. 快速开发(Rapid Development) **核心思想**:让开发者专注于应用逻辑,框架处理基础设施。 | 体现 | 说明 | |------|------| | 内置电池 | ORM / Auth / Admin / Forms / Migrations / i18n 开箱即用 | | `manage.py` 命令 | 一条命令建项目、建应用、跑迁移、起服务 | | 开发服务器 | `runserver` 自动重载,无需配 Nginx | | 默认 SQLite | 零配置即可开发 | ### 4. 显式优于隐式(Explicit is Better Than Implicit) **核心思想**:宁可多写一行明确代码,也不靠"魔法"自动推断。这是 Django 与 Rails 约定优于配置的根本分歧。 | 体现 | 说明 | |------|------| | URL 显式映射 | 不像 Flask 用装饰器、Rails 用 RESTful 约定自动路由 | | `INSTALLED_APPS` 显式声明 | 不自动扫描目录 | | `urls.py` 显式 include | 不自动发现 app 的路由 | | 字段不自动级联 | `on_delete` 必填,不默认 CASCADE | ```python # Flask(隐式,装饰器即路由) @app.route('/articles/<int:pk>/') def article_detail(pk): ... # Django(显式,URL 与 View 分离) # views.py def article_detail(request, pk): ... # urls.py(单独文件显式声明) path('articles/<int:pk>/', views.article_detail, name='article_detail') ``` ### 5. 安全优先(Security by Default) **核心思想**:默认安全,开发者"不做正确的事"也难写出漏洞。 | 内置防护 | 机制 | |---------|------| | **CSRF** | 所有 POST 表单强制 `{% csrf_token %}` | | **XSS** | 模板自动转义 HTML(`{{ var }}` 默认 escape) | | **SQL 注入** | ORM 参数化查询,不拼接 SQL | | **密码哈希** | 默认 PBKDF2,可换 Argon2/bcrypt | | **Clickjacking** | `X-Frame-Options` 默认 DENY | | **HTTPS** | `SECURE_SSL_REDIRECT` 等配置项 | | **Host 校验** | `ALLOWED_HOSTS` 防止 Host 头攻击 | ```python # settings.py 默认安全配置 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ``` ### 6. 内置电池(Batteries Included) **核心思想**:Web 开发所需组件框架都提供,避免在多个第三方库间选型拼装。 | 内置组件 | 替代品(Flask 需自选) | |---------|---------------------| | ORM | SQLAlchemy | | Admin | Flask-Admin | | Auth | Flask-Login | | Forms | WTForms | | Migrations | Alembic | | Template | Jinja2 | | Cache | Flask-Caching | | i18n | Flask-Babel | ## 二、哲学之间的张力 这些哲学并非完全一致,存在取舍: | 张力 | 取舍 | |------|------| | **DRY vs 显式** | DRY 想自动生成,显式想手动声明 → Django 折中:自动生成但可覆盖 | | **快速开发 vs 松耦合** | 全栈提速但耦合度高于微框架 → 接受"框架级耦合"换开发效率 | | **内置电池 vs 松耦合** | 组件多但彼此有依赖 → 用 `INSTALLED_APPS` 显式启用 | | **安全优先 vs 快速开发** | 安全检查增加步骤 → 默认开启但可配置关闭 | ## 三、哲学在代码中的具体体现 ### 1. `on_delete` 必填(显式 + 安全) ```python # Django 2.0+ 强制要求 on_delete,不默认 CASCADE author = models.ForeignKey(Author, on_delete=models.CASCADE) # ^^^^^^^^^^^^^^^^^^^^^^^^^ 必填 ``` ### 2. 模板自动转义(安全优先) ```html {# 默认转义,防 XSS #} {{ user_input }} {# <script> → <script> #} {# 需显式标记安全才不转义 #} {{ html_content|safe }} {# 开发者明确承担责任 #} ``` ### 3. `null` 与 `blank` 分离(显式) ```python # 两个独立维度,不合并为一个"可空"选项 title = models.CharField(null=True, blank=True) # null → 数据库层允许 NULL # blank → 表单层允许空输入 ``` ### 4. URL 命名而非自动路由(显式 + DRY) ```python # 显式命名,模板用 name 反查,不硬编码 URL(DRY) path('articles/<int:pk>/', views.article_detail, name='article_detail') # 模板 <a href="{% url 'article_detail' article.pk %}">详情</a> ``` ## 四、与其他框架哲学对比 | 哲学维度 | Django | Flask | Rails | FastAPI | |---------|--------|-------|-------|---------| | 耦合度 | 中(全栈但分层) | 低(微框架) | 高(全栈+约定) | 低 | | DRY | 强(自动生成) | 弱(手动组装) | 极强(约定) | 中 | | 显式 vs 隐式 | **显式** | 显式 | **隐式**(约定优于配置) | 显式 | | 安全默认 | **极强** | 弱(需手动加) | 强 | 中 | | 内置电池 | **全** | 少 | 全 | 少 | | 快速开发 | 强 | 中 | 极强 | 强(API 场景) | ## 五、哲学带来的实际影响 ### 优势 - **团队协作**:显式约定让代码可读性高,新人易上手 - **长期维护**:松耦合 + 迁移系统让大型项目演进可控 - **安全基线**:默认防护让"粗心开发者"也难写出漏洞 - **减少选型**:内置电池避免技术栈碎片化 ### 代价 - **学习曲线**:组件多,需理解 ORM / Admin / Forms / Middleware 全套 - **灵活性**:想换 ORM 或模板引擎需对抗框架惯性 - **"重"**:简单 API 也带全套中间件、Session、Auth,需精简配置 ```python # 想做纯 API,需手动关闭一堆默认组件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', # 注释掉 Session / Auth / CSRF / Messages 等 ] INSTALLED_APPS = [ # 注释掉 admin / auth / sessions / messages ] ``` --- **一句话总结**:Django 的设计哲学是 **松耦合(分层可替换)、DRY(一次定义多处复用)、快速开发(内置电池)、显式优于隐式(拒绝魔法约定)、安全优先(默认防护)、内置电池(全栈组件)** 六大原则的统一,核心张力在于用"显式 + 全栈"换取"快速 + 安全 + 可维护",与 Rails 的"约定优于配置"和 Flask 的"微内核自组装"形成鲜明分野。
Django 是什么?
# Django 是什么 **Django 是一个基于 Python 的高级、免费开源的 Web 框架**,遵循 MVT(Model-View-Template)架构,由 Adrian Holovaty 和 Simon Willison 于 2003 年创建,2005 年正式开源,由 Django Software Foundation(DSF)维护。 ## 一、核心定位 | 维度 | 说明 | |------|------| | **语言** | Python | | **类型** | 全栈(Full-stack)Web 框架 | | **架构** | MVT(Model-View-Template) | | **设计哲学** | DRY、松耦合、快速开发、显式优于隐式、安全优先、内置电池(Batteries Included) | | **许可证** | BSD | | **官网** | https://www.djangoproject.com | | **口号** | "The web framework for perfectionists with deadlines"(为有截止日期的完美主义者而生) | ## 二、Django 提供了什么 Django 是"内置电池"框架,开箱即用提供 Web 开发所需的大部分组件: | 组件 | 作用 | |------|------| | **ORM** | 对象关系映射,用 Python 类操作数据库,无需写 SQL | | **Admin** | 自动生成后台管理界面,CRUD 零代码 | | **Auth** | 内置用户认证、权限、会话系统 | | **URL Dispatcher** | 基于 URL 的请求路由分发 | | **Template Engine** | DTL(Django Template Language),支持继承与过滤 | | **Forms** | 表单生成、校验、CSRF 防护 | | **Middleware** | 请求/响应处理中间件链 | | **Migrations** | 数据库迁移系统,版本化管理表结构 | | **Cache** | 内置缓存框架(Memcached/Redis/数据库/文件) | | **i18n / l10n** | 国际化与本地化 | | **Security** | CSRF / XSS / SQL 注入 / 点击劫持防护 | ## 三、MVT 架构 Django 采用 **MVT**(Model-View-Template),是 MVC 的变体: ``` 用户请求 → URL Dispatcher → View → Model(数据)→ Template(渲染)→ 响应 ``` | MVT 组件 | 对应 MVC | 职责 | |---------|---------|------| | **Model** | Model | 定义数据模型,通过 ORM 映射数据库 | | **View** | Controller | 处理请求逻辑,调用 Model 取数据,选 Template 渲染 | | **Template** | View | HTML 模板,负责展示层 | Django 自身充当 Controller 的路由分发角色(URL Dispatcher)。 ## 四、典型工作流 ```bash # 1. 创建项目 django-admin startproject myproject cd myproject # 2. 创建应用 python manage.py startapp myapp # 3. 定义模型(models.py) class Article(models.Model): title = models.CharField(max_length=200) # 4. 生成并应用迁移 python manage.py makemigrations python manage.py migrate # 5. 创建超级用户 python manage.py createsuperuser # 6. 启动开发服务器 python manage.py runserver ``` ## 五、适用场景 | 适合 | 不太适合 | |------|---------| | 内容管理系统(CMS) | 高并发实时通信(用 Tornado/FastAPI) | | 电商、社交、博客平台 | 纯 RESTful API 微服务(用 FastAPI/Flask) | | 企业内部系统 | 极轻量小工具 | | 数据驱动的 Web 应用 | 需要异步长连接的场景 | | 快速原型开发 | — | ## 六、与同类框架对比 | 特性 | Django | Flask | FastAPI | |------|--------|-------|---------| | 类型 | 全栈 | 微框架 | 现代 API 框架 | | ORM | 内置 | 需 SQLAlchemy | 需 SQLAlchemy | | Admin | 内置 | 无 | 无 | | 异步 | 部分(3.x+) | 需 async 扩展 | 原生 async | | 学习曲线 | 中等 | 低 | 中 | | 适合 | 全功能 Web | 灵活小项目 | 高性能 API | ## 七、知名项目使用案例 Instagram、Pinterest、Mozilla、Disqus、Bitbucket、知乎、豆瓣(部分)等大型网站均使用 Django 构建。 --- **一句话总结**:Django 是一个基于 Python 的全栈 Web 框架,采用 MVT 架构,内置 ORM、Admin、认证、模板、表单、迁移等完整组件,遵循 DRY 与安全优先哲学,适合快速开发数据驱动的 Web 应用,是"有截止日期的完美主义者"的首选框架。
两年前端转AI全栈建议
24届二本毕业后一直在老家(四线城市)一个小公司呆了2年时间,想转AI全栈,如果本地找不到有计划到厦门去,推荐学python还是java
