当前位置: 首页 > article >正文

研途灵伴学习专项接口支撑与协议收口复盘

摘要前面的计划、错题本、复习、状态这些后端模块其实都已经能各自工作了聊天里的动作按钮也能执行。但是当桌面端真的开始接学习页和聊天动作时问题就出来了数据来源太散页面要自己拼。动作点完以后前端只知道“成功了”不知道该刷新什么、该往哪里跳。所以我这轮做的事情可以概括成两步给学习页补一个聚合入口让页面能一次拿到关键数据。把聊天动作执行结果补成结构化返回方便前端联调。后来又根据审查意见把公共 API 文档和save_note的联调指引一起收口。这样这轮工作才算完整。这轮任务在解决什么问题这次对应的是“学习专项接口支撑代码”。和 OCR、跟课上下文这种偏单点功能的模块不太一样这部分更像一层连接件。它不是去发明新的学习规则也不是重写 plan、wrong_book、review 这些已有能力而是把已经存在的服务往前接一层变成前端能直接消费的接口。我一开始也想过继续拆小接口比如计划一个、复习一个、错题再一个。但回头看桌面端任务文档以后我发现这样意义不大。页面真正关心的不是“你后端有几个 service”而是“我打开页面的时候今天该看的东西能不能一次拿到”。所以我最后选的是“聚合 适配”这个方向聚合解决学习页数据太散的问题。适配解决聊天动作执行后的联调问题。我这轮具体做了什么这次改动主要落在下面四块。1. 新增 learning-support 接口我加了两个接口GET /api/v1/learning-support/overviewGET /api/v1/learning-support/actions其中overview负责给学习页返回一份聚合摘要内容包括今日计划摘要错题本摘要复习任务摘要当前状态摘要actions则更像一份动作目录告诉前端这个动作是前端本地处理还是后端处理有没有对应页面可以跳动作执行完以后建议刷新哪些模块2. 扩展聊天动作执行返回原来的聊天动作执行接口返回内容比较简单主要是successresult_message这个结构适合给用户弹个提示但不太适合前端联调。因为前端还会关心这次有没有真的新建错题有没有排出新的复习任务哪些页面需要重新请求数据所以我这次把动作执行结果扩成了result_payloadrefresh_targets这样前端拿到结果之后不用再自己猜下一步该怎么处理。3. 把路由和 schema 一起补齐新增接口不只是把 service 写完就算结束还要把整个出口补完整。所以这一轮我也同步改了api/v1/router.pyschemas/learning_support.pyschemas/__init__.pyschemas/conversation.py这样一来接口路由、响应结构和对外导出都在同一轮里收口后面别人接的时候不需要再去猜。主链路是怎么搭起来的我觉得这篇里最值得记下来的不是“我新写了两个接口”而是这轮接口到底怎么接到项目主链路里的。第一步先确认学习页到底需要什么我先回头看了桌面端页面和导航文档。虽然学习相关页面分成了计划、错题本、复习任务、学习复盘这些模块但它们真正依赖的核心数据其实都绕不开下面四块planwrong_bookreviewstate也就是说页面不是缺数据而是缺一个统一入口。所以overview的目标很明确不重新定义业务规则只把学习页最关心的数据拼好直接给前端一份能用的结果。第二步聚合层只做读取不重写业务逻辑这一步我实现时比较克制。学习专项接口支撑这一层本质上是“聚合和适配”不是再造一套计划逻辑也不是在这里顺手修改错题和复习规则。所以LearningSupportService里做的事情主要是从DailyPlan和StudyTask提炼计划摘要复用WrongBookService的积压数和高频错点能力复用ReviewService的今日复习和 upcoming 能力从UserStateSnapshot取最新状态快照。这样做的好处很直接主业务规则还是留在原来的 service 里学习专项这一层只是把数据读出来整理好不会把后端逻辑越写越散。第三步把聊天动作和学习页刷新接起来这一部分其实是这轮最关键的主链路。之前聊天里的动作按钮虽然能点但点完以后前端很难优雅地知道后续该做什么。比如点“加入错题本”以后错题页要不要刷新点“加入并安排复习”以后复习页和计划页要不要一起刷新点“标记完成”以后状态面板里的完成率要不要同步更新如果这些都让前端自己写死后面只会越来越乱。所以我这次把聊天动作返回补成了结构化结果。以add_review为例现在后端会返回这次命中的wrong_question_ids新建的review_task_idsnext_review_dates新建数量和命中已存在数量以及refresh_targets[wrong_book, review, plan, state]这样前端拿到结果之后就可以明确刷新相关模块而不是自己到处写判断。第四步再补一份动作目录减少前后端各自维护一套表只有动作执行结果还不够因为页面第一次渲染按钮时也需要知道这些动作的基础信息。所以我又加了GET /learning-support/actions。这个接口统一返回action_keyhandlertarget_routerefresh_targets对前端来说它更像一份动作说明书。这样不管是聊天按钮、学习页入口还是后面联调脚本大家都可以读同一份动作目录不需要每个地方再维护一套自己的映射表。这一步做完之后前后端之间那层隐性的耦合就少了很多。写这轮代码时我的思路这轮虽然偏接口层但真正写的时候我脑子里一直在反复确认下面几个点。1. 这一层不能越权我一直提醒自己learning-support不是新的核心业务模块。它不能在聚合时顺手改业务规则也不能绕开原来的 service 直接去写核心表。所以我最后坚持的原则是读取已有数据可以聚合核心写入还是走原来的 service联动逻辑只做显式暴露不在这里偷偷扩规则。2. 结构化返回是给联调用的不是为了让字段看起来更多补result_payload的时候我想得比较清楚这不是为了把接口写得更“复杂”而是为了让前端少猜一点。如果 action 执行完只有一句文案前端后面还是得自己推断有没有真正新建数据统计要不要变页面要不要刷新那还不如直接把这些信息明确返回。这样调试也更方便出了问题也更容易定位。3. 当前项目没有的页面和读取链路就不要假装已经有了这个教训就是save_note给我的。我最开始给它配了跳转和刷新目标后来回头对照桌面端页面和业务逻辑问题文档发现现在并没有稳定的笔记读取页和对应接口。这个时候如果还继续给前端一个“跳这里、刷这里”的指引只会把联调带偏。所以我最后把它收成target_route nullrefresh_targets []这个修改看上去像是“少做了一点”但其实更符合当前项目状态。做到哪一步就写到哪一步这样后面别人接起来才不会被误导。这轮里我遇到的两个实际问题这轮后面最花时间的其实不是写overview和actions本身而是把两个看起来不大、但很容易在联调时出问题的点处理干净。1. 接口已经写出来了但公共协议还是旧的这是我改完第一版代码以后碰到的第一个问题。当时后端里其实已经有了GET /learning-support/overviewGET /learning-support/actions/chat/conversations/{id}/action新增的result_payload/chat/conversations/{id}/action新增的refresh_targets代码层面看起来已经能用了但回头一看公共 API 规范这些内容并没有正式写进去。这个问题的尴尬点在于后端自己知道自己返回了什么前端也许临时能从代码里看出来但只要开始多人协作问题马上就会冒出来别人接接口时不知道这两个新接口是不是正式协议action 返回体到底有哪些字段要不要依赖也说不清楚后面再做联调或者返修时大家会出现“代码一套、文档一套”的情况。我后面处理这个问题的方法很直接就是不拖。我把 learning-support 这两个接口和 action 新增字段的结构、示例、语义都正式补到了公共 API 规范里。这样做完以后这轮改动才算真正从“本地实现完成”变成“团队里其他人也能按同一套口径接入”。这个问题也让我更确定了一件事联调层的代码如果没有配套协议实际上还不能算交付完成。2. save_note 的联调指引写得太超前了第二个问题是save_note。我一开始给它配了一套比较完整的动作目录信息target_route/course-contextrefresh_targets[course_context, notes]当时这么写的想法很简单就是希望前端在保存笔记以后能知道要跳哪、刷哪。但后面我回头去对桌面端页面文档和业务逻辑问题文档时发现这里有个很明显的偏差当前桌面端并没有正式的/course-context页面笔记读取接口这块本身还是缺口之前也专门沉淀过业务问题文档。也就是说我这时候继续给前端一个“你点完以后跳这里、刷新这里”的指引其实是在给一个当前还接不住的能力做承诺。这个问题我后面没有硬圆而是直接收紧处理target_route改成nullrefresh_targets改成空数组聊天动作执行返回里也同步改成空数组避免前端误以为这条链路已经完整打通。我觉得这个调整虽然看起来像是在“减配置”但实际上更靠谱。因为它至少保证现在返回给前端的信息都是真能兑现的不会把后面的联调带偏。这轮最大的收获这轮做完以后我自己的感受很明显前面的 plan、wrong_book、review、state 更像一块一块砖学习专项接口支撑做的事情就是把这些砖往前搭成一段真正能走的路。它不一定是项目里最显眼的模块但它很影响联调体验。因为页面是不是能一次拿到需要的数据按钮点完后页面是不是知道该怎么刷新这些问题如果没人补最后都会变成前后端来回猜。另外我这次也更明确了一件事接口层工作不只是“把数据吐出来”还要考虑当前阶段的页面能力、协议有没有写清楚、联调指引会不会误导别人。如果只看代码量这轮不算特别大但从项目推进的角度看我觉得这次补的是一层很关键的连接件。它把聊天动作、学习页展示和公共协议真正接到了一起也给后面桌面端联调省了一些重复沟通的成本。

相关文章:

研途灵伴学习专项接口支撑与协议收口复盘

摘要 前面的计划、错题本、复习、状态这些后端模块其实都已经能各自工作了,聊天里的动作按钮也能执行。但是当桌面端真的开始接学习页和聊天动作时,问题就出来了: 数据来源太散,页面要自己拼。动作点完以后,前端只知道…...

Mem Reduct:3步解决电脑运行缓慢的实用内存管理指南

Mem Reduct:3步解决电脑运行缓慢的实用内存管理指南 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 你是…...

基于单细胞测序技术的细胞通讯分析方法及其应用

一、细胞通讯与单细胞测序技术的研究意义多细胞生物由不同类型的细胞构成一个开放的社会。在这一社会中,单个细胞之间必须协调其行为,因此建立有效的通讯联络机制至关重要。细胞通讯是指一个细胞发出的信息通过介质传递至另一个细胞,并引发相…...

别再只会用assign了!手把手教你用Verilog for循环实现4位乘法器(附Modelsim仿真对比)

从assign到for循环:Verilog乘法器的硬件思维进阶指南 在FPGA开发中,乘法器是最基础却又最容易被忽视的运算单元。许多初学者会直接使用assign out a*b;这样的简洁写法,却很少思考这行代码背后究竟生成了怎样的硬件电路。本文将带你从硬件思维…...

3大突破!网盘下载加速工具让你的文件获取效率倍增

3大突破!网盘下载加速工具让你的文件获取效率倍增 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

线控转向系统 Carsim和Simulink联合仿真模型。 基于横摆角速度增益不变的变传动比模块。 图中分别为角阶跃工况 和 双移线工况 汽车对应的响应曲线,并且与Carsim自带的机械转向对比图。

线控转向系统 Carsim和Simulink联合仿真模型。 基于横摆角速度增益不变的变传动比模块。 图中分别为角阶跃工况 和 双移线工况 汽车对应的响应曲线,并且与Carsim自带的机械转向对比图。这是一个非常专业的汽车动力学控制仿真需求。要实现线控转向(SBW&am…...

SPM12处理fMRI数据时,如何从OpenNeuro下载的JSON文件里自动提取SliceTiming参数?

SPM12处理fMRI数据时,如何从OpenNeuro下载的JSON文件里自动提取SliceTiming参数? 当你第一次从OpenNeuro下载fMRI数据集时,可能会被附带的JSON文件搞得一头雾水。这些看似复杂的元数据文件实际上藏着预处理所需的关键参数——尤其是SliceTim…...

LeetCode 9. 回文数:两种高效解法详解

LeetCode入门级经典题——9.回文数,这道题看似简单,却藏着两种思路截然不同的高效解法,尤其适合刚接触算法的小伙伴巩固基础。话不多说,我们直接进入正题! 一、题目回顾 题目很简洁:给你一个整数 x &#x…...

Qwen3-TTS开源大模型实操:批量处理CSV文本并生成多语种MP3音频的Python脚本

Qwen3-TTS开源大模型实操:批量处理CSV文本并生成多语种MP3音频的Python脚本 1. 为什么你需要这个脚本:从手动点选到全自动批量合成 你有没有试过用Qwen3-TTS WebUI生成几十条产品介绍语音?每次打开页面、粘贴文本、选语言、点生成、等加载、…...

AI辅助开发:让快马平台Kimi模型帮你编写狼蛛f87pro键盘的智能配置逻辑

最近在折腾狼蛛F87Pro机械键盘的深度配置,发现它的驱动功能虽然强大,但配置逻辑稍微复杂了点。特别是想实现一些高级的宏命令和情景模式切换时,手动编写配置文件容易出错。后来尝试用InsCode(快马)平台的AI辅助开发功能,整个过程顺…...

PP-DocLayoutV3详细步骤:image图像块识别+seal印章区域高亮标注输出

PP-DocLayoutV3详细步骤:image图像块识别seal印章区域高亮标注输出 你是不是经常遇到这样的烦恼:拿到一份扫描的合同或发票,想快速找到里面的关键信息,比如签名、印章、表格,但文档是歪的、有褶皱,或者印章…...

Outfit字体全面解析与实战指南:现代设计的无衬线字体解决方案

Outfit字体全面解析与实战指南:现代设计的无衬线字体解决方案 【免费下载链接】Outfit-Fonts The most on-brand typeface 项目地址: https://gitcode.com/gh_mirrors/ou/Outfit-Fonts Outfit字体作为一款现代开源无衬线字体,以其完整的9种字重体…...

打卡信奥刷题(3076)用C++实现信奥题 P7015 [CERC2013] Crane

P7015 [CERC2013] Crane 题目描述 有 nnn 个箱子等着装上船。箱子的编号是 a1,a2,⋯ ,ana_1,a_2,\cdots,a_na1​,a2​,⋯,an​。你的工作是通过若干次交换,将它们从小到大排列。你每次可以选择一个区间,将它的前半部分与后半部分交换,两半内…...

效率倍增:用快马平台自动化测试openclaw多模型性能

最近在开发机器人抓取算法时,经常需要对比不同模型的性能表现。传统方法需要手动切换模型、反复运行测试脚本,效率实在太低。经过一番摸索,我在InsCode(快马)平台上搭建了一个自动化测试工具,效果提升显著,分享下具体实…...

AI赋能前端设计:使用快马平台智能生成旅行博客网站首页

最近尝试用AI辅助开发一个旅行博客网站首页,整个过程比想象中顺利很多。作为一个经常需要快速产出前端页面的开发者,这种智能生成代码的方式确实带来了不少便利。下面记录下我的实践过程和一些思考。 需求分析与AI沟通 首先需要明确页面的核心模块&…...

Adobe Illustrator 2026 v30(AI2026)安装教程及下载

我用夸克网盘给你分享了「矢量绘图Adob...已激活版」,点击链接或复制整段内容,打开「夸克APP」即可获取。筷莱蜴蝮鰉鰗鰘夺郝/~b12b3Y1kyM~:/链接:https://pan.quark.cn/s/38566e6aec26Adobe矢量绘图软件Adobe Illustrator 2026(AI2026)是一款…...

产品经理开需求会必看!2026年5款会议纪要自动生成软件,真香体验散会就出完整纪要

做产品的天天泡需求会,做销售的天天跑客户要整理录音,做学生的天天要整理访谈,不同人对转写工具的需求天差地别——有人要准确率不能漏需求,有人要便宜不能月月大出血,有人要能识别方言听不懂客户说啥也不怕。我测了市…...

Z-Image Turbo进阶指南:自定义模型替换操作步骤

Z-Image Turbo进阶指南:自定义模型替换操作步骤 1. 了解Z-Image Turbo的核心优势 Z-Image Turbo是一个基于Gradio和Diffusers构建的高性能AI绘图工具,专为追求效率和质量的创作者设计。它最大的特点是能够在极短时间内生成高质量图像,通常只…...

NASA Earthdata保姆级教程:手把手教你用矩形框批量下载MODIS和VIIRS遥感数据

NASA Earthdata零基础实战:从注册到批量下载MODIS/VIIRS遥感数据的完整指南 第一次接触NASA Earthdata网站时,面对满屏的专业术语和复杂操作界面,大多数科研新手都会感到手足无措。作为全球最大的对地观测数据平台之一,Earthdata…...

终极指南:如何安全降级旧款iPhone和iPad系统,轻松延长设备寿命

终极指南:如何安全降级旧款iPhone和iPad系统,轻松延长设备寿命 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/L…...

PX4+Gazebo仿真:从键盘指令到无人机轨迹的Offboard控制实践

1. 环境搭建与基础配置 在开始PX4Gazebo仿真之前,我们需要先搭建好开发环境。我推荐使用Ubuntu 20.04 LTS系统,这是目前最稳定的ROS Noetic支持版本。记得第一次配置环境时,我花了整整一天时间解决各种依赖问题,现在把这些经验都总…...

SAM 3图像分割:支持点、框、掩码提示,交互式分割体验

SAM 3图像分割:支持点、框、掩码提示,交互式分割体验 想象一下,你有一张复杂的街景照片,里面有行人、车辆、树木和建筑。现在你想把照片里那辆红色的汽车单独抠出来,用来做一张海报。传统的方法可能需要你打开专业的图…...

如何让旧款iOS设备重获新生:Legacy-iOS-Kit全攻略

如何让旧款iOS设备重获新生:Legacy-iOS-Kit全攻略 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 当你…...

拖曳阵声纳系统技术开源情报(OSINT)综合分析

执行摘要 本报告基于印度国防研究与发展组织(DRDO)海军物理与海洋ographic实验室(NPOL)发布的ALTAS技术转让文件,结合全球开源情报,系统分析了拖曳阵声纳(Towed Array Sonar, TAS)的关键技术、开源实现、学术前沿和商业系统。情报显示,现代拖曳阵声纳技术正向双/多静…...

仙境传说RO:自定义商店脚本全解析与实战指南

1. 自定义商店脚本基础入门 在仙境传说RO私服开发中,自定义商店是最基础也最实用的功能之一。我第一次搭建商店时,花了整整三天才搞明白那些看似简单的脚本参数。现在回头看,其实掌握几个核心要点就能轻松上手。 商店脚本主要分为三种类型&am…...

汇川伺服Modbus通讯踩坑实录:从“通信超时”到“数据错乱”的五个常见故障排查指南

汇川伺服Modbus通讯实战:五大典型故障排查与深度解析 调试现场的温度总是比办公室高几度,尤其是当你面对一台"沉默"的汇川伺服驱动器时。Modbus-RTU协议作为工业自动化领域的"普通话",理论上应该让不同设备间的对话变得…...

突破限制的AI开发助手:Cursor Free VIP开源工具全攻略

突破限制的AI开发助手:Cursor Free VIP开源工具全攻略 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tri…...

leetcode 1624. 两个相同字符之间的最长子字符串-耗时100

Problem: 1624. 两个相同字符之间的最长子字符串 耗时100%&#xff0c;双指针&#xff0c;找到相同的以后直接break以及拿到最大值 Code class Solution { public:int maxLengthBetweenEqualCharacters(string s) {int n s.size(), mx -1;char ch;for(int i 0; i < n; i…...

3步终极指南:如何快速解决openpilot驾驶辅助系统的5大常见问题

3步终极指南&#xff1a;如何快速解决openpilot驾驶辅助系统的5大常见问题 【免费下载链接】openpilot openpilot is an operating system for robotics. Currently, it upgrades the driver assistance system on 300 supported cars. 项目地址: https://gitcode.com/GitHub…...

3步实现B站M4S格式转换:开源工具全流程指南

3步实现B站M4S格式转换&#xff1a;开源工具全流程指南 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter B站缓存的M4S格式&#xff08;B站采用的分…...