目录

 

摘  要

1 绪论

1.1 选题背景与意义

1.2 国内外研究现状

1.3 本文的研究路线

2 相关技术

2.1 开发框架介绍

2.1.1 SpringBoot框架

2.1.2 Vue.js框架

2.1.3 MyBatis-Plus框架

2.2 其他技术

2.2.1 BigModel智谱AI大模型开放平台

2.2.2 MySQL数据库

2.2.3 Redis数据库

2.2.4 Arco Design组件库

3 协同过滤算法的原理及应用

3.1 协同过滤算法的原理

3.2 协同过滤算法在本文中的应用

4 系统分析

4.1 可行性分析

4.2 需求分析

4.2.1 用户功能需求分析

4.2.2 管理员功能需求分析

5 系统设计

5.1 系统功能结构设计

5.2 数据库设计

5.2.1 数据库概念设计

5.2.2 数据库逻辑设计

6 系统实现

6.1 注册登陆模块的实现

6.2 题库与竞赛模块的实现

6.2.1 用户端题库部分的实现

6.2.2 管理员端题库部分的实现

6.3 讨论模块的实现

6.3.1 用户端讨论部分的实现

6.3.2 管理员端讨论部分的实现

6.4 代码沙箱模块的实现

6.4.1 判题服务与代码沙箱的关系

6.4.2 代码沙箱的具体实现

6.5 信息管理模块的实现

6.5.1 用户信息

6.5.2 平台信息

6.6 商城与课程模块的实现

6.6.1 商城部分的具体实现

6.6.2 课程部分的具体实现

7 系统测试

7.1 测试目的

7.2 测试环境

7.3 测试内容

7.3.1 用户端功能测试用例

7.3.2 管理员端功能测试用例

7.3.3 模块专项测试用例

7.3.4 性能与安全测试

7.4 测试结果

8 总结

视频演示


 

摘  要

随着科技的迅猛发展与数字化时代的到来,编程学习已逐渐成为社会关注的焦点。然而,现有的在线评判(Online Judge,OJ)系统和传统编程学习平台在满足初学者个性化学习需求方面仍存在诸多不足。为此,本文设计开发了融合多模态协同过滤技术的智能化编程学习平台,旨在通过自主构建代码沙箱、创新引入多模态协同过滤推荐机制、融合AI辅助编程技术,为编程初学者提供更精准、高效的学习支持。

平台核心模块包括:具备独立判题能力且可复用于多种执行场景的代码沙箱模块;融合用户行为、题目特征、标签偏好等多维度信息的多模态协同过滤推荐模块;以及基于大模型技术实现的AI辅助模块,为用户提供代码质量分析、优化建议与个性化学习路径规划。此外,系统支持管理员对题库、推荐、竞赛、用户、讨论、商城与课程等资源进行统一管理,普通用户则可完成题目练习、竞赛参与、讨论互动、课程学习与商品浏览等操作。

系统前后端分别使用了Vue框架和SpringBoot框架,数据存储采用MySQL,并集成智谱AI大模型开放平台实现AI辅助功能。

关键词:编程学习平台;代码沙箱;协同过滤推荐;AI辅助编程

1 绪论

随着信息技术的飞速发展,在线教育平台和在线学习系统已得到广泛应用和普及,为编程学习者提供了优质的练习和竞赛平台。然而,随着用户数量的增加和题库规模的扩大,如何精准、高效地为用户推荐个性化的编程题目,以匹配其学习水平、兴趣偏好和发展目标,成为一个亟待解决的挑战。

1.1 选题背景与意义

美国计算机协会(Association for Computing Machinery,ACM)主办的国际大学生程序设计竞赛(International Collegiate Programming Contest,ICPC),是历史悠久的国际大学生程序设计竞赛,其目的在于使大学生运用计算机来充分展示自己分析问题和解决问题的能力[1],是现如今参赛人数最多、影响最广泛、含金量最高的计算机类大学生竞赛[2]。OJ系统(在线判题系统)是计算机编程学习的重要资源。它在提升学员的程序设计技能、知识储备和整体学术表现方面起到关键作用,并被广泛应用于教育机构的程序设计教学中[3]。然而,大多数OJ系统并未充分考虑仅需练习编程能力和算法的新手用户需求。普遍存在个性化推荐不足、交互性较弱、缺乏学习路径引导等问题,平台学习体验仍存在较大提升空间。

在此背景下,本研究致力于改进在线评测系统中的题目推荐机制,并提出一套创新性解决方案。首先,通过自主研发安全可靠的代码沙箱系统[4],为平台提供独立的判题服务,同时可作为通用服务组件集成到其他代码执行场景中;其次,采用多模态协同过滤算法[5],通过分析用户行为数据、题目特征、标签偏好等多维度信息,实现精准的个性化题目推荐;最后,结合AI大模型技术,为管理员提供智能生成编程题目、为用户提供代码质量分析、优化建议以及个性化学习路径指导,旨在设计一个真正服务于初学者、高效且可拓展的智能化编程学习平台,帮助练习者提高学习效率[6]。

1.2 国内外研究现状

国外的OJ平台发展历史较长,已经得到了广泛的研究和应用,也存在很多优秀的平台。其中有一些国际知名的OJ如西班牙Valladolid大学的UVA OJ、Timus、CodeForces等[7]。这些系统提供了大量的编程题目,用于编程竞赛和个人学习,是计算机编程学习的重要材料和补充。Timus是俄罗斯著名的在线评测系统,它在俄罗斯和其他国家的程序竞赛中被广泛使用,已成为俄罗斯高校计算机科学课程的重要组成部分。CodeForces作为全球最具影响力的竞技编程训练平台,该平台采用高频次竞赛机制(每周1-2场)向所有用户免费开放,通过实时排名系统激励参与者持续提升算法能力;赛后完整公开参赛者提交代码、解题思路及排名数据,这种透明机制不仅支持代码审查与错误分析,还形成了独特的集体智慧共享模式。但是以上系统并不具备为用户推荐相关题目的功能。因此,用户仍需在对应算法类别的题目列表中进一步筛选。

目前国内比较成熟的OJ平台有POJ、TOJ、ZOJ、洛谷、力扣、牛客等,国内高校在线评测系统的发展呈现出明显的梯队化特征[8],以清华大学、浙江大学和北京大学为代表的三大OJ系统各具特色。清华大学开发的TOJ系统作为目前国内应用最广泛的训练平台,该系统不仅复现了ACM/ICPC竞赛的完整流程,还创新性地融入了自动化测试用例生成功能,极大提升了编程训练的效率。浙江大学的ZOJ系统则展现出较强的国际化特征,其用户群体覆盖全球60多个国家和地区,月活跃用户保持在12万以上,其题库内容从基础的数组操作到复杂的机器学习算法应有尽有。北京大学的POJ系统作为国内历史最悠久的在线评测平台,凭借其全英文界面和专业化的竞赛模拟功能,成为中国ICPC参赛队伍的首选训练平台,特别适合高强度竞技编程训练。这三个平台共同构成了中国计算机教育领域的重要基础设施,为培养高素质的程序设计人才提供了有力支撑[9]。

洛谷作为商业化平台的代表,主要服务于三类核心用户群体:备战NOI/CSP的中学生、高校ACM选手以及编程爱好者,力扣凭借其企业级算法和模拟面试功能,成为程序员求职的训练工具,牛客则专注于中国本土招聘市场,除了编程题库外,还包括笔试模拟、面试经验和内推资源,形成了从学习到求职较为完整的服务,但相较于传统高校OJ系统,这些平台在题目设计的严谨性和测试用例的完备性方面仍存在提升空间,这反映了商业平台与学术平台在定位上的本质差异。考虑到有的用户年龄偏低、自主学习能力薄弱,年龄差异化、认知水平差异化,平台仍需起到个性化、智能化教辅的作用。

1.3 本文的研究路线

本文旨在设计一款自主实现代码沙箱,集刷题训练、智能推荐、编程竞赛、讨论互动与AI辅助为一体的智能编程学习平台。结合当前流行的软件开发技术及框架,通过对SpringBoot、Vue.js等框架的探索和学习,建立一个前后端分离的编程学习平台,平台适用于编程初学者和高校学生。

本论文具体内容分为以下8章:

第一章:主要介绍了系统开发的背景与研究意义,分析了国内外相关研究现状,明确了本文的研究方向与目标。

第二章:介绍了系统开发过程中所涉及的关键技术框架与工具,包括 SpringBoot框架、Vue.js框架、MyBatis-Plus持久层框架、MySQL数据库以及智谱AI大模型开放平台等,为系统实现提供了技术支撑。

第三章:首先阐述了协同过滤算法的基本原理与类型,接着详细介绍了该算法在本系统中的具体应用,重点说明了个性化推荐模块的推荐流程与实现方式[10]。

第四章:从技术可行性和经济可行性两个维度对系统的整体可行性进行分析,随后通过功能性需求分析,明确了系统的基本功能框架与用户角色行为。

第五章:在总体结构设计的基础上,分别对系统功能模块、数据库概念结构与逻辑结构进行了详细设计,为后续实现提供理论支撑。

第六章:介绍了系统主要功能模块的实现过程,包括用户模块、管理员模块、代码沙箱模块与推荐模块的关键实现细节与流程。

第七章:通过对系统核心功能的接口测试、功能性测试与结果分析,验证了平台的稳定性、正确性与可用性,确保系统各模块能够实现预期效果。

第八章:总结了系统开发过程中取得的成果与不足,结合项目实践提出了未来的优化方向与研究展望。

2 相关技术

本章介绍了系统开发使用的主要技术和工具,平台采用前后端分离架构,后端基于SpringBoot框架开发,前端使用Vue.js框架实现,数据存储采用MySQL数据库。

2.1 开发框架介绍

2.1.1 SpringBoot框架

作为Pivotal团队推出的轻量级解决方案,SpringBoot通过标准化项目初始化流程与自动化配置机制,显著降低传统Spring应用开发的复杂度。

SpringBoot的核心特性及优点如下:

(1)允许开发者创建独立运行的Spring应用程序,无需部署到外部的应用服务器、内嵌Servlet容器、支持打包成JAR或者WAR文件实现轻松部署。

(2)能够自动配置、集成了大量常用的第三方库配置、简化启动和关闭过程、开箱即用无需代码生成和XML配置,使得应用的开发和部署更加简洁、快速和可靠。

2.1.2 Vue.js框架

Vue.js框架作为渐进式前端解决方案,采用声明式数据绑定与虚拟DOM技术,通过组件化架构将复杂UI拆解为独立可复用的功能单元。其低侵入式API设计遵循渐进增强原则,开发者可灵活选用核心库或整合配套工具链(如Vuex/Vue Router)构建单页应用,配合响应式渲染机制自动追踪数据变更并优化DOM更新效率,结合异步批量处理与差异比对算法,在提升开发效率的同时保障运行时性能,显著降低大型Web应用的维护成本。

2.1.3 MyBatis-Plus框架

MyBatis-Plus框架作为MyBatis生态的增强工具集,通过自动化代码生成与动态SQL抽象重构持久层开发范式。其核心价值在于基于约定优于配置原则,集成代码生成器实现Mapper接口、XML映射及实体类的一键生成,同时封装通用CRUD操作接口(如IService抽象层)以消除冗余代码。通过Lambda表达式构建类型安全的查询条件,结合分页插件优化数据检索效率,并开放SQL注入扩展接口支持自定义逻辑,辅以Wrapper条件构造器实现动态查询链式编程,显著提升复杂业务场景下的开发效能与代码可维护性。

2.2 其他技术

2.2.1 BigModel智谱AI大模型开放平台

BigModel智谱AI大模型开放平台(Zhipu AI BigModel Open Platform)是一个由智谱AI推出的大规模预训练模型开放平台,该平台支持ChatGLM系列大模型,具备强大的文本生成、代码分析、智能问答等功能,可广泛应用于智能交互、代码辅助、知识问答等场景,采用Transformer架构,结合高效的推理优化策略,使其在大规模并发任务中依然保持较快的响应速度。

本系统通过调用BigModel提供的API,结合SpringBoot作为后端进行AI交互,以提升响应速度并减少API请求开销。通过引入BigModel大模型技术,系统能够为用户提供更加智能化、个性化的编程学习体验,提高代码编写能力和学习效率。

2.2.2 MySQL数据库

MySQL作为开源关系型数据库管理系统,凭借多维度技术优势成为Web开发领域的核心基础设施。其采用C/S架构与混合存储引擎,实现跨平台兼容性及毫秒级OLTP事务处理能力,通过B+树索引优化与预写日志机制保障数据一致性。安全层面集成TLS/SSL传输加密、RBAC细粒度权限控制及审计日志追踪,满足高并发场景下的企业级安全需求。支持水平分片扩展与异步主从复制架构,可承载TB级数据存储,结合Apache协议下的零授权成本与活跃生态,持续领跑中小型数字化平台的技术选型。

2.2.3 Redis数据库

Redis作为高性能内存存储系统,采用单线程事件驱动架构与多路复用技术,提供基于键值结构的多元化数据模型,集成字符串、哈希、流式数据等9种数据结构,支持实时场景下的复杂操作需求。通过RDB快照与AOF增量日志双重持久化策略保障数据可靠性,结合哨兵集群监控和分片扩缩容机制实现高可用架构。在应用层通过内存级读写响应与分布式锁设计,有效解决缓存击穿、会话同步等高并发问题,典型应用于实时推荐、秒杀系统及物联网消息队列,吞吐量可达百万级TPS,相较磁盘数据库性能提升2-3个数量级。

2.2.4 Arco Design组件库

Arco Design是由字节跳动团队开发的企业级ReactUI组件库,提供100余个精心设计的组件,涵盖表单、表格、导航、数据展示等常用场景。该组件库拥用时尚化组件库风格,支持主题定制、提供暗色模式、虚拟滚动表、动态表单等高级组件、有丰富的Figma设计资源。基于TypeScript开发,类型提示丰富、代码提示丰富、支持按需加载。凭借完善的文档体系和模块化设计,可显著提升前端开发效率,是企业级应用开发的理想选择。

3 协同过滤算法的原理及应用

3.1 协同过滤算法的原理

协同过滤(Collaborative Filtering,CF)是一种通过利用用户的历史行为数据来推荐物品的算法。它的核心思想是“物以类聚,人以群分”,即通过分析用户与物品之间的互动找到具有相似兴趣的用户群体或者相似特征的物品,从而预测用户对未接触物品的喜好程度。

协同过滤算法主要分为两大类:

基于用户的协同过滤[11](User-Based Collaborative Filtering,UBCF):

原理:该方法通过分析用户与用户之间的相似性来进行推荐。它认为如果两个用户在过去对同一物品的喜好相似,那么他们在未来对新的物品的偏好也会相似。

原理如图3-1所示。

图3-1 基于用户的协同过滤算法原理图

基于物品的协同过滤[12](Item-Based Collaborative Filtering,IBCF):

原理:该方法通过分析物品与物品之间的相似性来进行推荐。它认为如果两个物品被同一批用户频繁地共同喜欢或不喜欢,那么这两个物品很可能具有相似的特征。

原理如图3-2所示。

图3-2 基于物品的协同过滤算法原理图

3.2 协同过滤算法在本文中的应用

在本系统的题目推荐模块中,以协同过滤算法作为主体算法,来挖掘用户偏好与题目之间的潜在相关性,从而实现更为精准的推荐。考虑到编程学习平台中用户行为和题目特征的多样性,本文在传统协同过滤的基础上进行了多模态融合和加权增强,综合考虑了用户特征、题目属性、评分行为、标签信息等多个维度,以提升推荐的准确性和用户满意度,算法流程图如图3-3所示。

图3-3 协同过滤算法流程图

具体而言,系统融合了基于用户的协同过滤(User-based CF)与基于物品的协同过滤(Item-based CF)思想。在评分维度上,引入皮尔逊相关系数计算用户与题目之间的评分相关性,度量用户对相似题目的评分偏好;在行为向量上,引入余弦相似度计算用户特征向量与题目特征向量之间的夹角,从而衡量相似度。平台算法架构图如下图3-4所示。

图3-4 平台算法架构图

为了进一步提升推荐效果,系统还引入了标签相似度机制,即通过分析用户过往提交题目的标签构建用户标签偏好分布,再与候选题目的标签向量计算余弦相似度,从而推荐与用户兴趣领域相符的题目。同时,为了兼顾新题目的曝光度,系统设计了新题目权重增强策略:对浏览次数较低的题目给予额外的得分补偿,从而缓解新题冷启动问题[13],此外,对于刚刚注册的新用户,由于提交次数较少,无法确定其喜好,系统也设计了冷启动处理机制,子流程图如下图3-5所示。

图3-5 冷启动处理机制子流程图

所有上述维度在推荐得分计算中均通过配置表进行加权组合,权重可由管理员根据平台数据指标动态配置,以适应不同阶段和不同用户群体的推荐需求。

4 系统分析

本章首先对系统进行可行性分析,接着分别从管理员功能和用户功能两个模块进行需求分析。

4.1 可行性分析

系统前端采用Vue框架,支持响应式开发,能够实现良好的交互体验,后端基于SpringBoot框架开发,具有开发速度快、简单、高效的特点,能够满足平台日常的应用需求。数据存储方面,系统采用MySQL数据库,结合Redis缓存机制,有效减少了数据库的访问压力,提升了系统的响应速度,因此具有技术可行性。

中国作为人口大国,人口规模庞大,这为编程学习平台提供了广阔的市场空间和潜在用户群体。平台开发初期仅需投入少量资金用于服务器组建等基础设施,后续可通过提供高质量的算法课程和竞赛报名服务实现盈利。通过合理定价和优质内容,平台能够吸引大量用户,形成稳定的收入来源。此外,平台还可通过增值服务、广告合作等方式进一步拓展盈利渠道,具备良好的经济可行性。

本平台面向编程学习者与初学者,具备刷题、推荐、课程、竞赛、讨论、商城等功能,基本满足用户在“学、练、赛、评、问”五个维度的核心需求。能够提升用户的学习成就感与参与度,有助于形成良性的学习生态,具备较强的用户可接受性与推广价值。

4.2 需求分析

本编程学习平台的核心角色分为管理员和用户两种角色,分别负责平台的内容管理与日常使用。为了便于说明系统功能与用户的关系,按照管理员的系统功能与用户的系统功能进行划分,分别绘制出“用户功能模块”和“管理员功能模块”的系统用例图,如下图4-1、图4-2所示。

4.2.1 用户功能需求分析

普通用户为平台的主要使用者,编程学习平台的用户用例图如图4-1所示。

图4-1 编程学习平台用户用例图

具体包括以下几个模块:

题库模块:平台提供编程题库供用户浏览,支持按标签、难度等条件筛选题目。提供“随机一题”功能增加用户刷题的趣味性。支持多模态推荐机制[15]的题目推送,系统会根据用户行为及题目特征推荐题目,在做题过程中,用户可在线编写并提交代码,系统通过代码沙箱返回评测结果;此外,平台还提供AI辅助功能,能够对用户提交的代码进行质量分析、优化建议与学习路径规划。用户还可发布题解,与其他用户在题目讨论区进行评论、交流、学习,查看自己提交的历史与判题情况。

竞赛模块:用户可以查看平台发布的编程竞赛,查看竞赛说明和竞赛规则,,通过“我的竞赛”页面管理已报名的竞赛。在竞赛时间内完成题目和提交代码,系统进行评测更新,在竞赛结束后查看竞赛得分和排名,评估自身水平,提升能力。

个人信息模块:在个人中心可以修改昵称、头像、密码等基本信息,平台也展示用户的总排名、答题数据、竞赛数据等。

讨论模块:用户可进入平台讨论区,浏览热门或最新话题,发布讨论,参与评论与互动。支持对评论进行回复、删除等操作,讨论内容还可进行点赞、收藏与查看。讨论模块支持嵌套评论结构,用户可在收藏夹中管理自己感兴趣的讨论内容,同时支持对自己发布的讨论进行修改与删除。

商城模块:平台提供学习资源商城供平台用户进行查看购买,用户可根据自己的兴趣进行课程资料、书籍、工具等商品的购买、学习拓展。

课程模块:平台提供丰富的在线课程资源,覆盖基础语法、算法题型、面试技巧等多个方向。用户可按需浏览、学习课程内容,帮助用户系统化掌握编程知识、夯实基础。

4.2.2 管理员功能需求分析

管理员主要负责平台内容维护与运营管理,编程学习平台管理员用例如图4-2所示。

图4-2 编程学习平台管理员用例图

具体包括以下几个模块:

题库管理模块:管理员可浏览并管理题库内容,支持使用“随机一题”功能及开启推荐功能以模拟用户视角进行体验与测试。在创建题目时,平台提供AI自动生成题目功能,提升题库更新效率。管理员还可查看每道题目的提交记录,发布参考题解,并对题目的内容进行修改或删除操作,从而保障题库质量与时效性。

推荐管理模块:平台为管理员提供丰富的数据统计与可视化分析功能,包括用户增长趋势、推荐算法使用频率、题目难度分布、通过率、编程语言使用情况、题目浏览量与讨论区活跃度等。管理员可依据不同时间段的变化趋势,评估当前推荐配置策略的有效性与优劣,并通过动态调整推荐算法中各项权重配置,优化推荐效果,提升用户体验。

竞赛管理模块:管理员具备与普通用户相同的竞赛参与能力,可浏览竞赛、报名参赛、提交代码、查看排名。同时,管理员还可创建、编辑或删除竞赛,设置比赛时限、题目内容与规则。

用户管理模块:管理员可管理平台所有用户的信息,包括查看与编辑用户资料、调整用户权限(如设置为平台管理员)、修改用户状态(如启用、封号、注销等),确保平台运行环境的稳定性与安全性。

讨论管理模块:管理员可浏览全站讨论内容,发布新讨论或评论他人内容。同时具备更高权限,可对所有用户发布的讨论内容进行修改与删除操作,以维护讨论区的健康秩序。管理员同样可对讨论内容进行点赞、收藏、查看收藏夹等操作,与用户保持良好互动。

商城管理模块:除普通用户可进行的浏览与购买操作外,管理员可对商城商品进行编辑、上架或下架,保障商品内容的准确性与时效性,提升平台的服务价值。

学习管理模块:管理员不仅可以浏览课程资源、观看教学内容,还具备对课程的添加、修改与删除权限,以确保平台课程内容的完整性、丰富性与质量,为用户提供优质的学习体验。

5 系统设计

本章介绍了基于多模态协同过滤算法的智能编程学习平台的总体设计,详细介绍了系统功能结构设计、数据库表设计,对该系统进行了较为全面的阐述。

5.1 系统功能结构设计

系统的功能模块设计分为两个部分,分别是用户端和管理员端,用户功能模块方面,平台主要面向编程学习者提供六大核心功能,以满足用户在“学、练、赛、评、问”各阶段的学习需求。

首先,题库模块支持题目浏览、筛选与搜索,用户可在线提交代码,系统通过代码沙箱返回评测结果,整合AI模型提供代码质量分析与优化建议,提升学习效率。同时,用户还可发布题解、参与题目评论互动、查看历史提交记录,促进交流与反思。其次,推荐模块通过多模态协同过滤算法,综合用户行为、题目特征与标签相似度,实现个性化题目推荐。竞赛模块允许用户报名参与在线竞赛,在限时内完成编程任务并查看排名,讨论模块支持用户发布讨论、评论回复、点赞收藏等操作,个人中心模块提供用户信息修改、做题记录查询、平台排名展示等功能,最后,课程与商城模块整合丰富课程资源与辅助学习商品,用户可按需学习课程视频或购买学习资料,用户端的具体功能模块设计如图5-1所示。

图5-1 用户端功能模块结构图

系统的管理员端是系统的核心,管理员不仅具备用户端的所有功能,还为后台系统管理员提供内容管理和平台运营功能。首先,题库管理模块支持管理员创建、编辑、删除题目、AI智能生成题目功能,以提升题库构建效率。推荐配置管理模块则允许管理员查看平台推荐相关的关键数据指标,如用户活跃度、推荐调用频率结合数据趋势动态调整算法权重参数,持续优化推荐效果。竞赛管理模块涵盖竞赛的发布、修改、删除,确保竞赛模块的灵活运作。用户管理模块支持为管理员提供平台用户的角色权限分配、修改,可以对用户账号启用、禁用、注销等操作。讨论管理模块则赋予管理员对所有讨论帖的编辑、删除等高权限操作,为社区营造健康有序的讨论环境。此外,商城与课程管理模块使管理员能够完成商品与课程的上架、下架、内容维护等工作,确保平台内容的丰富性与时效性,为用户提供更高质量的学习支持服务。管理员端的具体功能模块设计如图5-2所示。

图5-2 管理员端功能模块结构图

5.2 数据库设计

5.2.1 数据库概念设计

图5-3 用户实体属性图

图5-4 题目实体属性图

图5-5 题目提交实体属性图

图5-6 用户评分实体属性图

图5-7 讨论实体属性图

图5-8 评论实体属性图

图5-9 竞赛实体属性图

图5-10 推荐配置实体属性图

图5-11 系统E-R图

5.2.2 数据库逻辑设计

表5-1 用户表

字段名

数据类型

是否为空

注释

id

Bigint

NOT NULL

编号(主键、外键)

user_account

Varchar(256)

NOT NULL

账号

user_password

Varchar(512)

NOT NULL

密码

gender

Tinyint

NULL

性别(0为女性,1为男性)

school                                 

Varchar(256)

NULL

就读学校

email                                 

Varchar(512)

NULL

邮箱

submit_num

Int Default 0

NOT NULL

题目提交数

续表5-1 用户表

字段名

数据类型

是否为空

注释

accepted_num

Int Default 0

NOT NULL

题目通过数

pass_rate

Decimal

NULL

通过率

user_name                               

Varchar(256)

NULL

用户昵称

user_avatar

Varchar(1024)

NULL

用户头像

user_profile

Varchar(512)

NULL

用户简介

user_state 

Varchar(256)

NULL

用户状态(0-正常/1-注销/2-封号)

user_role

Varchar(256)

NOT NULL

用户角色(用户/管理员)

create_time

Datetime

NOT NULL

创建时间

update_time

Datetime

NOT NULL

更新时间

is_delete

Tinyint

NOT NULL

逻辑删除(0 - 未删除,1 - 删除)

题目表(question)是系统中存储题目信息的核心表,用于记录题目的基本信息、判题配置以及用户提交数据,如表5-2所示:

表5-2 题目表

字段名

数据类型

是否为空

注释

id

Bigint

NOT NULL

编号(主键、外键)

title

Varchar(512)

NOT NULL

标题

content                                  

Text

NOT NULL

内容

tags                             

Varchar(1024)

NULL

标签

difficulty

Tinyint

NULL

难度(1-简单2-中等3-困难)

view_count

Int

NULL

题目浏览数

submit_num        

Int

NOT NULL

题目提交数

accepted_num     

Int

NOT NULL

题目通过数

judge_case                                 

Text

NULL

判题用例

judge_config                              

Text

NULL

判题配置

user_id                                  

Bigint

NOT NULL

用户id(外键)

create_time

Datetime

NOT NULL

创建时间

update_time

Datetime

NOT NULL

更新时间

is_delete     

Tinyint

NOT NULL

逻辑删除(0 - 未删除,1 - 删除)

表5-3 题目提交表

字段名

数据类型

是否为空

注释

id

Bigint

NOT NULL

编号(主键、外键)

language

Varchar(128)

NOT NULL

编程语言

code

Text

NOT NULL

用户代码

judge_info

Text

NULL

判题信息

status

Int

NOT NULL

判题状态(0-待判题、1-判题中、2-成功、3-失败)

question_id

Bigint

NOT NULL

题目id(外键)

user_id

Bigint

NOT NULL

用户id(外键)

score

Int

NULL

用户评分

create_time

Datetime

NOT NULL

创建时间

update_time

Datetime

NOT NULL

更新时间

is_delete

Tinyint

NOT NULL

逻辑删除(0 - 未删除,1 - 删除)

表5-4 用户评分表

字段名

数据类型

是否为空

注释

id

Bigint

NOT NULL

编号(主键、外键)

question_id

Bigint

NOT NULL

题目id(外键)

user_id

Bigint

NOT NULL

用户id(外键)

score

Int

NOT NULL

评分

create_time

Datetime

NOT NULL

创建时间

update_time

Datetime

NOT NULL

更新时间

is_delete

Tinyint

NOT NULL

逻辑删除(0-未删除,1-删除)

表5-5 讨论表

字段名

数据类型

是否为空

注释

id

Bigint

NOT NULL

编号(主键、外键)

title

Varchar(512)

NULL

标题

content

Text

NULL

内容

tags

Varchar(1024)

NULL

标签

postThumbNum

Int

NOT NULL

点赞数

续表5-5 讨论表

字段名

数据类型

是否为空

注释

postFavourNum

Int

NOT NULL

收藏数

viewCount

Int

NOT NULL

浏览数

postUserId

Bigint

NOT NULL

创建用户

createTime

Datetime

NOT NULL

创建时间

updateTime

Datetime

NOT NULL

更新时间

isDelete

Tinyint

NOT NULL

逻辑删除(0-未删除,1-删除)

表5-6 评论表

字段名

数据类型

是否为空

注释

id

Bigint

NOT NULL

编号(主键、外键)

questionId

Bigint

NOT NULL

题目id(外键)

postId

Bigint

NOT NULL

讨论id(外键)

userId                               

Bigint

NOT NULL

用户id(外键)

content

Varchar(500)

NOT NULL

评论内容

commentId               

Int

NULL

父评论id(外键)

createTime

Datetime

NOT NULL

创建时间

isDelete

Tinyint

NOT NULL

逻辑删除(0-未删除,1-删除)

表5-7 竞赛表

字段名

数据类型

是否为空

注释

id

Bigint

NOT NULL

编号(主键、外键)

title

Varchar(255)

NOT NULL

标题

context

Varchar(255)

NULL

比赛描述

competeTime

Int

NULL

比赛时长(分钟)

beginTime

Datetime

NULL

开始时间

userAvatar

Varchar(255)

NULL

创建者头像

userId                               

Bigint

NOT NULL

用户id(外键)

createTime

Datetime

NOT NULL

创建时间

status

Tinyint

NOT NULL

比赛状态(0-未开始、1-进行中、2-已结束)

participantLimit

Int

NULL

人数限制

续表5-7 竞赛表

字段名

数据类型

是否为空

注释

scores

Int

NULL

分数

isDelete

Tinyint

NOT NULL

逻辑删除(0-未删除,1-删除)

表5-8 竞赛题目表

字段名

数据类型

是否为空

注释

id

Bigint

NOT NULL

编号(主键、外键)

title

Varchar(255)

NOT NULL

题目标题

content

Text

NULL

题目内容

judgeCase

Text

NULL

判题用例(json数组)

judgeConfig

Text

NULL

判题配置(json对象)

competitionId

Bigint

NOT NULL

比赛id(外键)

createTime

Datetime

NOT NULL

创建时间

score

Int

NULL

分数

isDelete

Tinyint

NOT NULL

逻辑删除(0-未删除,1-删除)

表5-9 竞赛报名表

字段名

数据类型

是否为空

注释

id

userId

Bigint

Bigint

NOT NULL

NOT NULL

编号(主键、外键)

用户id(外键)

competitionId

Bigint

NOT NULL

比赛id(外键)

createTime

Datetime

NOT NULL

创建时间

score

Int

NULL

分数

status

Int

NULL

状态(0-未参赛,1-已参赛)

isDelete

Tinyint

NOT NULL

逻辑删除(0-未删除,1-删除)

表5-10 推荐系统配置表

字段名

数据类型

是否为空

注释

id

Bigint

NOT NULL

编号(主键、外键)

cosine_similarity_weight

Double

NULL

余弦相似度权重

pearson_similarity_weight

Double

NULL

皮尔逊相似度权重

user_avg_score_weight

Double

NULL

用户平均评分权重

question_avg_score_weight

Double

NULL

题目平均评分权重

view_count_weight

Double

NULL

浏览次数权重

tag_similarity_weight

Double

NULL

标签相似度权重

new_question_boost

Double

NULL

新题目额外权重

days_half_life

Int

NULL

时间衰减半衰期

max_view_count

Double

NULL

最大浏览次数

update_time

Double

NOT NULL

更新时间

表5-11 题目浏览日志表

字段名

数据类型

是否为空

注释

id

Bigint

NOT NULL

编号(主键、外键)

question_id

Bigint

NOT NULL

题目id(外键)

user_id

Bigint

NOT NULL

用户id(外键)

view_time

Datetime

NOT NULL

浏览时间

6 系统实现

6.1 注册登陆模块的实现

图6-1 主页页面

图6-2 注册页面

图6-3 登录页面

图6-4 登录过程时序图

6.2 题库与竞赛模块的实现

6.2.1 用户端题库部分的实现

图6-5 题库浏览页面

图6-6 推荐题目页面

推荐算法的部分代码如下:

    public List<Question> recommendQuestions(Long userId, int topN) {

        int submitCount = Math.toIntExact(questionSubmitMapper.selectCount(

                new QueryWrapper<QuestionSubmit>().eq("user_id", userId)));

        if (submitCount == 0) {

            return getPopularQuestions(topN);}

        List<Question> allQuestions = questionMapper.selectList(new QueryWrapper<>());

        if (submitCount < SUBMIT_COUNT_THRESHOLD) {

            return allQuestions.stream()

                    .sorted(Comparator.comparingDouble(q ->

                            -0.6 * computePopularityScore(q) - 0.4 * computeRecommendationScore(userId, q.getId())))

                    .limit(topN)

                    .collect(Collectors.toList());}

        return allQuestions.stream()

                .sorted(Comparator.comparingDouble(q -> -computeRecommendationScore(userId, q.getId())))

                .limit(topN)

                .collect(Collectors.toList());}

图6-7 推荐算法时序图

图6-8 题目详情页面

图6-9 提交代码时序图

图6-10 判题服务时序图

图6-11 判题信息页面

图6-12 代码分析时序图

图6-13 AI分析结果页面

图6-14 提交记录页面

图6-15 提交详情页面

图6-16 竞赛页面

图6-17 竞赛报名页面

图6-18 竞赛详情页面

6.2.2 管理员端题库部分的实现

图6-19 题目管理浏览页面

图6-20 创建题目页面

部分代码如下:

    @PostMapping("/getQuestion/ai")

    public BaseResponse<QuestionAddRequest> getQuestionByAI(HttpServletRequest request) {

        List<ChatMessage> chatMessageList = new ArrayList<ChatMessage>();

        ChatMessage systemChatMessage = new ChatMessage(ChatMessageRole.USER.value(),        AIConstant.AUTO_CREATE_QUESTION);

        chatMessageList.add(systemChatMessage);

        String result = aiManager.doRequest(chatMessageList, Boolean.FALSE, STABLE_TEMPERATURE);

        int start = result.indexOf("{");

        int end = result.lastIndexOf("}");

        String json = result.substring(start, end + 1);

        QuestionAddRequest questionAddRequest = GSON.fromJson(json, QuestionAddRequest.class);

        return ResultUtils.success(questionAddRequest);

    }

图6-21 AI生成题目时序图

图6-22 题目修改页面

图6-23 创建竞赛页面

图6-24 创建竞赛时序图

6.3 讨论模块的实现

6.3.1 用户端讨论部分的实现

图6-25 讨论页面

图6-26 发表评论时序图

图6-27 讨论详情页面

图6-28 获取评论列表时序图

图6-29 发布讨论页面

图6-30 我的讨论页面

图6-31 我的收藏页面

6.3.2 管理员端讨论部分的实现

图6-32 讨论管理浏览页面

图6-33 讨论修改页面

6.4 代码沙箱模块的实现

6.4.1 判题服务与代码沙箱的关系

图6-34 判题模块关系图

部分代码如下:

@PostMapping("/execute")
public ExecuteCodeResponse executeCode(@RequestBody ExecuteCodeRequest executeCodeRequest) {
    CodeSandboxTemplate sandboxTemplate = CodeSandboxFactory.getInstance(executeCodeRequest.getLanguage());
    return sandboxTemplate.executeCode(executeCodeRequest);
}

图6-35 判题业务流程图

6.4.2 代码沙箱的具体实现

图6-36码沙箱执行时序图

6.5 信息管理模块的实现

6.5.1 用户信息

图6-37 修改信息页面

图6-38 修改密码页面

图6-39 添加用户页面

图6-40 用户管理页面

图6-41 用户信息修改页面

6.5.2 平台信息

图6-42 排名信息页面

图6-43 平台数据信息页面

图6-44 推荐算法权重配置页面

算法权重配置部分代码如下:

  public boolean updateConfig(RecommendationConfig config) {

        // 设置更新时间

        config.setUpdateTime(LocalDateTime.now().toDate());

        // 获取最新配置,如果有则更新,否则插入新记录

        RecommendationConfig latest = configMapper.getLatestConfig();

        if (latest != null) {

            config.setId(latest.getId());  // 设置已有记录的 ID

            return configMapper.updateById(config) > 0;

        } else {

            return configMapper.insert(config) > 0;

        }

    }

图6-45 题目提交列表页面

6.6 商城与课程模块的实现

6.6.1 商城部分的具体实现

图6-46 商城浏览页面

图6-47 商城管理页面

图6-48 编辑商品页面

6.6.2 课程部分的具体实现

图6-49 课程浏览页面

图6-50 编辑商品页面

图6-51 编辑课程页面

7 系统测试

7.1 测试目的

在日常开发中,由于代码的复杂程度、人为操作等因素,系统难免会出现各种错误。这些错误可能表现为功能异常、系统崩溃甚至数据泄露等严重后果。通过系统测试,可以有效地发现并修复这些错误,从而避免错误在正式环境中出现,提高系统的可靠性、安全性与用户体验。

7.2 测试环境

测试环境组件

配置说明

客户端

Windows11/Chrome浏览器最新版

前端框架

Vue3+Arco Design

后端框架

SpringBoot2.7+MyBatis-Plus

数据库

MySQL8.0

缓存组件

Redis6.2

模拟接口工具

JSONServer(用于商城与课程模块数据模拟)

服务器系统

CentOS7.9/Nginx+SpringBoot部署

测试工具

Postman(接口测试)、JMeter(性能测试)、Chrome控制台(功能验证)

7.3 测试内容

本系统测试主要分为接口测试、功能测试、性能测试和安全测试四个部分。测试采用黑盒测试方法,接口驱动法。

测试流程如下,首先通过后端接口调试文档对主要接口进行请求测试,检测参数的异常是否出现,并进行异常处理;而后,基于功能进行功能测试用例设计,尽可能覆盖管理端和用户端两种角色的操作,其次,借助Apache JMeter工具对推荐、判题两个接口进行100并发用户访问,进行压力压测;最后,通过角色权限和数据权限检查,防止未登录用户对敏感数据或功能的访问和使用,确保平台稳定,安全可靠运行。

首先通过平台后端的调试接口先进行接口测试,接着使用具体账号进行系统的功能测试,后端接口测试如图7-1所示。

图7-1 后端接口测试图

7.3.1 用户端功能测试用例

用户端测试用例设计如表7-1所示:

表7-1 用户端测试用例表

TC

测试功能

操作步骤

预期结果

实际结果

TC_User_001

注册账号

点击注册账号,输入账号、密码、确认密码和验证码

输入注册账号:koala code,密码7911230124,确认密码:7911230124后,注册成功

与预期结果一致

TC_User_002

登录账号

输入账号、密码后登录系统

输入账号:koala code,密码7911230124,登录成功

与预期结果一致

TC_User_003

开启推荐功能

点击题库的显示推荐按钮

显示带有推荐列表的题库

与预期结果一致

TC_User_004

提交题目

在做题页面输入相应的代码,然后点击提交代码

正常提交成功后显示判题结果,弹出题目评分弹窗

与预期结果一致

续表7-1 用户端测试用例表

TC

测试功能

操作步骤

预期结果

实际结果

TC_User_005

发表评论

在做题页面和讨论详情页面发表评论

发表成功后页面渲染评论列表,支持嵌套评论功能

与预期结果一致

TC_User_006

发布讨论

进入发布讨论页面,编辑讨论信息发布

输入标题:测试讨论,标签:测试,内容:测试功能,后显示发布成功

与预期结果一致

TC_User_007

参加竞赛

在竞赛页面报名参赛

报名成功后在我的竞赛列表显示

与预期结果一致

TC_User_008

AI代码分析

在做题页面点击AI代码分析

显示弹窗,包括AI分析结果

与预期结果一致

TC_User_009

修改个人信息

在个人信息页面修改个人信息及密码

修改性别为女,提示修改成功或者修改失败

与预期结果一致

TC_User_0010

点赞收藏讨论

在讨论页面点赞、收藏自己喜欢的讨论

点赞、收藏成功,收藏夹中显示收藏的讨论

与预期结果一致

7.3.2 管理员端功能测试用例

管理员端测试用例设计如表7-2所示:

表7-2 管理员端测试用例表

TC

测试功能

操作步骤

预期结果

实际结果

TC_Admin_001

创建题目

点击创建题目,输入题目标题,内容,标签,难度,判题配置等相关信息

题目:a+b标签:加法,难度:简单,内容:输出a+b的和,判题用例:输入1 1输出:2

与预期结果一致

TC_Admin_002

创建竞赛

在竞赛页面,输入竞赛相关信息

竞赛名称:周赛描述:平台第一场周赛

与预期结果一致

续表7-2 管理员端测试用例表

TC

测试功能

操作步骤

预期结果

实际结果

TC_Admin_003

AI生成题目

在创建题目页面点击AI生成题目

自动生成题目,并填充到输入框

与预期结果一致

TC_Admin_004

管理用户

在用户管理页面,修改用户的信息及权限

修改账号为cheshi用户的权限为管理员,显示修改成功

与预期结果一致

TC_Admin_005

管理讨论

在讨论管理页面,修改讨论的相关信息

在讨论内容追加上一句hello,world后提交,显示修改成功

与预期结果一致

TC_Admin_006

管理商城和课程

在课程管理、商城管理页面修改相关信息

修改商品单价后重新上架,显示修改成功

与预期结果一致

TC_Admin_007

查看平台数据

点击平台数据按钮,获取平台相关信息

正确返回平台各种数据

与预期结果一致

TC_Admin_008

修改推荐配置

在推荐配置调整余弦相似度参数为0.2

正确修改参数,修改后的推荐配置生效

与预期结果一致

7.3.3 模块专项测试用例

在对用户和管理员端的核心功能进行测试后,再根据题库管理、讨论管理、用户管理、商城管理、课程管理的模块特点分别测试,确保核心功能的运行稳定,题库管理模块用例设计如表7-3所示:

表7-3 题库管理测试用例表

TC

测试功能

操作步骤

预期结果

实际结果

TC_Admin_009

随机一题

题库页面点击随机一题按钮,随机进入一道题。

显示随机题目

与预期结果一致

续表7-3 题库管理测试用例表

TC

测试功能

操作步骤

预期结果

实际结果

TC_Admin_010

更新题目

在题库管理页面,对已经发布的题目进行更新修改

更新成功

与预期结果一致

TC_Admin_011

删除题目

在题库管理页面,对已发表的题目点击删除按钮

删除成功

与预期结果一致

TC_Admin_012

创建题目

点击创建题目,输入创建的题目、标签、判题配置后点击提交

创建题目

与预期结果一致

讨论管理模块用例设计如表7-4所示:

表7-4 讨论管理测试用例表

TC

测试功能

操作步骤

预期结果

实际结果

TC_User_011

用户发布讨论

在发起讨论页面编辑讨论内容后点击发布

发布成功

与预期结果一致

TC_User_012

用户讨论历史

点击我的讨论,进入我的讨论页面,包含所有用户历史发表的讨论

显示个人讨论历史

与预期结果一致

TC_User_013

用户讨论修改

在个人讨论历史页面对已发布的讨论修改

修改成功

与预期结果一致

TC_User_014

用户讨论删除

在个人讨论历史页面对已发布的讨论点击删除

删除成功

与预期结果一致

商城管理模块用例设计如表7-5所示。

表7-5 商城管理测试用例表

TC

测试功能

操作步骤

预期结果

实际结果

TC_Admin_013

添加商品

点击添加按钮进入添加页面,输入名称、描述、价格、图片、URL点击确定

添加成功

与预期结果一致

TC_Admin_014

修改商品

点击商品后的编辑按钮,对商品的名称、描述、价格、图片、URL进行修改

修改成功

与预期结果一致

TC_Admin_015

删除商品

点击商品后的删除按钮

删除成功

与预期结果一致

课程管理模块用例设计如表7-6所示:

表7-6 课程管理测试用例表

TC

测试功能

操作步骤

预期结果

实际结果

TC_Admin_016

添加课程

点击添加按钮进入添加页面,输入课程名称、内容、标签、URL,点击确定

添加成功

与预期结果一致

TC_Admin_017

编辑课程

点击课程后的编辑按钮,对课程的名称、内容、标签、URL编辑后,点击确定

编辑成功

与预期结果一致

TC_Admin_018

删除课程

点击课程后的删除按钮

删除成功

与预期结果一致

7.3.4 性能与安全测试

为了验证系统在高并发访问下的稳定性与响应能力,本文选取了平台使用频率较高的推荐接口、判题接口、首页加载接口及商城数据接口作为测试对象,采用Apache JMeter工具进行性能压力测试。测试模拟100名并发用户同时访问系统,每个用户对目标接口发起1次请求。通过收集各接口的平均响应时间、最大响应时间与成功率指标,综合评估系统的抗压能力与响应性能,系统核心接口性能测试数据如表7-7所示。

表7-7 系统核心接口性能测试数据表

接口名称

并发用户数

平均响应时间(ms)

最大响应时间(ms)

成功率(%)

推荐接口

100

488

1212

98.6

判题接口

100

233

752

100

首页加载接口

100

112

356

100

商城数据接口

100

49

90

100

为了保障智能编程学习平台在实际运行中的安全性,像越权访问等安全隐患,从账户权限管理、接口访问控制、数据传输安全进行了安全测试,如表7-8所示。

表7-8 权限管理用例表

测试用例

操作说明

预期结果

实际结果

非登录状态访问题库页面

未登录用户访问/question

被重定向至登录页面或返回403

与预期结果一致

普通用户访问后台管理接口

访问/admin等管理员接口

无权限

与预期结果一致

管理员删除普通用户发布内容

管理员删除用户发布讨论、评论

删除成功

与预期结果一致

用户只能修改自身信息

普通用户尝试修改他人账号数据

返回错误或无权限

与预期结果一致

7.4 测试结果

通过对编程学习平台的测试,系统的功能基本完整,设计目标基本达到,可以根据使用者使用得到预期的功能响应。测试覆盖了系统的主要功能模块,包括管理员端与用户端的核心功能、推荐功能、平台判题功能、AI辅助功能等。并对系统的性能、稳定性、安全性进行了测试与评估。在测试过程中也发现了系统的部分问题和不足,将在下一步工作中进行修复、改进与优化,进一步提升整体系统性能和体验。

8 总结

随着数字化时代的不断推进,编程教育的重要性日益凸显。面对现有在线评判系统、传统编程学习平台等无法满足个性化推荐、提升实际实践能力等不足,本文设计并开发了基于多模态协同过滤算法的智能编程学习平台。依托于平台自主代码沙箱技术为学习者提供了安全可靠的编程学习环境,同时融合多维度的用户行为数据与题目特征,实现了多模态协同过滤算法对平台题目进行个性化推荐,帮助初学者高效提升编程实践能力。

在本论文的研究与开发过程中,分析了系统需求、系统的架构设计、功能模块设计与关键技术选型等问题。通过实际开发实现了平台所需的各种功能,最后通过系统测试验证,平台在满足编程初学者学习需求的同时,展现出良好的可扩展性与用户交互体验,能够为广大编程学习者提供优质的学习资源与服务支持。

当然,系统在当前阶段仍存在一定的局限性。例如推荐算法仍有优化空间,AI模型的调用与适配尚待进一步加强,用户体验方面也有待持续打磨。未来工作中,将继续对平台进行迭代优化,进一步提升系统性能与智能化水平,力求打造更全面、更高效的编程学习平台。

视频演示

https://live.csdn.net/v/508277

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐