瀏覽代碼

0201 注册功能

Qing 1 年之前
父節點
當前提交
0c30b523c0
共有 37 個文件被更改,包括 718 次插入35 次删除
  1. 14 0
      novel-demo/pom.xml
  2. 18 0
      novel-demo/src/main/java/com/sf/controller/BookContentController.java
  3. 1 7
      novel-demo/src/main/java/com/sf/controller/BookInfoController.java
  4. 1 6
      novel-demo/src/main/java/com/sf/controller/HomeBookController.java
  5. 52 0
      novel-demo/src/main/java/com/sf/controller/UserInfoController.java
  6. 19 0
      novel-demo/src/main/java/com/sf/dto/req/UserRegisterReqDto.java
  7. 1 1
      novel-demo/src/main/java/com/sf/dto/resp/BookInfoRespDto.java
  8. 1 1
      novel-demo/src/main/java/com/sf/dto/resp/ChapterInfoRespDto.java
  9. 1 1
      novel-demo/src/main/java/com/sf/dto/resp/HomeBookRespDto.java
  10. 1 1
      novel-demo/src/main/java/com/sf/dto/resp/LastChapterRespDto.java
  11. 17 0
      novel-demo/src/main/java/com/sf/dto/resp/UserRegisterRespDto.java
  12. 19 0
      novel-demo/src/main/java/com/sf/dto/resp/VerifyCodeRespDto.java
  13. 94 0
      novel-demo/src/main/java/com/sf/handler/DataHandler.java
  14. 16 0
      novel-demo/src/main/java/com/sf/mapper/BookContentMapper.java
  15. 16 0
      novel-demo/src/main/java/com/sf/mapper/UserInfoMapper.java
  16. 7 0
      novel-demo/src/main/java/com/sf/po/BookChapter.java
  17. 51 0
      novel-demo/src/main/java/com/sf/po/BookContent.java
  18. 6 0
      novel-demo/src/main/java/com/sf/po/BookInfo.java
  19. 83 0
      novel-demo/src/main/java/com/sf/po/UserInfo.java
  20. 10 0
      novel-demo/src/main/java/com/sf/resp/RestResp.java
  21. 16 0
      novel-demo/src/main/java/com/sf/service/IBookContentService.java
  22. 1 3
      novel-demo/src/main/java/com/sf/service/IBookInfoService.java
  23. 1 2
      novel-demo/src/main/java/com/sf/service/IHomeBookService.java
  24. 22 0
      novel-demo/src/main/java/com/sf/service/IUserInfoService.java
  25. 20 0
      novel-demo/src/main/java/com/sf/service/impl/BookContentServiceImpl.java
  26. 1 1
      novel-demo/src/main/java/com/sf/service/impl/BookInfoServiceImpl.java
  27. 1 2
      novel-demo/src/main/java/com/sf/service/impl/HomeBookServiceImpl.java
  28. 96 0
      novel-demo/src/main/java/com/sf/service/impl/UserInfoServiceImpl.java
  29. 26 0
      novel-demo/src/main/java/com/sf/util/CaptchaUtils.java
  30. 37 7
      novel-demo/src/main/java/com/sf/util/EpubUtils.java
  31. 1 1
      novel-demo/src/main/java/com/sf/util/GeneUtils.java
  32. 15 0
      novel-demo/src/main/java/com/sf/util/vo/ChapterVo.java
  33. 5 0
      novel-demo/src/main/resources/mapper/BookContentMapper.xml
  34. 5 0
      novel-demo/src/main/resources/mapper/UserInfoMapper.xml
  35. 18 0
      novel-demo/src/test/java/com/sf/DataTests.java
  36. 1 2
      novel-demo/src/test/java/com/sf/MybatisPlusTests.java
  37. 24 0
      novel-demo/src/test/java/com/sf/UtilTests.java

+ 14 - 0
novel-demo/pom.xml

@@ -96,6 +96,20 @@
             <version>2.10.1</version>
             <version>2.10.1</version>
         </dependency>
         </dependency>
 
 
+        <!-- 生成验证码 -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.23</version>
+        </dependency>
+
+        <!-- 引入了对pair 成对的数据类型的使用-->
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-commons</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+
     </dependencies>
     </dependencies>
 
 
     <build>
     <build>

+ 18 - 0
novel-demo/src/main/java/com/sf/controller/BookContentController.java

@@ -0,0 +1,18 @@
+package com.sf.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 小说内容 前端控制器
+ * </p>
+ *
+ * @author Qing
+ * @since 2024-02-01
+ */
+@Controller
+@RequestMapping("/bookContent")
+public class BookContentController {
+
+}

+ 1 - 7
novel-demo/src/main/java/com/sf/controller/BookInfoController.java

@@ -1,9 +1,7 @@
 package com.sf.controller;
 package com.sf.controller;
 
 
-import com.google.gson.Gson;
-import com.sf.dto.BookInfoRespDto;
+import com.sf.dto.resp.BookInfoRespDto;
 import com.sf.dto.req.BookVisitReqDto;
 import com.sf.dto.req.BookVisitReqDto;
-import com.sf.po.BookInfo;
 import com.sf.resp.RestResp;
 import com.sf.resp.RestResp;
 import com.sf.service.IBookInfoService;
 import com.sf.service.IBookInfoService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Operation;
@@ -11,12 +9,8 @@ import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.stereotype.Controller;
-
-import java.util.HashMap;
 
 
 /**
 /**
  * <p>
  * <p>

+ 1 - 6
novel-demo/src/main/java/com/sf/controller/HomeBookController.java

@@ -1,16 +1,11 @@
 package com.sf.controller;
 package com.sf.controller;
 
 
-import com.sf.dto.HomeBookRespDto;
-import com.sf.po.BookInfo;
-import com.sf.po.HomeBook;
+import com.sf.dto.resp.HomeBookRespDto;
 import com.sf.resp.RestResp;
 import com.sf.resp.RestResp;
-import com.sf.service.IBookInfoService;
 import com.sf.service.IHomeBookService;
 import com.sf.service.IHomeBookService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.stereotype.Controller;
 
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**

+ 52 - 0
novel-demo/src/main/java/com/sf/controller/UserInfoController.java

@@ -0,0 +1,52 @@
+package com.sf.controller;
+
+import com.sf.dto.req.UserRegisterReqDto;
+import com.sf.dto.resp.UserRegisterRespDto;
+import com.sf.dto.resp.VerifyCodeRespDto;
+import com.sf.resp.RestResp;
+import com.sf.service.IUserInfoService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 用户信息 前端控制器
+ * </p>
+ *
+ * @author Qing
+ * @since 2024-02-01
+ */
+@RestController
+@RequestMapping("/api/front")
+public class UserInfoController {
+
+    private Logger logger = LoggerFactory.getLogger(UserInfoController.class);
+
+    @Autowired
+    private IUserInfoService userInfoService;
+
+    @GetMapping("/resource/img_verify_code")
+    public RestResp<VerifyCodeRespDto> imgVerifyCode() {
+        logger.info("方法名是:{}", "imgVerifyCode");
+        VerifyCodeRespDto verifyCodeRespDto = userInfoService.imgVerifyCode();
+        logger.info("方法名是:{}, 返回结果是:{}", "imgVerifyCode", verifyCodeRespDto);
+        return RestResp.ok(verifyCodeRespDto);
+    }
+
+    @PostMapping("/user/register")
+    public RestResp<UserRegisterRespDto> register(@RequestBody UserRegisterReqDto reqDto) {
+        logger.info("方法名是:{}, 参数是:{}", "register", reqDto);
+        UserRegisterRespDto respDto = userInfoService.register(reqDto);
+        if (respDto.getType() == 1) {
+            return RestResp.fail("00001", "验证码错误啦!", respDto);
+        }
+        if (respDto.getType() == 2) {
+            return RestResp.fail("00002", "用户名已经被使用啦!", respDto);
+        }
+        logger.info("方法名是:{}, 参数是:{}, 返回结果是:{}", "register", reqDto, respDto);
+        return RestResp.ok(respDto);
+    }
+}

+ 19 - 0
novel-demo/src/main/java/com/sf/dto/req/UserRegisterReqDto.java

@@ -0,0 +1,19 @@
+package com.sf.dto.req;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserRegisterReqDto {
+
+    private String username;
+    private String password;
+    private String velCode;
+    private String sessionId;
+    private String imgVerifyCode;
+}

+ 1 - 1
novel-demo/src/main/java/com/sf/dto/BookInfoRespDto.java → novel-demo/src/main/java/com/sf/dto/resp/BookInfoRespDto.java

@@ -1,4 +1,4 @@
-package com.sf.dto;
+package com.sf.dto.resp;
 
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;

+ 1 - 1
novel-demo/src/main/java/com/sf/dto/ChapterInfoRespDto.java → novel-demo/src/main/java/com/sf/dto/resp/ChapterInfoRespDto.java

@@ -1,4 +1,4 @@
-package com.sf.dto;
+package com.sf.dto.resp;
 
 
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Data;

+ 1 - 1
novel-demo/src/main/java/com/sf/dto/HomeBookRespDto.java → novel-demo/src/main/java/com/sf/dto/resp/HomeBookRespDto.java

@@ -1,4 +1,4 @@
-package com.sf.dto;
+package com.sf.dto.resp;
 
 
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Data;

+ 1 - 1
novel-demo/src/main/java/com/sf/dto/LastChapterRespDto.java → novel-demo/src/main/java/com/sf/dto/resp/LastChapterRespDto.java

@@ -1,4 +1,4 @@
-package com.sf.dto;
+package com.sf.dto.resp;
 
 
 import lombok.Data;
 import lombok.Data;
 
 

+ 17 - 0
novel-demo/src/main/java/com/sf/dto/resp/UserRegisterRespDto.java

@@ -0,0 +1,17 @@
+package com.sf.dto.resp;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserRegisterRespDto {
+    private Long uid;
+    private String token;
+    // 成功为0  失败如果是验证码问题返回1 如果是用户名问题返回2
+    private Integer type;
+}

+ 19 - 0
novel-demo/src/main/java/com/sf/dto/resp/VerifyCodeRespDto.java

@@ -0,0 +1,19 @@
+package com.sf.dto.resp;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class VerifyCodeRespDto {
+
+    @Schema(description = "sessionId")
+    private String sessionId;
+    @Schema(description = "Base64 编码的验证码图片")
+    private String img;
+}

+ 94 - 0
novel-demo/src/main/java/com/sf/handler/DataHandler.java

@@ -0,0 +1,94 @@
+package com.sf.handler;
+
+import com.sf.mapper.BookChapterMapper;
+import com.sf.mapper.BookContentMapper;
+import com.sf.mapper.BookInfoMapper;
+import com.sf.po.BookChapter;
+import com.sf.po.BookContent;
+import com.sf.po.BookInfo;
+import com.sf.util.EpubUtils;
+import com.sf.util.vo.ChapterVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 数据处理器
+ * 编写导入数据的逻辑
+ */
+@Component
+public class DataHandler {
+
+    // book_info  book_chapter  book_content
+    // CRUD
+    // 可以在类别表中新增一行数据  代表一个新的类别book_category
+    // INSERT INTO `book_info` (`id`, `work_direction`, `category_id`, `category_name`, `pic_url`, `book_name`, `author_id`, `author_name`, `book_desc`, `score`, `book_status`, `visit_count`, `word_count`, `comment_count`, `last_chapter_id`, `last_chapter_name`, `last_chapter_update_time`, `is_vip`, `create_time`, `update_time`)
+    // VALUES
+    //	(1431630596354977792, 0, 3, '都市言情', '/images/2023/11/30/1cfaa56c4e32bbef.jpg', '重生之夫妻', 0, '木易秋', '&nbsp;&nbsp;&nbsp;&nbsp;一生一世哪够,生生世世才够。一个是军人世家出身,冷酷无情。一个是医学怪才,从不心软。这样的两个人撞到了一起一个褪下了冷酷唯爱温柔,一个娇俏可爱,夫妻相互扶持一生到老。原以为俩人的缘分就这么一辈子,约<br/>', 7, 0, 1734, 364638, 0, 1432076089790877696, '第一百八十五章 智灭毒藤', '2021-08-30 04:21:59', 0, NULL, NULL);
+    // 参考原始数据来构造新的数据
+    // work_direction 0-男频 1-女频
+    // book_status  书籍状态;0-连载中 1-已完结
+    // is_vip 是否收费;1-收费 0-免费
+    // author_id 是0
+    // 重要信息有 book_name  author_name  book_desc
+
+    @Autowired
+    private BookInfoMapper bookInfoMapper;
+
+    @Autowired
+    private BookChapterMapper bookChapterMapper;
+
+    @Autowired
+    private BookContentMapper bookContentMapper;
+
+    public void saveBookInfo() throws Exception{
+        BookInfo bookInfo = BookInfo.builder()
+                .bookName("长安的荔枝")
+                .authorId(0L)
+                .authorName("马伯庸")
+                .bookDesc("大唐天宝十四年,长安城的小吏李善德突然接到一个任务:要在贵妃诞日之前,从岭南运来新鲜荔枝。荔枝“一日色变,两日香变,三日味变”,而岭南距长安五千余里,山水迢迢,这是个不可能完成的任务,可为了家人,李善德决心放手一搏:“就算失败,我也想知道,自己倒在距离终点多远的地方。”")
+                .workDirection((byte) 1)
+                .categoryId(4L)
+                .categoryName("历史军事")
+                .picUrl("")
+                .score((byte) 0)
+                .bookStatus((byte) 1)
+                .visitCount(0L)
+                .wordCount(0)
+                .commentCount(0)
+                .isVip((byte) 0)
+                .createTime(LocalDateTime.now())
+                .updateTime(LocalDateTime.now())
+                .build();
+        bookInfoMapper.insert(bookInfo);
+
+        // 根据生成的bookId 继续存储章节内容  章节表中的章节名字和其他  生成章节id 再去章节内容表中存储
+        Long bookId = bookInfo.getId();
+        List<ChapterVo> chapterVos = EpubUtils.getChapterInfo("长安的荔枝 - 马伯庸");
+        for (int i = 0; i < chapterVos.size(); i++) {
+            ChapterVo chapterVo = chapterVos.get(i);
+            BookChapter bookChapter = BookChapter.builder()
+                    .bookId(bookId)
+                    .chapterName(chapterVo.getTitle())
+                    .chapterNum(i)
+                    .wordCount(chapterVo.getContent().length())
+                    .isVip(0)
+                    .createTime(LocalDateTime.now())
+                    .updateTime(LocalDateTime.now())
+                    .build();
+            bookChapterMapper.insert(bookChapter);
+
+            BookContent bookContent = BookContent.builder()
+                    .chapterId(bookChapter.getId())
+                    .content(chapterVo.getContent())
+                    .createTime(LocalDateTime.now())
+                    .updateTime(LocalDateTime.now())
+                    .build();
+            bookContentMapper.insert(bookContent);
+
+        }
+        System.out.println();
+    }
+}

+ 16 - 0
novel-demo/src/main/java/com/sf/mapper/BookContentMapper.java

@@ -0,0 +1,16 @@
+package com.sf.mapper;
+
+import com.sf.po.BookContent;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 小说内容 Mapper 接口
+ * </p>
+ *
+ * @author Qing
+ * @since 2024-02-01
+ */
+public interface BookContentMapper extends BaseMapper<BookContent> {
+
+}

+ 16 - 0
novel-demo/src/main/java/com/sf/mapper/UserInfoMapper.java

@@ -0,0 +1,16 @@
+package com.sf.mapper;
+
+import com.sf.po.UserInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 用户信息 Mapper 接口
+ * </p>
+ *
+ * @author Qing
+ * @since 2024-02-01
+ */
+public interface UserInfoMapper extends BaseMapper<UserInfo> {
+
+}

+ 7 - 0
novel-demo/src/main/java/com/sf/po/BookChapter.java

@@ -3,7 +3,11 @@ package com.sf.po;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
@@ -17,6 +21,9 @@ import java.time.LocalDateTime;
  * @since 2024-01-30
  * @since 2024-01-30
  */
  */
 @Data
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 @TableName("book_chapter")
 @TableName("book_chapter")
 public class BookChapter implements Serializable {
 public class BookChapter implements Serializable {
 
 

+ 51 - 0
novel-demo/src/main/java/com/sf/po/BookContent.java

@@ -0,0 +1,51 @@
+package com.sf.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 小说内容
+ * </p>
+ *
+ * @author Qing
+ * @since 2024-02-01
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("book_content")
+public class BookContent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 章节ID
+     */
+    private Long chapterId;
+
+    /**
+     * 小说章节内容
+     */
+    private String content;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+
+}

+ 6 - 0
novel-demo/src/main/java/com/sf/po/BookInfo.java

@@ -3,7 +3,10 @@ package com.sf.po;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
@@ -17,6 +20,9 @@ import java.time.LocalDateTime;
  * @since 2024-01-29
  * @since 2024-01-29
  */
  */
 @TableName("book_info")
 @TableName("book_info")
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 @Data
 @Data
 public class BookInfo implements Serializable {
 public class BookInfo implements Serializable {
 
 

+ 83 - 0
novel-demo/src/main/java/com/sf/po/UserInfo.java

@@ -0,0 +1,83 @@
+package com.sf.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 用户信息
+ * </p>
+ *
+ * @author Qing
+ * @since 2024-02-01
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("user_info")
+public class UserInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 登录名
+     */
+    private String username;
+
+    /**
+     * 登录密码-加密
+     */
+    private String password;
+
+    /**
+     * 加密盐值
+     */
+    private String salt;
+
+    /**
+     * 昵称
+     */
+    private String nickName;
+
+    /**
+     * 用户头像
+     */
+    private String userPhoto;
+
+    /**
+     * 用户性别;0-男 1-女
+     */
+    private Integer userSex;
+
+    /**
+     * 账户余额
+     */
+    private Long accountBalance;
+
+    /**
+     * 用户状态;0-正常
+     */
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 10 - 0
novel-demo/src/main/java/com/sf/resp/RestResp.java

@@ -26,4 +26,14 @@ public class RestResp<T> {
     public static <T> RestResp<T> ok(T data) {
     public static <T> RestResp<T> ok(T data) {
         return new RestResp(data);
         return new RestResp(data);
     }
     }
+
+    public static <T> RestResp<T> fail(String code, String message, T data) {
+        return new RestResp(code, message);
+    }
+
+    private RestResp(String code, String message) {
+        this.code = code;
+        this.message = message;
+        this.ok = false;
+    }
 }
 }

+ 16 - 0
novel-demo/src/main/java/com/sf/service/IBookContentService.java

@@ -0,0 +1,16 @@
+package com.sf.service;
+
+import com.sf.po.BookContent;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 小说内容 服务类
+ * </p>
+ *
+ * @author Qing
+ * @since 2024-02-01
+ */
+public interface IBookContentService extends IService<BookContent> {
+
+}

+ 1 - 3
novel-demo/src/main/java/com/sf/service/IBookInfoService.java

@@ -1,10 +1,8 @@
 package com.sf.service;
 package com.sf.service;
 
 
-import com.sf.dto.BookInfoRespDto;
+import com.sf.dto.resp.BookInfoRespDto;
 import com.sf.po.BookInfo;
 import com.sf.po.BookInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.sf.resp.RestResp;
-import org.springframework.web.bind.annotation.PathVariable;
 
 
 /**
 /**
  * <p>
  * <p>

+ 1 - 2
novel-demo/src/main/java/com/sf/service/IHomeBookService.java

@@ -1,9 +1,8 @@
 package com.sf.service;
 package com.sf.service;
 
 
-import com.sf.dto.HomeBookRespDto;
+import com.sf.dto.resp.HomeBookRespDto;
 import com.sf.po.HomeBook;
 import com.sf.po.HomeBook;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.sf.resp.RestResp;
 
 
 import java.util.List;
 import java.util.List;
 
 

+ 22 - 0
novel-demo/src/main/java/com/sf/service/IUserInfoService.java

@@ -0,0 +1,22 @@
+package com.sf.service;
+
+import com.sf.dto.req.UserRegisterReqDto;
+import com.sf.dto.resp.UserRegisterRespDto;
+import com.sf.dto.resp.VerifyCodeRespDto;
+import com.sf.po.UserInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 用户信息 服务类
+ * </p>
+ *
+ * @author Qing
+ * @since 2024-02-01
+ */
+public interface IUserInfoService extends IService<UserInfo> {
+
+    VerifyCodeRespDto imgVerifyCode();
+
+    UserRegisterRespDto register(UserRegisterReqDto reqDto);
+}

+ 20 - 0
novel-demo/src/main/java/com/sf/service/impl/BookContentServiceImpl.java

@@ -0,0 +1,20 @@
+package com.sf.service.impl;
+
+import com.sf.po.BookContent;
+import com.sf.mapper.BookContentMapper;
+import com.sf.service.IBookContentService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 小说内容 服务实现类
+ * </p>
+ *
+ * @author Qing
+ * @since 2024-02-01
+ */
+@Service
+public class BookContentServiceImpl extends ServiceImpl<BookContentMapper, BookContent> implements IBookContentService {
+
+}

+ 1 - 1
novel-demo/src/main/java/com/sf/service/impl/BookInfoServiceImpl.java

@@ -2,7 +2,7 @@ package com.sf.service.impl;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.sf.dto.BookInfoRespDto;
+import com.sf.dto.resp.BookInfoRespDto;
 import com.sf.mapper.BookChapterMapper;
 import com.sf.mapper.BookChapterMapper;
 import com.sf.po.BookChapter;
 import com.sf.po.BookChapter;
 import com.sf.po.BookInfo;
 import com.sf.po.BookInfo;

+ 1 - 2
novel-demo/src/main/java/com/sf/service/impl/HomeBookServiceImpl.java

@@ -1,12 +1,11 @@
 package com.sf.service.impl;
 package com.sf.service.impl;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.sf.dto.HomeBookRespDto;
+import com.sf.dto.resp.HomeBookRespDto;
 import com.sf.mapper.BookInfoMapper;
 import com.sf.mapper.BookInfoMapper;
 import com.sf.po.BookInfo;
 import com.sf.po.BookInfo;
 import com.sf.po.HomeBook;
 import com.sf.po.HomeBook;
 import com.sf.mapper.HomeBookMapper;
 import com.sf.mapper.HomeBookMapper;
-import com.sf.resp.RestResp;
 import com.sf.service.IHomeBookService;
 import com.sf.service.IHomeBookService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;

+ 96 - 0
novel-demo/src/main/java/com/sf/service/impl/UserInfoServiceImpl.java

@@ -0,0 +1,96 @@
+package com.sf.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.sf.dto.req.UserRegisterReqDto;
+import com.sf.dto.resp.UserRegisterRespDto;
+import com.sf.dto.resp.VerifyCodeRespDto;
+import com.sf.po.UserInfo;
+import com.sf.mapper.UserInfoMapper;
+import com.sf.service.IUserInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sf.util.CaptchaUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.util.Pair;
+import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
+
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+
+/**
+ * <p>
+ * 用户信息 服务实现类
+ * </p>
+ *
+ * @author Qing
+ * @since 2024-02-01
+ */
+@Service
+public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService {
+
+    static HashMap<String, String> map = new HashMap<>();
+
+    @Autowired
+    private UserInfoMapper userInfoMapper;
+
+    @Override
+    public VerifyCodeRespDto imgVerifyCode() {
+        Pair<String, String> pair = CaptchaUtils.getImageBase64();
+        String sessionId = IdWorker.get32UUID();
+        // 存储起来 下一次发送注册请求时 进行验证
+        //  可以把sessionId和图片验证码的对应关系存储起来
+        map.put(sessionId, pair.getFirst());
+        VerifyCodeRespDto verifyCodeRespDto = VerifyCodeRespDto.builder()
+                .sessionId(sessionId)
+                .img(pair.getSecond())
+                .build();
+        return verifyCodeRespDto;
+    }
+
+    @Override
+    public UserRegisterRespDto register(UserRegisterReqDto reqDto) {
+        UserRegisterRespDto respDto = UserRegisterRespDto.builder().build();
+        // 要验证两个条件
+        // 1、验证码是否正确
+        // 2、用户名是否使用过
+        String sessionId = reqDto.getSessionId();
+        // 传进来的用户填写的验证码 和 实际生成的验证码 是否匹配
+        if (!reqDto.getVelCode().equals(map.get(sessionId))) {
+            respDto.setType(1);
+            return respDto;
+        }
+        // select count(*) from user_info where username = '13654561111'
+        LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(UserInfo::getUsername, reqDto.getUsername());
+        Long count = userInfoMapper.selectCount(lambdaQueryWrapper);
+        if (count == 1) {
+            respDto.setType(2);
+            return respDto;
+        }
+
+        // 密码往往是通过md5进行加密存储
+        // DigestUtils是spring提供的工具类 需要的参数是字节数组
+        // INSERT INTO `user_info` (`id`, `username`, `password`, `salt`, `nick_name`, `user_photo`, `user_sex`, `account_balance`, `status`, `create_time`, `update_time`)
+        // VALUES
+        //	(2, '13654562222', 'e10adc3949ba59abbe56e057f20f883e', '0', '13654562222', NULL, NULL, 0, 0, '2024-01-04 18:03:39', '2024-01-04 18:03:39');
+        byte[] bytes = reqDto.getPassword().getBytes(StandardCharsets.UTF_8);
+        UserInfo userInfo = UserInfo.builder()
+                .username(reqDto.getUsername())
+                .password(DigestUtils.md5DigestAsHex(bytes))
+                .nickName(reqDto.getUsername())
+                .salt("0")
+                .accountBalance(0L)
+                .status(0)
+                .createTime(LocalDateTime.now())
+                .updateTime(LocalDateTime.now())
+                .build();
+        userInfoMapper.insert(userInfo);
+
+        respDto.setType(0);
+        respDto.setUid(userInfo.getId());
+        respDto.setToken(userInfo.getId().toString());
+        return respDto;
+    }
+}

+ 26 - 0
novel-demo/src/main/java/com/sf/util/CaptchaUtils.java

@@ -0,0 +1,26 @@
+package com.sf.util;
+
+import cn.hutool.captcha.CaptchaUtil;
+import cn.hutool.captcha.LineCaptcha;
+import cn.hutool.captcha.generator.RandomGenerator;
+import org.springframework.data.util.Pair;
+
+public class CaptchaUtils {
+
+    public static Pair<String, String> getImageBase64() {
+        // 生成四位数字的验证码  宽高是100*38
+        RandomGenerator randomGenerator = new RandomGenerator("0123456789", 4);
+        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(100, 38);
+        lineCaptcha.setGenerator(randomGenerator);
+
+        String code = lineCaptcha.getCode();
+        String imageBase64 = lineCaptcha.getImageBase64();
+        System.out.println("--------------");
+        System.out.println(code);
+        System.out.println(imageBase64);
+        System.out.println("--------------");
+        // 有一对数据需要返回 可以使用pair 第一个数据叫first 第二个数据叫second
+        Pair<String, String> pair = Pair.of(code, imageBase64);
+        return pair;
+    }
+}

+ 37 - 7
novel-demo/src/main/java/com/sf/util/EpubUtils.java

@@ -1,7 +1,9 @@
 package com.sf.util;
 package com.sf.util;
 
 
+import com.sf.util.vo.ChapterVo;
 import nl.siegmann.epublib.domain.*;
 import nl.siegmann.epublib.domain.*;
 import nl.siegmann.epublib.epub.EpubReader;
 import nl.siegmann.epublib.epub.EpubReader;
+import org.apache.commons.lang3.StringUtils;
 import org.jsoup.Jsoup;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.nodes.Element;
@@ -10,6 +12,7 @@ import org.jsoup.select.Elements;
 import java.io.File;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.regex.Pattern;
@@ -19,11 +22,13 @@ import java.util.regex.Pattern;
  */
  */
 public class EpubUtils {
 public class EpubUtils {
 
 
-    public static void main(String[] args) throws Exception {
+    // 需要的数据 是 章节名称+章节内容
+    public static List<ChapterVo> getChapterInfo(String fileName) throws Exception {
+        List<ChapterVo> chapterVoList = new ArrayList<>();
+
         // IO处理的相对路径  是项目的根路径
         // IO处理的相对路径  是项目的根路径
-        File file = new File("epub/长安的荔枝 - 马伯庸.epub");
-//        File file = new File("epub/《德米安》赫尔曼·黑塞.epub");
-//        System.out.println(file.exists());
+//        File file = new File("epub/长安的荔枝 - 马伯庸.epub");
+        File file = new File("epub/" + fileName + ".epub"); // 《德米安》赫尔曼·黑塞.epub
         FileInputStream fis = new FileInputStream(file);
         FileInputStream fis = new FileInputStream(file);
         // 是通过将输入流传入epubreader  来获取它所识别出的book对象
         // 是通过将输入流传入epubreader  来获取它所识别出的book对象
         EpubReader epubReader = new EpubReader();
         EpubReader epubReader = new EpubReader();
@@ -34,20 +39,33 @@ public class EpubUtils {
         Spine spine = book.getSpine();
         Spine spine = book.getSpine();
         // 获取骨骼所关联的数据
         // 获取骨骼所关联的数据
         List<SpineReference> spineReferences = spine.getSpineReferences();
         List<SpineReference> spineReferences = spine.getSpineReferences();
+        // 如果标题和内容不在同一个页面中
+        // 要么是标题 要么是内容  此时不适合用lambda表达式
+//        ChapterVo newVo = null;
         spineReferences.forEach(spineReference -> {
         spineReferences.forEach(spineReference -> {
             // 通过关联数据拿到资源
             // 通过关联数据拿到资源
             Resource resource = spineReference.getResource();
             Resource resource = spineReference.getResource();
             try {
             try {
                 byte[] data = resource.getData();
                 byte[] data = resource.getData();
                 String html = new String(data);
                 String html = new String(data);
-//                System.out.println(html);
                 // 首先通过jsoup将页面解析成 文档对象
                 // 首先通过jsoup将页面解析成 文档对象
                 Document document = Jsoup.parse(html);
                 Document document = Jsoup.parse(html);
                 Element body = document.body();
                 Element body = document.body();
                 String text = body.text();
                 String text = body.text();
                 String htmlTxt = body.html();
                 String htmlTxt = body.html();
-
+                // 因为使用的是lambda表达式 所以这里不能用continue
+                // -> {} 这是一个方法体
+                if (StringUtils.isBlank(text)) {
+                    return;
+                }
                 StringBuffer buffer = new StringBuffer();
                 StringBuffer buffer = new StringBuffer();
+                // 章节标题
+                String title = "";
+                Elements h1Ele = body.select("h1");
+                if (h1Ele.size() > 0) {
+                    title = h1Ele.get(0).text();
+                }
+                // 章节内容
                 Elements elements = body.select("p");
                 Elements elements = body.select("p");
                 for (Element element : elements) {
                 for (Element element : elements) {
 //                    String pHtml = element.html();
 //                    String pHtml = element.html();
@@ -58,12 +76,24 @@ public class EpubUtils {
                 }
                 }
                 // 这就是最终需要的数据
                 // 这就是最终需要的数据
                 String htmlData = buffer.toString();
                 String htmlData = buffer.toString();
-                System.out.println();
+                if(StringUtils.isBlank(htmlData)){
+                    return;
+                }
+                // 如果标题和内容不在同一个页面中
+                // 那么判断是标题 就创建对象
+                // 是内容 就存储对象
+//                newVo = new ChapterVo();
+//                newVo.setContent("");
+//                chapterVoList.add(newVo);
+
+                ChapterVo chapterVo = ChapterVo.builder().title(title).content(htmlData).build();
+                chapterVoList.add(chapterVo);
 
 
             } catch (IOException e) {
             } catch (IOException e) {
                 throw new RuntimeException(e);
                 throw new RuntimeException(e);
             }
             }
         });
         });
+        return chapterVoList;
     }
     }
 
 
     // 移除标签
     // 移除标签

+ 1 - 1
novel-demo/src/main/java/com/sf/util/GeneUtils.java

@@ -61,7 +61,7 @@ public class GeneUtils {
 //                    tableList.add("fiction_shelf");
 //                    tableList.add("fiction_shelf");
 //                    builder.addInclude(tableList); // 设置需要生成的表名
 //                    builder.addInclude(tableList); // 设置需要生成的表名
 //                    builder.addInclude("chapter_content","fiction_shelf"); // 设置需要生成的表名
 //                    builder.addInclude("chapter_content","fiction_shelf"); // 设置需要生成的表名
-                    builder.addInclude("book_chapter"); // 设置需要生成的表名
+                    builder.addInclude("user_info"); // 设置需要生成的表名
                     //                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                     //                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                 })
                 })
                 .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                 .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板

+ 15 - 0
novel-demo/src/main/java/com/sf/util/vo/ChapterVo.java

@@ -0,0 +1,15 @@
+package com.sf.util.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ChapterVo {
+    private String title;
+    private String content;
+}

+ 5 - 0
novel-demo/src/main/resources/mapper/BookContentMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sf.mapper.BookContentMapper">
+
+</mapper>

+ 5 - 0
novel-demo/src/main/resources/mapper/UserInfoMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sf.mapper.UserInfoMapper">
+
+</mapper>

+ 18 - 0
novel-demo/src/test/java/com/sf/DataTests.java

@@ -0,0 +1,18 @@
+package com.sf;
+
+import com.sf.handler.DataHandler;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class DataTests {
+
+    @Autowired
+    private DataHandler dataHandler;
+
+    @Test
+    public void test() throws Exception{
+        dataHandler.saveBookInfo();
+    }
+}

+ 1 - 2
novel-demo/src/test/java/com/sf/MybatisPlusTests.java

@@ -1,7 +1,7 @@
 package com.sf;
 package com.sf;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.sf.dto.ChapterInfoRespDto;
+import com.sf.dto.resp.ChapterInfoRespDto;
 import com.sf.mapper.BookInfoMapper;
 import com.sf.mapper.BookInfoMapper;
 import com.sf.po.BookChapter;
 import com.sf.po.BookChapter;
 import com.sf.service.IBookChapterService;
 import com.sf.service.IBookChapterService;
@@ -11,7 +11,6 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest;
 
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 
 
 @SpringBootTest
 @SpringBootTest

+ 24 - 0
novel-demo/src/test/java/com/sf/UtilTests.java

@@ -0,0 +1,24 @@
+package com.sf;
+
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.sf.util.EpubUtils;
+import com.sf.util.vo.ChapterVo;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+public class UtilTests {
+
+    @Test
+    public void test() throws Exception{
+        List<ChapterVo> chapterVos = EpubUtils.getChapterInfo("长安的荔枝 - 马伯庸");
+        System.out.println();
+    }
+
+    @Test
+    public void testSessionId(){
+        System.out.println(IdWorker.get32UUID());
+        System.out.println(IdWorker.get32UUID());
+        System.out.println(IdWorker.get32UUID());
+    }
+}