package com.ruoyi.im; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.im.comm.Result; import com.ruoyi.im.config.IpUtils; import com.ruoyi.im.dto.UpdateUserBusinessDto; import com.ruoyi.im.service.ImApiServcie; import com.ruoyi.im.dto.RegisterDto; import com.ruoyi.system.domain.GroupWelcomeConfig; import com.ruoyi.system.domain.IpBlacklist; import com.ruoyi.system.domain.UserAccount; import com.ruoyi.system.service.GroupWelcomeConfigService; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.IpBlacklistService; import com.ruoyi.system.service.UserAccountService; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermissions; import java.util.Map; import java.util.Set; import java.util.UUID; @RestController @RequestMapping("/im/api") @Slf4j public class ImApiController { @Autowired private ImApiServcie imApiServcie; @Autowired IpBlacklistService ipBlacklistService; @Autowired UserAccountService userAccountService; @Value("${file.upload-dir}") private String uploadDir; @Value("${file.upload-prefix}") private String prefix; /** * 获取参数配置列表 */ @PostMapping("/register") public Result register(@Validated RegisterDto dto){ try { return imApiServcie.register(dto); }catch (Exception e){ log.error("注册报错:",e); return Result.error("注册失败,请稍后再试!"); } } /** * 获取ip地址并判断是否在黑名单 */ @GetMapping("/blacklist") public Result blacklist(HttpServletRequest request,@PathVariable("account") String account){ try { String clientIp = IpUtils.getClientIp(request); if(StringUtils.isEmpty(clientIp)){ return Result.success(); } long count = ipBlacklistService.count(new LambdaQueryWrapper().eq(IpBlacklist::getIpAddress, clientIp)); if(count > 0){ return Result.error("账号异常,禁止登录!"); } UserAccount userAccount = userAccountService.getOne(new LambdaQueryWrapper<>(UserAccount.class).eq(UserAccount::getCloudMessageAccount, account)); if(ObjectUtil.isEmpty(userAccount)){ return Result.error("账号不存在!"); } userAccount.setLoginIp(clientIp); userAccountService.updateById(userAccount); return Result.success(); }catch (Exception e){ log.error("登录错误:",e); return Result.error("登录错误,请稍后再试!"); } } @PostMapping("/upload") public Result uploadFile(@RequestParam("file") MultipartFile file,@RequestParam("accountId") String accountId) { try { // 1. 验证文件类型 String contentType = file.getContentType(); if (contentType == null || (!contentType.equals("image/jpeg") && !contentType.equals("image/png") && !contentType.equals("image/gif"))) { return Result.error("只支持JPEG、PNG和GIF格式的图片!"); } // 确保上传目录存在 File directory = new File(uploadDir); if (!directory.exists()) { directory.mkdirs(); // 设置目录权限为755 (rwxr-xr-x) setPermissions(directory, "rwxr-xr-x"); } // 生成唯一文件名 String fileName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename(); Path filePath = Paths.get(uploadDir, fileName); // 保存文件 Files.write(filePath, file.getBytes()); // 设置文件权限为644 (rw-r--r--) setPermissions(filePath.toFile(), "rw-r--r--"); // 5. 调用网易云信API更新头像 fileName = prefix+"/"+fileName; UpdateUserBusinessDto dto = new UpdateUserBusinessDto(); dto.setAvatar(fileName); Map result = imApiServcie.updateUserAvatar(accountId,dto); if ((Boolean) result.get("success")) { return Result.success("文件上传成功"); } else { return Result.error("上传失败!"); } } catch (IOException e) { return Result.error("文件上传失败"); } catch (Exception e) { e.printStackTrace(); log.error("设置文件权限失败!"); } return Result.success(); } /** * 设置文件/目录权限 * @param file 文件或目录对象 * @param perm 权限字符串,如 "rw-r--r--" */ private void setPermissions(File file, String perm) throws IOException { // 获取当前操作系统 String os = System.getProperty("os.name").toLowerCase(); // 只有在Unix/Linux系统上才能设置POSIX权限 if (os.contains("nix") || os.contains("nux") || os.contains("mac")) { Set permissions = PosixFilePermissions.fromString(perm); Files.setPosixFilePermissions(file.toPath(), permissions); } else { // Windows系统不支持POSIX权限,可以设置基本权限 file.setReadable(true, false); // 所有用户可读 if (perm.startsWith("rw")) { file.setWritable(true, false); // 所有用户可写(如果权限字符串以rw开头) } else { file.setWritable(false, false); } // 如果是目录且包含执行权限,设置可执行 if (file.isDirectory() && perm.contains("x")) { file.setExecutable(true, false); } } } }