当前位置: 首页 > news >正文

项目的小结

项目场景:

作业的发布,打回 。 学生端做作业

由作业的state来确定作业是否上交,批改,打回作业。

实体类的建立,还有各种成员变量的设计要满足需求


问题描述

问题:

在进行上传作业后,老师端批改作业,并作出评论,这所有的信息我全部都写在一张表里面,导致自己的思维有点混乱。这里应该把老师的批改单独建立一张表,进行存储数据。

这里建立实体类就是传递数据,客户端与服务端的交互数据传值就比乱,


原因分析:

提示:因为状态不同导致,有些传值就只有一些有效值存在,其它值没有传递,但是有时候,在后面又会再次使用

 比如前面查询时只有id,而后面需要一个name,这时就需要单独又要去请求一遍

解决方案:

实体类:作业:进行找值,还有进行赋值,传值,就比较方便

package com.test.po;import java.io.Serializable;
import java.time.LocalDateTime;public class MyWork implements Serializable {private int id;private int classId;private int student_id;private int state;      //1:已提交  2:未批改 3:已批改 4:已打回private String answer;private String question;private LocalDateTime start_time;private LocalDateTime end_time;private int score;private String StudentName;private String teacher_reply;private String workName;public String getWorkName() {return workName;}public void setWorkName(String workName) {this.workName = workName;}public String getTeacher_reply() {return teacher_reply;}public void setTeacher_reply(String teacher_reply) {this.teacher_reply = teacher_reply;}public LocalDateTime getStart_time() {return start_time;}public void setStart_time(LocalDateTime start_time) {this.start_time = start_time;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getStudentName() {return StudentName;}public void setStudentName(String studentName) {StudentName = studentName;}public int getClassId() {return classId;}public void setClassId(int classId) {this.classId = classId;}public int getStudent_id() {return student_id;}public void setStudent_id(int student_id) {this.student_id = student_id;}public int getState() {return state;}public void setState(int state) {this.state = state;}public String getAnswer() {return answer;}public void setAnswer(String answer) {this.answer = answer;}public String getQuestion() {return question;}public void setQuestion(String question) {this.question = question;}public LocalDateTime getEnd_time() {return end_time;}public void setEnd_time(LocalDateTime end_time) {this.end_time = end_time;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}
}

班级资源的下载

当学生点击下载后,弹出选择文件地址,因为进行下载文件,需要文件分片下载,并且下载文件时需要单独的线程,否则会堵塞。因为采用的长连接,最方便的就是采用一个新的socket。

package com.test.controller;import com.test.Util.SocketUtil;
import com.test.common.Message;
import com.test.common.MessageType;
import com.test.po.MyFile;
import com.test.po.MyLargerFile;
import javafx.application.Platform;import java.io.*;
import java.net.Socket;
import java.nio.file.Files;public class MyFileRunnable implements Runnable {private Socket socket;private File file;public int state;public int flag = 0;public MyFileRunnable(Socket socket, File file) {this.socket = socket;this.file = file;}@Overridepublic void run() {// 假设分片存储目录File storageDirectory = new File(file.getParent(), "chunks");while (!socket.isClosed()) {try {Message responseMessage = SocketUtil.getSocketUtil().getMessage(socket);switch (responseMessage.getMessageType()) {case MessageType.stu_download_file_start -> {MyLargerFile myLargerFile = (MyLargerFile) responseMessage.getData();MyFile myFile = myLargerFile.getMyFile();// 假设分片信息存储在MyFile中,包括分片总数和当前分片序号int totalChunks = myLargerFile.getTotalSlices();int chunkNumber = myLargerFile.getState(); // 假设这个方法存在// 创建分片存储目录if (!storageDirectory.exists()) {storageDirectory.mkdirs();}// 存储分片File chunkFile = new File(storageDirectory, "chunk_" + chunkNumber);myFile.writeFileData(chunkFile);//进行更新uiPlatform.runLater(()->{ControllerManager.stuClassIfoController.stringStuIfoPaneControllerHashMap.get(myLargerFile.getMd5()).update(myLargerFile);});// 检查是否所有分片都已下载if (areAllChunksDownloaded(storageDirectory, totalChunks)) {// 合并分片mergeChunks(storageDirectory, file, totalChunks);System.out.println("文件下载完成");return;}}}} catch (Exception e) {e.printStackTrace();return;}}}private boolean areAllChunksDownloaded(File directory, int totalChunks) {for (int i = 1; i <= totalChunks; i++) {File chunkFile = new File(directory, "chunk_" + i);if (!chunkFile.exists()) {return false;}}return true;}private void mergeChunks(File directory, File outputFile, int totalChunks) throws IOException {try (FileOutputStream fos = new FileOutputStream(outputFile, true);BufferedOutputStream mergingStream = new BufferedOutputStream(fos)) {for (int i = 1; i <= totalChunks; i++) {File chunkFile = new File(directory, "chunk_" + i);Files.copy(chunkFile.toPath(), mergingStream);// 删除分片文件,如果需要的话
//                chunkFile.delete();}}}
}

 这个先进行文件分片的下载,当下载完成之后,再进行执行合并文件。并关闭这个线程。

服务端进行文件上传我也采用了多线程进行执行上传文件:

 case MessageType.stu_download_file -> {
                        MyLargerFile myLargerFile = (MyLargerFile) requestMessage.getData();
                        String md5 = myLargerFile.getMd5();
                        MyLargerFile my= MyFileDAO.queryFile(md5);
                        String dir = my.getPath();

                        File[] files = new File(dir).listFiles();
                        if (files == null) {
                            System.out.println("文件目录不存在");
                            return;
                        }
                        int len = files.length;

                        Arrays.sort(files, (f1, f2) -> {
                            // 分割文件名,获取分片编号部分
                            String[] parts1 = f1.getName().split("\\.part");
                            String[] parts2 = f2.getName().split("\\.part");

                            // 提取并解析分片编号
                            int part1 = Integer.parseInt(parts1[1]);
                            int part2 = Integer.parseInt(parts2[1]);

                            // 比较分片编号
                            return Integer.compare(part1, part2);
                        });

                        new Thread(()->{
                            int index = 1;
                            for (File file : files) {
                                MyFile myFile = new MyFile();
                                myFile.readFileData(file);

                                MyLargerFile myLargerFile1 = new MyLargerFile();
                                myLargerFile1.setMyFile(myFile);

                                myLargerFile1.setState(index);
                                myLargerFile1.setTotalSlices(len);
                                myLargerFile1.setMd5(md5);


                                Message message = new Message();
                                message.setData(myLargerFile1);
                                message.setMessageType(MessageType.stu_download_file_start);
                                try {
                                    SocketUtil.getSocketUtil().sendMessage(socket,message);
                                } catch (IOException e) {
                                    throw new RuntimeException(e);
                                }
                                index++;

                            }

                        }).start();

                    }
 

在这种情况下,进行传递文件数据。然后读写文件。

 

相关文章:

项目的小结

项目场景&#xff1a; 作业的发布&#xff0c;打回 。 学生端做作业 由作业的state来确定作业是否上交&#xff0c;批改&#xff0c;打回作业。 实体类的建立&#xff0c;还有各种成员变量的设计要满足需求 问题描述 问题&#xff1a; 在进行上传作业后&#xff0c;老师端…...

【目标检测实验系列】YOLOv5高效涨点:基于NAMAttention规范化注意力模块,调整权重因子关注有效特征(文内附源码)

1. 文章主要内容 本篇博客主要涉及规范化注意力机制&#xff0c;融合到YOLOv5(v6.1版本&#xff0c;去掉了Focus模块)模型中&#xff0c;通过惩罚机制&#xff0c;调整特征权重因子&#xff0c;使模型更加关注有效特征&#xff0c;助力模型涨点。 2. 简要概括 论文地址&#x…...

LSPatch制作内置模块应用软件无需root 教你制作内置应用

前言 LSPatch功能非常强大&#xff0c;它是一款基于LSPosed核心的免Root Xposed框架软件。这意味着用户无需进行手机root操作&#xff0c;即可轻松植入内置Xposed模块&#xff0c;享受更多定制化的功能和体验&#xff0c;比如微某内置模块版等&#xff0c;这为那些不想root手机…...

Java设计模式七大原则

本篇为七大原则概述&#xff0c;后面会有每个原则的介绍&#xff0c;喜欢的朋友可以蹲一下哦&#xff01;&#xff01;&#xff01;&#xff01; Java设计模式的七大原则一般是指“面向对象设计原则”&#xff0c;这些原则有助于在设计软件系统时提高代码的可维护性、可扩展性和…...

Copy as cURL 字段含义

当前端在开发过程中&#xff0c;遇到接口错误反馈给后端人员时&#xff0c;一般在此接口处右键复制为cURL。 格式如下&#xff1a; curl https://xxx.xxx.cn/xxx/xxx/management/record/list \-H accept: application/json, text/plain, */* \-H accept-language: zh-CN,zh;q0…...

mysql更改密码后,若依 后端启动不了解决方案

我原先的mysql 密码是 数字字符串 我想改成000 纯数字 改完之后&#xff0c;连接的数据库的代码 也更改后 &#xff0c;后端启动不了 因为原先 密码数字字符串 不需要用引号" " 括起来 我改成纯数字 需要用 " " 括起来 如下图 然后就可以运行成功了...

Redis--缓存击穿、缓存穿透、缓存雪崩

缓存击穿 什么是缓存击穿呢&#xff1f; 在高并发的场景下,一个热点的缓存数据在redis中突然失效(过期或被删除时&#xff0c;所有的读请求都会直接落在数据库上&#xff0c;导致数据库瞬间压力剧增&#xff0c;严重时可能会造成数据库宕机。这种情况就是所谓的“缓存击穿”。(…...

10个理由告诉你,为什么鸿蒙是下一个职业风口!

在当今科技飞速发展的时代&#xff0c;新的技术和趋势不断涌现&#xff0c;为人们带来了前所未有的机遇和挑战。鸿蒙操作系统作为我国自主研发的创新成果&#xff0c;正逐渐成为科技领域的焦点&#xff0c;被认为是下一个职业风口。 10个理由告诉你&#xff0c;为什么鸿蒙是下一…...

Gitlab仓库的权限分配以及如何查看自己的权限

在GitLab中&#xff0c;权限分配和查看自己的权限可以通过以下步骤进行&#xff1a; ### 1. 查看自己的权限 要查看你在某个GitLab项目中的权限&#xff0c;可以按照以下步骤操作&#xff1a; 1. 登录到GitLab。 2. 进入你想查看权限的项目页面。 3. 在左侧菜单中&#xff0c…...

职业本科大数据实训室

一、职业本科大数据实训室建设背景 在数字化浪潮汹涌澎湃的今天&#xff0c;大数据已跃升为引领社会进步和经济发展的新引擎。随着《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》的深入实施&#xff0c;数字化转型作为国家战略的重要组成部分&…...

【密码学】网络攻击类型:窃听攻击、假冒攻击、欺骗攻击和重放攻击

一、窃听攻击、假冒攻击、欺骗攻击和重放攻击的定义 这些攻击从名字中就大概能知道他们的攻击原理&#xff0c;我就不赘述了&#xff0c;直接用一个表格来一次性介绍四种攻击方式。 攻击类型攻击原理窃听攻击攻击者监听网络中的数据传输以获取敏感信息。示例&#xff1a;在未加…...

探索WebKit的奥秘:塑造高效、兼容的现代网页应用

探索WebKit的奥秘&#xff1a;塑造高效、兼容的现代网页应用 在数字时代的洪流中&#xff0c;网页应用已成为连接用户与信息的桥梁&#xff0c;其性能、兼容性和用户体验直接决定了产品的成败。WebKit&#xff0c;作为众多现代浏览器背后的核心渲染引擎&#xff0c;承载着将HT…...

2-52 基于matlab局部信息的模糊C均值聚类算法(FLICM)

基于matlab局部信息的模糊C均值聚类算法&#xff08;FLICM&#xff09;&#xff0c;是在FCM聚类算法的基础上结合了图像的邻域信息&#xff0c;有更好的鲁棒性。程序已调通&#xff0c;可直接运行。 2-52 局部信息的模糊C均值聚类算法 - 小红书 (xiaohongshu.com)...

JAVASE

1.泛型 泛型指类型参数化&#xff0c; 在定义期间&#xff0c;不知道调用时会使用什么类型&#xff0c;就可以添加泛型形参&#xff0c;在使用时传入实参固定类型即可。 泛型类&#xff1a; 泛型应用在类上。 一般用在类名后&#xff0c;用尖括号括起来。用大写字母作为泛型参…...

SpringBoot学习之EasyExcel解析合并单元格(三十九)

本解析主要采用反射来修改EasyExcel 返回的默认数据结构实现。 一、待解析表格 二、依赖 全部pom.xml文件如下,仅作参考: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…...

【Kimi学习笔记】C/C++、C#、Java 和 Python

C/C、C#、Java 和 Python 是几种流行的编程语言&#xff0c;它们在设计哲学、用途、语法和运行机制上有所不同。下面我会类比 Java 来解释这些语言的区别&#xff1a; 1. C/C&#xff1a; 类比于 Java&#xff0c;C/C 是一种更接近硬件的低级语言&#xff0c;提供了更多的控制…...

基于贪心算法的路径优化

贪心算法原理 ‌贪心算法的核心原理是在每一步选择中都采取在当前看来最好的选择,以期达到全局最优解。 这种算法不追求整体最优解,而是通过局部最优的选择逐步逼近全局最优解。贪心算法的关键在于构造合适的贪心策略,这种策略需要满足两个基本要素:贪婪选择属性和‌最优子…...

谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)

文章目录 一&#xff0c;通过域名访问商城架构设计1&#xff0c;为什么nginx要将请求转发给网关2&#xff0c;架构设计 二&#xff0c;配置1&#xff0c;nginx配置1.1 nginx.conf1.2 gulimall.conf1.3 配置原理 2&#xff0c;网关配置 三&#xff0c;记录2个问题1&#xff0c;网…...

【Android Studio】 创建第一个Android应用HelloWorld

文章目录 创建项目查看AndroidManifest.xml&#xff08;清单&#xff09;查看MainActivity.java&#xff08;Activity&#xff09;查看activity_main.xml(布局) 创建项目 查看AndroidManifest.xml&#xff08;清单&#xff09; 查看MainActivity.java&#xff08;Activity&…...

C++中的错误处理机制:异常

C中的错误处理机制&#xff1a;异常 在软件开发中&#xff0c;错误处理是确保程序稳定性和健壮性的关键环节。C作为一种高级编程语言&#xff0c;提供了比C语言更为灵活和强大的错误处理机制——异常处理。异常处理机制允许程序在运行时检测到错误或异常情况时&#xff0c;能够…...

基于J2EE架构的在线考试系统设计与实现【源码+文档】

目录 摘要: Abstract: 1 引言 2 在线考试系统构架 2.1 在线考试系统一般需求分析 2.2 当前在线考试系统现状分析 2.3 基于J2EE的在线考试系统架构介绍及拥有的优势 2.3.1 结构总体介绍 2.3.2 客户层组件 2.3.2.1 Applets 2.3.2.2 应用程序客户端 2.3.3 …...

终极数据结构详解:从理论到实践

终极数据结构详解&#xff1a;从理论到实践 我将从 底层原理、时间复杂度、空间优化、实际应用 和 代码实现 五个维度&#xff0c;彻底解析数据结构。内容涵盖&#xff1a; 线性结构&#xff08;数组、链表、栈、队列&#xff09;非线性结构&#xff08;树、图&#xff09;高…...

day20 leetcode-hot100-38(二叉树3)

226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 1.广度遍历 思路 这题目很简单&#xff0c;就是交换每个节点的左右子树&#xff0c;也就是相当于遍历到某个节点&#xff0c;然后交换子节点即可。 具体步骤 &#xff08;1&#xff09;创建队列&#xff0c;使用广…...

电脑的ip地址会自动变怎么办?原因解析和解决方法

在当今互联网时代&#xff0c;IP地址是每台联网设备的"身份证"&#xff0c;但很多用户都遇到过IP地址自动变化的情况。这种现象既可能发生在内网&#xff08;局域网&#xff09;环境中&#xff0c;也可能出现在外网&#xff08;公网&#xff09;连接中。要理解IP地址…...

优化电脑的磁盘和驱动器提高电脑性能和延长硬盘寿命?

磁盘优化 磁盘清理&#xff1a; 使用系统自带的磁盘清理工具&#xff08;如Windows的“磁盘清理”&#xff09;删除不必要的文件。清空回收站。删除临时文件和缓存。 磁盘碎片整理&#xff08;针对机械硬盘&#xff09;&#xff1a; 定期进行磁盘碎片整理&#xff0c;以提高文…...

Git 推送失败解决教程——error: failed to push some refs to

&#x1f6a7; Git 推送失败解决教程&#xff1a; 错误信息&#xff1a; error: failed to push some refs to ... hint: Updates were rejected because the remote contains work that you do not have locally.&#x1f9e0; 问题原因简述&#xff1a; 你的本地分支试图将…...

命令行以TLS/SSL显式加密方式访问FTP服务器

昨天留了一个小尾巴~~就是在命令行或者代码调用命令&#xff0c;以TLS/SSL显式加密方式&#xff0c;访问FTP服务器&#xff0c;上传和下载文件。 有小伙伴可能说ftp命令不可以吗&#xff1f;不可以哦~~ ftp 命令本身不支持显式加密。要实现 FTP 的显式加密&#xff0c;可以使…...

javascript中Cookie、BOM、DOM的使用

Cookie 在客户端存储小型文本数据&#xff08;通常 ≤ 4KB&#xff09;&#xff0c;常用于会话管理、个性化设置等场景。 名称描述作用生命周期存储位置安全性会话 Cookie临时存储&#xff0c;浏览器关闭后自动删除会话管理、个性化设置浏览器关闭内存高持久 Cookie设置过期时…...

1.1Nodejs和浏览器中的二进制处理

Buffer 在 Node.js 中&#xff0c;Buffer 类用于处理二进制数据。由于 JavaScript 在浏览器环境中主要用于处理字符串和数字等类型的数据&#xff0c;对二进制数据的处理能力较弱&#xff0c;因此 Node.js 引入了 Buffer 类来弥补这一不足&#xff0c;特别是在处理文件系统操作…...

Linux文件系统详解:从入门到精通

无论是开发高性能应用还是进行系统级编程&#xff0c;文件系统都是我们必须掌握的基础知识。今天&#xff0c;我将带大家深入浅出地了解Linux文件系统的核心概念和工作原理。 一、Linux文件系统概述 Linux文件系统是操作系统中负责管理持久存储设备上数据的子系统。它不仅仅是…...