diff --git a/AES-front/src/api/admin.js b/AES-front/src/api/admin.js index e946ae8..6ede440 100644 --- a/AES-front/src/api/admin.js +++ b/AES-front/src/api/admin.js @@ -47,4 +47,20 @@ export default { findClassStudentsByIdPage: (data) => request.post('/classes/findClassStudentsByIdPage', data), deleteClassStudentsById: (data) => request.post('/classes/deleteClassStudentsById', data), getUserAdd: (data) => request.post('/user/getUserAdd', data), + importClassStudents: (config, data) => + request({ + url: '/importClassStudentsFile/importClassStudents', + method: 'post', + responseType: 'blob', + headers: { 'Content-Type': 'multipart/form-data' }, + params: config, + data: data, + }), + download: (config) => + request({ + url: '/downloadFile/download', + method: 'get', + responseType: 'blob', + params: config, + }), } diff --git a/AES/pom.xml b/AES/pom.xml index 1e454f9..69fada4 100644 --- a/AES/pom.xml +++ b/AES/pom.xml @@ -109,6 +109,77 @@ jedis 3.8.0 + + + commons-fileupload + commons-fileupload + 1.3.1 + + + commons-io + commons-io + 2.4 + + + + + ws.schild + jave-all-deps + 3.3.1 + + + + + org.apache.commons.collections + commons-collections + 2.0.0 + system + ${project.basedir}/src/main/WEB-INF/lib/commons-collections-3.1.jar + + + + it.sauronsoftware.java + sauronsoftware-java + 2.0.0 + system + ${project.basedir}/src/main/WEB-INF/lib/jave-1.0.2.jar + + + + org.apache.poi + apache-poi + 2.0.0 + system + ${project.basedir}/src/main/WEB-INF/lib/poi-3.6-20091214.jar + + + + commons-codec + commons-codec + 1.9 + + + com.csvreader + csvreader + 2.0.0 + system + ${project.basedir}/src/main/WEB-INF/lib/javacsv.jar + + + + jakarta.mail + jakarta.mail-api + + + org.springframework.boot + spring-boot-test + + + org.apache.struts + struts2-core + 2.5.29 + + @@ -119,6 +190,23 @@ pom import + + com.opensymphony + xwork + 2.3.20 + + + + com.belerweb + pinyin4j + 2.5.1 + + + + javax.xml.ws + jaxws-api + 2.3.1 + diff --git a/AES/src/main/java/com/example/aes/user/controller/DownLoadFileController.java b/AES/src/main/java/com/example/aes/user/controller/DownLoadFileController.java new file mode 100644 index 0000000..0295b1a --- /dev/null +++ b/AES/src/main/java/com/example/aes/user/controller/DownLoadFileController.java @@ -0,0 +1,142 @@ +package com.example.aes.user.controller; + +import cn.hutool.core.io.FileUtil; + +import com.example.aes.global.model.RespBean; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +@RestController +@RequestMapping("/downloadFile") +public class DownLoadFileController { + + + private final ResourceLoader resourceLoader; + + public DownLoadFileController(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + @GetMapping("/download") + public RespBean download(String fileName, HttpServletResponse response) throws IOException { + + ServletOutputStream outputStream = null; + try { + response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8")); + outputStream = response.getOutputStream(); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + +// File file = new File(root + File.separator + fileName); +// System.out.println(root + File.separator + fileName); + //加载资源文件 + Resource resource = resourceLoader.getResource("classpath:file" + File.separator + fileName); + InputStream inputStream = resource.getInputStream(); + + // 创建临时文件 + File file = File.createTempFile(FileUtil.mainName(fileName), "."+FileUtil.extName(fileName)); + + // 将资源文件内容复制到临时文件中 + try (FileOutputStream fileoutputStream = new FileOutputStream(file)) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + fileoutputStream.write(buffer, 0, bytesRead); + } + } + + // 下载 + if(file.exists()){ + //从文件中读到的内容 + InputStream fis = new FileInputStream(file); +// System.out.println("File存在"); + BufferedInputStream bis = new BufferedInputStream(fis); + byte[] buff = new byte[1024]; + int size; + while((size = bis.read(buff))!=-1){ + outputStream.write(buff,0,size); + } + bis.close(); + fis.close(); + }else{ + outputStream.write(new String("No Such File!").getBytes()); + } + outputStream.flush(); + outputStream.close(); + return RespBean.ok("importClassStudentModel"); + } + + @GetMapping("/downloadTestOut") + public RespBean downloadTestOut(String fileNameOut, String fileNameIn, HttpServletResponse response) throws IOException{ + String prefix = "dhuoj://"; + String baseDirOut = "C:" + File.separator + "OJtemp" + File.separator + "testcaseOut" + File.separator; + String baseDirIn = "C:" + File.separator + "OJtemp" + File.separator + "testcaseIn" + File.separator; + + File tempZipFile = File.createTempFile("download", ".zip"); + + try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(tempZipFile))) { + // Add fileNameOut to ZIP + if (fileNameOut.startsWith(prefix)) { + String outputPath = baseDirOut + fileNameOut.substring(prefix.length()); + addFileToZip(outputPath, "TestOut.txt", zos); + } + + // Add fileNameIn to ZIP (assuming it also follows the same prefix and directory structure) + if (fileNameIn.startsWith(prefix)) { + String inputPath = baseDirIn + fileNameIn.substring(prefix.length()); + addFileToZip(inputPath, "TestIn.txt", zos); + } + } + + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("files.zip", "UTF-8")); + try (ServletOutputStream outputStream = response.getOutputStream(); + FileInputStream fis = new FileInputStream(tempZipFile)) { + byte[] buffer = new byte[1024]; + int size; + while ((size = fis.read(buffer)) != -1) { + outputStream.write(buffer, 0, size); + } + outputStream.flush(); + } finally { + // Clean up temporary file + tempZipFile.delete(); + } + + return RespBean.ok("AnswerTestOut"); + } + + private void addFileToZip(String filePath, String entryName, ZipOutputStream zos) throws IOException{ + File file = new File(filePath); + + if (file.exists()) { + try (FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis)) { + zos.putNextEntry(new ZipEntry(entryName)); + byte[] buffer = new byte[1024]; + int size; + while ((size = bis.read(buffer)) != -1) { + zos.write(buffer, 0, size); + } + zos.closeEntry(); + } + } else { + zos.putNextEntry(new ZipEntry(entryName)); + zos.write("No Such File!".getBytes()); + zos.closeEntry(); + } + } + +} diff --git a/AES/src/main/java/com/example/aes/user/controller/importClassStudentsFileController.java b/AES/src/main/java/com/example/aes/user/controller/importClassStudentsFileController.java new file mode 100644 index 0000000..cc045cf --- /dev/null +++ b/AES/src/main/java/com/example/aes/user/controller/importClassStudentsFileController.java @@ -0,0 +1,378 @@ +package com.example.aes.user.controller; + +import cn.hutool.core.io.FileUtil; +import com.example.aes.global.model.RespBean; +import com.example.aes.user.dao.AdminusersDaoI; +import com.example.aes.user.dao.ClassesDaoI; +import com.example.aes.user.dao.ClassstudentsDaoI; +import com.example.aes.user.model.Adminusers; +import com.example.aes.user.model.Classes; +import com.example.aes.user.model.PMUser; +import com.example.aes.user.model.Users; +import com.example.aes.user.service.UserServiceI; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + + +@RestController +@RequestMapping("/importClassStudentsFile") +@Transactional +public class importClassStudentsFileController{ +// private File upload; +// private String uploadContentType; +// private String uploadFileName; +// private String savePath; +// int classId; + @Autowired + private UserServiceI userService; + @Autowired + private ClassstudentsDaoI classstudentsDao; + @Resource + private ClassesDaoI classesDao; + @Autowired + private AdminusersDaoI adminusersDao; + +// ApplicationHome home = new ApplicationHome(importClassStudentsFileController.class); +// String jarPath = home.getSource().getParentFile().toString(); + +// public void setSavePath(String value) { +// this.savePath = value; +// } +// +// private String getSavePath() throws Exception { +// return ServletActionContext.getServletContext().getRealPath("/file/"); +// } + +// public void setUpload(File upload) { +// this.upload = upload; +// } +// +// public File getUpload() { +// return this.upload; +// } + +// public void setUploadContentType(String uploadContentType) { +// this.uploadContentType = uploadContentType; +// } +// +// public String getUploadContentType() { +// return this.uploadContentType; +// } + +// public void setUploadFileName(String uploadFileName) { +// this.uploadFileName = uploadFileName; +// } +// +// public String getUploadFileName() { +// return this.uploadFileName; +// } + +// @PostMapping("/upload") +// @ResponseBody +// public RespBean upload(MultipartFile file) throws IOException { +// Calendar c = Calendar.getInstance();// 可以对每个时间域单独修改 +// String year = String.valueOf(c.get(Calendar.YEAR)); +// String month = String.valueOf(c.get(Calendar.MONTH)); +// if (month.length() == 1) +// month = "0" + month; +// String date = String.valueOf(c.get(Calendar.DATE)); +// if (date.length() == 1) +// date = "0" + date; +// String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY)); +// if (hour.length() == 1) +// hour = "0" + hour; +// String minute = String.valueOf(c.get(Calendar.MINUTE)); +// if (minute.length() == 1) +// minute = "0" + minute; +// String second = String.valueOf(c.get(Calendar.SECOND)); +// if (second.length() == 1) +// second = "0" + second; +// String[] temp = uploadFileName.split("\\."); +// String ext = "." + temp[1]; // 得到文件后缀 +// if (ext.equals(".csv") == false) +// return "FAIL"; +// uploadFileName = year + "" + month + "" + date + "" + hour + "" +// + minute + "" + second + ext; // 以时间作为文件名 +// FileOutputStream fos; +// try { +// fos = new FileOutputStream(getSavePath() + "\\" +// + getUploadFileName()); +// FileInputStream fis = new FileInputStream(getUpload()); +// byte[] buffer = new byte[1024]; +// int len = 0; +// while ((len = fis.read(buffer)) > 0) { +// fos.write(buffer, 0, len); +// } +// fos.close(); +// fis.close(); +// boolean result = decodeFile(getSavePath() + "\\" +// + getUploadFileName()); // 解析文件 +// if (result == false) { +// // System.out.println(getSavePath()+"\\"+getUploadFileName()+"文件格式不正确!"); +// File file = new File(getSavePath() + "\\" + getUploadFileName()); +// file.delete(); +// return "FAIL"; +// } +// // System.out.println(getSavePath()+"\\"+getUploadFileName()+"文件解析成功!"); +// File file = new File(getSavePath() + "\\" + getUploadFileName()); // 删除文件 +// file.delete(); +// return "SUCCESS"; +// } catch (Exception e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// // System.out.println(getUploadFileName()+"上传失败!"); +// return "FAIL"; +// } +// +// } + + + +// @Override +// public String execute() { +// Calendar c = Calendar.getInstance();// 可以对每个时间域单独修改 +// String year = String.valueOf(c.get(Calendar.YEAR)); +// String month = String.valueOf(c.get(Calendar.MONTH)); +// if (month.length() == 1) +// month = "0" + month; +// String date = String.valueOf(c.get(Calendar.DATE)); +// if (date.length() == 1) +// date = "0" + date; +// String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY)); +// if (hour.length() == 1) +// hour = "0" + hour; +// String minute = String.valueOf(c.get(Calendar.MINUTE)); +// if (minute.length() == 1) +// minute = "0" + minute; +// String second = String.valueOf(c.get(Calendar.SECOND)); +// if (second.length() == 1) +// second = "0" + second; +// String[] temp = uploadFileName.split("\\."); +// String ext = "." + temp[1]; // 得到文件后缀 +// if (ext.equals(".csv") == false) +// return "FAIL"; +// uploadFileName = year + "" + month + "" + date + "" + hour + "" +// + minute + "" + second + ext; // 以时间作为文件名 +// FileOutputStream fos; +// try { +// fos = new FileOutputStream(getSavePath() + "\\" +// + getUploadFileName()); +// FileInputStream fis = new FileInputStream(getUpload()); +// byte[] buffer = new byte[1024]; +// int len = 0; +// while ((len = fis.read(buffer)) > 0) { +// fos.write(buffer, 0, len); +// } +// fos.close(); +// fis.close(); +// boolean result = decodeFile(getSavePath() + "\\" +// + getUploadFileName()); // 解析文件 +// if (result == false) { +// // System.out.println(getSavePath()+"\\"+getUploadFileName()+"文件格式不正确!"); +// File file = new File(getSavePath() + "\\" + getUploadFileName()); +// file.delete(); +// return "FAIL"; +// } +// // System.out.println(getSavePath()+"\\"+getUploadFileName()+"文件解析成功!"); +// File file = new File(getSavePath() + "\\" + getUploadFileName()); // 删除文件 +// file.delete(); +// return "SUCCESS"; +// } catch (Exception e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// // System.out.println(getUploadFileName()+"上传失败!"); +// return "FAIL"; +// } +// +// } + + @PostMapping("/importClassStudents") + public RespBean importClassStudents(MultipartFile file, int classId) throws IOException{ + // 获取文件原始名 + String uploadFileName = file.getOriginalFilename(); + + // 获取主要名称 + String mainName = FileUtil.mainName(uploadFileName); + // 获取文件后缀名 + String extName = FileUtil.extName(uploadFileName); + // 用当前时间避免重复 + SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); + Date date1 = new Date(); + String timeStamp = formatter.format(date1); + + // 获取时间戳 + long timestamp = System.currentTimeMillis(); // 获取当前时间戳(单位:毫秒) + String timeStampStr = Long.toString(timestamp); // 将时间戳转换为字符串类型 + + Calendar c = Calendar.getInstance();// 可以对每个时间域单独修改 + String year = String.valueOf(c.get(Calendar.YEAR)); + String month = String.valueOf(c.get(Calendar.MONTH)); + if (month.length() == 1) + month = "0" + month; + String date = String.valueOf(c.get(Calendar.DATE)); + if (date.length() == 1) + date = "0" + date; + String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY)); + if (hour.length() == 1) + hour = "0" + hour; + String minute = String.valueOf(c.get(Calendar.MINUTE)); + if (minute.length() == 1) + minute = "0" + minute; + String second = String.valueOf(c.get(Calendar.SECOND)); + if (second.length() == 1) + second = "0" + second; + String[] temp = uploadFileName.split("\\."); + String ext = "." + temp[1]; // 得到文件后缀 + // 如果文件不是以csv结尾的 + if (ext.equals(".csv") == false) + return RespBean.error("FAIL"); + // 用来保存的文件名 + uploadFileName = year + "" + month + "" + date + "" + hour + "" + + minute + "" + second + ext; // 以时间作为文件名 + + try { + String root = System.getProperty("user.dir")+ File.separator + "upload"; + + String left = "classStudentFile" + File.separator + timeStamp + File.separator; + // 文件存储 + String resultPath = root + File.separator + left; + + if(!FileUtil.exist(resultPath)) + FileUtil.mkdir(resultPath); + String decodeFileName = resultPath + mainName + timeStampStr + "." + extName; + + // 存储文件到服务器 + file.transferTo(new File(decodeFileName)); + // 解析文件 + boolean result = decodeFile(decodeFileName, classId); + + if (result == false) { + File file1 = new File(decodeFileName); + file1.delete(); + return RespBean.error("FAIL"); + } + File file1 = new File(decodeFileName); // 删除文件 + file1.delete(); + return RespBean.ok("SUCCESS"); + }catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + // System.out.println(getUploadFileName()+"上传失败!"); + return RespBean.error("FAIL"); + } + } + + + @Transactional + public boolean decodeFile(String fileName, int classId) // 解析csv文件 + { +// String filePath = System.getProperty("user.dir")+"\\upload\\classStudentFile\\" + fileName; + File file = new File(fileName); +// File file = new File(fileName); + List userList = new ArrayList(); + try { +// InputStream fis = new FileInputStream(file); +// FileReader in1 = new FileReader(file); +// BufferedReader in2 = new BufferedReader(in1); + FileInputStream fis = new FileInputStream(file); + InputStreamReader in1 = new InputStreamReader(fis, "GBK"); + BufferedReader in2 = new BufferedReader(in1); + String s = ""; + String row[]; + s = in2.readLine(); + row = s.split(","); + if (row[0].equals("学号") && row[1].equals("姓名") + && row[2].equals("自然班级")) { + while ((s = in2.readLine()) != null) { + row = s.split(","); + if (row.length < 2) + return false; + String studentNo = row[0]; + String chineseName = row[1]; + String banji = row[2]; + PMUser user = new PMUser(); // 将信息存储 + user.setStudentNo(studentNo); + user.setChineseName(chineseName); + user.setBanji(banji); + userList.add(user); + } + Classes onclass = classesDao.get(Classes.class, classId); + if (onclass != null) { + int teacherId = onclass.getTeacherId(); + Adminusers adminuser = adminusersDao.get(Adminusers.class, + teacherId); + if (adminuser != null) { +// int schoolId = adminuser.getSchoolId(); + // 开始导入信息 + for (int i = 0; i < userList.size(); i++) { + PMUser p = userList.get(i); +// p.setSchoolId(schoolId); + String studentNo = p.getStudentNo(); + + Users user = userService + .findUserByStudentNo(studentNo); // 用户信息 + if (user != null) // users表中存在用户则只在classStudents表中插入数据并且更新学生班级 + { + user.setBanji(p.getBanji()); + boolean updateresult = userService.updateStudentBanji(user); + if(updateresult){ + int id = user.getId(); + boolean result = classstudentsDao + .findClassStudentByUserId(id, classId); // 如果为true则表明该学生已在表中 + if (result == false){ + result = classstudentsDao + .insertClassStudent(id, classId); // 将用户插入classstudents表 + } + } + } else { + p = userList.get(i); + boolean result = userService.insertUser(p); + if (result == true) { + studentNo = p.getStudentNo(); + user = userService + .findUserByStudentNo( + studentNo); + int id = user.getId(); + result = classstudentsDao + .insertClassStudent(id, classId); // 将用户插入classstudents表 + } + + } + } + // 更新学生人数 + int studentsNum = classstudentsDao + .getClassStudentsNum(classId); + boolean result = classesDao.updateClassStudentsNum( + classId, studentsNum); + + } + else { + return false; + } + } + else { + return false; + } + } else { + return false; + } + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return true; + } + +} diff --git a/AES/src/main/java/com/example/aes/user/service/impl/UserServiceImpl.java b/AES/src/main/java/com/example/aes/user/service/impl/UserServiceImpl.java index c2860c9..f95cc60 100644 --- a/AES/src/main/java/com/example/aes/user/service/impl/UserServiceImpl.java +++ b/AES/src/main/java/com/example/aes/user/service/impl/UserServiceImpl.java @@ -414,7 +414,7 @@ public class UserServiceImpl implements UserServiceI { String time = dateFormat.format(createDate); // TODO Auto-generated method stub String hql = "update Users set banji='" + user.getBanji() - + "'where studentNo='" + user.getStudentNo(); + + "'where studentNo='" + user.getStudentNo()+"'"; int result = userDao.executeHql(hql); if (result == 1) return true; diff --git a/AES/src/main/resources/file/importClassStudentModel.csv b/AES/src/main/resources/file/importClassStudentModel.csv new file mode 100644 index 0000000..f000e32 --- /dev/null +++ b/AES/src/main/resources/file/importClassStudentModel.csv @@ -0,0 +1 @@ +ѧºÅ,ÐÕÃû,×ÔȻ°༶