本文档汇总了各成员在 2025 年 4 月 22 日前完成的工作。
知识学习/项目管理上的进度
魂兮归乡:
- 基本确定项目分工,代入用户视角完成了需求分析和“交互驱动的网页设计”,绘制了若干 UI 布局草稿。
- 完成技术选型,基本确定项目的文件结构。
- 扫除了之前对 CORS 和 Security 过滤器链的理解误区,掌握了注册表和钩子思想。
- 发布了《一、项目伊始》和《二、数据通讯(上)》。第一篇记录了项目灵感来源、以用户视角进行“交互驱动的网页设计”的过程、技术选型及依据、从粗到细逐步迭代分工并绘制依赖关系图的过程和项目文件的结构,第二篇记录了从零设计和实现数据通讯系统主干道的过程,包括海量信息。
- 学习了 One API(Chat Completion)和 Web Client 发送异步请求的基础知识,初步讨论了一些潜在的 LLM 输出异常情况及应对方案。
dogdogw:
- 复习了 Git 的基础知识,发布了《Git 学习笔记:从基础到分支管理的实践》,博客中重点介绍了 Git 的工作流程和常用指令(附带思维导图),并在最后动手练习了项目初始化、同步远程仓库和分支开发等内容。
- 分析了任务所需的技术,复习了 Java、Springboot、Spring MVC 和 Spring Data JPA 的基础知识。
- 因为诤略参谋项目的地基部分尚未完工,在与项目独立的小 demo 中走通了“项目管理”功能的流程。
w_x_yao:
- 复习了 Git 的基础知识,发布了《初次邂逅 Git:因项目实训开启的探索之旅》和《深入 Git:从理论到实践的进阶之路》。第一篇博客记录了自己安装和配置 Git 的过程,第二篇博客记录了自己学到的 Git 理论知识,动手练习了提交和删除等操作。
- 学习了 LLM 的基础知识,试用了学校提供的 API(Chat Completion API)。发布了《从摸鱼到填坑:我的 LLM API 学习实录》,编写了一个小的 Python demo,通过 API 与 DeepSeek-R1 对话。
贝格拉夫:
- 复习整理了 Git 的基础知识,发布了《Git知识补充学习》,练习了一些 Git 的基础操作。
- 学习了 token、temperature、提示词和 embedding 等 LLM 基础知识,发布了《LLM基础知识学习个人笔记》。写了小的 Python demo 做实验,发现 One API 的 DeepSeek-R1 不会像 DeepSeek 官方 API 一样把 CoT 写在
reasoning_content
中,而是把 CoT 同正式答案一并写在content
中。 - 从 OpenAI API 文档中学习了 Chat Completion API 的使用方法,发布了《阅读OpenAI官方文档学习LLM》。
epiphany狂人:
- 学习了 Git 的基础知识,发布了《(第一周,校历第9周)了解git ,简单使用一些的指令》,练习了一些 Git 的基础操作。
主项目上的进度
注:
- 灰底带删除线的是在上一次或更早的汇报中就已完成的任务;
- 绿底带删除线的是在本次汇报中完成的任务;
- 如果队员在上一次汇报后没有完成新任务,不展示对应成员的任务表。
- “没有完成新任务”不等于“没有做新的事情”,队员依旧会学习相关知识、编写博客、构思实现方案、写小例子。
魂兮归乡:
艺术
代码
- 设计和实现了
Field
、Btn
和FormWrapper
组件,利用这三个组件可以极轻松地配置前端字段的校验规则、按钮与文本框的关联、按钮的禁用与否以及请求的发送和响应的解析。 - 设计开发了前端全局弹窗系统,编写了
modal
store、toast
store 和notification
store,让App.vue
中顶层组件GlobalModalWrapper
、ToastDrawer
和NotificationDrawer
根据对应 store 中的状态值响应式地渲染通知。三个 store 还对外提供modal.open
、toast.success
、toast.error
等方法,队员可以通过调用这些方法极轻松地显示不同类型的提示消息(实际上他们只需要手动调用modal.open
)。 - 基于
modal.open
编写了Deletor
组件,会弹窗确认删除,简化后续各种删除功能的开发。 - 设计并实现了业务状态码
BizCode
和统一响应格式StdResponse
,并实现了 MVC 层的全局异常处理器,保证后端发来的数据总是遵循StdResponse
格式。同时设置了前端 axios 响应拦截器,基于统一格式自动解析http
对象发出的请求对应的响应,根据StdResponse
的userVisibility
决定是否调用全局弹窗提示用户,根据code
决定调用弹窗系统提供的哪一种方法(哪一种样式的 Toast)显示提示消息。基本可以说,消息提示被完全自动化了,队员开发时只需要声明式地定义一个BizCode
值决定userVisibility
和弹窗中显示的msg
即可。 - 编写了
CorsFilter
,配置了 Security 过滤器链,规避了对/api/××
的跨域限制。 - 实现了用户注册、登录、忘记密码、重置密码、修改用户名、退出登录和自动登录功能。其中注册、忘记密码和重置密码需要使用邮箱验证码,我们也完成了发送邮件相关的代码。
- 编写了
user
store,在前端持久化用户的基本信息(如 JWT 和邮箱等)以及配置信息(如是否启用自动登录),加载网页后立刻检查用户是否开启了自动登录,如果开启,立刻向后端发送自动登录请求,如果后端判断 JWT 有效,在收到成功响应后更新用户基本信息,并将用户从欢迎页路由到核心功能页。 - 配置了 axios 请求拦截器,从
user
store 中取出登录用户的 JWT,自动附加到每一个http
对象发出的请求的请求头中。 - 编写了 JWT 签发和验证等函数和
JwtAuthFilter
,JwtAuthFilter
会检查大部分路径上的请求携带的 JWT 的合法性,如果合法则将用户信息填入安全上下文,如果不合法就不填写安全上下文。之后FilterSecurityInterceptor
发现安全上下文内为空时意识到 JWT 不合法,抛出异常,被特意配置了的ExceptionTranslationFilter
使用我们自定义的入口点CustomAuthenticationFilter
向/error
转发请求,我们为/error
写了 RESTful API,这个 API 会抛出异常,就这样把 Security 中的异常转为了 MVC 层全局异常处理器可以统一处理的异常。 - 为 JWT 设置了版本号机制以实现“立刻失效”,搭配退出登录、修改密码和忘记密码功能使用。
- 开发了
Bubble
、Empty
和Tip
组件,队员只需要向组件传递内容字符串,不需要再关心样式。 - 开发了
Search
组件,简化后续各种查询功能的开发。 - 开发了
Switch
组件,用于启用/禁用各类配置。 - 开发了
Wave
组件,充当加载指示器。 - 为了避免 LLM 输出慢的问题开发了任务系统。开发了专用于后台任务的组件
TaskBtn
,行为类似Btn
,但是点击后会向后端提交一个任务,后端发出异步请求并立刻生成一个Task
实体类对象,将对象传回浏览器。前端使用task
store 记录这个Task
实体类对象(内含反映任务完成情况的字段),并自动轮询这个任务的状态。后端利用 WebClient 发送异步请求,请求成功时调用成功回调处理响应、生成结果,更新对应任务的状态。TaskBtn
有whenSucceed
钩子,轮询发现任务状态变为完成后拿着任务中的resultId
调用whenSucceed
。 - 前端
task
store 也会在任务完成时自动调用notification.success
或notification.error
,自动弹出提示。成功提示带有一键路由功能。 - 前端
task
store 在网页加载时调用init
向后端请求任务列表,以初始化任务面板。 - 初步讨论了对 LLM 异常情况的处理。
任务系统核心逻辑示意图:
诤略参谋数据通讯系统的完整图景: