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

第 5 周——诗词创作模块后端接口对接

前言

本周承接上周前端基础建设,主要开展诗词创作模块后端接口对接与基础功能联调工作。基于给定的接口规范,完成了智能评分、AI 改写、多轮对话等核心功能的前后端数据打通,实现了三栏联动的基础数据同步。目前核心流程可正常运行,但界面样式较为基础,部分交互细节有待打磨,为下周创作模块界面专项优化做好了准备。

一、本周核心任务

  • 对接创作模块 5 个核心后端接口,替换全部前端模拟数据
  • 实现诗词提交评析、AI 改写、专属对话基础功能
  • 完成历史记录加载、查看与前端删除功能
  • 实现三栏联动数据同步与全局导航跳转
  • 修复联调过程中出现的数据解析、状态同步问题

二、核心功能实现

2.1 统一请求工具与 API 封装

基于 Axios 封装统一请求工具,集成 token 自动携带与基础错误处理;按照后端接口规范,封装创作模块所需的全部 API 函数。

// src/utils/request.js import axios from 'axios' import { ElMessage } from 'element-plus' import router from '@/router' const service = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL + '/api/poem/learn', timeout: 30000 // AI接口延长超时至30秒 }) // 请求拦截:自动携带token service.interceptors.request.use(config => { const token = localStorage.getItem('token') if (token) config.headers.Authorization = `Bearer ${token}` return config }) // 响应拦截:统一处理错误 service.interceptors.response.use( response => response.data, error => { if (error.response?.status === 401) { ElMessage.error('登录已过期') localStorage.clear() router.push('/login') } else { ElMessage.error(error.response?.data?.message || '请求失败') } return Promise.reject(error) } ) export default service
// src/api/index.js import request from '@/utils/request' // 提交诗词进行智能评价 export const submitPoemForEvaluation = (data) => request({ url: '/create', method: 'post', data }) // AI改写诗词 export const rewritePoem = (data) => request({ url: '/rewrite', method: 'post', data }) // 获取用户会话列表 export const getConversations = (userId) => request({ url: '/conversations', method: 'get', params: { userId } }) // 获取单个会话详情 export const getConversationDetail = (conId) => request({ url: `/conversation/${conId}`, method: 'get' }) // 发送对话消息 export const conversation = (data) => request({ url: '/conversation', method: 'post', data })

2.2 三栏联动核心逻辑

通过计算属性绑定当前选中的历史记录,实现左中右三栏数据的自动同步,这是整个创作页面的核心机制。

<script setup> import { ref, computed, nextTick, onMounted } from 'vue' import { useRouter } from 'vue-router' import { ElMessage } from 'element-plus' import { submitPoemForEvaluation, rewritePoem, getConversations, getConversationDetail, conversation } from '@/api/index' const router = useRouter() const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}') // 核心状态 const loading = ref(false) const rewriting = ref(false) const currentPoemTitle = ref('') const currentPoem = ref('') const currentActiveId = ref(null) const inputMessage = ref('') const chatScrollRef = ref(null) const historyList = ref([]) // 【核心】三栏联动计算属性 const currentHistory = computed(() => { return historyList.value.find(item => item.id === currentActiveId.value) || null }) // 选择历史记录,同步更新中栏和右栏 const selectHistory = (item) => { currentActiveId.value = item.id currentPoemTitle.value = item.title currentPoem.value = item.poemText nextTick(() => { chatScrollRef.value?.setScrollTop(99999) }) } // 页面加载时获取历史记录 onMounted(() => { loadHistory() }) </script>

2.3 核心功能实现

完成了诗词提交评析、AI 改写、多轮对话三大核心功能的前后端联调。

// 提交诗词进行智能评析 const handleAnalyze = async () => { if (!currentPoemTitle.value.trim()) return ElMessage.warning('请输入诗词标题') if (!currentPoem.value.trim()) return ElMessage.warning('请先输入诗词内容') loading.value = true try { const response = await submitPoemForEvaluation({ userId: userInfo.userId || 1, title: currentPoemTitle.value, content: currentPoem.value }) if (response.code === 200) { const newPoem = response.data // 添加到历史记录 historyList.value.unshift({ id: newPoem.poemId, title: newPoem.title, createTime: new Date().toLocaleDateString(), poemText: newPoem.content, evaluation: newPoem.evaluation, score: newPoem.score, aiContent: newPoem.aiContent, aiExplain: newPoem.aiExplain, chatList: [{ role: 'ai', content: `已完成《${newPoem.title}》的智能评析,评分${newPoem.score}分,有任何问题都可以问我~` }], conId: newPoem.conId }) currentActiveId.value = newPoem.poemId ElMessage.success('智能评析完成') // 清空输入框 currentPoemTitle.value = '' currentPoem.value = '' } } finally { loading.value = false } } // AI改写当前诗词 const handleRewrite = async () => { if (!currentHistory.value) return rewriting.value = true try { const response = await rewritePoem({ poemId: currentHistory.value.id, userId: userInfo.userId || 1 }) if (response.code === 200) { currentHistory.value.aiContent = response.data.aiContent currentHistory.value.aiExplain = response.data.aiExplain ElMessage.success('AI改写完成') } } finally { rewriting.value = false } } // 发送对话消息 const sendChat = async () => { if (!inputMessage.value.trim() || !currentHistory.value) return const userContent = inputMessage.value.trim() inputMessage.value = '' // 先添加用户消息 currentHistory.value.chatList.push({ role: 'user', content: userContent }) nextTick(() => chatScrollRef.value?.setScrollTop(99999)) try { const response = await conversation({ userId: userInfo.userId || 1, poemId: currentHistory.value.id, conId: currentHistory.value.conId, message: { content: userContent, role: 'user' } }) if (response.code === 200) { currentHistory.value.chatList.push({ role: 'ai', content: response.data.latestMessage.content }) } } catch { currentHistory.value.chatList.push({ role: 'ai', content: '网络连接出现问题,请检查网络后重试。' }) } finally { nextTick(() => chatScrollRef.value?.setScrollTop(99999)) } }

三、主要问题与解决

  1. 会话与诗词数据分离存储:后端将会话和诗词数据分开存储,需要先获取会话列表再逐个查询详情。通过循环异步请求并转换为前端统一的数据结构,解决了历史记录加载问题。
  2. AI 接口响应时间过长:大模型接口平均响应时间 5-8 秒,通过添加按钮加载状态、延长接口超时时间至 30 秒,缓解了用户等待体验。
  3. 数据格式不统一:部分返回字段与前端预期不一致,在数据处理阶段做了统一转换,保证页面正常渲染。

四、本周完成情况

  • 基本完成创作模块 5 个核心后端接口对接,主要功能可正常使用
  • 三栏联动布局与数据同步基本实现,点击历史记录可正确加载对应内容
  • 左上角 "首页 + 切换" 导航功能正常,支持模块间快速跳转
  • 修复了 8 个主要的功能性 BUG
  • 存在问题:界面样式较为基础,部分交互反馈不够明显

五、反思与不足

  • 前期与后端沟通不够充分,导致数据转换工作量较大
  • 历史记录逐个加载的方式效率不高,记录较多时可能影响加载速度
  • 对界面细节关注不足,整体视觉效果比较粗糙,缺乏设计感

六、下周计划

  • 针对古诗词创作模块进行界面优化
  • 美化 AI 改写区域,优化改写说明的排版与视觉层次
  • 调整对话界面的气泡样式、间距与字体大小,提升阅读体验
  • 统一按钮、卡片、输入框等基础组件的样式与 hover / 点击反馈
  • 修复测试中发现的小问题,提升页面整体质感
http://www.zskr.cn/news/1438599.html

相关文章:

  • 在WSL2的Ubuntu 22.04上,用Intel OneAPI 2024编译VASP 6.3.2的保姆级教程
  • 2026年义乌本地快递气泡袋/气泡袋/气泡袋定制长期合作厂家推荐 - 行业平台推荐
  • Go 并发模式深度解析:Fan-out/Fan-in 高效处理大规模数据流
  • 2026年比较好的三角梅苗木基地/三角梅养殖基地/三角梅种植基地诚信商家榜 - 品牌宣传支持者
  • 2026年江浙沪气泡膜卷/共挤膜气泡膜卷/彩色气泡膜卷/黑色气泡膜卷可靠供应商推荐 - 行业平台推荐
  • [开源] DRG边界病例错分识别与病案首页整改建议系统:面向医院信息科、医保办与病案室的自动化质控工具
  • 2026年热门的苏州AI算力机房/弱电算力机房热选公司推荐 - 品牌宣传支持者
  • 爆火的三个GitHub项目,真香~
  • AI编码时代:如何审查与理解AI生成代码,夺回代码所有权
  • 深度解析SingularityNET:去中心化AI市场的技术架构与经济模型挑战
  • 《告别日志排查:OpenClaw如何修复工具错误指南》
  • 别再折腾了!一个Windows用户搞定多个OneDrive账号同步的保姆级教程
  • 知识越记越乱?obsidian + claude快速搭建增量式知识库,实现笔记自动关联
  • AI驱动网络无障碍:智能图像描述、实时字幕与文本简化实战
  • 用Anaconda一键搞定torch_geometric?实测Pip与Conda安装的差异与选择建议
  • 从规则到理解:LLM如何重塑NLP实践与范式
  • 从‘翻车’到‘稳如狗’:聊聊我在MOS管电源控制电路上踩过的那些坑(附解决方案)
  • 2026年口碑好的牛肉胡辣汤/羊肉胡辣汤/河南胡辣汤/胡辣汤连锁品牌榜 - 品牌宣传支持者
  • 2026年口碑好的济宁GEO/济宁豆包GEO/济宁deepseek GEO综合评价公司 - 行业平台推荐
  • 告别龟速下载!手把手教你用清华源离线安装D2L库(附常见WinError 5报错解决)
  • [开源] 出院费用清单医保编码大白话翻译器:面向患者与家属的医疗费用可读化工具
  • SSD-Mamba2:端到端强化学习中的高效运动控制方案
  • 拆解开源6位半万用表:从LM399H基准源到STM32L152,手把手分析硬件设计思路
  • 构建多元化加密投资组合:从机构策略到个人实践
  • DPARSF跑完数据后,这些.mat和.nii文件到底怎么看?一份给fMRI新手的输出文件解读指南
  • 导弹拦截制导新范式:基于贝叶斯决策的杀伤概率最大化策略
  • 80C51寻址方式深度解析:从MOV A, 50H这条指令,看懂CPU如何找到数据
  • 基于薛定谔桥的生成式语义通信:构建语义到图像的“最优传输”高速公路
  • 糖尿病精准管理:数据驱动下的膳食分析与血糖预测实战
  • Neo4j GDS插件安装后,除了`gds.version()`,你还可以用这几种方法验证和探索