手术训练系统项目

★ 手术训练系统项目
项目描述:手术训练系统,它提供了多项功能,包括账户登录与创建、数据库与账户管理、课程管理、小组管理、成绩统计、证书发布、训练和系统设置。
职责描述:
1、训练功能开发(任务概述、任务指导、评分规则、评分成绩)。
2、课程管理功能(CRUD课程、为课程分配任务、设置评分规则)。
3、数据库设计。

项目概述

我参与开发的项目是一个手术训练系统,它提供了多项功能,包括账户登录与创建、数据库与账户管理、课程管理、小组管理、成绩统计、证书发布、训练和系统设置。我的主要负责领域是训练功能和课程管理功能。

我的贡献

训练功能:我负责开发系统中的训练模块。其中的主要难点之一是展示当前课程的级别-训练树,这需要将课程结构以树形式展示,并与训练任务进行关联。我成功地实现了这一功能,使用户能够轻松地浏览和选择适合他们的训练任务。

课程管理功能:我还负责课程管理模块的开发。这包括创建新的课程和管理已有课程。用户可以定义课程的基本属性,如名称、尝试次数和评论。这个模块的开发也与训练任务的创建和关联密切相关,确保了系统的一致性和流畅性。

数据库设计:
在项目中,我们使用了一种具有表层级的数据库结构,其中主要的表是course、block和task,以及一个名为exercise的训练池表。为了管理多种评分标准,我们还创建了task_metrics_configuration表,负责12种维度的评分标准。这种设计将任务、评分标准名称和评分标准属性合理地组织在一起。

其中的难点

1、面对到任务id-评分标准名称-评分标准内容三个维度的情况,如下图所示,为了减少一对多关系表的复杂性,我们采用了一种巧妙的设计,将任务ID、左手器械的最小值、最大值、状态和权重等信息存储在同一表中,以逻辑的整合换取了数据库表结构的简洁性,提高了系统的性能和可维护性。(核心就是简化查询缺点就是降低了扩展性)
在这里插入图片描述
2、导出到本地需要配置虚拟路径方法

public class SaTokenConfigure implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 配置虚拟地址 "/video/**" 映射到实际视频文件路径registry.addResourceHandler("/virtual/**").addResourceLocations("file:///" + RESOURCE_PATH).resourceChain(true).addResolver(new DebugResourceResolver());}
}

核心难点:
3、如下图所示,左边可选训练任务是exercise(及其配置表)、中间已分配训练任务是block与task表(及其配置表),那么这棵树能够新增同级、新增子级,还能随意地复制任意结点、删除结点,由于每个训练用户还能自定义配置任务时长限制、可尝试次数、任务评分规则配置等信息,所以能预见到
推论1:如果需要新增训练时,需要从exercise表中复制,而复制训练时,需要从task及其配置表中复制。
推论2:前端不会每次新增操作了给你传过来、复制操作给你传过来数据、删除操作给你传过来数据,因为前端对用户操作是无感知的,这也就意味着你在执行编辑当前课程的逻辑时,只能拿到你之前的这棵树的逻辑和前端传过来的之后修改后的这棵树的逻辑。
我与前端有如下约定:
1、exerciseId区分block与task
2、id区分是新增结点还是复制的结点

实现步骤思想:
1、清理数据结构。
2、为没有ID的子节点设置唯一的ID。
3、处理可能存在的重复ID的情况,以确保每个节点都有唯一的ID。
4、为树的每个节点设置parentId。
5、解析前端传递的参数,生成树节点列表。
6、删除与特定课程ID相关的数据库中的信息。
7、根据节点类型将节点分为任务(Task)和块(Block)。
8、将任务(Task)节点插入到任务表中。
8、将块(Block)节点插入到块表中,并关联它们到特定课程。
10、返回更新后的课程树数据。
在这里插入图片描述
在这里插入图片描述

@PostMapping("updateDirectoryTree2")public CommonResult updateDirectoryTree2(@RequestBody UpdateDirectoryTreeDto updateDirectoryTreeDto) {//清理treeNodeList = new ArrayList<>();idCountMap = new HashMap<>();//为没有id的子节点设置唯一的idsetUniqueIdsIfNotNull(updateDirectoryTreeDto.getList());//TODO 新增的结点是没有id的,updateDirectoryTreeDto.getList()有id重复的时候说明有复制的id,需要进行重新赋予id的操作,同时需要将配置表的信息也连带复制过来handleDuplicateIds(updateDirectoryTreeDto.getList());//为树的每个节点设置parentIdsetParentIds(updateDirectoryTreeDto.getList(), null);//前端传的参数解析setTreeNode(updateDirectoryTreeDto.getList());System.out.println("treeNodeList:" + treeNodeList);//删除与该课程id相关的block和task表中信息taskService.deleteTaskByCourseId(updateDirectoryTreeDto.getCourseId());blockService.deleteBlockByCourseId(updateDirectoryTreeDto.getCourseId());List<TreeNode> taskList = new ArrayList<>();List<TreeNode> blockList = new ArrayList<>();for (TreeNode node : treeNodeList) {if (node.getExerciseId() != null && !node.getExerciseId().isEmpty()) {taskList.add(node);} else {blockList.add(node);}}// 打印结果taskService.insertTask(taskList);blockService.insertBlock(blockList, updateDirectoryTreeDto.getCourseId());return CommonResult.success(blockService.getDataTreeByCourseId(updateDirectoryTreeDto.getCourseId()));}

遇到的注意点

1、考虑权限@SaCheckRole(value = {RoleConstants.ROLE_STUDENT, RoleConstants.ROLE_GUEST}, mode = SaMode.OR)
2、@MapperScan不要加到@SpringBootApplication,加到MybatisPlusConfig ,否则扫描包时会有异常情况。

@Configuration
@MapperScan("com.wego.training.mapper")
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 分页插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}

3、碰到枚举的情况,至少要设置一个constants类,并加上必要的注释,否则就会与同事逻辑不一致,也便于以后修改枚举值

package com.wego.training.constant;/*** @author lst* @date 2023年10月18日 10:27*/
public class CourseConstants {/*** 课程私有的** @author lst* @date 2023/10/18 10:28* @param null* @return null*/public static final int COURSE_PRIVATE = 0;/*** 课程公开的** @author lst* @date 2023/10/18 10:28* @param null* @return null*/public static final int COURSE_PUBLIC = 1;/*** 课程同组的** @author lst* @date 2023/10/18 10:28* @param null* @return null*/public static final int COURSE_GROUP = 2;}

总结:
在这个项目中,我承担了训练功能和课程管理功能的开发任务,并成功应对了展示课程结构、任务评分和数据库设计等关键挑战。我的工作使项目能够提供用户友好的手术训练体验,并确保了系统的高性能和可维护性。

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

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

相关文章

71 内网安全-域横向网络传输应用层隧道技术

目录 必备知识点&#xff1a;1.代理和隧道技术区别?2.隧道技术为了解决什么?3.隧道技术前期的必备条件? 演示案例:网络传输应用层检测连通性-检测网络层ICMP隧道Ptunnel使用-检测利用传输层转发隧道Portmap使用-检测,利用传输层转发隧道Netcat使用-检测,利用,功能应用层DNS隧…

Jmeter分布式性能测试细节+常见问题解决,资深老鸟带你避坑...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Jmeter分布式测试…

【TiDB】TiDB CLuster部署

目录 0 大纲 一 集群部署工具TiUP简介 1 TiUP 简介 2 TiUP使用 3 TiUP使用举例 二 TiDB Cluster安装配置需求 1 生产环境硬件需求 2 操作系统需求 三 TIDB部署 1 软硬件需求以及前置检查​编辑 2 安装TiUP 组件 ​3 集群拓扑文件 4 执行部署命令 &#xff08;1&…

6-爬虫-scrapy解析数据(使用css选择器解析数据、xpath 解析数据)、 配置文件

1 scrapy解析数据 1.1 使用css选择器解析数据 1.2 xpath 解析数据 2 配置文件 3 整站爬取博客–》爬取详情–》数据传递 scrapy 爬虫框架补充 # 1 打码平台---》破解验证码-数字字母&#xff1a;ddddocr-计算题&#xff0c;滑块&#xff0c;成语。。。-云打码&#xff0c;超…

HK WEB3 MONTH Polkadot Hong Kong 火热报名中!

HK Web3 Month 11月除了香港金融科技周外&#xff0c;HK Web3 Month又是一大盛事&#xff0c;从10月29日开始开幕直到11月18日结束。此次将齐聚世界各地的Web3产业从业者、开发者、社群成员和学生来参与本次盛会。除外&#xff0c;超过75位产业知名的讲者与超过50场工作坊将为…

大数据毕业设计选题推荐-农作物观测站综合监控平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

linux基础:3.linux基础环境开发工具和配置。

linux基础环境开发工具和配置 一.学习yum工具进行软件安装&#xff1a;1.什么是yum&#xff1a;2.查看软件包&#xff1a;3.安装和删除&#xff1a;4.yum生态&#xff1a; 二.vim的使用&#xff1a;一.快速介绍一下vim二.vim正常模式&#xff1a;2-1&#xff1a;命令模式1.光标…

strtok函数详解:字符串【分割】的利器

目录 一&#xff0c;strtok函数简介 二&#xff0c;strtok函数的用法 三&#xff0c;strtok函数的注意事项 一&#xff0c;strtok函数简介 strtok函数可以帮助我们将一个字符串按照指定的分隔符进行分割&#xff0c;从而得到我们想要的子字符串。 &#x1f342;函数头文件&am…

【Qt绘制小猪】以建造者模式绘制小猪

效果 学以致用&#xff0c;使用设计模式之建造者模式绘制小猪。 代码 接口&#xff1a;申明绘制的步骤 PigBuilder.h #ifndef PIGBUILDER_H #define PIGBUILDER_H#include <QObject> #include <QPainter>class PigBuilder : public QObject {Q_OBJECT public:ex…

记录C# WinForm项目调用Rust生成的dll库

一、开发环境 1.RustRover (version&#xff1a;2023.3 EAP) 2.Visual Studio 2019 (version&#xff1a;16.11.30) 3.Windows 10 64位 OS 4.WinR&#xff1a;控制台程序&#xff0c;cmd.exe 二、使用RustRover编译Rust脚本为dll 1.下载安装Rust&#xff0c;https://www.…

Spark大数据应用实战

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

计算机丢失mfc100.dll如何恢复,详细解析mfc100.dll文件丢失解决方法

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;比如“mfc100.dll丢失”。这是因为动态链接库&#xff08;DLL&#xff09;文件是Windows操作系统的重要组成部分&#xff0c;它们包含了许多程序运行所需的函数和数据。当这些DLL文件丢失或损坏时&#x…

Selenium爬取内容并存储至MySQL数据库

前面我通过一篇文章讲述了如何爬取博客摘要等信息。通常,在使用Selenium爬虫爬取数据后,需要存储在TXT文本中,但是这是很难进行数据处理和数据分析的。这篇文章主要讲述通过Selenium爬取我的个人博客信息,然后存储在数据库MySQL中,以便对数据进行分析,比如分析哪个时间段…

挑战100天 AI In LeetCode Day06(热题+面试经典150题)

挑战100天 AI In LeetCode Day06&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-82.1 题目2.2 题解 三、面试经典 150 题-83.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&am…

17.复制字符串 ,包括\0

#include<stdio.h> #include <cstring>int main(){int len1,len2;char s1[44];char s2[33];scanf("%s",s1);scanf("%s",s2);len1strlen(s1)1;printf("先s1的字符长度为&#xff1a;%d\n",len1) ;strcpy(s1,s2) ;printf("复制字…

【算法与数据结构】39、LeetCode组合总和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题当中数字可以多次使用&#xff0c;那么我们在递归语句当中不能直接找下一个candidate的元素&…

Leetcode—102.二叉树的层序遍历【中等】

2023每日刷题&#xff08;二十四&#xff09; Leetcode—102.二叉树的层序遍历 C语言BFS实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Return an array of arr…

OpenHarmony,奏响中国基础软件的“光辉岁月”

梦想需要多久的时间&#xff0c;多少血和泪&#xff0c;才能慢慢实现&#xff1f; 天地间任我展翅高飞&#xff0c;谁说那是天真的预言&#xff1f; 《光辉岁月》歌词中的这两个问题&#xff0c;恰好可以送给今天的中国基础软件事业。 曾几何时&#xff0c;我们认为中国基础软件…

16.字符连接

#include<stdio.h> #include <cstring> int main(){char s1[44];char s2[33];scanf("%s",s1);scanf("%s",s2);strcat(s1,s2) ;printf("连接两个字符为&#xff1a;%s ",s1); return 0;}

【ES专题】Logstash与FileBeat详解以及ELK整合详解

目录 前言阅读对象阅读导航前置知识笔记正文一、ELK架构1.1 经典的ELK1.2 整合消息队列Nginx架构 二、LogStash介绍2.1 Logstash核心概念2.1.1 Pipeline2.1.2 Event2.1.3 Codec (Code / Decode)2.1.4 Queue 2.2 Logstash数据传输原理2.3 Logstash的安装&#xff08;以windows为…