Compare commits

...

9 Commits

Author SHA1 Message Date
458e49df22 1.重设密码,重设密码邮件接口放行
2.添加接口注释
2025-08-21 18:11:08 +08:00
d0a5c97dcc 1.修改OTP控制器接口地址 2025-08-15 14:45:02 +08:00
6429606fda 1.IM通讯 OTP生成 2025-08-14 21:06:31 +08:00
43302a00b8 1.修改部分逻辑 2025-08-14 20:05:46 +08:00
918ada9a82 1.修改邮件发送为异步处理 2025-08-13 21:58:51 +08:00
a2172c691b 1.修改 DTO字段 2025-08-07 22:01:19 +08:00
5caa4b6580 1.调整 controller 位置
2.添加日志拦截
2025-08-07 21:17:47 +08:00
ff29da493e 1.添加头像上传接口 2025-08-07 15:41:10 +08:00
51b9180316 1.添加头像上传接口 2025-08-07 15:39:58 +08:00
36 changed files with 909 additions and 592 deletions

Binary file not shown.

2
.idea/misc.xml generated
View File

@@ -8,5 +8,5 @@
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_24" project-jdk-name="17" project-jdk-type="JavaSDK" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="17" project-jdk-type="JavaSDK" />
</project>

18
pom.xml
View File

@@ -61,6 +61,10 @@
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
@@ -156,8 +160,18 @@
<artifactId>javase</artifactId>
<version>3.4.1</version>
</dependency>
<!-- 引入本项目 -->
<dependency>
<groupId>org.dromara.x-file-storage</groupId>
<artifactId>x-file-storage-spring</artifactId>
<version>2.3.0</version>
</dependency>
<!-- 引入 腾讯云 COS SDK如果使用其它存储平台就引入对应的 SDK -->
<dependency>
<groupId>com.qcloud</groupId>
<artifactId>cos_api</artifactId>
<version>5.6.227</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>

View File

@@ -1,10 +1,12 @@
package vvpkassistant;
import org.dromara.x.file.storage.spring.EnableFileStorage;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync
@EnableFileStorage
public class Application {
public static void main(String[] args) {

View File

@@ -34,7 +34,7 @@ public class ResponseData<T> implements Serializable {
// 返回错误的方法
public static ResponseData<Object> error(int code,String message) {
return new ResponseData<>(code, message);
return new ResponseData<>(code, null,message);
}
public static ResponseData<Object> error(ErrorCode errorCode) {

View File

@@ -0,0 +1,12 @@
package vvpkassistant.OTP.model;
import lombok.Data;
/*
* @author: ziin
* @date: 2025/8/14 20:53
*/
@Data
public class OTPDTO {
private String secretKey;
}

View File

@@ -0,0 +1,11 @@
package vvpkassistant.OTP.service;
import vvpkassistant.OTP.model.OTPDTO;
/*
* @author: ziin
* @date: 2025/8/14 20:51
*/
public interface OTPService {
Object getOTP();
}

View File

@@ -0,0 +1,41 @@
package vvpkassistant.OTP.service;
import cn.hutool.core.codec.Base64;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import vvpkassistant.OTP.model.OTPDTO;
import vvpkassistant.common.ErrorCode;
import vvpkassistant.exception.BusinessException;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
/*
* @author: ziin
* @date: 2025/8/14 20:51
*/
@Slf4j
@Service
public class OTPServiceImpl implements OTPService {
@Value("${IM-secretKey}")
private String IM_SecretKey;
@Override
public Object getOTP() {
try {
String otp = "000" + System.currentTimeMillis();
SecretKeySpec key = new SecretKeySpec(IM_SecretKey.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
byte[] otpBytes = otp.getBytes();
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedOTP = cipher.doFinal(otpBytes);
otp = Base64.encode(encryptedOTP);
return otp;
} catch (Exception e) {
log.error("Failed to generate GoEasy-OTP.", e);
throw new BusinessException(ErrorCode.SYSTEM_ERROR,"Failed to generate GoEasy-OTP.");
}
}
}

View File

@@ -25,5 +25,5 @@ public class LoginInfoDTO {
*/
private String status;
private Integer userId;
private Integer id;
}

View File

@@ -9,5 +9,5 @@ import lombok.Data;
@Data
public class ScanInfoDTO {
private String uuid;
private Integer userId;
private Integer id;
}

View File

@@ -25,4 +25,6 @@ public class UserModelDTO {
private String oldPassword;
private String password;
private String token;
private String userName;
private String userNameOrEmail;
}

View File

@@ -23,4 +23,5 @@ public class UserModel {
private String email;
private String password;
private Integer mailVerification;
private String userName;
}

View File

@@ -1,6 +1,7 @@
package vvpkassistant.User.service;
import com.baomidou.mybatisplus.extension.service.IService;
import vvpkassistant.User.model.DTO.LoginInfoDTO;
import vvpkassistant.User.model.DTO.ScanInfoDTO;
import vvpkassistant.User.model.DTO.UserModelDTO;
import vvpkassistant.User.model.UserModel;
@@ -27,7 +28,7 @@ public interface UserService extends IService<UserModel> {
Object checkQrcode(String uuid);
void scanQrcode(ScanInfoDTO scanInfoDTO);
LoginInfoDTO scanQrcode(ScanInfoDTO scanInfoDTO);
void confirm(ScanInfoDTO scanInfoDTO);
@@ -40,4 +41,7 @@ public interface UserService extends IService<UserModel> {
Object resetPassWord(UserModelDTO userModelDTO);
Boolean updateUserMail(MailModel mailModel);
Boolean checkUserName(UserModelDTO userModelDTO);
}

View File

@@ -61,9 +61,14 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> implements
@Override
public UserModelVO loginWithMail(UserModelDTO model) {
if (model.getUserNameOrEmail().isEmpty()){
throw new BusinessException(ErrorCode.PARAMS_ERROR,"用户名或邮箱不能为空");
}
LambdaQueryWrapper<UserModel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UserModel::getEmail,model.getEmail())
lambdaQueryWrapper.eq(UserModel::getEmail,model.getUserNameOrEmail())
.or()
.eq(UserModel::getUserName,model.getUserNameOrEmail())
.in(UserModel::getStatus, 0,2);
UserModel userModel = userDao.selectOne(lambdaQueryWrapper);
@@ -127,16 +132,31 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> implements
@Override
public UserModelVO addUserWithMail(UserModelDTO userModelDTO) {
LambdaQueryWrapper<UserModel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
LambdaQueryWrapper<UserModel> usernameWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UserModel::getEmail,userModelDTO.getEmail());
UserModel userModel = userDao.selectOne(lambdaQueryWrapper);
UserModel usernameModel = userDao.selectOne(usernameWrapper
.eq(UserModel::getUserName, userModelDTO.getUserName()));
if (userModel != null) {
throw new BusinessException(ErrorCode.MAIL_ALREADY_EXIST);
}
if (usernameModel != null) {
throw new BusinessException(ErrorCode.USERNAME_ALREADY_EXIST);
}
if (userModelDTO.getPassword().length() < 6 ){
throw new BusinessException(ErrorCode.PARAMS_ERROR,"密码长度不能小于 6 位");
}
if (userModelDTO.getUserName().isEmpty()){
throw new BusinessException(ErrorCode.PARAMS_ERROR,"用户名不能为空");
}
userModelDTO.setPassword(BcryptUtils.encryptPassword(userModelDTO.getPassword()));
userModelDTO.setCreateTime(VVTools.currentTimeStamp());
//设置状态为待验证
@@ -156,9 +176,12 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> implements
userDao.updateById(oldUser);
}
UserModelVO userModelVO = BeanUtil.copyProperties(userModelEntity, UserModelVO.class);
StpUtil.login(userModelVO.getId());
userModelVO.setToken(StpUtil.getTokenValue());
userModelVO.setHavaPassword(true);
userModelVO.setNewAccount(true);
userModelVO.setChatInfo(wxChatParam);
log.info("用户{}注册,邮箱{},手机号{}",userModelVO.getId(),userModelVO.getEmail(),userModelVO.getPhoneNumber());
return userModelVO;
}
@@ -169,6 +192,9 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> implements
if (userModel == null) {
throw new BusinessException(ErrorCode.USER_DOES_NOT_EXIST);
}
if (userModel.getStatus() == 0){
throw new BusinessException(ErrorCode.USER_HAS_ACTIVATED);
}
userModel.setStatus(0);
userModel.setMailVerification(0);
if (userDao.updateById(userModel) == 1){
@@ -225,7 +251,7 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> implements
return loginInfoDTO;
}
if (LoginStatusEnum.CONFIRMED.name().equals(loginInfoDTO.getStatus())) {
UserModel userModel = userDao.selectById(loginInfoDTO.getUserId());
UserModel userModel = userDao.selectById(loginInfoDTO.getId());
StpUtil.login(userModel.getId());
UserModelVO userModelVO = BeanUtil.copyProperties(userModel, UserModelVO.class);
userModelVO.setToken(StpUtil.getTokenValue());
@@ -236,16 +262,14 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> implements
}
@Override
public void scanQrcode(ScanInfoDTO scanInfoDTO) {
public LoginInfoDTO scanQrcode(ScanInfoDTO scanInfoDTO) {
LoginInfoDTO loginInfoDTO = qrcodeCache.getIfPresent(scanInfoDTO.getUuid());
if (loginInfoDTO != null) {
loginInfoDTO.setStatus(LoginStatusEnum.SCANNED.name());
}
if (loginInfoDTO != null) {
qrcodeCache.put(scanInfoDTO.getUuid(),loginInfoDTO);
}
log.info("-------扫码成功uuid:{}-------", scanInfoDTO.getUuid());
return loginInfoDTO;
}
@Override
@@ -253,7 +277,7 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> implements
LoginInfoDTO loginInfoDTO = qrcodeCache.getIfPresent(scanInfoDTO.getUuid());
if (loginInfoDTO != null) {
loginInfoDTO.setStatus(LoginStatusEnum.CONFIRMED.name());
loginInfoDTO.setUserId(scanInfoDTO.getUserId());
loginInfoDTO.setId(scanInfoDTO.getId());
qrcodeCache.put(scanInfoDTO.getUuid(),loginInfoDTO);
}
log.info("-------确认登录成功uuid:{}-------", scanInfoDTO.getUuid());
@@ -322,13 +346,35 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> implements
if (mail != null && mail.isEmpty()) {
throw new BusinessException(ErrorCode.SYSTEM_ERROR,"验证码过期或验证码错误");
}
LambdaQueryWrapper<UserModel> duplicateMailUserWrapper = new LambdaQueryWrapper<>();
LambdaQueryWrapper<UserModel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
UserModel duplicateMailUser = userDao.selectOne(duplicateMailUserWrapper
.eq(UserModel::getEmail, mailModel.getMailAddress()));
if (duplicateMailUser != null) {
throw new BusinessException(ErrorCode.SYSTEM_ERROR,"邮箱地址已被使用");
}
UserModel userModel = userDao.selectOne(lambdaQueryWrapper
.eq(UserModel::getEmail, mail)
.eq(UserModel::getStatus, 0));
.eq(UserModel::getMailVerification, 0 ));
if (userModel == null) {
throw new BusinessException(ErrorCode.USER_MAIL_NOT_VERIFICATION);
}
userModel.setEmail(mailModel.getMailAddress());
mailService.sendVerificationMail(mailModel.getMailAddress(),userModel.getId());
userModel.setMailVerification(1);
return userDao.updateById(userModel) == 1;
}
@Override
public Boolean checkUserName(UserModelDTO userModelDTO) {
LambdaQueryWrapper<UserModel> lambdaQueryWrapper = new LambdaQueryWrapper<>();
UserModel userModel = userDao.selectOne(lambdaQueryWrapper
.eq(UserModel::getUserName, userModelDTO.getUserName()));
return userModel == null;
}
}

View File

@@ -0,0 +1,55 @@
package vvpkassistant.aop;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.UUID;
@Aspect
@Component
@Slf4j
public class LogInterceptor {
/**
* 执行拦截
*/
@Around("execution(* vvpkassistant.controller.*.*(..))")
public Object doInterceptor(ProceedingJoinPoint point) throws Throwable {
// 计时
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// 获取请求路径
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest httpServletRequest = ((ServletRequestAttributes) requestAttributes).getRequest();
// 生成请求唯一 id
String requestId = UUID.randomUUID().toString();
String url = httpServletRequest.getRequestURI();
// 获取请求参数
Object[] args = point.getArgs();
String reqParam = "[" + StringUtils.join(args, ", ") + "]";
// 输出请求日志
log.info("request startid: {}, path: {}, ip: {}, params: {}", requestId, url,
httpServletRequest.getRemoteHost(), reqParam);
// log.info("request startid: {}, path: {}, ip: {}", requestId, url,
// httpServletRequest.getRemoteHost());
// 执行原方法
Object result = point.proceed();
// 输出响应日志
stopWatch.stop();
long totalTimeMillis = stopWatch.getTotalTimeMillis();
log.info("request end, id: {}, cost: {}ms", requestId, totalTimeMillis);
return result;
}
}

View File

@@ -32,8 +32,12 @@ public enum ErrorCode {
WX_GET_USER_INFO_FAILED(50001, "获取用户信息失败,请稍后再试"),
USER_DOES_NOT_EXIST(5002,"用户不存在"),
MAIL_ALREADY_EXIST(5003,"邮箱已存在"),
USERNAME_ALREADY_EXIST(5006,"用户名已存在"),
PASSWORD_ERROR(5004, "用户名或密码错误" ),
TOKEN_INVALID(40400, "Token无效请重新登录");
USER_MAIL_NOT_VERIFICATION(5005,"用户邮未验证"),
TOKEN_INVALID(40400, "Token无效请重新登录"),
USER_HAS_ACTIVATED(5005,"用户已激活" );
/**
* 状态码

View File

@@ -51,7 +51,11 @@ public class SaTokenConfigure implements WebMvcConfigurer {
"/user/qrcode",
"/user/check/**",
"/user/scan",
"/user/confirm"
"/user/confirm",
"/user/checkUserName",
"/user/verification",
"/user/forgetMail",
"/user/resetPassword/"
};
}

View File

@@ -1,4 +1,4 @@
package vvpkassistant.Anchors.controller;
package vvpkassistant.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

View File

@@ -1,10 +1,9 @@
package vvpkassistant.chat.controller;
package vvpkassistant.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import vvpkassistant.Data.ResponseData;
import vvpkassistant.Data.ResponseInfo;
import vvpkassistant.chat.mapper.ChatDao;
import vvpkassistant.chat.model.ChatModel;
import vvpkassistant.common.ErrorCode;

View File

@@ -0,0 +1,31 @@
package vvpkassistant.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import vvpkassistant.Data.ResponseData;
import vvpkassistant.file.service.FileService;
import javax.annotation.Resource;
/*
* @author: ziin
* @date: 2025/8/7 13:58
*/
@RestController
@RequestMapping("file")
public class FileController {
@Resource
private FileService fileService;
@PostMapping("/uploadHeadIcon")
public ResponseData<Object> uploadHeadIcon(@RequestParam("file") MultipartFile file) {
return ResponseData.success(fileService.uploadHeadIcon(file));
}
}

View File

@@ -1,8 +1,7 @@
package vvpkassistant.FunctionConfig.controller;
package vvpkassistant.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import vvpkassistant.Data.ResponseData;
import vvpkassistant.Data.ResponseInfo;
import vvpkassistant.FunctionConfig.mapper.FunctionConfigMapper;
import vvpkassistant.FunctionConfig.model.FunctionConfigModel;
import vvpkassistant.FunctionConfig.service.FunctionConfigService;

View File

@@ -0,0 +1,26 @@
package vvpkassistant.controller;
import org.springframework.web.bind.annotation.*;
import vvpkassistant.Data.ResponseData;
import vvpkassistant.OTP.model.OTPDTO;
import vvpkassistant.OTP.service.OTPService;
import javax.annotation.Resource;
/*
* @author: ziin
* @date: 2025/8/14 20:50
*/
@RestController
@RequestMapping("otp")
public class OTPController {
@Resource
private OTPService otpService;
@GetMapping("/getotp")
public ResponseData<Object> getOTP() {
return ResponseData.success(otpService.getOTP());
}
}

View File

@@ -1,14 +1,11 @@
package vvpkassistant.pk.controller;
package vvpkassistant.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import vvpkassistant.CoinRecords.CoinRecords;
import vvpkassistant.CoinRecords.CoinRecordsDao;
import vvpkassistant.Data.ResponseData;
import vvpkassistant.Data.ResponseInfo;
import vvpkassistant.config.FunctionConfigHolder;
import vvpkassistant.Tools.VVTools;
import vvpkassistant.User.mapper.UserDao;
import vvpkassistant.User.model.UserModel;
import vvpkassistant.pk.mapper.PkInfoDao;
import vvpkassistant.pk.mapper.PkRecordDao;
import vvpkassistant.pk.mapper.PkRecordDetailDao;

View File

@@ -1,4 +1,4 @@
package vvpkassistant.SystemMessage.controller;
package vvpkassistant.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,7 +1,6 @@
package vvpkassistant.User.controller;
package vvpkassistant.controller;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.extra.mail.Mail;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import vvpkassistant.CoinRecords.CoinRecords;
@@ -10,12 +9,10 @@ import vvpkassistant.Data.ResponseData;
import vvpkassistant.Data.ResponseInfo;
import vvpkassistant.Data.WxChatParam;
import vvpkassistant.User.mapper.UserDao;
import vvpkassistant.User.model.DTO.LoginInfoDTO;
import vvpkassistant.User.model.DTO.ScanInfoDTO;
import vvpkassistant.User.model.DTO.UserModelDTO;
import vvpkassistant.User.model.UserModel;
import vvpkassistant.User.model.UserModelVO;
import vvpkassistant.User.model.enumeration.LoginStatusEnum;
import vvpkassistant.User.service.UserService;
import vvpkassistant.common.ErrorCode;
import vvpkassistant.config.FunctionConfigHolder;
@@ -205,8 +202,14 @@ public class UserController {
// 获取用户信息
@PostMapping("getUserInfo")
public ResponseData<Object> getUserInfo(@RequestBody Map<String,Integer> map) {
UserModel userModel = userDao.selectById(map.get("id"));
public ResponseData<Object> getUserInfo(@RequestBody UserModelDTO userModelDTO) {
if (userModelDTO.getId() == null){
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
UserModel userModel = userDao.selectById(userModelDTO.getId());
if (userModel == null) {
throw new BusinessException(ErrorCode.USER_DOES_NOT_EXIST);
}
UserModelVO userModelVO = BeanUtil.copyProperties(userModel, UserModelVO.class);
userModelVO.setHavaPassword(userModel.getPassword() != null);
return ResponseData.success(userModelVO);
@@ -382,81 +385,101 @@ public class UserController {
return ResponseData.success(coinRecords);
}
// 邮件登录接口
@PostMapping("/loginWithMail")
public ResponseData<Object> loginWithMail(@RequestBody UserModelDTO model) {
return ResponseData.success(userService.loginWithMail(model));
}
//邮件注册接口
@PostMapping("/registerWithMail")
public ResponseData<Object> mailRegister(@RequestBody UserModelDTO model){
return ResponseData.success(userService.addUserWithMail(model));
}
@GetMapping("/activateAccount")
// 用户邮件激活
@GetMapping("/activate")
public ResponseData<Object> activateAccount(@RequestParam("token") String token){
return ResponseData.success(userService.activateAccount(token));
}
// 重发邮件接口
@PostMapping("/resendMail")
public ResponseData<Object> resendMail(@RequestBody MailModel mailModel){
return ResponseData.success(mailService.resendMail(mailModel));
}
// 验证邮箱链接
@GetMapping("/verificationMail")
public ResponseData<Object> verificationMail(@RequestParam("token") String token){
return ResponseData.success(userService.verificationMail(token));
}
// 发送忘记密码邮件
@PostMapping("/forgetMail")
public ResponseData<Object> sendForgetPassWordMail(@RequestBody MailModel mailModel){
return ResponseData.success(userService.sendForgetPassWordMail(mailModel));
}
// 生成二维码登录接口
@GetMapping("/qrcode")
public ResponseData<Object> generatedQrcode(){
return ResponseData.success(userService.generatedQrcode());
}
// 检查二维码状态接口
@GetMapping("/check/{uuid}")
public ResponseData<Object> checkQrcode(@PathVariable String uuid){
return ResponseData.success(userService.checkQrcode(uuid));
}
// 二维码扫描状态
@PostMapping("/scan")
public ResponseData<?> scanQrCode(@RequestBody ScanInfoDTO scanInfoDTO) {
userService.scanQrcode(scanInfoDTO);
return ResponseData.success("");
return ResponseData.success( userService.scanQrcode(scanInfoDTO));
}
//二维码扫描确认
@PostMapping("/confirm")
public ResponseData<?> confirm(@RequestBody ScanInfoDTO scanInfoDTO) {
userService.confirm(scanInfoDTO);
return ResponseData.success("");
}
// 注销接口
@PostMapping("/logout")
public ResponseData<Object> logOut(@RequestBody UserModelDTO userModelDTO){
userService.logOut(userModelDTO.getId());
return ResponseData.success("");
}
// 设置密码接口
@PostMapping("/setPassword")
public ResponseData<Object>setPassWord(@RequestBody UserModelDTO userModelDTO){
return ResponseData.success(userService.setPassWord(userModelDTO));
}
@GetMapping("/resetPassword/")
// 用户通过邮件验证链接重设密码接口
@PostMapping("/resetPassword/")
public ResponseData<Object>resetPassWord(@RequestBody UserModelDTO userModelDTO){
return ResponseData.success(userService.resetPassWord(userModelDTO));
}
// 设置新邮箱接口
@PostMapping("/updateUserMail")
public ResponseData<Object>updateUserMail(@RequestBody MailModel mailModel){
return ResponseData.success(userService.updateUserMail(mailModel));
}
// 发送更新邮箱验证邮件接口
@PostMapping("/sendUpdateMailConfirmMail")
public ResponseData<Object>sendUpdateMailConfirmMail(@RequestBody MailModel mailModel){
return ResponseData.success(mailService.sendUpdateConfirmMail(mailModel));
}
// 检查重复用户名接口
@PostMapping("/checkUserName")
public ResponseData<Boolean>checkUserName(@RequestBody UserModelDTO userModelDTO){
return ResponseData.success(userService.checkUserName(userModelDTO));
}
}

View File

@@ -0,0 +1,11 @@
package vvpkassistant.file.service;
import org.springframework.web.multipart.MultipartFile;
/*
* @author: ziin
* @date: 2025/8/7 13:58
*/
public interface FileService {
Object uploadHeadIcon(MultipartFile file);
}

View File

@@ -0,0 +1,43 @@
package vvpkassistant.file.service;
import cn.hutool.core.lang.UUID;
import lombok.extern.slf4j.Slf4j;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.FileStorageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
/*
* @author: ziin
* @date: 2025/8/7 13:58
*/
@Service
@Slf4j
public class FileServiceImpl implements FileService {
@Resource
private FileStorageService fileStorageService;//注入实列
@Override
public Object uploadHeadIcon(MultipartFile file) {
// 生成 UUID 文件名,保留原扩展名
String originalFilename = file.getOriginalFilename();
String extension = originalFilename != null && originalFilename.contains(".")
? originalFilename.substring(originalFilename.lastIndexOf("."))
: "";
String uuidFileName = UUID.randomUUID().toString().replace("-", "") + extension;
// 使用 fileStorageService 进行上传
// 设置保存的文件名为 UUID
// 返回文件信息或 URL
log.info("Uploading head icon to file: {}", uuidFileName);
return fileStorageService.of(file)
.setSaveFilename(uuidFileName) // 设置保存的文件名为 UUID
.upload();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -43,5 +43,21 @@ sa-token:
is-log: true
activateUrl: http://192.168.1.174:8086/user/activate?token=
verificationMailUrl: http://192.168.1.174:8086/user/verification?token=
forgetPassWordUrl: http://192.168.1.174:8086/user//resetPassword/?token=
verificationMailUrl: http://192.168.1.174:8086/user/verificationMail?token=
forgetPassWordUrl: http://192.168.1.174:8086/user/resetPassword/?token=
dromara:
x-file-storage: #文件存储配置
default-platform: tencent-cos-1 #默认使用的存储平台
thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】
tencent-cos:
- platform: tencent-cos-1 # 存储平台标识
enable-storage: true # 启用存储
secret-id: AKIDNbcQ1c3HJD9rQ6g5PaZN0PekcIkyzmMl
secret-key: Nl4FI9mLo46vWu40iT0JQK8j8LK5cw2u
region: ap-shanghai #存仓库所在地域
bucket-name: vv-1317974657
domain: https://vv-1317974657.cos.ap-shanghai.myqcloud.com # 访问域名,注意“/”结尾例如https://abc.cos.ap-nanjing.myqcloud.com/
base-path: /headerIcon/ # 基础路径
IM-secretKey: 04452c3231ae4fe5

View File

@@ -43,5 +43,21 @@ sa-token:
is-log: true
activateUrl: http://192.168.1.174:8086/user/activate?token=
verificationMailUrl: http://192.168.1.174:8086/user/verification?token=
forgetPassWordUrl: http://192.168.1.174:8086/user//resetPassword/?token=
verificationMailUrl: http://192.168.1.174:8086/user/verificationMail?token=
forgetPassWordUrl: http://192.168.1.174:8086/user/resetPassword/?token=
dromara:
x-file-storage: #文件存储配置
default-platform: tencent-cos-1 #默认使用的存储平台
thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】
tencent-cos:
- platform: tencent-cos-1 # 存储平台标识
enable-storage: true # 启用存储
secret-id: AKIDNbcQ1c3HJD9rQ6g5PaZN0PekcIkyzmMl
secret-key: Nl4FI9mLo46vWu40iT0JQK8j8LK5cw2u
region: ap-shanghai #存仓库所在地域
bucket-name: vv-1317974657
domain: https://vv-1317974657.cos.ap-shanghai.myqcloud.com # 访问域名,注意“/”结尾例如https://abc.cos.ap-nanjing.myqcloud.com/
base-path: /headerIcon/ # 基础路径
IM-secretKey: 04452c3231ae4fe5

View File

@@ -1,5 +0,0 @@
#Generated by Maven
#Wed Jul 30 13:17:57 CST 2025
version=0.0.1
groupId=com.vv.pk.assistant
artifactId=vvPkAssistant

View File

@@ -1,38 +0,0 @@
vvpkassistant\FunctionConfig\FunctionConfigHolder.class
vvpkassistant\FunctionConfig\FunctionConfigMapper.class
vvpkassistant\User\UserModel.class
vvpkassistant\pk\PkInfoDao.class
vvpkassistant\pk\PkRecordDetail.class
META-INF\spring-configuration-metadata.json
vvpkassistant\Anchors\AnchorModel.class
vvpkassistant\CoinRecords\CoinRecordsDao.class
vvpkassistant\Data\ResponseData.class
vvpkassistant\SystemMessage\SystemMessageDao.class
vvpkassistant\SystemMessage\SystemMessage.class
vvpkassistant\Tools\VVRequester.class
vvpkassistant\Anchors\AnchorDao.class
vvpkassistant\FunctionConfig\FunctionConfigController.class
vvpkassistant\pk\PkRecord.class
vvpkassistant\Tools\OkHttpUtils.class
vvpkassistant\Tools\COSSigner.class
vvpkassistant\chat\ChatModel.class
vvpkassistant\pk\PkRecordDetailDao.class
vvpkassistant\Tools\VVRequester$1.class
vvpkassistant\Data\WxChatParam.class
vvpkassistant\chat\ChatDao.class
vvpkassistant\pk\PkInfoModel.class
vvpkassistant\SystemMessage\SystemMessageController.class
vvpkassistant\Data\ResponseInfo.class
vvpkassistant\chat\ChatController.class
vvpkassistant\FunctionConfig\FunctionConfigModel.class
vvpkassistant\User\UserDao.class
vvpkassistant\pk\PkController.class
vvpkassistant\Anchors\AnchorsController.class
vvpkassistant\Application.class
vvpkassistant\pk\PkRecordDao.class
vvpkassistant\CoinRecords\CoinRecords.class
vvpkassistant\Tools\VVTools.class
vvpkassistant\Tools\LogUtil.class
vvpkassistant\User\UserController.class
vvpkassistant\Tools\WebMvcConfig.class
vvpkassistant\Data\WxParam.class

View File

@@ -1,36 +0,0 @@
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\chat\ChatModel.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Application.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\chat\ChatDao.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Data\ResponseInfo.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\FunctionConfig\FunctionConfigController.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\FunctionConfig\FunctionConfigModel.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\CoinRecords\CoinRecordsDao.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Tools\OkHttpUtils.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Tools\LogUtil.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Anchors\AnchorDao.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\CoinRecords\CoinRecords.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\pk\PkController.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Data\WxChatParam.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Anchors\AnchorModel.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\FunctionConfig\FunctionConfigHolder.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\SystemMessage\SystemMessage.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\SystemMessage\SystemMessageDao.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\pk\PkInfoModel.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\pk\PkRecordDao.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\SystemMessage\SystemMessageController.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Data\WxParam.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\pk\PkRecord.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Data\ResponseData.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Anchors\AnchorsController.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\pk\PkInfoDao.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\pk\PkRecordDetail.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Tools\COSSigner.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\FunctionConfig\FunctionConfigMapper.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Tools\WebMvcConfig.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\pk\PkRecordDetailDao.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\chat\ChatController.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Tools\VVTools.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\User\UserDao.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\Tools\VVRequester.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\User\UserController.java
E:\Code\java\vvPkAssistant\src\main\java\vvpkassistant\User\UserModel.java

View File

@@ -1 +0,0 @@
vvpkassistant\ApplicationTests.class

View File

@@ -1 +0,0 @@
E:\Code\java\vvPkAssistant\src\test\java\vvpkassistant\ApplicationTests.java