手术训练系统项目

★ 手术训练系统项目
项目描述:手术训练系统,它提供了多项功能,包括账户登录与创建、数据库与账户管理、课程管理、小组管理、成绩统计、证书发布、训练和系统设置。
职责描述:
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.mzph.cn/news/133714.shtml

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

相关文章

【数据结构】手撕单链表

目录 前言 1 链表 1.1 链表的概念及结构 1.2 链表的分类 1.2.1 单向或者双向 1.2.2 带头或者不带头 1.2.3 循环或者非循环 1.2.4 无头单向非循环链表 1.2.5 带头双向循环链表 2 链表的实现 2.1 结构 2.2 结点的创建 2.3 尾插 2.4 头插 2.5 尾删 2.6 头删 2.7 …

数据结构与算法之美学习笔记:17 | 跳表:为什么Redis一定要用跳表来实现有序集合?

目录 前言如何理解“跳表”&#xff1f;用跳表查询到底有多快&#xff1f;跳表是不是很浪费内存&#xff1f;高效的动态插入和删除跳表索引动态更新解答开篇内容小结 前言 本节课程思维导图&#xff1a; 二分查找底层依赖的是数组随机访问的特性&#xff0c;所以只能用数组来实…

2.求100-999之间的水仙花数

#include<stdio.h>void fun(void){int i,a,b,c;for(i100;i<1000;i) {ai%10;//个 b(i/10)%10;//十 ci/100;//百 if(ia*a*ab*b*bc*c*c)printf("%d ",i);}}int main(){fun();return 0;}

STM32 GPIO 描述

一、GPIO功能描述 每个GPIO端口有两个32位配置寄存器(GPIOx_CRL&#xff0c;GPIOx_CRH) &#xff0c;两个32位数据寄存器 (GPIOx_IDR和GPIOx_ODR) &#xff0c;一个32位置位/复位寄存器(GPIOx_BSRR)&#xff0c;一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR…

数据可视化:地图

1.基础地图的使用 如何添加颜色表示层级 代码实现 """基础地图的使用 """ from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京市", 9),("上海市…

实验记录之——git push

平时做开发的时候经常push代码不成功&#xff0c;如下图 经好友传授经验&#xff0c;有如下方法 Win cmd使用Clash&#xff08;端口是7890&#xff09;代理操作&#xff0c;在cmd中输入&#xff1a; set http_proxy127.0.0.1:7890 set https_proxy127.0.0.1:7890Linux export …

有关LED显示屏对比度的知识

LED显示屏的对比度是指显示屏的亮度范围&#xff0c;即显示屏能够显示的最亮和最暗的部分之间的差异。对比度是一个重要的显示参数&#xff0c;它影响图像和视频的质量&#xff0c;以及用户对显示内容的感知。你知道LED显示屏的亮度和对比度是如何调节的吗&#xff1f; 一般来说…

【渗透测试】垂直越权(高危)、水平越权(中危)

目录 一、简介1.1 水平越权&#xff08;中危&#xff09;1.2 垂直越权&#xff08;高危&#xff09;1.3 方便记忆方法 二、修复方案2.1 水平越权修复2.2 垂直越权修复 一、简介 1.1 水平越权&#xff08;中危&#xff09; 漏洞危害&#xff1a; 水平越权 是相同级别&#xff0…

智能井盖传感器实时批发价格

城市之中高楼大厦林立&#xff0c;越来越多的人群涌入一线城市或二线城市。同时即便是县城之中接连不断的高楼大厦拔地而起&#xff0c;住宅小区的面积在不断拓宽。随着这一系列情况的出现&#xff0c;首先要完善的是每一个地区的城市道路设施建设。无论小区还是在城市路面之中…

antv G6 开发踩坑记录

1、通过键盘 鼠标拖拽创建边 根据官方实例&#xff0c;在画布上创建边基本都是点击端点构建边&#xff0c;或者固定端点后拖拽创建边&#xff0c;但是倘若有个这样的需求&#xff1a;“键盘按住ctrl后&#xff0c;鼠标从一个端点拖拽出边到另一个端点来创建边” 改如何应对呢…

使用c++解压rar文件,基于UnRAR64,非命令行

最近项目需要解压缩rar文件&#xff0c;我们都知道rar是闭源收费软件&#xff0c;如果直接采用命令行可能会有限制&#xff0c;或者盗版问题&#xff0c;使用正版的winrar命令行解压rar文件是否有限制&#xff0c;这个我没来得及测试&#xff0c;但是从交互体验上来说&#xff…

面试—如何介绍项目中的多级缓存?

项目中使用的多级缓存也就是 分布式缓存 Redis 本地缓存 Caffeine&#xff0c;那么令 Caffeine 作为一级缓存&#xff0c;Redis 作为二级缓存&#xff0c;在项目中通过记录数据的访问次数&#xff0c;将热点数据放在 本地缓存&#xff0c;将非热点数据放在 Redis缓存 中&#…

11月1日 mybatis入门

java程序与数据库对接端: jdbc 步骤固定, 代码固定, 大量重复代码 SQL写在代码中, 修改sql,需要重新编译代码, 动态sql, 手动拼接 结果集与java对象转换, java程序与前端对接端: javaWeb 手动获取请求参数, 需要手动进行数据转换 一个请求对应一个Servlet,造成Servlet类暴增…

【MongoDB】索引 - 复合索引

一、准备工作 这里准备一些学生数据 db.students.insertMany([{ _id: 1, name: "张三", age: 20, class: { id: 1, name: "1班" }},{ _id: 2, name: "李四", age: 22, class: { id: 2, name: "2班" }},{ _id: 3, name: "王五…

2023年最热门的五大编程技术趋势

2023年最热门的五大编程技术趋势 摘要&#xff1a;本文将介绍2023年最热门的五大编程技术趋势&#xff0c;包括人工智能、区块链、WebAssembly、5G和边缘计算以及自动化。我们将详细讨论这些趋势的当前状态、未来展望以及如何利用这些技术来提高您的编程技能。 一、前言 随着…

linux+python3.6.8+uwsgi+postgresql+django部署web服务器

linuxpython3.6.8uwsgipostgresqldjango部署web服务器 1.查看系统信息2.配置postgresql数据库2-1.安装postgresql数据库2-2.设置密码2-3.修改postgresql数据库配置文件 3.Python虚拟环境激活虚拟环境 4.Django4-1.Python 安装Django4-2.创建Django项目4-3.配置Django 5.uwsgi5-…

解决docker tag打标签时报错:Error response from daemon: no such id

现象&#xff1a; 原因&#xff1a; docker tag时不仅仅要Repository仓库名&#xff0c;也需要原有的tag作为版本号 解决办法&#xff1a; docker tag 原有仓库名: 原有tag值 新的打标名称 问题解决&#xff01;

【vue3/高德地图】实现地图打点/自定义点位图标/地理围栏实现

<template><div class"app-container"><div id"container"></div></div> </template><script setup> import AMapLoader from amap/amap-jsapi-loader; /*在Vue3中使用时,需要引入Vue3中的shallowRef方法(使用s…

响应式编程-Project Reactor Mono 介绍

响应式编程-Project Reactor Mono 介绍 本文以Mono的角度来介绍Reactor编程&#xff0c;Flux的使用同理。 初体验 Web应用 controller 方法在Spring webmvc 和 Spring webFlux下Controller方法实现示例如下&#xff1a; Spring webmvc: GetMapping("/test1") …

【bug-maven】(一)java: 错误: 不支持发行版本 5 (二):java: 错误: 无效的源发行版:15

【bug-maven】&#xff08;一&#xff09;java: 错误: 不支持发行版本 5 &#xff08;二&#xff09;&#xff1a;java: 错误: 无效的源发行版&#xff1a;15 &#xff08;一&#xff09;java: 错误: 不支持发行版本 5 报错截图&#xff1a; 出错原因&#xff1a; 打开Projec…