From 7f9491166538dffcab6d2457d637db2e4af86130 Mon Sep 17 00:00:00 2001 From: ovo Date: Mon, 23 Dec 2024 14:55:04 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=94=A8=E6=88=B7):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/guwan/backend/Demo.java | 130 +++++++++++++++++- .../backend/common/BusinessException.java | 25 ++++ .../guwan/backend/config/EasyEsConfig.java | 2 +- .../controller/BookCategoryController.java | 12 +- .../backend/controller/CommonController.java | 1 + .../backend/controller/DemoController.java | 4 +- .../backend/controller/UserController.java | 15 +- .../backend/dto/user/ChangePasswordDTO.java | 24 ++++ .../document/ProductDocument.java | 2 +- .../document/VideoDocument.java | 2 +- .../mapper/ProductEsMapper.java | 4 +- .../mapper/VideoEsMapper.java | 4 +- .../java/com/guwan/backend/entity/Book.java | 2 +- .../com/guwan/backend/enums/UserEnums.java | 27 ++++ .../backend/service/ProductSearchService.java | 4 +- .../guwan/backend/service/UserService.java | 3 +- .../backend/service/VideoSearchService.java | 4 +- .../backend/service/impl/BookServiceImpl.java | 71 +++++++++- .../backend/service/impl/UserServiceImpl.java | 19 ++- .../guwan/backend/util/BookContentUtil.java | 128 +++++++++++++++++ .../backend/service/BookServiceTest.java | 10 +- 21 files changed, 453 insertions(+), 40 deletions(-) create mode 100644 src/main/java/com/guwan/backend/common/BusinessException.java create mode 100644 src/main/java/com/guwan/backend/dto/user/ChangePasswordDTO.java rename src/main/java/com/guwan/backend/{es => elasticsearch}/document/ProductDocument.java (94%) rename src/main/java/com/guwan/backend/{es => elasticsearch}/document/VideoDocument.java (96%) rename src/main/java/com/guwan/backend/{es => elasticsearch}/mapper/ProductEsMapper.java (62%) rename src/main/java/com/guwan/backend/{es => elasticsearch}/mapper/VideoEsMapper.java (62%) create mode 100644 src/main/java/com/guwan/backend/enums/UserEnums.java create mode 100644 src/main/java/com/guwan/backend/util/BookContentUtil.java diff --git a/src/main/java/com/guwan/backend/Demo.java b/src/main/java/com/guwan/backend/Demo.java index 2f3ad16..dc8163b 100644 --- a/src/main/java/com/guwan/backend/Demo.java +++ b/src/main/java/com/guwan/backend/Demo.java @@ -1,12 +1,132 @@ package com.guwan.backend; -import com.guwan.backend.entity.BookOfUser; -import com.guwan.backend.enums.ReadStatus; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; public class Demo { public static void main(String[] args) { - BookOfUser bookOfUser = new BookOfUser(); - bookOfUser.setReadStatus(ReadStatus.yes); - System.out.println("bookOfUser = " + bookOfUser); + /* //特征 字符串类型 + String feature = "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"; + //把字符串特征转为byte数组 + byte[] featureData = Base64.getDecoder().decode(feature); + + //把byte数组转成float数组 + float[] floats = byteArrayToFloatArray(featureData); + + System.out.println("floats = " + Arrays.toString(floats)); + + + + String featureTemp = "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"; + + + byte[] featureDataTemp = Base64.getDecoder().decode(featureTemp); + + //把byte数组转成float数组 + float[] floatsTemp = byteArrayToFloatArray(featureDataTemp); + + + ArrayList floats1 = new ArrayList<>(); + + floats1.add(floatsTemp); + + + double v = cosineSimilarity(floats, floats1.get(0)); + System.out.println("v = " + v);*/ + + + double[] doubles = {-0.0352081,-0.0163718,0.113464,-0.0457607,-0.0228123,0.0142874,0.0740019,0.00288365,-0.110673,0.0526064,0.0139265,0.0744885,-0.0412488,-0.0311719,0.0216231,0.033215,0.0280232,0.131054,-0.0156883,0.00170596,0.00759027,0.0268327,0.0370857,0.0909865,-0.00383334,0.00671704,0.0510927,0.00180582,-0.0205071,-0.00153944,-0.0156899,-0.00792534,-0.00589185,0.0166622,0.00356512,-0.0182008,0.0446218,-0.0509262,0.014187,0.0253807,0.0294458,0.0175046,-0.0237926,0.0242274,0.0102303,0.049546,-0.0174432,0.0177695,0.0710449,0.0230212,0.0143679,-0.0311899,-0.0432953,0.00784463,-0.0286118,0.0273324,-0.0461148,0.00585143,-0.011629,-0.0129471,0.000953736,-0.0181937,0.0134825,0.105295,-0.0935257,0.0241507,0.0375398,-0.0517571,-0.0506961,0.012484,-0.0442213,-0.00743918,0.00370283,0.0156851,0.00959287,-0.00477757,0.00449016,0.00397012,0.0633307,-0.0707372,-0.0321311,0.0659621,-0.0616805,0.0285434,-0.0310853,0.0176812,0.0353986,-0.0279339,0.0229439,0.045278,0.0481303,-0.0235495,0.0326106,-0.0761708,0.00808068,-0.00456206,-0.00852788,0.0526605,0.0461031,0.0416323,0.0432226,-0.0207777,-0.0516211,-0.011498,0.0905969,-0.00927981,-0.0189808,-0.0476142,0.0136191,0.0097134,0.0171482,-0.00520009,-0.0479759,-0.00636322,0.0333897,-0.0280815,0.0501385,-0.0169669,0.0247753,0.0188397,-0.0111982,-0.0702241,0.0527548,-0.0293651,0.101869,0.00474862,-0.031367,-0.0154804,-0.0659446,0.0605851,-0.0109845,0.0238625,0.0198412,-0.0467853,-0.0516566,0.025722,-0.000690443,0.0372588,0.0127293,0.0211014,0.0526116,-0.00158713,0.0369421,-0.056745,-0.0570097,0.0553551,0.0126704,0.00867879,-0.0339234,-0.0329998,-0.0146587,-0.0391345,0.00200493,-0.0133447,-0.0399313,-0.0911577,-0.0310714,0.00292068,0.0028959,0.0522638,0.0554402,0.0528203,0.0239841,0.0185744,-0.109159,0.0130593,-0.000616273,-0.00290453,0.0153996,0.00173764,0.0752341,-0.0136966,0.0431422,-0.0122696,-0.0169659,0.0602294,0.0172437,0.0616292,-0.0680277,-0.0147055,0.0181788,-0.0625065,-0.00536659,-0.0258318,-0.0215521,-0.0339283,-0.0270861,-0.0445622,-0.0152902,0.0134233,-0.0501826,-0.0398217,-0.0531037,-0.00851477,0.0347081,-0.00432806,0.00793383,-0.100882,0.0151744,-0.0460822,0.0125454,0.0746673,-0.0653158,-0.020281,0.00431118,0.0185082,-0.0411779,0.0463541,-0.0277811,-0.0804778,-0.0586562,-0.027781,-0.0220337,0.0433422,-0.092973,0.0269354,-0.0803722,0.0932509,-0.0387957,-0.0435295,0.0136896,-0.0273304,0.0921194,0.00694876,-0.0283286,-0.0197691,0.0209291,-0.108669,-0.0247853,-0.0464452,0.0715987,0.023145,0.120532,-0.0197666,-0.0264453,0.0111391,-0.04733,0.00376833,-0.00690541,0.0616964,1.0519e-05,-0.0438902,0.0507134,-0.051979,-0.0446854,0.0815651,-0.028631,0.0597776,0.0390429,-0.0572839,0.0189218,-0.0438377,0.10237,0.0350527,0.00535964,0.0682074,-0.00526155,0.0489809,0.0119144,-0.0165262,0.00714121,-0.0874836,-0.0221077,0.00374976,0.00878105,-0.0415268,-0.0543031,0.0548884,-0.00121022,0.00277462,0.0582475,-0.113232,0.0540337,-0.0339349,-0.0292762,-0.00997748,0.00715756,-0.0015942,-0.0360834,-0.008949,-0.015179,0.064527,-0.0465851,-0.110153 ,0.103316,0.00361014,-0.00273068,-0.0108293,-0.026429,-0.0140639,0.0397532,0.00789045,0.00595908,0.0168543,-0.0823144,-0.0617517,-0.085128,-0.0220202,-0.0717282,0.0633981,0.0224178,0.0442783,-0.0416746,-0.00623414,-0.0233973,-0.0157803,-0.015859,-0.0201777,0.0617971,0.0560899,0.00860386,0.0302356,-0.107394,-0.0169646,0.071508,0.0176446,-0.00217147,-0.0681916,0.0136407,-0.0741634,-0.0535869,0.0464016,-0.0394994,0.0537852,0.0367996,-0.124392,0.0195711,0.0541755,0.0228499,-0.0350375,-0.0149807,0.0174996,-0.124202,0.0303861,0.0298131,-0.00981478,0.0530499,0.0171792,-0.0424528,-0.0233981,-0.00582898,0.100836,-0.00376015,0.00658868,-0.0312281,0.0180465,-0.00987971,-0.0236039,-0.000361603,-0.0479677,-0.0506302,0.0107029,-0.082876,0.0257411,-0.0277769,-0.0458004,0.00809061,0.0290405,-0.0284178,0.0209994,-0.00728538,0.0328386,0.00544227,-0.0363328,0.00188648,-0.0104825,-0.0722954,-0.00173925,-0.0484706,-0.0222163,0.0299116,-0.0212834,0.0174813,0.0226205,0.0367308,0.0204559,-0.00146273,-0.140625,0.0247594,0.0526165,0.0250386,-0.0248913,0.00356631,0.0201347,0.0154826,0.0316476,-0.0481723,-0.0140202,0.0389124,0.0116012,-0.0288238,-0.00753672,0.0645469,-0.0940087,-0.0274343,0.0349478,0.0255966,-0.0769446,-0.0125907,-0.0457527,-0.0656101,0.0169675,-0.0221416,-0.0144944,-0.0405301,0.024952,0.00430235,0.0173926,-0.0363139,-0.0707111,0.0163327,-0.0388954,0.0456016,0.0655302,0.00849187,-0.0970634,0.0702335,0.00564433,-0.0823578,-0.0283372,-0.037038,-0.0811458,-0.0130487,-0.0383367,-0.0390362,-0.0020493,0.0718953,-0.0574609,0.0396165,0.00794933,-0.0216455,0.0925518,0.0052399,-0.021257,0.0134079,-0.0398886,-0.015632,-0.000603031,0.0243635,-0.0346116,-0.0726879,-0.0637852,-0.0832938,-0.0098353,0.0510517,-0.0406974,0.0688816,0.0448888,-0.00984261,-0.0263185,0.0168501,-0.0285142,0.0144279,-0.00729834,-0.0126016,-0.0392452,-0.0502653,-0.0599408,0.0966084,0.0559494,-0.00181757,0.0412759,0.0517144,0.00585333,-0.0702228,-0.0224603,-0.0299506,-0.0290966,-0.0328161,0.0259779,-0.0884318,0.00847697,0.00861558,-0.0400162,0.0689192,-0.023095,-0.0271147,-0.0222886,-0.0390342,0.0331603,-0.00448798,0.0680335,0.0262495,-0.0582166,-0.040625,0.0113046,-0.0268747,-0.0147528,-0.0407415,-0.00999497,0.0135198,-0.00663672,0.0758287,-0.0916361,0.00114834,0.00468575,0.0504335,0.0022237,0.0237341,0.0289137,-0.0101094,-0.0465523,-0.0316757,-0.0539199,0.0214407,-0.0329883,0.0116078,-0.0117651,0.0643414,-0.0507588,0.0616225,0.0040464}; + + // double[] doubles = {}; + // double数组转float数组 + float[] floatArray = doubleArrayToFloatArray(doubles); + + + // System.out.println("feature = " + feature); + // System.out.println("floats = " + Arrays.toString(floats)); + // 把float数组转byte数组 + byte[] bytes = floatToByteArray(floatArray); + + System.out.println("floats.length = " + floatArray.length); + + // 把byte转为字符串特征 + String feature = Base64.getEncoder().encodeToString(bytes); + + System.out.println("feature = " + feature); } + + /** + * float数组转byte数组 + * @param floatArray + * @return + */ + public static byte[] floatToByteArray(float[] floatArray) { + if (floatArray == null) { + return null; + } + byte[] byteArray = new byte[floatArray.length * 4]; + ByteBuffer.wrap(byteArray).order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer().put(floatArray); + return byteArray; + } + + /** + * byte数组转float数组 + * @param byte_arr + * @return + */ + public static float[] byteArrayToFloatArray(byte[] byte_arr) { + int floatCount = byte_arr.length / 4; + float[] floatArray = new float[floatCount]; + ByteBuffer.wrap(byte_arr).order(ByteOrder.LITTLE_ENDIAN).asFloatBuffer().get(floatArray); + return floatArray; + } + + + /** + * double数组 转 float数组 + * @param doubles + * @return + */ + public static float[] doubleArrayToFloatArray(double[] doubles) { + float[] floatArray = new float[doubles.length]; + + // 遍历double数组并转换每个元素到float数组 + for (int i = 0; i < doubles.length; i++) { + floatArray[i] = (float) doubles[i]; + } + + return floatArray; + } + + + public static double cosineSimilarity(float[] array1, float[] array2) { + if (array1.length != array2.length) { + throw new IllegalArgumentException("Arrays must be of the same length."); + } + + double dotProduct = 0.0; + double normArray1 = 0.0; + double normArray2 = 0.0; + + for (int i = 0; i < array1.length; i++) { + dotProduct += array1[i] * array2[i]; + normArray1 += Math.pow(array1[i], 2); + normArray2 += Math.pow(array2[i], 2); + } + + normArray1 = Math.sqrt(normArray1); + normArray2 = Math.sqrt(normArray2); + + if (normArray1 == 0.0 || normArray2 == 0.0) { + throw new IllegalArgumentException("Arrays must not be zero vectors."); + } + + return dotProduct / (normArray1 * normArray2); + } + + + } diff --git a/src/main/java/com/guwan/backend/common/BusinessException.java b/src/main/java/com/guwan/backend/common/BusinessException.java new file mode 100644 index 0000000..2133f17 --- /dev/null +++ b/src/main/java/com/guwan/backend/common/BusinessException.java @@ -0,0 +1,25 @@ +package com.guwan.backend.common; + +public class BusinessException extends RuntimeException { + + @java.io.Serial private static final long serialVersionUID = -2119302295305964305L; + + public BusinessException() {} + + public BusinessException(String message) { + super(message); + } + + public BusinessException(String message, Throwable cause) { + super(message, cause); + } + + public BusinessException(Throwable cause) { + super(cause); + } + + public BusinessException( + String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/main/java/com/guwan/backend/config/EasyEsConfig.java b/src/main/java/com/guwan/backend/config/EasyEsConfig.java index 7169d67..af21b85 100644 --- a/src/main/java/com/guwan/backend/config/EasyEsConfig.java +++ b/src/main/java/com/guwan/backend/config/EasyEsConfig.java @@ -8,7 +8,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration -@EsMapperScan("com.guwan.backend.es.mapper") +@EsMapperScan("com.guwan.backend.elasticsearch.mapper") @EnableConfigurationProperties(EasyEsConfigProperties.class) public class EasyEsConfig { @Bean diff --git a/src/main/java/com/guwan/backend/controller/BookCategoryController.java b/src/main/java/com/guwan/backend/controller/BookCategoryController.java index 082ca0a..6700599 100644 --- a/src/main/java/com/guwan/backend/controller/BookCategoryController.java +++ b/src/main/java/com/guwan/backend/controller/BookCategoryController.java @@ -1,14 +1,12 @@ package com.guwan.backend.controller; import com.guwan.backend.common.Result; - import com.guwan.backend.entity.BookCategory; import com.guwan.backend.service.BookCategoryService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import org.springframework.beans.factory.annotation.Autowired; /** * (BookCategory)表控制层 @@ -61,7 +59,13 @@ public class BookCategoryController { @PostMapping public Result add(BookCategory bookCategory) { // return Result.success(this.bookCategoryService.insert(bookCategory)); - return Result.success(); + + if (bookCategoryService.save(bookCategory)) { + return Result.success(); + }else { + return Result.error("保存失败"); + } + } /** diff --git a/src/main/java/com/guwan/backend/controller/CommonController.java b/src/main/java/com/guwan/backend/controller/CommonController.java index 1e968eb..49970e5 100644 --- a/src/main/java/com/guwan/backend/controller/CommonController.java +++ b/src/main/java/com/guwan/backend/controller/CommonController.java @@ -1,6 +1,7 @@ package com.guwan.backend.controller; import com.guwan.backend.annotation.OperationLog; +import com.guwan.backend.common.BusinessException; import com.guwan.backend.common.Result; import com.guwan.backend.entity.BookContent; import com.guwan.backend.mongodb.EveryReadDetailOfMongodb; diff --git a/src/main/java/com/guwan/backend/controller/DemoController.java b/src/main/java/com/guwan/backend/controller/DemoController.java index 09547b4..f606a23 100644 --- a/src/main/java/com/guwan/backend/controller/DemoController.java +++ b/src/main/java/com/guwan/backend/controller/DemoController.java @@ -2,8 +2,8 @@ package com.guwan.backend.controller; import cn.easyes.core.conditions.LambdaEsQueryWrapper; import com.guwan.backend.common.Result; -import com.guwan.backend.es.document.ProductDocument; -import com.guwan.backend.es.mapper.ProductEsMapper; +import com.guwan.backend.elasticsearch.document.ProductDocument; +import com.guwan.backend.elasticsearch.mapper.ProductEsMapper; import com.guwan.backend.util.MinioUtil; import io.minio.MinioClient; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/guwan/backend/controller/UserController.java b/src/main/java/com/guwan/backend/controller/UserController.java index ffa2546..6e8f804 100644 --- a/src/main/java/com/guwan/backend/controller/UserController.java +++ b/src/main/java/com/guwan/backend/controller/UserController.java @@ -98,9 +98,13 @@ public class UserController { log.info("邮箱注册: {}", email); Context context = new Context(); + context.setVariable("nowDate", DateUtil.now()); + String code = RandomUtil.randomNumbers(6); + redisUtils.set(email, code, 10); + context.setVariable("code", code.toCharArray()); emailService.sendHtmlMessage(email, @@ -112,7 +116,9 @@ public class UserController { @PostMapping("/getPhoneCode") public Result registerByPhone(@RequestBody @Valid PhoneDto phoneDto) throws Exception { String phone = phoneDto.getPhone(); + log.info("手机号注册: {}", phone); + String random = RandomUtil.randomNumbers(6); SmsUtils.sendMessage(phone, random); @@ -127,9 +133,14 @@ public class UserController { @PostMapping("/password/reset") - public Result resetPassword(@RequestParam @Email String email) { + public Result resetPassword(@RequestBody ChangePasswordDTO changePasswordDTO) { + + log.debug("更改方式: {}, 内容: {}", + changePasswordDTO.getChangeWay(), + changePasswordDTO.getInfo()); + try { - userService.resetPassword(email); + userService.resetPassword(changePasswordDTO); return Result.success(); } catch (Exception e) { log.error("重置密码失败", e); diff --git a/src/main/java/com/guwan/backend/dto/user/ChangePasswordDTO.java b/src/main/java/com/guwan/backend/dto/user/ChangePasswordDTO.java new file mode 100644 index 0000000..bc42f9e --- /dev/null +++ b/src/main/java/com/guwan/backend/dto/user/ChangePasswordDTO.java @@ -0,0 +1,24 @@ +package com.guwan.backend.dto.user; + +import lombok.Data; + +@Data +public class ChangePasswordDTO { + /** + * 修改方式 + */ + String changeWay; + /** + * 账号(邮箱)(手机号) + */ + String info; + /** + * 密码(验证码) + */ + String code; + /** + * 新密码 + */ + String newPassword; + +} diff --git a/src/main/java/com/guwan/backend/es/document/ProductDocument.java b/src/main/java/com/guwan/backend/elasticsearch/document/ProductDocument.java similarity index 94% rename from src/main/java/com/guwan/backend/es/document/ProductDocument.java rename to src/main/java/com/guwan/backend/elasticsearch/document/ProductDocument.java index 1e5d6b2..ed331f9 100644 --- a/src/main/java/com/guwan/backend/es/document/ProductDocument.java +++ b/src/main/java/com/guwan/backend/elasticsearch/document/ProductDocument.java @@ -1,4 +1,4 @@ -package com.guwan.backend.es.document; +package com.guwan.backend.elasticsearch.document; import cn.easyes.annotation.IndexField; import cn.easyes.annotation.IndexId; diff --git a/src/main/java/com/guwan/backend/es/document/VideoDocument.java b/src/main/java/com/guwan/backend/elasticsearch/document/VideoDocument.java similarity index 96% rename from src/main/java/com/guwan/backend/es/document/VideoDocument.java rename to src/main/java/com/guwan/backend/elasticsearch/document/VideoDocument.java index 09f05be..9f074b6 100644 --- a/src/main/java/com/guwan/backend/es/document/VideoDocument.java +++ b/src/main/java/com/guwan/backend/elasticsearch/document/VideoDocument.java @@ -1,4 +1,4 @@ -package com.guwan.backend.es.document; +package com.guwan.backend.elasticsearch.document; import cn.easyes.annotation.IndexField; import cn.easyes.annotation.IndexId; diff --git a/src/main/java/com/guwan/backend/es/mapper/ProductEsMapper.java b/src/main/java/com/guwan/backend/elasticsearch/mapper/ProductEsMapper.java similarity index 62% rename from src/main/java/com/guwan/backend/es/mapper/ProductEsMapper.java rename to src/main/java/com/guwan/backend/elasticsearch/mapper/ProductEsMapper.java index 1706cf1..c3cf522 100644 --- a/src/main/java/com/guwan/backend/es/mapper/ProductEsMapper.java +++ b/src/main/java/com/guwan/backend/elasticsearch/mapper/ProductEsMapper.java @@ -1,7 +1,7 @@ -package com.guwan.backend.es.mapper; +package com.guwan.backend.elasticsearch.mapper; import cn.easyes.core.conditions.interfaces.BaseEsMapper; -import com.guwan.backend.es.document.ProductDocument; +import com.guwan.backend.elasticsearch.document.ProductDocument; import org.springframework.stereotype.Repository; @Repository diff --git a/src/main/java/com/guwan/backend/es/mapper/VideoEsMapper.java b/src/main/java/com/guwan/backend/elasticsearch/mapper/VideoEsMapper.java similarity index 62% rename from src/main/java/com/guwan/backend/es/mapper/VideoEsMapper.java rename to src/main/java/com/guwan/backend/elasticsearch/mapper/VideoEsMapper.java index b38e301..bae47f2 100644 --- a/src/main/java/com/guwan/backend/es/mapper/VideoEsMapper.java +++ b/src/main/java/com/guwan/backend/elasticsearch/mapper/VideoEsMapper.java @@ -1,7 +1,7 @@ -package com.guwan.backend.es.mapper; +package com.guwan.backend.elasticsearch.mapper; import cn.easyes.core.conditions.interfaces.BaseEsMapper; -import com.guwan.backend.es.document.VideoDocument; +import com.guwan.backend.elasticsearch.document.VideoDocument; import org.springframework.stereotype.Repository; @Repository diff --git a/src/main/java/com/guwan/backend/entity/Book.java b/src/main/java/com/guwan/backend/entity/Book.java index 5965529..d9c9b90 100644 --- a/src/main/java/com/guwan/backend/entity/Book.java +++ b/src/main/java/com/guwan/backend/entity/Book.java @@ -10,7 +10,7 @@ public class Book { @TableId(type = IdType.AUTO) private Long id; private String isbn; // ISBN编号 - private String title; // 书名 + private String name; // 书名 private String author; // 作者 private String publisher; // 出版社 private String description; // 描述 diff --git a/src/main/java/com/guwan/backend/enums/UserEnums.java b/src/main/java/com/guwan/backend/enums/UserEnums.java new file mode 100644 index 0000000..f473ec9 --- /dev/null +++ b/src/main/java/com/guwan/backend/enums/UserEnums.java @@ -0,0 +1,27 @@ +package com.guwan.backend.enums; + +public enum UserEnums { + ACCOUNT("account"), + EMAIL("email"), + PHONE("phone"), + FACE("face"); + + private String value; + + UserEnums(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public static UserEnums fromValue(String value) { + for (UserEnums userEnum : values()) { + if (userEnum.getValue().equals(value)) { + return userEnum; + } + } + throw new IllegalArgumentException("Unexpected value: " + value); + } +} diff --git a/src/main/java/com/guwan/backend/service/ProductSearchService.java b/src/main/java/com/guwan/backend/service/ProductSearchService.java index ca1a9c4..ba66ded 100644 --- a/src/main/java/com/guwan/backend/service/ProductSearchService.java +++ b/src/main/java/com/guwan/backend/service/ProductSearchService.java @@ -2,8 +2,8 @@ package com.guwan.backend.service; import cn.easyes.core.conditions.LambdaEsQueryWrapper; import com.guwan.backend.dto.product.ProductDTO; -import com.guwan.backend.es.document.ProductDocument; -import com.guwan.backend.es.mapper.ProductEsMapper; +import com.guwan.backend.elasticsearch.document.ProductDocument; +import com.guwan.backend.elasticsearch.mapper.ProductEsMapper; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/guwan/backend/service/UserService.java b/src/main/java/com/guwan/backend/service/UserService.java index 9269d79..9be6fec 100644 --- a/src/main/java/com/guwan/backend/service/UserService.java +++ b/src/main/java/com/guwan/backend/service/UserService.java @@ -1,5 +1,6 @@ package com.guwan.backend.service; +import com.guwan.backend.dto.user.ChangePasswordDTO; import com.guwan.backend.dto.user.LoginDto; import com.guwan.backend.dto.user.RegisterDTO; import com.guwan.backend.dto.user.UserDTO; @@ -23,7 +24,7 @@ public interface UserService { UserDTO getUserById(Long id); UserDTO updateUserInfo(UserDTO userDTO); - void resetPassword(String email); + void resetPassword(ChangePasswordDTO changePasswordDTO); public String refreshToken(String token); UserDTO findByUsername(String username); diff --git a/src/main/java/com/guwan/backend/service/VideoSearchService.java b/src/main/java/com/guwan/backend/service/VideoSearchService.java index 2733347..cbcaad9 100644 --- a/src/main/java/com/guwan/backend/service/VideoSearchService.java +++ b/src/main/java/com/guwan/backend/service/VideoSearchService.java @@ -4,8 +4,8 @@ import cn.easyes.core.conditions.LambdaEsQueryWrapper; import cn.easyes.core.conditions.LambdaEsUpdateWrapper; import com.guwan.backend.dto.video.VideoDTO; import com.guwan.backend.entity.Video; -import com.guwan.backend.es.document.VideoDocument; -import com.guwan.backend.es.mapper.VideoEsMapper; +import com.guwan.backend.elasticsearch.document.VideoDocument; +import com.guwan.backend.elasticsearch.mapper.VideoEsMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; diff --git a/src/main/java/com/guwan/backend/service/impl/BookServiceImpl.java b/src/main/java/com/guwan/backend/service/impl/BookServiceImpl.java index 56e76c9..eaf12c5 100644 --- a/src/main/java/com/guwan/backend/service/impl/BookServiceImpl.java +++ b/src/main/java/com/guwan/backend/service/impl/BookServiceImpl.java @@ -3,32 +3,83 @@ package com.guwan.backend.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.guwan.backend.annotation.OperationLog; +import com.guwan.backend.common.BusinessException; import com.guwan.backend.entity.Book; +import com.guwan.backend.entity.BookCategory; +import com.guwan.backend.entity.BookContent; +import com.guwan.backend.mapper.BookCategoryMapper; import com.guwan.backend.mapper.BookMapper; +import com.guwan.backend.service.BookContentService; import com.guwan.backend.service.BookService; -import com.mongoplus.conditions.query.LambdaQueryChainWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import okhttp3.OkHttpClient; +import okhttp3.Request; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; +import java.util.ArrayList; + +import static com.guwan.backend.util.BookContentUtil.getTextUsingOkHttp; +import static com.guwan.backend.util.BookContentUtil.processContent; + @Slf4j @Service @RequiredArgsConstructor -public class BookServiceImpl implements BookService { +public class BookServiceImpl extends ServiceImpl implements BookService { + + + private final BookContentService bookContentService; private final BookMapper bookMapper; @Override @Transactional + @OperationLog(description = "添加图书") public Book addBook(Book book) { + Book one = this.getOne(new LambdaQueryWrapper().eq(Book::getBookUrl, book.getBookUrl())); - // new LambdaQueryWrapper<>() - // new LambdaQueryChainWrapper<>() + if (one != null){ + //复制处理 + + + //不允许 + throw new BusinessException("此图书url已被使用"); + + } + + + // new LambdaQueryWrapper<>() + + // new LambdaQueryChainWrapper<>() bookMapper.insert(book); + + log.debug(book.getBookUrl()); + + OkHttpClient client = new OkHttpClient(); + + // 创建一个请求对象 + Request request = new Request.Builder() + .url(book.getBookUrl()) + .build(); + + // 发起同步请求 + try { + String content = getTextUsingOkHttp(client, request); + ArrayList bookContents = processContent(content, book.getName()); + bookContentService.saveBatch(bookContents); + + } catch (IOException e) { + e.printStackTrace(); + log.error(e.getMessage()); + } + return book; } @@ -36,6 +87,14 @@ public class BookServiceImpl implements BookService { @Transactional public Book updateBook(Book book) { bookMapper.updateById(book); + + + Book book1 = bookMapper.selectOne(new LambdaQueryWrapper() + .eq(Book::getBookUrl, book.getBookUrl())); + + + + return book; } @@ -62,7 +121,7 @@ public class BookServiceImpl implements BookService { public IPage getBookList(Integer pageNum, Integer pageSize, String keyword) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (keyword != null && !keyword.isEmpty()) { - wrapper.like(Book::getTitle, keyword) + wrapper.like(Book::getName, keyword) .or() .like(Book::getAuthor, keyword) .or() @@ -77,4 +136,4 @@ public class BookServiceImpl implements BookService { wrapper.eq(Book::getCategory, category); return bookMapper.selectPage(new Page<>(pageNum, pageSize), wrapper); } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/com/guwan/backend/service/impl/UserServiceImpl.java b/src/main/java/com/guwan/backend/service/impl/UserServiceImpl.java index ddb1a44..0975393 100644 --- a/src/main/java/com/guwan/backend/service/impl/UserServiceImpl.java +++ b/src/main/java/com/guwan/backend/service/impl/UserServiceImpl.java @@ -1,11 +1,14 @@ package com.guwan.backend.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.guwan.backend.annotation.OperationLog; +import com.guwan.backend.dto.user.ChangePasswordDTO; import com.guwan.backend.dto.user.LoginDto; import com.guwan.backend.dto.user.RegisterDTO; import com.guwan.backend.dto.user.UserDTO; import com.guwan.backend.entity.User; +import com.guwan.backend.enums.UserEnums; import com.guwan.backend.mapper.UserMapper; import com.guwan.backend.mybatis.query.LambdaQueryWrapperX; import com.guwan.backend.service.EmailService; @@ -25,7 +28,7 @@ import java.time.LocalDateTime; @Slf4j @Service @RequiredArgsConstructor -public class UserServiceImpl implements UserService { +public class UserServiceImpl extends ServiceImpl implements UserService { private final UserMapper userMapper; private final PasswordEncoder passwordEncoder; @@ -159,6 +162,7 @@ public class UserServiceImpl implements UserService { @Override + @OperationLog(description = "根据Id获取用户信息") public UserDTO getUserById(Long id) { // 先从缓存获取 Object cached = redisUtil.get(USER_CACHE_KEY + id); @@ -184,7 +188,18 @@ public class UserServiceImpl implements UserService { @Override - public void resetPassword(String email) { + public void resetPassword(ChangePasswordDTO changePasswordDTO) { + + if(changePasswordDTO.getChangeWay().equals(UserEnums.ACCOUNT.getValue())){ + User user = this.getOne(new LambdaQueryWrapper() + .eq(User::getUsername, changePasswordDTO.getInfo())); + + + } + if (changePasswordDTO.getChangeWay().equals(UserEnums.ACCOUNT.getValue())){ + + } + } diff --git a/src/main/java/com/guwan/backend/util/BookContentUtil.java b/src/main/java/com/guwan/backend/util/BookContentUtil.java new file mode 100644 index 0000000..2e78b6c --- /dev/null +++ b/src/main/java/com/guwan/backend/util/BookContentUtil.java @@ -0,0 +1,128 @@ +package com.guwan.backend.util; + +import com.guwan.backend.entity.BookContent; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class BookContentUtil { + + + + // 通过 OkHttpClient 发起同步请求获取文件内容 + public static String getTextUsingOkHttp(OkHttpClient client, Request request) throws IOException { + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + return response.body().string(); // 返回文件内容 + } else { + throw new IOException("Unexpected code " + response); + } + } + } + + + + public static ArrayList processContent(String content, String bookName) { + // 正则表达式,提取卷和节 + String volumePattern = "第([一二三四五六七八九十]+)卷"; // 提取卷 + String sectionPattern = "第([一二三四五六七八九十零百]+)节:(.*)"; // 提取节及其节名 + + // 提取卷 + Pattern volumeRegex = Pattern.compile(volumePattern); + Matcher volumeMatcher = volumeRegex.matcher(content); + + // 提取节 + Pattern sectionRegex = Pattern.compile(sectionPattern); + Matcher sectionMatcher = sectionRegex.matcher(content); + + // 列表来存储所有卷和节的内容 + List volumes = new ArrayList<>(); // 存储所有卷的标题 + List sections = new ArrayList<>(); // 存储所有节的标题 + List sectionContents = new ArrayList<>(); // 存储每节的正文内容 + + // 收集卷的信息 + while (volumeMatcher.find()) { + String volume = "第" + volumeMatcher.group(1) + "卷"; + volumes.add(volume); + } + + // 收集节的信息 + while (sectionMatcher.find()) { + String sectionTitle = "第" + sectionMatcher.group(1) + "节:" + sectionMatcher.group(2).trim(); // 这里去掉节名前后空格 + sections.add(sectionTitle); + + // 获取节的正文内容 + int start = sectionMatcher.end(); // 获取节标题之后的位置 + int end = content.length(); // 默认到文件末尾 + + // 查找下一个节的位置(即本节内容的结束位置) + Matcher nextSectionMatcher = sectionRegex.matcher(content); + if (nextSectionMatcher.find(start)) { + end = nextSectionMatcher.start(); + } + + // 获取当前节的正文内容 + String sectionContent = content.substring(start, end).trim(); + sectionContents.add(sectionContent); + } + + // 标记是否是第一次匹配到“第一节” + boolean isFirstSection = true; + + ArrayList bookContents = new ArrayList<>(); + + int sectionId = 1; + + // 输出卷和节信息 + for (int i = 0; i < volumes.size(); i++) { + // 输出卷的标题 + + // 输出该卷的每一节标题和正文内容 + for (int j = 0; j < sections.size(); j++) { + + // System.out.print(volumes.get(i)); + String section = sections.get(j); + String sectionContent = sectionContents.get(j); + + // 输出节标题 + // System.out.println(" " + section); + + // 输出节的正文内容 + // System.out.println(" 正文: " + sectionContent); + + // 如果是“第一节”,并且不是第一次出现,递增卷的索引 + if (section.contains("第一节") && !isFirstSection) { + i++; // 不是第一次才递增 + } + + // 第一次匹配到“第一节”后,标记为false + isFirstSection = false; + + + BookContent bookContent = new BookContent(); + bookContent.setBookName(bookName); + bookContent.setVolume(volumes.get(i)); + bookContent.setSection(section); + bookContent.setSectionContent(sectionContent); + bookContent.setSectionId(sectionId++); + + System.out.println("bookContent = " + bookContent); + + bookContents.add(bookContent); + + + } + + + } + return bookContents; + } + + +} diff --git a/src/test/java/com/guwan/backend/service/BookServiceTest.java b/src/test/java/com/guwan/backend/service/BookServiceTest.java index 6917a7c..6230171 100644 --- a/src/test/java/com/guwan/backend/service/BookServiceTest.java +++ b/src/test/java/com/guwan/backend/service/BookServiceTest.java @@ -9,8 +9,6 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.time.LocalDateTime; - import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; import static org.junit.jupiter.api.Assertions.*; @@ -32,7 +30,7 @@ class BookServiceTest { void addBook_Success() { // 准备测试数据 Book book = new Book(); - book.setTitle("测试书籍"); + book.setName("测试书籍"); book.setAuthor("测试作者"); book.setIsbn("9787000000000"); @@ -43,7 +41,7 @@ class BookServiceTest { // 验证结果 assertNotNull(result); - assertEquals("测试书籍", result.getTitle()); + assertEquals("测试书籍", result.getName()); verify(bookMapper, times(1)).insert(any(Book.class)); } @@ -52,7 +50,7 @@ class BookServiceTest { // 准备测试数据 Book book = new Book(); book.setId(1L); - book.setTitle("测试书籍"); + book.setName("测试书籍"); book.setIsbn("9787000000000"); when(bookMapper.selectOne(any())).thenReturn(book); @@ -62,7 +60,7 @@ class BookServiceTest { // 验证结果 assertNotNull(result); - assertEquals("测试书籍", result.getTitle()); + assertEquals("测试书籍", result.getName()); assertEquals("9787000000000", result.getIsbn()); } } \ No newline at end of file