zhentao 1 month ago
parent
commit
62446b55b1

+ 54 - 38
pom.xml

@@ -13,6 +13,13 @@
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <spring-boot.version>2.6.13</spring-boot.version>
     </properties>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.15</version> <!-- 使用最新的稳定版本 -->
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
     <dependencies>
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
@@ -30,88 +37,97 @@
             <version>2.6</version>
         </dependency>
         <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.0</version>
+        </dependency>
+        <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
             <version>5.8.11</version> <!-- 确保版本号是正确的 -->
         </dependency>
+        <!-- Jackson -->
         <dependency>
-            <groupId>io.jsonwebtoken</groupId>
-            <artifactId>jjwt</artifactId>
-            <version>0.9.0</version>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>2.13.3</version>
         </dependency>
-
         <dependency>
-            <groupId>org.hibernate.validator</groupId>
-            <artifactId>hibernate-validator</artifactId>
-            <version>6.2.0.Final</version>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.13.3</version>
         </dependency>
         <dependency>
-            <groupId>org.redisson</groupId>
-            <artifactId>redisson</artifactId>
-            <version>3.12.1</version>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>2.13.3</version>
         </dependency>
 
+        <!-- Spring Boot Starters -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
+            <artifactId>spring-boot-starter</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.fasterxml.jackson.core</groupId>
-            <artifactId>jackson-databind</artifactId>
-            <version>2.13.3</version> <!-- 可以根据需要选择合适的版本 -->
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
 
+        <!-- MyBatis Plus -->
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
             <version>3.5.4</version>
         </dependency>
+
+        <!-- MySQL -->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
+
+        <!-- Hibernate Validator -->
         <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>4.0.1</version>
-            <scope>provided</scope>
+            <groupId>org.hibernate.validator</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>6.2.0.Final</version>
         </dependency>
-        <!-- Spring Security -->
-<!--        <dependency>-->
-<!--            <groupId>org.springframework.boot</groupId>-->
-<!--            <artifactId>spring-boot-starter-security</artifactId>-->
-<!--        </dependency>-->
-        <!-- FastJSON -->
+
+        <!-- Redisson -->
         <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>fastjson</artifactId>
-            <version>2.0.29</version>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>3.12.1</version>
         </dependency>
 
+        <!-- MinIO -->
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter</artifactId>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>7.1.0</version>
         </dependency>
 
+        <!-- FastJSON -->
         <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.29</version>
         </dependency>
+
+        <!-- Lombok -->
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
         </dependency>
-        <dependency>
-            <groupId>com.vaadin.external.google</groupId>
-            <artifactId>android-json</artifactId>
-            <version>0.0.20131108.vaadin1</version>
-            <scope>compile</scope>
-        </dependency>
     </dependencies>
     <dependencyManagement>
         <dependencies>

+ 22 - 0
src/main/java/com/zhentao/config/MinioConfig.java

@@ -0,0 +1,22 @@
+package com.zhentao.config;
+
+import io.minio.MinioClient;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+
+@Data
+@EnableConfigurationProperties({MinioConfigProperties.class})
+public class MinioConfig {
+    @Autowired
+    private MinioConfigProperties minioConfigProperties;
+    @Bean
+    public MinioClient minioClient() {
+        return MinioClient.builder()
+                .endpoint(minioConfigProperties.getEndpoint())
+                .credentials(minioConfigProperties.getAccesskey(), minioConfigProperties.getSecretkey())
+                .build();
+    }
+
+}

+ 18 - 0
src/main/java/com/zhentao/config/MinioConfigProperties.java

@@ -0,0 +1,18 @@
+package com.zhentao.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "minio")
+public class MinioConfigProperties {
+
+    //存地址
+    private String endpoint;
+    private String accesskey;
+    private String secretkey;
+    //捅名
+    private String bucketName;
+
+
+}

+ 5 - 1
src/main/java/com/zhentao/controller/Course/CourseController.java

@@ -18,11 +18,15 @@ public class CourseController {
 //    查询商品
     @PostMapping("findAll")
     public Result findAll(@RequestBody CourseDto courseDto){
-        return service.findAll(courseDto);
+        System.err.println(courseDto);
+        Result all = service.findAll(courseDto);
+        System.err.println(all);
+        return all;
     }
 //    查询详情信息
     @PostMapping("coursedatails")
     public Result coursedatails(@RequestBody CourseDatailsDto courseDatailsDto){
+        System.err.println(courseDatailsDto);
         return service.Cha(courseDatailsDto);
     }
 

+ 1 - 1
src/main/java/com/zhentao/controller/Course/dto/CourseDatailsDto.java

@@ -4,5 +4,5 @@ import lombok.Data;
 
 @Data
 public class CourseDatailsDto {
-    private Integer id;
+    private Long id;
 }

+ 49 - 8
src/main/java/com/zhentao/controller/user/UserController.java

@@ -1,18 +1,20 @@
 package com.zhentao.controller.user;
 
-import com.zhentao.dto.user.NoteDto;
+import com.zhentao.domain.UserLogin;
+import com.zhentao.dto.user.*;
 import com.zhentao.dto.Result;
-import com.zhentao.dto.user.UserDto;
-import com.zhentao.dto.user.UserDtoup;
-import com.zhentao.dto.user.UserRegister;
 import com.zhentao.service.UserLoginService;
+import io.minio.errors.*;
+import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
+import java.io.IOException;
+import java.rmi.ServerException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
 
 @RestController
 @RequestMapping("user")
@@ -41,4 +43,43 @@ public class UserController {
     public Result Register(@RequestBody @Valid UserRegister userRegister){
         return service.register(userRegister);
     }
+
+
+    //上传
+    @RequestMapping("/uploadPicture")
+    public Result uploadPicture(@RequestBody MultipartFile multipartFile, Long id) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, InvalidKeyException, io.minio.errors.InternalException, InvalidBucketNameException {
+        return service.uploadPicture(multipartFile,id);
+    }
+
+    //查询用户信息
+    @RequestMapping("/getUserInfo")
+    public UserLogin getUserInfo(@RequestParam("id") Long id){
+        return service.getUserInfo(id);
+    }
+
+    //修改密码
+    @RequestMapping("/updatePassword")
+    public Result updatePassword(@RequestParam("username") String username,@RequestParam("oldPassword") String oldPassword,@RequestParam("newPassword") String newPassword){
+        return service.updatePassword(username,oldPassword,newPassword);
+    }
+
+
+    //修改个人信息
+    @RequestMapping("/updateUserInfo")
+    public String updateUserInfo(@RequestBody UserInfoDto userInfoDto) {
+        // 这里假设从JWT中解析获取当前登录用户的userId,实际需根据你的登录鉴权逻辑调整
+        Long userId = getUserIdFromJwt();
+        boolean result = service.updateUserInfo(userInfoDto, userId);
+        if (result) {
+            return "个人信息修改成功";
+        } else {
+            return "个人信息修改失败";
+        }
+    }
+
+    // 模拟从JWT获取userId的方法,实际需根据具体JWT解析逻辑实现
+    private Long getUserIdFromJwt() {
+        // 这里简单返回一个示例值,实际应从JWT中解析
+        return 1L;
+    }
 }

+ 5 - 2
src/main/java/com/zhentao/domain/Courses.java

@@ -1,12 +1,14 @@
 package com.zhentao.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 
 /**
@@ -20,6 +22,7 @@ public class Courses implements Serializable {
      * 主键
      */
     @TableId
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long courseId;
 
     /**
@@ -75,7 +78,7 @@ public class Courses implements Serializable {
     /**
      * 备注
      */
-    private String courseRemark;
+    private String sub;
     @TableField(exist = false)
     private Shop shop;
     @TableField(exist = false)

+ 15 - 0
src/main/java/com/zhentao/dto/user/UserInfoDto.java

@@ -0,0 +1,15 @@
+package com.zhentao.dto.user;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+@Data
+public class UserInfoDto {
+    //头像图片
+   private String avator;
+    //用户昵称
+    private String userName;
+    //手机号
+    private String userMobile;
+
+}

+ 14 - 0
src/main/java/com/zhentao/service/FileService.java

@@ -0,0 +1,14 @@
+package com.zhentao.service;
+
+import io.minio.errors.*;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+public interface FileService {
+    //上传头像
+
+    String uploadImage(String fileName, InputStream inputStream) throws IOException, ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException;
+}

+ 19 - 4
src/main/java/com/zhentao/service/UserLoginService.java

@@ -2,11 +2,16 @@ package com.zhentao.service;
 
 import com.zhentao.domain.UserLogin;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.zhentao.dto.user.NoteDto;
+import com.zhentao.dto.user.*;
 import com.zhentao.dto.Result;
-import com.zhentao.dto.user.UserDto;
-import com.zhentao.dto.user.UserDtoup;
-import com.zhentao.dto.user.UserRegister;
+import io.minio.errors.*;
+import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.rmi.ServerException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
 
 /**
 * @author 86183
@@ -23,4 +28,14 @@ public interface UserLoginService extends IService<UserLogin> {
     Result login_up(UserDtoup userDtoup);
     //    注册
     Result register(UserRegister userRegister);
+    //图片上传
+    Result uploadPicture(MultipartFile multipartFile, Long id) throws IOException, ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, InvalidKeyException, io.minio.errors.InternalException;
+
+    //    获取用户信息 根据id查询数据
+    UserLogin getUserInfo(Long id);
+
+    //修改密码
+    Result updatePassword(String username, String oldPassword, String newPassword);
+    //修改个人信息
+    boolean updateUserInfo(UserInfoDto userInfoDto, Long userId);
 }

+ 44 - 0
src/main/java/com/zhentao/service/impl/FileServiceimpl.java

@@ -0,0 +1,44 @@
+package com.zhentao.service.impl;
+
+import com.zhentao.config.MinioConfig;
+import com.zhentao.config.MinioConfigProperties;
+import com.zhentao.service.FileService;
+import io.minio.MinioClient;
+import io.minio.ObjectWriteResponse;
+import io.minio.PutObjectArgs;
+import io.minio.errors.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Import;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+@Service
+@Import(MinioConfig.class)
+@EnableConfigurationProperties(MinioConfigProperties.class)
+public class FileServiceimpl implements FileService {
+
+    @Autowired
+    private MinioClient minioClient;
+    @Autowired
+    private MinioConfigProperties minioConfigProperties;
+
+
+    @Override
+    public String uploadImage(String fileName, InputStream inputStream) throws IOException, ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
+        PutObjectArgs putObjectArgs= PutObjectArgs.builder()
+                .bucket(minioConfigProperties.getBucketName())
+                .contentType("image/jpg")
+                .object(fileName)
+                .stream(inputStream, inputStream.available(), -1)
+                .build();
+        ObjectWriteResponse response = minioClient.putObject(putObjectArgs);
+        //获取地址
+        String path = minioClient.getObjectUrl(putObjectArgs.bucket(), putObjectArgs.object());
+        return path;
+    }
+}

+ 110 - 9
src/main/java/com/zhentao/service/impl/UserLoginServiceImpl.java

@@ -3,30 +3,30 @@ package com.zhentao.service.impl;
 import cn.hutool.core.util.IdUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.sun.deploy.net.HttpResponse;
 import com.zhentao.domain.UserLogin;
-import com.zhentao.dto.user.NoteDto;
+import com.zhentao.dto.user.*;
 import com.zhentao.dto.Result;
-import com.zhentao.dto.user.UserDto;
-import com.zhentao.dto.user.UserDtoup;
-import com.zhentao.dto.user.UserRegister;
 import com.zhentao.enums.ApiServerException;
 import com.zhentao.exception.AsynException;
 import com.zhentao.mapper.UserLoginMapper;
+import com.zhentao.service.FileService;
 import com.zhentao.service.UserLoginService;
-import com.zhentao.tool.HttpUtils;
 import com.zhentao.tool.TokenUtils;
+import io.minio.errors.*;
+import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.data.redis.core.ValueOperations;
 import org.springframework.stereotype.Service;
 import org.springframework.util.DigestUtils;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.management.openmbean.InvalidKeyException;
+import java.io.IOException;
+import java.rmi.ServerException;
+import java.security.NoSuchAlgorithmException;
 import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
@@ -42,6 +42,11 @@ public class UserLoginServiceImpl extends ServiceImpl<UserLoginMapper, UserLogin
     private StringRedisTemplate stringRedisTemplate;
     @Autowired
     private RedissonClient redissonClient;
+    @Autowired
+    private UserLoginMapper userLoginMapper;
+
+    @Autowired
+    private FileService fileService;
     @Override
     public Result login(UserDto userDto) {
         RLock lock = redissonClient.getLock(userDto.getPhone()+"phone");
@@ -213,6 +218,102 @@ public class UserLoginServiceImpl extends ServiceImpl<UserLoginMapper, UserLogin
         }
         return null;
     }
+
+    @Override
+    public Result uploadPicture(MultipartFile multipartFile, Long id) throws IOException, ServerException, InvalidBucketNameException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, io.minio.errors.ServerException, java.security.InvalidKeyException, io.minio.errors.InternalException {
+        if (multipartFile == null) {
+            Result.ERR("上传失败", null);
+        }
+        UserLogin userLogin = userLoginMapper.selectById(id);
+        String url = fileService.uploadImage(multipartFile.getOriginalFilename(), multipartFile.getInputStream());
+        System.err.println(url);
+        userLogin.setAvatar(url);
+        userLoginMapper.updateById(userLogin);
+        return Result.OK("上传成功", url);
+    }
+
+    @Override
+    public UserLogin getUserInfo(Long id) {
+        return userLoginMapper.selectById(id);
+    }
+
+    @Override
+    public Result updatePassword(String username, String oldPassword, String newPassword) {
+        // 获取分布式锁,防止并发修改密码问题
+        RLock lock = redissonClient.getLock(username);
+        try {
+            // 尝试获取锁,等待10秒,锁自动释放时间为20秒
+            boolean b = lock.tryLock(10, 20, java.util.concurrent.TimeUnit.SECONDS);
+            if (b) {
+                // 创建查询条件,根据用户名查询用户信息
+                QueryWrapper<UserLogin> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("user_username", username);
+                UserLogin one = this.getOne(queryWrapper);
+                if (one == null) {
+                    // 如果用户不存在,抛出异常
+                    throw new AsynException(ApiServerException.NULL_USERNAME);
+                }
+                String salt = one.getSalt();
+                // 使用之前相同的加密逻辑,对旧密码进行加密
+                String oldPasswordEncrypted = DigestUtils.md5DigestAsHex((salt + oldPassword).getBytes());
+                if (!oldPasswordEncrypted.equals(one.getUserPassword())) {
+                    // 如果旧密码加密后与数据库中存储的密码不匹配,抛出异常
+                    throw new AsynException(ApiServerException.NULL_PASSWORD);
+                }
+                // 使用相同的加密逻辑,对新密码进行加密
+                String newPasswordEncrypted = DigestUtils.md5DigestAsHex((salt + newPassword).getBytes());
+                // 更新用户密码到数据库
+                one.setUserPassword(newPasswordEncrypted);
+                boolean updateResult = this.updateById(one);
+                if (updateResult) {
+                    return Result.OK("修改密码成功", updateResult);
+                } else {
+                    return Result.ERR("修改密码失败", null);
+                }
+            } else {
+                return Result.ERR("获取锁超时",null);
+            }
+        } catch (Exception e) {
+            // 捕获可能的异常,如获取锁时中断异常等
+            if (e instanceof InterruptedException) {
+                Thread.currentThread().interrupt();
+            }
+            String message = e.getMessage();
+            return Result.ERR("修改密码失败:" + message,null);
+        } finally {
+            // 无论是否成功获取锁或修改密码,都要释放锁
+            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
+        }
+    }
+
+    @Override
+    public boolean updateUserInfo(UserInfoDto userInfoDto, Long userId) {
+        // 根据userId查询用户原始信息
+        QueryWrapper<UserLogin> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("id", userId);
+        UserLogin userLogin = userLoginMapper.selectOne(queryWrapper);
+        if (userLogin == null) {
+            // 用户不存在,返回修改失败
+            return false;
+        }
+        // 更新头像图片字段
+        if (userInfoDto.getAvator()!= null) {
+            userLogin.setAvatar(userInfoDto.getAvator());
+        }
+        // 更新用户昵称字段
+        if (userInfoDto.getUserName() != null) {
+            userLogin.setUserName(userInfoDto.getUserName());
+        }
+        // 更新手机号字段
+        if (userInfoDto.getUserMobile() != null) {
+            userLogin.setUserMobile(userInfoDto.getUserMobile());
+        }
+        // 将更新后的用户信息更新到数据库
+        int updateResult = userLoginMapper.updateById(userLogin);
+        return updateResult > 0;
+    }
 }
 
 

+ 5 - 0
src/main/resources/application.yml

@@ -10,3 +10,8 @@ spring:
     host: 47.110.46.22
     port: 6379
     database: 0
+minio:
+  endpoint: http://47.110.46.22:9001
+  accesskey: admin
+  secretkey: admin123456
+  bucketName: xiaoet