工作记录(三)——题目模块前端实现

前端开发环境:Vue、Element Plus、Axios 本文介绍了前端开发环境的搭建,包括:Vue项目创建、在Vue项目中引入Element-Plus和Axios。通过一个简单的登录程序说明如何开发基于Vue的前端项目。 阅读详情

工作记录(三):题目模块前端,包括题库页面、答题页面、题目详情、提交分析、题解

一、整体架构

以Vue 3为核心,使用Axios处理API请求,通过拦截器机制实现统一的错误处理与请求格式化,借助OpenAPI TypeScript 代码生成器来生成 API 相关的代码。整个架构采用功能域驱动的模块划分策略,题目模块中:QuestionsView.vue作为题目列表主视图,仅负责数据展示与交互调度;
CodeEditor.vue等分页面作为核心组件,封装了代码编辑与提交详解的全部逻辑;
questionService.ts则统一管理与题目相关的API请求。

二、主要实现技术点

1. 数据状态管理

题库模块的状态管理是前端实现的核心难点之一,涉及题目数据、用户交互状态、筛选条件等多维度数据的协同更新。基于Vue 3的响应式系统,模块采用了声明式的状态管理模式,使得数据流向清晰可追踪。

把核心状态组织成多个响应式引用,包括题目列表数据dataList、总题目数total、当前页码currentPage、搜索关键词searchKeyword等。这些状态通过ref函数包装,形成响应式对象,当状态发生变化时,相关的视图会自动更新。

数据加载逻辑通过watchEffect实现自动触发,当任何影响数据加载的状态(如搜索关键词、筛选标签)发生变化时,watchEffect会自动调用loadData函数重新获取数据,框架自动处理状态与视图的同步。例如:

// 自动监听参数变化并加载数据
watchEffect(() => {
  loadData();
});

其中loadData函数会根据当前的searchParams,调用后端API获取题目数据,并更新dataList和total。这样,用户每次切换筛选条件或翻页,页面都能自动刷新数据,无需手动干预。

2、题目提交分析从目录切换到详解的核心实现

首先,通过Vuex状态管理获取当前登录用户信息,将用户ID和题目ID关联起来,确保只显示相关的提交记录。在数据加载方面,使用了Vue 3的组合式API中的watchEffect来监听搜索参数的变化,这样可以自动触发数据重新加载。实现了一个智能的状态切换系统,通过isShow状态来控制列表和详情的切换显示。当用户点击查看某条提交记录的详情时,系统会保存当前的记录状态,并平滑地切换到详情视图。这个切换过程中,使用了Vue的响应式系统来确保数据的同步更新。

例如,切换详情页的逻辑可以简化为:

// 切换详情页
function showDetail(record) {
  nowrecord.value = record;
  isShow.value = false;
  // 预加载详情数据
  loadRelatedData(record.id);
}

而数据加载时,会对每条记录做预处理,比如格式化时间、解析评测信息等,提升用户体验。

3、热门标签筛选题目

通过Vue的响应式系统ref创建了一个响应式对象,用于存储所有的筛选条件。其中title用于存储题目标题的搜索关键词,tags数组用于存储选中的标签,pageSize和current用于分页控制。这个状态对象的任何变化都会触发重新加载数据的操作。

当用户点击一个标签时,如果该标签不在当前选中的标签列表中,就添加它;如果已经在列表中,就移除它。每次标签变化时都会重置页码到第一页,确保用户看到筛选后的完整结果。这里使用展开运算符来创建新的对象,而不是直接修改原对象,这样可以确保Vue能够正确追踪状态变化。

标签统计部分,系统会自动统计当前题目列表中最常见的标签,并展示前三名。代码简化如下:

// 伪代码:统计热门标签
const topTags = computed(() => {
  // 统计每个标签出现次数,排序后取前三
  return getTopTagsFrom(dataList.value);
});

这样,用户可以一键筛选热门标签,提升检索效率。

4、评测结果详情

系统会根据提交记录的状态,计算题目的通过率,并根据不同的评测结果展示不同的提示信息。不仅显示成功或失败,还会根据通过率给出鼓励性的提示,比如当通过率低于50%时,会提示用户"请不要灰心",用于鼓励用户,提升用户体验。

代码简化如下:

// 伪代码:计算通过率并给出提示
if (submitNum > 0) {
  passrate = (acceptedNum / submitNum) * 100;
  if (passrate < 50) {
    showMessage("请不要灰心");
  }
}

这种细致的用户关怀,有助于提升平台的友好度和用户粘性。

5、代码编辑器实现

属性监听和同步系统:

实现编辑器内容和编程语言的双向绑定。通过Vue的watch机制,确保编辑器的内容和语言设置始终与父组件保持同步。在更新内容时会先检查是否真的需要更新,避免不必要的重渲染。代码简化如下:

// 同步编辑器内容和语言
watch(props.value, (newValue) => {
  if (editor.value && newValue !== editor.value.getValue()) {
    editor.value.setValue(newValue);
  }
});
watch(props.language, (newLang) => {
  if (editor.value) {
    setEditorLanguage(editor.value, newLang);
  }
});
代码自动补全系统:

代码补全功能是通过 Monaco Editor 的补全提供者(CompletionItemProvider)机制实现的。当用户输入 “.” 或 “$” 等触发字符,或手动触发补全(如按下 Ctrl+Space)时,编辑器会调用补全提供者函数。这个函数首先获取当前光标位置和正在输入的内容,然后根据预定义的 Java 关键字列表(如 “public”、“private”、“class” 等)生成补全建议。每个补全建议包含显示文本(label)、类型(kind)、插入内容(insertText)和替换范围(range)等信息。当用户选择某个补全项时,编辑器会自动将当前输入的文本替换为完整的关键字。代码简化如下:

//注册补全关键字
registerCompletionProvider({
  triggerCharacters: [".", "$"],
  provideCompletionItems: () => {
    return getJavaKeywords();
  }
});

这样,用户在编写代码时可以获得智能提示,提升编程效率。

三、页面美化以及展示

1、QuestionSubmitAnalyseView.vue(提交记录分析页面)

页面由提交记录表格、分页器和详情查看按钮组成。通过自定义CSS实现按钮悬浮高亮、表格行动画等效果,提升交互体验。

// 按钮悬浮高亮
:deep(.arco-btn-text:hover) { color: 主色; background: transparent; }

在这里插入图片描述

2、QuestionSubmitDetailView.vue(提交详情页面)

页面包含提交时间、评测结果、代码展示等区域。通过卡片阴影、圆角、浮动分析卡片等样式,增强视觉层次感。

// 卡片阴影
.judge-result { box-shadow: 0 2px 8px rgba(0,0,0,0.05); border-radius: 8px; }

在这里插入图片描述

3、QuestionAnswerView.vue(题目题解页面)

采用居中布局,空状态时显示友好提示。内容区域支持Markdown渲染,便于展示丰富的题解内容。

// 空状态居中
.empty-state { display: flex; align-items: center; justify-content: center; }

在这里插入图片描述

4、ViewQuestionView.vue(题目查看页面)

左侧为题目描述、标签、限制条件,右侧为代码编辑区。整体采用毛玻璃和卡片风格,提升页面质感。

// 毛玻璃背景
.page-background { background-image: url(...); opacity: 0.6; }

在这里插入图片描述

5、QuestionsView.vue(题目列表页面)

包含左侧边栏(如日历、统计、标签筛选)、搜索栏和题目表格。表格行悬浮有动画,提升交互感。

//表格行悬浮动画
.leetcode-table :deep(.arco-table-tr:hover) { transform: translateY(-2px); }

在这里插入图片描述

四、总结

完成了基于 Vue 3+Element UI 的题库页面、答题页面、题目详情等核心页面和前端功能实现,通过组合式 API 管理响应式状态,实现多维度题目筛选、代码编辑器,以及提交分析页面闭环,同时运用毛玻璃效果、动态动画等手段优化视觉体验。在这个过程中学习到 Vue 3 响应式系统的深度应用,掌握了复杂状态管理与组件通信技巧,也对用户交互设计的细节打磨有了更深刻认知,为后面的开发打下基础。

一名前端 Leader 的转正述职记录 一转眼,已经是 2022 年了。为了我爱的人,我决定离开北上广,去海口或者三亚过两年隐居的日子。 阅读详情

相关推荐

【前端框架开发 | Vue.js | 第一篇】Vue.js框架简介、安装及打包教程

正式开始学习前 确保你已学过前端三件套 HTML CSS JavaScriptVue.js是一种流行的JavaScript前端框架,用于构建交互式的、响应式的用户界面。它是一种轻量级、灵活和易于学习的框架,广泛应用于现代Web应用程序开发中。前端框架那么多,为什么Vue.js非学不可?Vue.js的简洁语法和易用性使得它成为构建现代Web应用程序的优秀选择,无论是小型项目还是大型复杂的应用都能发挥出色的效果。Vue.js使用双向绑定的数据模型,将数据和视图进行关联。

等风来 2万+

前端JS学习(一)

前端JS学习(一)

qq_50086023的博客 663

Vue从入门到精通:全方位掌握Vue.js开发技能

Vue.js(通常简称为 Vue)是一套构建用户界面的渐进式JavaScript框架。与其他重量级框架不同,Vue 采用了自底向上增量开发的设计。Vue 的核心库只关注视图层,非常容易学习,并且可以轻松与其他库或已有项目集成。Vue 允许开发者自定义指令,这些指令可以在模板中以v-自定义指令名的形式使用。el.focus();});在上面的例子中,我们创建了一个名为 focus 的自定义指令,当绑定的元素被插入到 DOM 中时,该指令会自动聚焦到该元素。

邓邓子的博客 9554

前端学习笔记(三):js基础

前端学习js基础

憬淮的博客 3469

ODS 与模态分析

模态分析不是通过现有的 FRF 来“推测”或“估计”其他模态参数,而是通过测量和分析 FRF 来。

轩辕霸天L 1260

安装Anaconda和Labelme的教程

1 登录Anaconda官网,选择Download https://www.anaconda.com/distribution/ 2 选择你想下载的Python版本,选择你的操作系统和位数,然后点击Download按钮就开始下载了 3 开始安装 下面两个框框都勾选 点击next,等待安装成功 打开Anaconda Navigator 点击红色圈圈的按钮 在cmd中输入 (1)创建虚拟环境 conda create -n labelme python=3.6 (2)激活虚拟环境 conda activa

qq_42178122的博客 3811

工作记录(四)——题目模块+导航栏前端开发

创新实训阶段记录

w030921的博客 758

从CMT2300A实战出发:Sub1G射频匹配电路设计要点与315MHz应用详解

本文从CMT2300A芯片实战出发,详细解析Sub1G射频匹配电路设计要点,特别针对315MHz应用场景。内容涵盖频段划分逻辑、调制方式选择、晶体振荡器设计等基础认知,以及315MHz匹配电路物料选型、巴伦网络处理等实战技巧,并分享PCB布局防干扰设计和实测验证方法,助力开发者优化射频通信性能。

weixin_29238147的博客 164

工作记录(五)——竞赛模块前端用户部分实现

创新实训阶段记录

w030921的博客 556

ATE Pin Electronics电路学习总结

PinElectronics(PE)是ATE测试机的核心模拟前端电路,负责ATE与芯片间的信号转换与交互。主要包含四大功能模块:Driver实现逻辑信号到模拟电平的转换(VIH/VIL可编程);Receiver对DUT输出进行采样比较(VOH/VOL判定);ActiveLoad施加可编程电流负载;PPMU进行精密电压/电流测量。PE的性能直接影响功能测试和直流参数测试的精度,需定期校准维护。关键参数包括:Driver电压精度(±5mV)、Receiver比较精度(±10-50mV)、PPMU测量精度(±1-

歌颂苦难的行为是无耻的; 467

从原理到落地:Mamba-YOLOv8 全面实战指南(源码 + 训练 + 部署一次学会)

在目标检测领域,CNN与Transformer的较量从未停歇。本文提出一种革命性的架构——,将状态空间模型(SSM)首次引入YOLO框架。实验表明,该模型在COCO数据集上达到54.3% mAP@0.5,推理速度达89 FPS(RTX 4090),相比原版YOLOv8提升12.7%精度与23%速度。本文将完整揭示其技术原理与工程实现,助您掌握这一前沿技术。

FJN110的博客 120

【工作记录】前端项目打开、运行

不再详述。

m0_46582389的博客 1127

Android11.0(R) MTK 平台开机logo动态替换(by logo.bin方式)

实现的效果 客户提供一张格式为 bmp 的开机logo,在 linux 环境下执行制作 logo.bin 脚本文件, apk 拷贝 logo.bin 文件替换系统原有的bin,然后重启 logo 自动更新。 原理分析 MTK 平台的充电图片和开机logo都是打包到 logo.bin 中的 对应的资源路径在源码 vendor\mediatek\proprietary\bootable\bootloader\lk\dev\logo 系统一般预制了很多分辨率文件夹,实际通过 BOOT_LOGO 来确定打包那一个

cczhengv 4586

前端为什么需要模块

模块是指一个独立的功能单元,它封装了实现细节,并通过明确的接口与外部交互。在JavaScript中,模块帮助我们避免全局命名空间污染,使得代码更加整洁和易于管理。// 定义一个简单的模块// 私有变量和函数const privateMethod = () => console.log('这是私有方法');// 返回公共接口return {publicMethod: () => console.log('这是公共方法')})();// 输出: 这是公共方法。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 872

基于YOLOv8的人群聚集检测系统:含UI界面设计与数据集应用

人群聚集检测是智慧城市、公共安全和疫情防控等领域的重要任务。本文结合YOLOv8最新目标检测技术,设计并实现了一个高效的人群聚集检测系统,支持可视化UI界面操作,方便用户实时检测和分析视频中的人群密度。本文详细介绍了系统设计思路、使用的数据集、YOLOv8模型训练和推理过程,以及UI界面的开发与整合。最后通过实验验证了该系统的实用性和性能表现。更灵活的模型架构强化的特征融合网络(PAN++)自动混合精度训练支持支持多任务学习(目标检测+分类+分割)预训练模型丰富,适应多种应用场景。

YOLO 433

【异常】Claude Code 第三方API 400报错(thinking type should be enabled or disabled)解决方案

摘要: Claude Code接入第三方API端点时出现400参数错误,主要因新版默认启用的Adaptive Thinking功能与旧版接口参数格式不兼容(需thinking: {type: "adaptive"},但第三方仅支持布尔值)。解决方案为修改本地settings.json配置文件,添加"CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING": "1"环境变量并重启客户端,即可恢复思考模式功能。Adaptive Th

奶爸的编程之路,也就一周冷个三天 1万+

vue前端实现自定义工作台模块内容

vue前端实现自定义工作台模块内容

csdn_46884182的博客 194

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

前端模块化、分布式架构设计与实现(一)

设计思想与目标 概要 主要介绍 Vue 框架下、在工程化的前端项目中如何实现前端模块化、分布式部署方案。 这也是一份在我所在部门内已经使用近一年的一套前端架构及工程化方案。 PS: 这是一部连续剧... 这是里的模块指业务功能模块,不是 js 范畴的模块。为便于区分,后文将 js 范畴的模块称为 jsModule. 这是一段现实场景的回忆录,所以,1. 可能有细节遗漏;2. 它不是一个目...

weixin_34221775的博客 5580

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

前端工作记录二

工作记录二 组件篇 1. 在前端ui组件中的聚焦或者失焦事件中拿不到event,.capture用法 @focus.native.capture="selectFocus($event)" @blur.native.capture="selectBlur($event)" 会覆盖掉原有组件的失焦事件 2. ref的一些小细节 组件内部有多个同名ref引用时 没有父子关系 <template> <h2 ref="test">test1</h2

❤的博客 1099

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

工作记录(六)——竞赛模块前端管理员部分实现

创新实训工作记录

w030921的博客 230

前端代码工作流

编辑器选择 在刚接触前端的时候,我使用的编辑器是sublime。主要特点是轻量,缺点就是安装插件的时候过程比较麻烦,而且代码提示做的也不够好;后来听说webstrom这个地表最强编辑器功能很强大,就尝试着使用这个编辑器。webstrom给我的感觉是就功能很强大,但是很臃肿,软件包很大。实际上我用到编辑器的功能就几个,但是webstrom给我提供了一大堆功能。主要还是webstrom这东西太吃内存了,电脑性能支撑不起来,所以后面使用了一段时间就放弃了;后来有同学给我推荐了vscode这个编辑器。发现这个编辑器

vgub158的博客 2766

表单式工作流功能模块设计方案

最近一个项目中需要独自设计一个表单式工作流功能模块,在此将整个功能模块的设计思路分享出来。

ATFWUS的博客 1万+

个人前端面试题目总结(未工作)

记录一些自己在工作前面试的问题以及回答,包括电话面试,线下面试等

Aurora_1970s的博客 981

Web前端基础开发,【Vs code工作记录三,21年前端面经分享

“prettier.eslintIntegration”: true,// 保存时自动fix“eslint.autoFixOnSave”: true,// 添加 vue 支持“eslint.validate”: [“javascript”,“javascriptreact”,{“language”: “vue”,“autoFix”: true}],// 使用插件格式化 html“vetur.format.defaultFormatter.html”: “js-beautify-html”,// 格式化插件的

2401_83946570的博客 670

软考题目记录02

weixin_45938566的博客 645

三 光学工程师工作规范记录

【代码】三 光学工程师工作规范记录。

Major_S的博客 693
上一篇: 工作记录(二)——关于大模型的学习(二)以及vue的回顾
下一篇: 工作记录(四)——题目模块+导航栏前端开发
R进制
博客等级 码龄4年 61粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值