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 @@
+ѧºÅ,ÐÕÃû,×ÔȻ°༶