|
|
@@ -9,15 +9,28 @@ import com.njuzr.eaibackend.po.User;
|
|
|
import com.njuzr.eaibackend.service.UserService;
|
|
|
import com.njuzr.eaibackend.utils.ModelMapperUtil;
|
|
|
import com.njuzr.eaibackend.vo.UserVO;
|
|
|
+import com.opencsv.CSVReader;
|
|
|
+import com.opencsv.exceptions.CsvValidationException;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.poi.ss.usermodel.Cell;
|
|
|
+import org.apache.poi.ss.usermodel.Row;
|
|
|
+import org.apache.poi.ss.usermodel.Sheet;
|
|
|
+import org.apache.poi.ss.usermodel.Workbook;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.BeansException;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStreamReader;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.UUID;
|
|
|
|
|
|
/**
|
|
|
* @author: Leonezhurui
|
|
|
@@ -31,6 +44,8 @@ public class UserServiceImpl implements UserService {
|
|
|
|
|
|
private final UserMapper userMapper;
|
|
|
|
|
|
+ private final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
|
|
|
+
|
|
|
@Autowired
|
|
|
public UserServiceImpl(UserMapper userMapper) {
|
|
|
this.userMapper = userMapper;
|
|
|
@@ -91,4 +106,99 @@ public class UserServiceImpl implements UserService {
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析文件,批量创建用户。其中,文件必须包含姓名、邮箱、学号。
|
|
|
+ * @param file
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void batchCreateUsersFromExcel(MultipartFile file) throws Exception {
|
|
|
+ Workbook workbook = new XSSFWorkbook(file.getInputStream());
|
|
|
+ Sheet sheet = workbook.getSheetAt(0); // 默认只允许一张表
|
|
|
+ Row headerRow = sheet.getRow(0);
|
|
|
+ int nameCol = findColumnIndex(headerRow, "姓名");
|
|
|
+ int numberCol = findColumnIndex(headerRow, "学号");
|
|
|
+ int emailCol = findColumnIndex(headerRow, "邮箱");
|
|
|
+
|
|
|
+ List<User> users = new ArrayList<>();
|
|
|
+
|
|
|
+ for (Row row : sheet) {
|
|
|
+ if (row.getRowNum() == 0) continue; // 跳过表头
|
|
|
+
|
|
|
+ User user = new User();
|
|
|
+ user.setName(row.getCell(nameCol).getStringCellValue());
|
|
|
+ user.setOfficialNumber(row.getCell(numberCol).getStringCellValue());
|
|
|
+ user.setOfficialEmail(row.getCell(emailCol).getStringCellValue());
|
|
|
+
|
|
|
+ // 随机生成密码,并使用BCryptPasswordEncoder加密密码
|
|
|
+ String randomPassword = UUID.randomUUID().toString();
|
|
|
+ String encodedPassword = passwordEncoder.encode(randomPassword);
|
|
|
+ user.setPassword(encodedPassword);
|
|
|
+
|
|
|
+ users.add(user);
|
|
|
+ }
|
|
|
+
|
|
|
+ int res = userMapper.batchInsert(users);
|
|
|
+ if (res == 0) throw new MyException(500, "批量创建失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void batchCreateUsersFromCsv(MultipartFile file) throws Exception {
|
|
|
+ CSVReader csvReader = new CSVReader(new InputStreamReader(file.getInputStream()));
|
|
|
+ String[] header = csvReader.readNext();
|
|
|
+ int nameCol = findColumnIndex(header, "姓名");
|
|
|
+ int numberCol = findColumnIndex(header, "学号");
|
|
|
+ int emailCol = findColumnIndex(header, "邮箱");
|
|
|
+
|
|
|
+ List<User> users = new ArrayList<>();
|
|
|
+ String[] nextRecord;
|
|
|
+ while ((nextRecord = csvReader.readNext()) != null) {
|
|
|
+ User user = new User();
|
|
|
+ user.setName(nextRecord[nameCol]);
|
|
|
+ user.setOfficialNumber(nextRecord[numberCol]);
|
|
|
+ user.setOfficialEmail(nextRecord[emailCol]);
|
|
|
+
|
|
|
+ // 随机生成密码,并使用BCryptPasswordEncoder加密密码
|
|
|
+ String randomPassword = UUID.randomUUID().toString();
|
|
|
+ String encodedPassword = passwordEncoder.encode(randomPassword);
|
|
|
+ user.setPassword(encodedPassword);
|
|
|
+
|
|
|
+ users.add(user);
|
|
|
+ }
|
|
|
+
|
|
|
+ int res = userMapper.batchInsert(users);
|
|
|
+ if (res == 0) throw new MyException(500, "批量创建失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ private int findColumnIndex(Row headerRow, String columnName) {
|
|
|
+ for (Cell cell : headerRow) {
|
|
|
+ if (cell.getStringCellValue().trim().equalsIgnoreCase(columnName)) {
|
|
|
+ return cell.getColumnIndex();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ private int findColumnIndex(String[] header, String columnName) {
|
|
|
+ for (int i = 0; i < header.length; i++) {
|
|
|
+ if (header[i].trim().equalsIgnoreCase(columnName)) {
|
|
|
+ return i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+// private void processUsers(List<User> users) {
|
|
|
+// for(User user: users) {
|
|
|
+// // 随机生成密码,并使用BCryptPasswordEncoder加密密码
|
|
|
+// String randomPassword = UUID.randomUUID().toString();
|
|
|
+// String encodedPassword = passwordEncoder.encode(randomPassword);
|
|
|
+// user.setPassword(encodedPassword);
|
|
|
+// }
|
|
|
+// int res = userMapper.batchInsert(users);
|
|
|
+// if (res == 0) throw new MyException(500, "批量创建失败");
|
|
|
+// // TODO 通过邮箱服务,将初始密码发送给指定邮箱
|
|
|
+// }
|
|
|
+
|
|
|
}
|