Compare commits
9 Commits
2cfadf96dd
...
458e49df22
| Author | SHA1 | Date | |
|---|---|---|---|
| 458e49df22 | |||
| d0a5c97dcc | |||
| 6429606fda | |||
| 43302a00b8 | |||
| 918ada9a82 | |||
| a2172c691b | |||
| 5caa4b6580 | |||
| ff29da493e | |||
| 51b9180316 |
BIN
.idea/.cache/.Apifox_Helper/.toolWindow.db
generated
BIN
.idea/.cache/.Apifox_Helper/.toolWindow.db
generated
Binary file not shown.
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -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
18
pom.xml
@@ -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>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
12
src/main/java/vvpkassistant/OTP/model/OTPDTO.java
Normal file
12
src/main/java/vvpkassistant/OTP/model/OTPDTO.java
Normal 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;
|
||||
}
|
||||
11
src/main/java/vvpkassistant/OTP/service/OTPService.java
Normal file
11
src/main/java/vvpkassistant/OTP/service/OTPService.java
Normal 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();
|
||||
}
|
||||
41
src/main/java/vvpkassistant/OTP/service/OTPServiceImpl.java
Normal file
41
src/main/java/vvpkassistant/OTP/service/OTPServiceImpl.java
Normal 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.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,5 +25,5 @@ public class LoginInfoDTO {
|
||||
*/
|
||||
private String status;
|
||||
|
||||
private Integer userId;
|
||||
private Integer id;
|
||||
}
|
||||
@@ -9,5 +9,5 @@ import lombok.Data;
|
||||
@Data
|
||||
public class ScanInfoDTO {
|
||||
private String uuid;
|
||||
private Integer userId;
|
||||
private Integer id;
|
||||
}
|
||||
|
||||
@@ -25,4 +25,6 @@ public class UserModelDTO {
|
||||
private String oldPassword;
|
||||
private String password;
|
||||
private String token;
|
||||
private String userName;
|
||||
private String userNameOrEmail;
|
||||
}
|
||||
|
||||
@@ -23,4 +23,5 @@ public class UserModel {
|
||||
private String email;
|
||||
private String password;
|
||||
private Integer mailVerification;
|
||||
private String userName;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
55
src/main/java/vvpkassistant/aop/LogInterceptor.java
Normal file
55
src/main/java/vvpkassistant/aop/LogInterceptor.java
Normal 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 start,id: {}, path: {}, ip: {}, params: {}", requestId, url,
|
||||
httpServletRequest.getRemoteHost(), reqParam);
|
||||
// log.info("request start,id: {}, 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,"用户已激活" );
|
||||
|
||||
/**
|
||||
* 状态码
|
||||
|
||||
@@ -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/"
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
31
src/main/java/vvpkassistant/controller/FileController.java
Normal file
31
src/main/java/vvpkassistant/controller/FileController.java
Normal 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));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
26
src/main/java/vvpkassistant/controller/OTPController.java
Normal file
26
src/main/java/vvpkassistant/controller/OTPController.java
Normal 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());
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
11
src/main/java/vvpkassistant/file/service/FileService.java
Normal file
11
src/main/java/vvpkassistant/file/service/FileService.java
Normal 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);
|
||||
}
|
||||
@@ -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
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -1 +0,0 @@
|
||||
vvpkassistant\ApplicationTests.class
|
||||
@@ -1 +0,0 @@
|
||||
E:\Code\java\vvPkAssistant\src\test\java\vvpkassistant\ApplicationTests.java
|
||||
Binary file not shown.
Reference in New Issue
Block a user