基于SpringAI的在线考试系统-企业级软件研发工程应用规范实现细节

从“考生参加考试”看DDD四层架构:把业务需求拆成可落地的代码逻辑

在企业级在线考试系统中,“考生参加考试并提交答卷”是核心场景之一。我们用DDD四层架构,把用户的自然语言需求,转化为“业务规则→流程→接口→技术实现”的完整链路。

一、先明确:用户的“自然语言业务需求”是什么?

这是领域层的输入源,必须先把用户的口语化需求,提炼成清晰的业务规则:

  1. 考生只能参加“已发布且未结束”的考试;
  2. 考试开始后,系统自动加载对应试卷,且试卷内容不可修改;
  3. 考生答题过程中,系统每5分钟自动保存一次答案;
  4. 考生主动交卷/考试时间到,系统自动计算客观题分数,主观题进入阅卷队列;
  5. 考试结束后,考生能立即看到客观题得分和错题提示。

二、领域层:把“自然语言规则”转化为业务代码

领域层是业务规则的载体,我们要把上面的需求,封装成实体、聚合根、领域服务:

1. 核心领域实体/聚合根设计

Exam(考试)为聚合根(因为考试是该场景的核心载体),包含关联的实体/值对象:

// 聚合根:Exam(考试)@AggregateRoot@DatapublicclassExam{@IdentifierprivateLongid;privateStringtitle;// 考试名称privateLongpaperId;// 关联试卷IDprivateLocalDateTimestartTime;// 开始时间privateLocalDateTimeendTime;// 结束时间privateExamStatusstatus;// 状态:DRAFT(草稿)/PUBLISHED(已发布)/FINISHED(已结束)// 值对象:封装“考试配置”的业务规则@EmbeddedprivateExamConfigconfig;// 业务规则1:判断考生是否能参加考试publicbooleanisJoinable(){LocalDateTimenow=LocalDateTime.now();returnthis.status==ExamStatus.PUBLISHED&&now.isAfter(this.startTime)&&now.isBefore(this.endTime);}// 业务规则2:考试开始后不能修改试卷publicbooleancanModifyPaper(){returnLocalDateTime.now().isBefore(this.startTime);}}// 值对象:ExamConfig(考试配置)@ValueObject@DatapublicclassExamConfig{privateIntegerautoSaveInterval;// 自动保存间隔(分钟)// 业务规则3:获取自动保存的时间间隔publicDurationgetAutoSaveDuration(){returnDuration.ofMinutes(this.autoSaveInterval);}}// 实体:AnswerSheet(考生答卷)@Entity@DatapublicclassAnswerSheet{@IdprivateLongid;privateLongexamId;// 关联考试IDprivateLonguserId;// 关联考生IDprivateMap<Long,String>answers;// 题目ID→考生答案privateLocalDateTimelastSaveTime;// 最后自动保存时间privateBigDecimalobjectiveScore;// 客观题得分// 业务规则4:判断是否需要自动保存publicbooleanneedAutoSave(ExamConfigexamConfig){LocalDateTimenextSaveTime=this.lastSaveTime.plus(examConfig.getAutoSaveDuration());returnLocalDateTime.now().isAfter(nextSaveTime);}}

2. 领域服务:跨聚合的业务规则封装

如果业务需要多个聚合协同(比如“计算客观题分数”需要AnswerSheet+Question聚合),用领域服务封装:

// 领域服务:AnswerSheetDomainService@ServicepublicclassAnswerSheetDomainService{// 依赖Question聚合的仓储(接口,由基础设施层实现)privatefinalQuestionRepositoryquestionRepository;// 业务规则4:计算客观题分数publicBigDecimalcalculateObjectiveScore(AnswerSheetanswerSheet){List<Question>questions=questionRepository.findByExamId(answerSheet.getExamId());BigDecimalscore=BigDecimal.ZERO;for(Questionquestion:questions){if(question.getType()==QuestionType.OBJECTIVE){// 只算客观题StringcorrectAnswer=question.getCorrectAnswer();StringuserAnswer=answerSheet.getAnswers().get(question.getId());if(correctAnswer.equals(userAnswer)){score=score.add(question.getScore());}}}answerSheet.setObjectiveScore(score);returnscore;}}

三、应用层:把“业务规则”编排成“用户流程”

应用层不写业务规则,只负责把领域层的能力串成用户需要的操作流程(对应“考生参加考试”的完整步骤):

// 应用服务:ExamApplicationService@ServicepublicclassExamApplicationService{// 依赖领域层的仓储和服务privatefinalExamRepositoryexamRepository;privatefinalAnswerSheetRepositoryanswerSheetRepository;privatefinalAnswerSheetDomainServiceanswerSheetDomainService;privatefinalMessageProducermessageProducer;// 消息发送(基础设施层提供)// 编排“考生参加考试并提交答卷”的流程publicExamResultDTOparticipateAndSubmit(LongexamId,LonguserId,Map<Long,String>answers){// 步骤1:校验考试是否可参加(调用领域层规则)Examexam=examRepository.findById(examId).orElseThrow(()->newBusinessException("考试不存在"));if(!exam.isJoinable()){thrownewBusinessException("当前考试不可参加");}// 步骤2:创建/更新答卷(调用领域层实体)AnswerSheetanswerSheet=answerSheetRepository.findByExamIdAndUserId(examId,userId).orElse(newAnswerSheet(examId,userId));answerSheet.setAnswers(answers);answerSheet.setLastSaveTime(LocalDateTime.now());// 步骤3:计算客观题分数(调用领域服务)BigDecimalobjectiveScore=answerSheetDomainService.calculateObjectiveScore(answerSheet);answerSheetRepository.save(answerSheet);// 步骤4:发送“主观题阅卷”消息(调用基础设施层能力)messageProducer.sendSubjectiveMarkingMessage(answerSheet.getId());// 步骤5:组装结果返回returnExamResultDTO.builder().examId(examId).userId(userId).objectiveScore(objectiveScore).build();}}

四、接口层:把“流程”包装成“对外服务”

接口层是系统的对外入口,负责把应用层的流程,暴露为前端/其他系统可调用的形式(比如RESTful API):

// 接口层:ExamController@RestController@RequestMapping("/api/exam")publicclassExamController{privatefinalExamApplicationServiceexamApplicationService;// 对外提供“参加考试并提交答卷”的API@PostMapping("/{examId}/submit")publicResult<ExamResultDTO>submitExam(@PathVariableLongexamId,@RequestParamLonguserId,@RequestBodyMap<Long,String>answers){ExamResultDTOresult=examApplicationService.participateAndSubmit(examId,userId,answers);returnResult.success(result);}}

五、基础设施层:把“业务逻辑”落地为“技术实现”

基础设施层是纯技术细节,负责实现领域层/应用层需要的技术能力(数据库、消息队列等):

1. 仓储的技术实现(比如MySQL)

// 基础设施层:ExamRepository的MySQL实现@RepositorypublicclassExamRepositoryImplimplementsExamRepository{privatefinalJdbcTemplatejdbcTemplate;@OverridepublicOptional<Exam>findById(Longid){Stringsql="SELECT * FROM exam WHERE id = ?";returnjdbcTemplate.query(sql,newObject[]{id},rs->{if(rs.next()){Examexam=newExam();exam.setId(rs.getLong("id"));exam.setTitle(rs.getString("title"));// 其他字段赋值...returnOptional.of(exam);}returnOptional.empty();});}@Overridepublicvoidsave(Examexam){// 实现MySQL的插入/更新逻辑}}

2. 消息队列的技术实现(比如RabbitMQ)

// 基础设施层:MessageProducer的RabbitMQ实现@ServicepublicclassRabbitMQMessageProducerimplementsMessageProducer{privatefinalRabbitTemplaterabbitTemplate;@OverridepublicvoidsendSubjectiveMarkingMessage(LonganswerSheetId){rabbitTemplate.convertAndSend("subjective-marking-exchange","subjective.marking",answerSheetId);}}

六、总结:四层架构的“职责边界”

通过“考生参加考试”场景,我们能清晰看到DDD四层的分工:

层级角色核心产出物
领域层业务规则的“翻译器”实体、聚合根、领域服务
应用层业务流程的“串线工”应用服务(流程编排)
接口层对外服务的“窗口”RESTful API/消息处理器
基础设施层技术实现的“工具箱”仓储实现、消息队列集成、外部接口适配

这样的分层设计,既能保证业务规则不被技术细节污染(领域层独立),又能让流程和技术实现灵活替换(比如把MySQL换成MongoDB,只改基础设施层),是企业级系统“易维护、易扩展”的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1150273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单机防护机器码 仿网吧

链接&#xff1a;https://pan.quark.cn/s/3af0c8a38d9e软件介绍&#xff1a;机器码防护 理论就是仿网吧无盘 弹出的磁盘是无序列号的 理论是可以的 例子 防护电脑不出现1天以上的机器码 内包含教程

基于SpringAI的在线考试系统-企业级软件研发工程应用规范实现细节(完整)

完整版|考试系统 DDD 四层架构落地全解(含领域层四大核心对象+分层联动+设计原则,博客级完善版) 前言:为什么DDD分层设计是复杂业务的最优解 我们做考试系统这类业务系统,最核心的痛点是:业务规则多变、需求迭代快、技术选型易替换,而DDD的核心价值,就是把「业务规则…

深度学习毕设选题推荐:通过python深度学习对狗的体型识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

机器码机器码

链接&#xff1a;https://pan.quark.cn/s/c251eef0119f

Flink与CockroachDB集成:分布式SQL数据库

Flink与CockroachDB集成:分布式SQL数据库的流批协同技术栈 关键词:Apache Flink, CockroachDB, 分布式SQL, 实时数据处理, 流批一体, 数据集成, 分布式事务 摘要:本文深入探讨Apache Flink与CockroachDB的技术集成体系,构建覆盖实时流处理、分布式事务管理、弹性扩展的完整…

AI编辑器

链接&#xff1a;https://pan.quark.cn/s/913f284a0b47、小红书emoji排版、小红书运营干货等功能和内容, 一站式搞定小红书笔记创作。

大数据领域数据服务在教育行业的创新应用

大数据领域数据服务在教育行业的创新应用&#xff1a;用数据点亮教育的“成长地图” 关键词&#xff1a;大数据、教育数据服务、个性化学习、教育智能、数据驱动决策 摘要&#xff1a;本文从“教育数据服务”这一核心出发&#xff0c;结合大数据技术原理与教育行业需求&#xf…

【设计模式】外观模式(Facade)详解

文章目录1. 引言&#xff1a;系统复杂&#xff0c;调用者太累2. 什么是外观模式GoF 定义3. 外观模式的核心思想4. 外观模式的结构5. 示例&#xff1a;电脑启动系统5.1 子系统5.2 外观类5.3 客户端使用6. 外观模式的优点7. 外观模式的缺点8. 外观 vs 适配器 vs 桥接9. JDK 中的外…

内存碎片|c++内存池|lua gc

c内存池|lua gcC内存池和Lua GC的高效性取决于使用场景&#xff1a;内存池在固定大小对象的高频分配/释放场景下更高效Lua GC则在动态类型、灵活内存管理的脚本场景下更适配sum- C内存池&#xff1a;手动预分配一块连续内存&#xff0c;按需切割分配避免频繁调用系统 malloc/fr…

大语言模型在城市规划决策支持中的推理应用

大语言模型在城市规划决策支持中的推理应用 关键词:大语言模型、城市规划、决策支持、推理应用、人工智能 摘要:本文聚焦于大语言模型在城市规划决策支持中的推理应用。首先介绍了研究的背景、目的、预期读者和文档结构,明确相关术语。接着阐述大语言模型与城市规划的核心概…

喂金鱼小工具

链接&#xff1a;https://pan.quark.cn/s/2eac449f5915需要配合node下载使用&#xff0c;喜欢的朋友可一个安装到各种单机老电脑做个屏保。

深度学习计算机毕设之通过python-CNN深度学习对狗的体型识别通过机器学习对狗的体型识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

amd 功耗频率

链接&#xff1a;https://pan.quark.cn/s/638dbd83dcc2morepowertools的作用是修改BIOS文件中SPPT&#xff08;Soft Power Play Tables&#xff09;模块&#xff0c;这个模块包含了电压&#xff0c;风扇&#xff0c;功耗墙等的设置,如下图所示&#xff01;

【课程设计/毕业设计】人工智能基于python-CNN卷积神经网络识别玻璃是否破碎基于人工智能python-CNN卷积神经网络识别玻璃是否破碎

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

AI元人文:欲望-客观-自感的纠缠治理——从三值纠缠到内生进化

AI元人文&#xff1a;欲望-客观-自感的纠缠治理——从三值纠缠到内生进化引言&#xff1a;治理的范式危机与元人文转向人工智能治理正陷入双重困境&#xff1a;一面是日益精巧却脱离实践的“茴香豆化”学术生产&#xff0c;一面是将人类价值悄悄“数值化”的技术优化陷阱。传统…

深度学习计算机毕设之基于python-CNN卷积神经网络识别玻璃是否破碎基于卷神经网络识别玻璃是否破碎

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

大数据领域数据产品的旅游行业应用方案

大数据时代,旅游行业如何用数据产品重构“人-货-场”闭环? 引言:旅游行业的“痛点急救包”,为何是数据产品? 凌晨3点,某景区运营经理的手机突然震动——实时监控显示,明日景区人流预测将突破最大承载量的120%。他立刻打开数据后台,快速调阅了未来3天的天气、周边交通…

导师严选9个AI论文平台,自考学生轻松搞定论文写作!

导师严选9个AI论文平台&#xff0c;自考学生轻松搞定论文写作&#xff01; AI工具让论文写作不再难 在自考学习的道路上&#xff0c;论文写作常常成为学生们的“拦路虎”。面对繁重的学术任务和严格的格式要求&#xff0c;很多同学感到无从下手。然而&#xff0c;随着AI技术的发…

低端游戏网站:在线玩260+经典DOS/Windows游戏,基于JSDOS技术

对于许多资深玩家而言&#xff0c;重温《红色警戒》、《仙剑奇侠传98柔情篇》、《大富翁4》等经典游戏往往面临兼容性差、安装繁琐的难题。传统的解决方案是使用DOSBox等本地模拟器进行复杂配置。低端游戏​ 平台则另辟蹊径&#xff0c;通过前沿的Web技术将模拟器环境“搬”到了…

服务器/论坛试运行发布测试!

用香橙派的AI开发板挂载了一个论坛服务&#xff0c;都过来聊天喵&#xff01; 链接&#xff1a;https://code.tokesystem.top/ 由于是非运营的很不稳定&#xff0c;因此只作为测试&#xff0c;随时可能会断掉&#xff0c;只作为学习交流使用 代码开源&#xff1f;&#xff08;…