package cc.mrbird.febs.server.system.controller; import cc.mrbird.febs.common.core.entity.FebsResponse; import cc.mrbird.febs.common.core.entity.QueryRequest; import cc.mrbird.febs.common.core.entity.constant.StringConstant; import cc.mrbird.febs.common.core.entity.system.Dept; import cc.mrbird.febs.common.core.entity.system.Eximport; import cc.mrbird.febs.common.core.entity.system.LoginLog; import cc.mrbird.febs.common.core.entity.system.SystemUser; import cc.mrbird.febs.common.core.exception.FebsException; import cc.mrbird.febs.common.core.utils.FebsUtil; import cc.mrbird.febs.server.system.annotation.ControllerEndpoint; import cc.mrbird.febs.server.system.service.IDeptService; import cc.mrbird.febs.server.system.service.ILoginLogService; import cc.mrbird.febs.server.system.service.IUserDataPermissionService; import cc.mrbird.febs.server.system.service.IUserService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.wuwenze.poi.ExcelKit; import com.wuwenze.poi.handler.ExcelReadHandler; import com.wuwenze.poi.pojo.ExcelErrorField; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.converters.DateConverter; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import javax.validation.constraints.NotBlank; import java.io.IOException; import java.util.*; import java.util.stream.IntStream; /** * @author MrBird */ @Slf4j @Validated @RestController @RequiredArgsConstructor @RequestMapping("user") public class UserController { private final IDeptService deptService; private final IUserService userService; private final IUserDataPermissionService userDataPermissionService; private final ILoginLogService loginLogService; private final PasswordEncoder passwordEncoder; @GetMapping("success") public void loginSuccess(HttpServletRequest request) { String currentUsername = FebsUtil.getCurrentUsername(); // update last login time this.userService.updateLoginTime(currentUsername); // save login log LoginLog loginLog = new LoginLog(); loginLog.setUsername(currentUsername); loginLog.setSystemBrowserInfo(request.getHeader("user-agent")); this.loginLogService.saveLoginLog(loginLog); } @GetMapping("index") public FebsResponse index() { Map data = new HashMap<>(5); // 获取系统访问记录 Long totalVisitCount = loginLogService.findTotalVisitCount(); data.put("totalVisitCount", totalVisitCount); Long todayVisitCount = loginLogService.findTodayVisitCount(); data.put("todayVisitCount", todayVisitCount); Long todayIp = loginLogService.findTodayIp(); data.put("todayIp", todayIp); // 获取近期系统访问记录 List> lastTenVisitCount = loginLogService.findLastTenDaysVisitCount(null); data.put("lastTenVisitCount", lastTenVisitCount); SystemUser param = new SystemUser(); param.setUsername(FebsUtil.getCurrentUsername()); List> lastTenUserVisitCount = loginLogService.findLastTenDaysVisitCount(param); data.put("lastTenUserVisitCount", lastTenUserVisitCount); return new FebsResponse().data(data); } @GetMapping @PreAuthorize("hasAuthority('user:view')") public FebsResponse userList(QueryRequest queryRequest, SystemUser user) { Map dataTable = FebsUtil.getDataTable(userService.findUserDetailList(user, queryRequest)); return new FebsResponse().data(dataTable); } @GetMapping("check/{username}") public boolean checkUserName(@NotBlank(message = "{required}") @PathVariable String username) { return this.userService.findByName(username) == null; } @PostMapping @PreAuthorize("hasAuthority('user:add')") @ControllerEndpoint(operation = "新增用户", exceptionMessage = "新增用户失败") public void addUser(@Valid SystemUser user) throws FebsException { this.userService.createUser(user); } @PutMapping @PreAuthorize("hasAuthority('user:update')") @ControllerEndpoint(operation = "修改用户", exceptionMessage = "修改用户失败") public void updateUser(@Valid SystemUser user) throws FebsException { this.userService.updateUser(user); } @GetMapping("/{userId}") @PreAuthorize("hasAuthority('user:update')") public FebsResponse findUserDataPermissions(@NotBlank(message = "{required}") @PathVariable String userId) { String dataPermissions = this.userDataPermissionService.findByUserId(userId); return new FebsResponse().data(dataPermissions); } @DeleteMapping("/{userIds}") @PreAuthorize("hasAuthority('user:delete')") @ControllerEndpoint(operation = "删除用户", exceptionMessage = "删除用户失败") public void deleteUsers(@NotBlank(message = "{required}") @PathVariable String userIds) { String[] ids = userIds.split(StringConstant.COMMA); this.userService.deleteUsers(ids); } @PutMapping("profile") @ControllerEndpoint(exceptionMessage = "修改个人信息失败") public void updateProfile(@Valid SystemUser user) throws FebsException { this.userService.updateProfile(user); } @PutMapping("avatar") @ControllerEndpoint(exceptionMessage = "修改头像失败") public void updateAvatar(@NotBlank(message = "{required}") String avatar) { this.userService.updateAvatar(avatar); } @GetMapping("password/check") public boolean checkPassword(@NotBlank(message = "{required}") String password) { String currentUsername = FebsUtil.getCurrentUsername(); SystemUser user = userService.findByName(currentUsername); return user != null && passwordEncoder.matches(password, user.getPassword()); } @PutMapping("password") @ControllerEndpoint(exceptionMessage = "修改密码失败") public void updatePassword(@NotBlank(message = "{required}") String password) { userService.updatePassword(password); } @PutMapping("password/reset") @PreAuthorize("hasAuthority('user:reset')") @ControllerEndpoint(exceptionMessage = "重置用户密码失败") public void resetPassword(@NotBlank(message = "{required}") String usernames) { String[] usernameArr = usernames.split(StringConstant.COMMA); this.userService.resetPassword(usernameArr); } @PostMapping("excel") @PreAuthorize("hasAuthority('user:export')") @ControllerEndpoint(operation = "导出用户数据", exceptionMessage = "导出Excel失败") public void export(QueryRequest queryRequest, SystemUser user, HttpServletResponse response) { int count = this.userService.count(); queryRequest.setPageSize(count); List users = this.userService.findUserDetailList(user, queryRequest).getRecords(); ExcelKit.$Export(SystemUser.class, response).downXlsx(users, false); } @PostMapping("updateStatus") public void updateStatus(@NotBlank(message = "{required}") String certificateNumb) { String[] strNumbers = certificateNumb.split(","); for (int i = 0,k=strNumbers.length; i < k; i++) { this.userService.updateUserByCertificateNumb(strNumbers[i]); } } private static final String XLSX = ".xlsx"; @PostMapping("import") public FebsResponse importExcels(MultipartFile file) throws IOException, FebsException { if (file.isEmpty()) { throw new FebsException("导入数据为空"); } String filename = file.getOriginalFilename(); if (!StringUtils.endsWith(filename, XLSX)) { throw new FebsException("只支持.xlsx类型文件导入"); } Stopwatch stopwatch = Stopwatch.createStarted(); final List data = Lists.newArrayList(); final List> error = Lists.newArrayList(); ExcelKit.$Import(SystemUser.class).readXlsx(file.getInputStream(), new ExcelReadHandler() { @Override public void onSuccess(int sheet, int row, SystemUser eximport) { data.add(eximport); } @Override public void onError(int sheet, int row, List errorFields) { error.add(ImmutableMap.of("row", row, "errorFields", errorFields)); } }); if (CollectionUtils.isNotEmpty(data)) { for (SystemUser systemUser:data){ Dept one = deptService.getOne(new QueryWrapper().eq("DEPT_NAME", systemUser.getDeptName())); if(one!=null){ systemUser.setDeptId(one.getDeptId()); } this.userService.createUser(systemUser); } } ImmutableMap result = ImmutableMap.of( "time", stopwatch.stop().toString(), "data", data, "error", error ); return new FebsResponse().data(result); } @PostMapping("template") public void generateImportTemplate(HttpServletResponse response) { List list = new ArrayList<>(); ExcelKit.$Export(SystemUser.class, response).downXlsx(list, true); } }