├── .gitignore ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── LICENSE ├── README.md ├── README_en.md ├── doc └── swagger.png ├── mvnw ├── mvnw.cmd ├── pom.xml ├── sql └── bms_boot_structure.sql └── src ├── main ├── java │ └── com │ │ └── book │ │ └── backend │ │ ├── VueBookBackendApplication.java │ │ ├── common │ │ ├── BaseContext.java │ │ ├── BasePage.java │ │ ├── CustomException.java │ │ ├── JwtProperties.java │ │ ├── MyMetaObjectHandler.java │ │ ├── R.java │ │ └── exception │ │ │ ├── BusinessException.java │ │ │ ├── CommonError.java │ │ │ ├── ErrorCode.java │ │ │ ├── GlobalExceptionHandler.java │ │ │ ├── ThrowUtils.java │ │ │ └── VueBookException.java │ │ ├── config │ │ ├── HttpSessionConfigurator.java │ │ ├── JsonConfig.java │ │ ├── MyBatisConfig.java │ │ ├── RedisConfig.java │ │ ├── RedissonConfig.java │ │ ├── ThreadPoolExecutorConfig.java │ │ ├── WebMvcConfig.java │ │ └── WebSocketConfig.java │ │ ├── constant │ │ ├── ChatConstant.java │ │ └── Constant.java │ │ ├── controller │ │ ├── admin │ │ │ ├── AdminFunctionController.java │ │ │ └── AdminLoginController.java │ │ ├── bookadmin │ │ │ ├── BookAdminFunctionController.java │ │ │ └── BookAdminLoginController.java │ │ └── user │ │ │ ├── UserFunctionController.java │ │ │ └── UserLoginController.java │ │ ├── interceptor │ │ └── AuthInterceptorHandler.java │ │ ├── job │ │ ├── cycle │ │ │ ├── ConvertCommentListToRedis.java │ │ │ └── IncSyncDeleteAIMessage.java │ │ └── once │ │ │ ├── EasyExcelBatchImportBookList.java │ │ │ └── FetchInitBookList.java │ │ ├── manager │ │ ├── AiManager.java │ │ ├── AlibabaAIModel.java │ │ ├── GuavaRateLimiterManager.java │ │ ├── SparkAIManager.java │ │ ├── SparkClient.java │ │ ├── constant │ │ │ ├── SparkApiVersion.java │ │ │ ├── SparkErrorCode.java │ │ │ └── SparkMessageRole.java │ │ ├── exception │ │ │ └── SparkException.java │ │ ├── listener │ │ │ ├── SparkBaseListener.java │ │ │ ├── SparkConsoleListener.java │ │ │ └── SparkSyncChatListener.java │ │ └── model │ │ │ ├── SparkChatParameter.java │ │ │ ├── SparkMessage.java │ │ │ ├── SparkRequestBuilder.java │ │ │ ├── SparkSyncChatResponse.java │ │ │ ├── request │ │ │ ├── SparkRequest.java │ │ │ ├── SparkRequestHeader.java │ │ │ ├── SparkRequestMessage.java │ │ │ ├── SparkRequestParameter.java │ │ │ ├── SparkRequestPayload.java │ │ │ └── function │ │ │ │ ├── SparkFunctionBuilder.java │ │ │ │ ├── SparkRequestFunctionMessage.java │ │ │ │ ├── SparkRequestFunctionParameters.java │ │ │ │ ├── SparkRequestFunctionProperty.java │ │ │ │ └── SparkRequestFunctions.java │ │ │ └── response │ │ │ ├── SparkResponse.java │ │ │ ├── SparkResponseChoices.java │ │ │ ├── SparkResponseFunctionCall.java │ │ │ ├── SparkResponseHeader.java │ │ │ ├── SparkResponsePayload.java │ │ │ ├── SparkResponseUsage.java │ │ │ └── SparkTextUsage.java │ │ ├── mapper │ │ ├── AdminsMapper.java │ │ ├── AiIntelligentMapper.java │ │ ├── BookAdminsMapper.java │ │ ├── BookRuleMapper.java │ │ ├── BookTypeMapper.java │ │ ├── BooksBorrowMapper.java │ │ ├── BooksMapper.java │ │ ├── ChartMapper.java │ │ ├── ChatMapper.java │ │ ├── CommentMapper.java │ │ ├── NoticeMapper.java │ │ ├── UserInterfaceInfoMapper.java │ │ ├── UsersMapper.java │ │ └── ViolationMapper.java │ │ ├── pojo │ │ ├── Admins.java │ │ ├── AiIntelligent.java │ │ ├── BookAdmins.java │ │ ├── BookRule.java │ │ ├── BookType.java │ │ ├── Books.java │ │ ├── BooksBorrow.java │ │ ├── Chart.java │ │ ├── Chat.java │ │ ├── Comment.java │ │ ├── Notice.java │ │ ├── UserInterfaceInfo.java │ │ ├── Users.java │ │ ├── Violation.java │ │ ├── dto │ │ │ ├── BookDTO.java │ │ │ ├── BookData.java │ │ │ ├── BookRuleDTO.java │ │ │ ├── BooksBorrowDTO.java │ │ │ ├── BorrowData.java │ │ │ ├── BorrowTypeDTO.java │ │ │ ├── CommentDTO.java │ │ │ ├── UsersDTO.java │ │ │ ├── ViolationDTO.java │ │ │ ├── chart │ │ │ │ ├── ChartAddRequest.java │ │ │ │ ├── ChartEditRequest.java │ │ │ │ ├── ChartUpdateRequest.java │ │ │ │ └── GenChartByAiRequest.java │ │ │ └── chat │ │ │ │ ├── ChatRequest.java │ │ │ │ └── MessageRequest.java │ │ └── vo │ │ │ ├── BiResponse.java │ │ │ └── ChatVo.java │ │ ├── service │ │ ├── AdminsService.java │ │ ├── AiIntelligentService.java │ │ ├── BookAdminsService.java │ │ ├── BookRuleService.java │ │ ├── BookTypeService.java │ │ ├── BooksBorrowService.java │ │ ├── BooksService.java │ │ ├── ChartService.java │ │ ├── ChatService.java │ │ ├── CommentService.java │ │ ├── NoticeService.java │ │ ├── UserInterfaceInfoService.java │ │ ├── UsersService.java │ │ ├── ViolationService.java │ │ └── impl │ │ │ ├── AdminsServiceImpl.java │ │ │ ├── AiIntelligentServiceImpl.java │ │ │ ├── BookAdminsServiceImpl.java │ │ │ ├── BookRuleServiceImpl.java │ │ │ ├── BookTypeServiceImpl.java │ │ │ ├── BooksBorrowServiceImpl.java │ │ │ ├── BooksServiceImpl.java │ │ │ ├── ChartServiceImpl.java │ │ │ ├── ChatServiceImpl.java │ │ │ ├── CommentServiceImpl.java │ │ │ ├── NoticeServiceImpl.java │ │ │ ├── UserInterfaceInfoServiceImpl.java │ │ │ ├── UsersServiceImpl.java │ │ │ └── ViolationServiceImpl.java │ │ ├── utils │ │ ├── BorrowDateUtil.java │ │ ├── ExcelUtils.java │ │ ├── JwtKit.java │ │ ├── NetUtils.java │ │ ├── NumberUtil.java │ │ ├── RandomNameUtils.java │ │ ├── RedisUtil.java │ │ ├── SpringBootUtil.java │ │ ├── SqlUtils.java │ │ └── Utility.java │ │ └── ws │ │ └── WebSocket.java └── resources │ ├── application-dev.yml │ ├── application.yml │ ├── banner.txt │ ├── mapper │ ├── AdminsMapper.xml │ ├── AiIntelligentMapper.xml │ ├── BookAdminsMapper.xml │ ├── BookRuleMapper.xml │ ├── BookTypeMapper.xml │ ├── BooksBorrowMapper.xml │ ├── BooksMapper.xml │ ├── ChartMapper.xml │ ├── ChatMapper.xml │ ├── CommentMapper.xml │ ├── NoticeMapper.xml │ ├── UserInterfaceInfoMapper.xml │ ├── UsersMapper.xml │ └── ViolationMapper.xml │ └── test_excel.xlsx └── test └── java └── com └── book └── backend ├── AITest.java ├── AliAITest.java ├── BenchmarkTest.java ├── BigModelNew.java ├── CrawlerTest.java ├── OpenAPITest.java ├── RedisTest.java ├── SparkAITest.java ├── SparkClientTest.java ├── VueBookBackendApplicationTests.java ├── VueBookBackendUserTest.java ├── domain ├── BookData.java └── DemoData.java └── testutils └── EasyExcelTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | src/main/resources/application-prod.yml 35 | /jmh-result.json 36 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luoye6/Vue_BookManageSystem_backend/8409e7b75dc03790302e1084cc669d11f41d8a56/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip 2 | wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar 3 | -------------------------------------------------------------------------------- /doc/swagger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luoye6/Vue_BookManageSystem_backend/8409e7b75dc03790302e1084cc669d11f41d8a56/doc/swagger.png -------------------------------------------------------------------------------- /src/main/java/com/book/backend/VueBookBackendApplication.java: -------------------------------------------------------------------------------- 1 | package com.book.backend; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; 7 | import org.springframework.transaction.annotation.EnableTransactionManagement; 8 | 9 | /** 10 | * @author 程序员小白条 11 | */ 12 | // @SpringBootApplication(exclude = {RedisAutoConfiguration.class}) 13 | // todo 如需关闭 Redis,须添加 exclude 中的内容 14 | @SpringBootApplication() 15 | @MapperScan("com.book.backend.mapper") 16 | @EnableTransactionManagement 17 | public class VueBookBackendApplication { 18 | 19 | public static void main(String[] args) { 20 | SpringApplication.run(VueBookBackendApplication.class, args); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/BaseContext.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common; 2 | 3 | /** 4 | * 基于ThreadLocal封装工具类,用于保存和获取当前登录用户id 5 | * @author 程序员小白条 6 | */ 7 | public class BaseContext { 8 | private static ThreadLocal threadLocal = new ThreadLocal<>(); 9 | 10 | /** 11 | * 设置值 12 | * @param id 13 | */ 14 | public static void setCurrentId(Long id){ 15 | threadLocal.set(id); 16 | } 17 | 18 | /** 19 | * 获取值 20 | * @return 21 | */ 22 | public static Long getCurrentId(){ 23 | return threadLocal.get(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/BasePage.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author 程序员小白条 7 | */ 8 | @Data 9 | public class BasePage { 10 | /** 11 | * 分页参数 当前页 12 | */ 13 | private int pageNum = 1; 14 | /** 15 | * 分页参数每页条数 16 | */ 17 | private int pageSize = 3; 18 | /** 19 | * 查询的内容 20 | */ 21 | private String query; 22 | /** 23 | * 查询的条件 24 | */ 25 | private String condition; 26 | /** 27 | * 借阅证编号 28 | */ 29 | private String cardNumber; 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/CustomException.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common; 2 | 3 | /** 4 | * 自定义业务异常类 5 | * @author 程序员小白条 6 | */ 7 | public class CustomException extends RuntimeException{ 8 | public CustomException(String message){ 9 | super(message); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/JwtProperties.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common; 2 | 3 | import lombok.Data; 4 | import org.springframework.beans.factory.annotation.Value; 5 | import org.springframework.stereotype.Component; 6 | 7 | /** 8 | * JWT配置类,读取Application.yml中的配置 9 | * 10 | * @author AdminMall 11 | */ 12 | @Component 13 | @Data 14 | public class JwtProperties { 15 | /** 16 | * JWT存储的请求头 17 | */ 18 | @Value("${jwt.tokenHeader}") 19 | private String tokenHeader; 20 | /** 21 | * jwt加解密使用的密钥 22 | */ 23 | @Value("${jwt.secret}") 24 | private String secret; 25 | /** 26 | * JWT的超时时间 27 | */ 28 | @Value("${jwt.expiration}") 29 | private long expiration; 30 | 31 | public JwtProperties() { 32 | } 33 | 34 | /** 35 | * JWT负载中拿到的开头 36 | */ 37 | @Value("${jwt.tokenHead}") 38 | private String tokenHead; 39 | 40 | public JwtProperties(String tokenHeader, String secret, long expiration, String tokenHead) { 41 | this.tokenHeader = tokenHeader; 42 | this.secret = secret; 43 | this.expiration = expiration; 44 | this.tokenHead = tokenHead; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/MyMetaObjectHandler.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common; 2 | 3 | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.ibatis.reflection.MetaObject; 6 | import org.springframework.stereotype.Component; 7 | 8 | import java.time.LocalDateTime; 9 | import java.time.format.DateTimeFormatter; 10 | 11 | /** 12 | * 自定义元数据对象处理器 13 | * 公共填充功能 14 | * MyBatisPlus 15 | */ 16 | @Component 17 | @Slf4j 18 | public class MyMetaObjectHandler implements MetaObjectHandler { 19 | /** 20 | * 插入操作自动填充 21 | * @param metaObject 22 | */ 23 | @Override 24 | public void insertFill(MetaObject metaObject) { 25 | 26 | // metaObject.setValue("createTime", LocalDateTime.now()); 27 | // metaObject.setValue("updateTime",LocalDateTime.now()); 28 | // MyBatisPlus3.3.0版本后推荐使用strictInsertFill,当字段值为null时,不进行填充 29 | this.strictInsertFill(metaObject,"createTime",String.class, 30 | LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); 31 | this.strictInsertFill(metaObject,"updateTime",String.class, 32 | LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); 33 | } 34 | 35 | /** 36 | * 更新操作自动填充 37 | * @param metaObject 38 | */ 39 | @Override 40 | public void updateFill(MetaObject metaObject) { 41 | // MyBatisPlus3.3.0版本后推荐使用strictUpdateFill,当字段值为null时,不进行更新 42 | // metaObject.setValue("updateTime",LocalDateTime.now()); 43 | this.strictUpdateFill(metaObject,"updateTime", 44 | String.class,LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/R.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.HashMap; 6 | 7 | /** 8 | * 通用返回结果,服务端响应的数据最终都会封装成此对象 9 | * @param 10 | */ 11 | @Data 12 | public class R { 13 | /** 14 | * 响应状态码 15 | * | 200 | OK | 请求成功 16 | * | ---- | --------------------- | --------------------------------------------------- 17 | * | 201 | CREATED | 创建成功 18 | * | 204 | DELETED | 删除成功 19 | * | 400 | BAD REQUEST | 请求的地址不存在或者包含不支持的参数 20 | * | 401 | UNAUTHORIZED | 未授权 21 | * | 403 | FORBIDDEN | 被禁止访问 22 | * | 404 | NOT FOUND | 请求的资源不存在 23 | * | 422 | Unprocesable entity | [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误 24 | * | 500 | INTERNAL SERVER ERROR | 内部错误 25 | */ 26 | private Integer status; 27 | /** 28 | * 返回给前端的自定义信息 29 | */ 30 | private String msg; 31 | 32 | /** 33 | * 前端发送请求所需要接受到的真实数据 34 | */ 35 | private T data; 36 | 37 | /** 38 | * 动态数据 39 | */ 40 | private HashMap map = new HashMap<>(); 41 | 42 | public static R success(T object,String message) { 43 | R r = new R(); 44 | r.data = object; 45 | r.status = 200; 46 | r.msg = message; 47 | return r; 48 | } 49 | 50 | public static R error(String msg) { 51 | R r = new R(); 52 | r.msg = msg; 53 | return r; 54 | } 55 | public static R error(String msg,int code) { 56 | R r = new R(); 57 | r.msg = msg; 58 | r.status = code; 59 | return r; 60 | } 61 | /** 62 | * 自定义类型的添加 加入到动态数据HashMap中 63 | * @param key string 64 | * @param value Object 65 | * @return R 66 | */ 67 | public R add(String key, Object value) { 68 | this.map.put(key, value); 69 | return this; 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/exception/BusinessException.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common.exception; 2 | 3 | /** 4 | * 自定义异常类 5 | * 6 | * @author 程序员小白条 7 | * 8 | */ 9 | public class BusinessException extends RuntimeException { 10 | 11 | /** 12 | * 错误码 13 | */ 14 | private final int code; 15 | 16 | public BusinessException(int code, String message) { 17 | super(message); 18 | this.code = code; 19 | } 20 | 21 | public BusinessException(ErrorCode errorCode) { 22 | super(errorCode.getMessage()); 23 | this.code = errorCode.getCode(); 24 | } 25 | 26 | public BusinessException(ErrorCode errorCode, String message) { 27 | super(message); 28 | this.code = errorCode.getCode(); 29 | } 30 | 31 | public int getCode() { 32 | return code; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/exception/CommonError.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common.exception; 2 | 3 | public enum CommonError { 4 | UNKOWN_ERROR("系统内部错误"), 5 | PARAMS_ERROR("非法参数"), 6 | OBJECT_NULL("对象为空"), 7 | QUERY_NULL("查询结果为空或图书已借出"), 8 | REQUEST_NULL("请求参数为空"), 9 | USER_NULL("用户为空"); 10 | private String errMessage; 11 | 12 | public String getErrMessage() { 13 | return errMessage; 14 | } 15 | 16 | private CommonError( String errMessage) { 17 | this.errMessage = errMessage; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/exception/ErrorCode.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common.exception; 2 | 3 | /** 4 | * 自定义错误码 5 | * 6 | */ 7 | public enum ErrorCode { 8 | 9 | SUCCESS(0, "ok"), 10 | PARAMS_ERROR(40000, "请求参数错误"), 11 | NOT_LOGIN_ERROR(40100, "未登录"), 12 | NO_AUTH_ERROR(40101, "无权限"), 13 | NOT_FOUND_ERROR(40400, "请求数据不存在"), 14 | TOO_MANY_REQUEST(42900, "请求过于频繁"), 15 | FORBIDDEN_ERROR(40300, "禁止访问"), 16 | SYSTEM_ERROR(50000, "系统内部异常"), 17 | OPERATION_ERROR(50001, "操作失败"); 18 | 19 | /** 20 | * 状态码 21 | */ 22 | private final int code; 23 | 24 | /** 25 | * 信息 26 | */ 27 | private final String message; 28 | 29 | ErrorCode(int code, String message) { 30 | this.code = code; 31 | this.message = message; 32 | } 33 | 34 | public int getCode() { 35 | return code; 36 | } 37 | 38 | public String getMessage() { 39 | return message; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/exception/GlobalExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common.exception; 2 | 3 | import com.book.backend.common.R; 4 | import org.springframework.http.HttpStatus; 5 | import org.springframework.web.bind.annotation.ControllerAdvice; 6 | import org.springframework.web.bind.annotation.ExceptionHandler; 7 | import org.springframework.web.bind.annotation.ResponseBody; 8 | import org.springframework.web.bind.annotation.ResponseStatus; 9 | @ControllerAdvice 10 | public class GlobalExceptionHandler { 11 | 12 | @ResponseBody 13 | @ExceptionHandler(VueBookException.class) 14 | @ResponseStatus(HttpStatus.OK) 15 | public R businessExceptionHandler(VueBookException e) { 16 | return R.error(e.getErrMessage(),e.getCode()); 17 | } 18 | 19 | // @ResponseBody 20 | // @ExceptionHandler(Exception.class) 21 | // @ResponseStatus(HttpStatus.OK) 22 | // public R runtimeExceptionHandler(Exception e) { 23 | // return R.error(CommonError.UNKOWN_ERROR.getErrMessage()); 24 | // 25 | // } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/exception/ThrowUtils.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common.exception; 2 | 3 | /** 4 | * 抛异常工具类 5 | * 6 | * @author 程序员小白条 7 | * 8 | */ 9 | public class ThrowUtils { 10 | 11 | /** 12 | * 条件成立则抛异常 13 | * 14 | * @param condition 15 | * @param runtimeException 16 | */ 17 | public static void throwIf(boolean condition, RuntimeException runtimeException) { 18 | if (condition) { 19 | throw runtimeException; 20 | } 21 | } 22 | 23 | /** 24 | * 条件成立则抛异常 25 | * 26 | * @param condition 27 | * @param errorCode 28 | */ 29 | public static void throwIf(boolean condition, ErrorCode errorCode) { 30 | throwIf(condition, new BusinessException(errorCode)); 31 | } 32 | 33 | /** 34 | * 条件成立则抛异常 35 | * 36 | * @param condition 37 | * @param errorCode 38 | * @param message 39 | */ 40 | public static void throwIf(boolean condition, ErrorCode errorCode, String message) { 41 | throwIf(condition, new BusinessException(errorCode, message)); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/common/exception/VueBookException.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.common.exception; 2 | 3 | public class VueBookException extends RuntimeException{ 4 | 5 | private static final long serialVersionUID = 5565760508056698922L; 6 | /** 7 | * 错误信息 8 | */ 9 | private String errMessage; 10 | /** 11 | * 错误码 12 | */ 13 | private int code; 14 | public VueBookException() { 15 | super(); 16 | } 17 | 18 | public VueBookException(String errMessage) { 19 | super(errMessage); 20 | this.errMessage = errMessage; 21 | } 22 | 23 | public String getErrMessage() { 24 | return errMessage; 25 | } 26 | 27 | public void setErrMessage(String errMessage) { 28 | this.errMessage = errMessage; 29 | } 30 | 31 | public int getCode() { 32 | return code; 33 | } 34 | 35 | public void setCode(int code) { 36 | this.code = code; 37 | } 38 | 39 | /** 40 | * 新增 41 | * @param errorCode 42 | * @param message 43 | */ 44 | public VueBookException(ErrorCode errorCode,String message){ 45 | super(message); 46 | this.code = errorCode.getCode(); 47 | } 48 | public VueBookException(ErrorCode errorCode){ 49 | this.code = errorCode.getCode(); 50 | } 51 | 52 | public static void cast(CommonError commonError){ 53 | throw new VueBookException(commonError.getErrMessage()); 54 | } 55 | public static void cast(String errMessage){ 56 | throw new VueBookException(errMessage); 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/config/HttpSessionConfigurator.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.config; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import javax.servlet.ServletRequestEvent; 6 | import javax.servlet.ServletRequestListener; 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpSession; 9 | import javax.websocket.HandshakeResponse; 10 | import javax.websocket.server.HandshakeRequest; 11 | import javax.websocket.server.ServerEndpointConfig; 12 | import javax.websocket.server.ServerEndpointConfig.Configurator; 13 | 14 | /** 15 | * 从websocket中获取用户session 16 | * 17 | * @author qimu 18 | */ 19 | @Component 20 | public class HttpSessionConfigurator extends Configurator implements ServletRequestListener { 21 | 22 | @Override 23 | public void requestInitialized(ServletRequestEvent sre) { 24 | HttpSession session = ((HttpServletRequest) sre.getServletRequest()).getSession(); 25 | } 26 | 27 | @Override 28 | public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) { 29 | HttpSession httpSession = (HttpSession) request.getHttpSession(); 30 | if (httpSession != null) { 31 | sec.getUserProperties().put(HttpSession.class.getName(), httpSession); 32 | } 33 | super.modifyHandshake(sec, request, response); 34 | } 35 | 36 | @Override 37 | public void requestDestroyed(ServletRequestEvent arg0) { 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/config/JsonConfig.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.config; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | import com.fasterxml.jackson.databind.module.SimpleModule; 5 | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 6 | import org.springframework.boot.jackson.JsonComponent; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; 9 | 10 | /** 11 | * Spring MVC Json 配置 12 | * 13 | * @author 程序员小白条 14 | * 15 | */ 16 | @JsonComponent 17 | public class JsonConfig { 18 | 19 | /** 20 | * 添加 Long 转 json 精度丢失的配置 21 | */ 22 | @Bean 23 | public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { 24 | ObjectMapper objectMapper = builder.createXmlMapper(false).build(); 25 | SimpleModule module = new SimpleModule(); 26 | module.addSerializer(Long.class, ToStringSerializer.instance); 27 | module.addSerializer(Long.TYPE, ToStringSerializer.instance); 28 | objectMapper.registerModule(module); 29 | return objectMapper; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/config/MyBatisConfig.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.config; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; 4 | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; 5 | import com.baomidou.mybatisplus.generator.config.StrategyConfig; 6 | import org.mybatis.spring.annotation.MapperScan; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | 10 | /** 11 | * @author 程序员小白条 12 | */ 13 | @Configuration 14 | @MapperScan("com.blog.backend.mapper") 15 | public class MyBatisConfig { 16 | @Bean 17 | public MybatisPlusInterceptor mybatisPlusInterceptor(){ 18 | //配置分页插件 19 | MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); 20 | mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 21 | return mybatisPlusInterceptor; 22 | } 23 | // @Bean 24 | // public StrategyConfig strategyConfig(){ 25 | // return new StrategyConfig.Builder().entityBuilder().enableTableFieldAnnotation().build(); 26 | // } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/config/RedisConfig.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.data.redis.connection.RedisConnectionFactory; 6 | import org.springframework.data.redis.core.RedisTemplate; 7 | import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; 8 | import org.springframework.data.redis.serializer.RedisSerializer; 9 | 10 | @Configuration 11 | public class RedisConfig { 12 | // 因为用到了jsonRedisSerializer,所以要导入jackson依赖 13 | @Bean 14 | public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory){ 15 | // 创建RedisTemplate对象 16 | RedisTemplate template = new RedisTemplate<>(); 17 | // 设置连接工厂 18 | template.setConnectionFactory(connectionFactory); 19 | // 创建JSON序列化工具 20 | GenericJackson2JsonRedisSerializer jsonRedisSerializer = 21 | new GenericJackson2JsonRedisSerializer(); 22 | // 设置Key的序列化 23 | template.setKeySerializer(RedisSerializer.string()); 24 | template.setHashKeySerializer(RedisSerializer.string()); 25 | // 设置Value的序列化 26 | template.setValueSerializer(jsonRedisSerializer); 27 | template.setHashValueSerializer(jsonRedisSerializer); 28 | // 返回 29 | return template; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/config/RedissonConfig.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.config; 2 | 3 | /** 4 | * @author 小白条 5 | * @from 个人博客 6 | */ 7 | import lombok.Data; 8 | import org.redisson.Redisson; 9 | import org.redisson.api.RedissonClient; 10 | import org.redisson.config.Config; 11 | import org.springframework.boot.context.properties.ConfigurationProperties; 12 | import org.springframework.context.annotation.Bean; 13 | import org.springframework.context.annotation.Configuration; 14 | 15 | //@Configuration 16 | //@ConfigurationProperties(prefix = "spring.redis") 17 | @Data 18 | public class RedissonConfig { 19 | 20 | private Integer database; 21 | 22 | private String host; 23 | 24 | private Integer port; 25 | 26 | private String password; 27 | 28 | @Bean 29 | public RedissonClient redissonClient() { 30 | Config config = new Config(); 31 | config.useSingleServer() 32 | .setDatabase(database) 33 | .setAddress("redis://" + host + ":" + port) 34 | .setPassword(password); 35 | return Redisson.create(config); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/config/ThreadPoolExecutorConfig.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.config; 2 | 3 | /** 4 | * @author 小白条 5 | * @from 个人博客 6 | */ 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | 10 | import java.util.concurrent.ArrayBlockingQueue; 11 | import java.util.concurrent.ThreadFactory; 12 | import java.util.concurrent.ThreadPoolExecutor; 13 | import java.util.concurrent.TimeUnit; 14 | 15 | @Configuration 16 | public class ThreadPoolExecutorConfig { 17 | 18 | @Bean 19 | public ThreadPoolExecutor threadPoolExecutor() { 20 | ThreadFactory threadFactory = new ThreadFactory() { 21 | private int count = 1; 22 | 23 | @Override 24 | public Thread newThread( Runnable r) { 25 | Thread thread = new Thread(r); 26 | thread.setName("线程" + count); 27 | count++; 28 | return thread; 29 | } 30 | }; 31 | return new ThreadPoolExecutor(2, 4, 100, TimeUnit.SECONDS, 32 | new ArrayBlockingQueue<>(4), threadFactory); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/config/WebMvcConfig.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.config; 2 | 3 | import com.book.backend.interceptor.AuthInterceptorHandler; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.web.servlet.config.annotation.CorsRegistry; 7 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 8 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 9 | 10 | /** 11 | * @author 程序员小白条 12 | */ 13 | @Configuration 14 | public class WebMvcConfig implements WebMvcConfigurer { 15 | @Override 16 | public void addCorsMappings(CorsRegistry registry) { 17 | //跨域配置 18 | registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("POST","GET","PUT","OPTIONS","DELETE").allowCredentials(true).allowedHeaders("*").maxAge(3600); 19 | } 20 | 21 | @Override 22 | public void addInterceptors(InterceptorRegistry registry) { 23 | registry.addInterceptor(authInterceptorHandler()).excludePathPatterns("/**/login").excludePathPatterns("/doc.html").excludePathPatterns("/**/websocket"); 24 | } 25 | 26 | @Bean 27 | public AuthInterceptorHandler authInterceptorHandler(){ 28 | return new AuthInterceptorHandler(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/config/WebSocketConfig.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.socket.server.standard.ServerEndpointExporter; 6 | 7 | @Configuration 8 | public class WebSocketConfig { 9 | 10 | /** 11 | * ServerEndpointExporter类的作用是,会扫描所有的服务器端点, 12 | * 把带有@ServerEndpoint 注解的所有类都添加进来 13 | * 14 | */ 15 | @Bean 16 | public ServerEndpointExporter serverEndpointExporter(){ 17 | return new ServerEndpointExporter(); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/constant/ChatConstant.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.constant; 2 | 3 | 4 | public interface ChatConstant { 5 | /** 6 | * 私聊 7 | */ 8 | int PRIVATE_CHAT = 1; 9 | /** 10 | * 群聊 11 | */ 12 | int HALL_CHAT = 2; 13 | 14 | 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/constant/Constant.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.constant; 2 | 3 | /** 4 | * @author 程序员小白条 5 | * 常量类 6 | * 防止魔法值 7 | */ 8 | public class Constant { 9 | /** 10 | * 字符串NULL判断 11 | */ 12 | public static final String NULL = "null"; 13 | /** 14 | * 预检请求 15 | */ 16 | public static final String OPTIONS = "OPTIONS"; 17 | /** 18 | * 账号为可用状态 19 | */ 20 | public static final Integer AVAILABLE = 1; 21 | /** 22 | * 账号为禁用状态 23 | */ 24 | public static final Integer DISABLE = 0; 25 | /** 26 | * 图书已借出状态 27 | */ 28 | public static final String BOOKDISABLE = "已借出"; 29 | /** 30 | * 图书未借出状态 31 | */ 32 | public static final String BOOKAVAILABLE = "未借出"; 33 | /** 34 | * 用户可用状态 字符串 35 | */ 36 | public static final String USERAVAILABLE = "可用"; 37 | /** 38 | * 用户禁用状态 字符串 39 | */ 40 | public static final String USERDISABLE = "禁用"; 41 | /** 42 | * 密码超过30,判定为md5加密字符 43 | */ 44 | public static final Integer MD5PASSWORD = 30; 45 | /** 46 | * 升序 47 | */ 48 | public static final String SORT_ORDER_ASC = "ascend"; 49 | 50 | /** 51 | * 降序 52 | */ 53 | public static final String SORT_ORDER_DESC = " descend"; 54 | /** 55 | * BI 模型 id 56 | */ 57 | public static final long BI_MODEL_ID = 1659171950288818178L; 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/controller/admin/AdminLoginController.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.controller.admin; 2 | 3 | import com.book.backend.common.R; 4 | import com.book.backend.pojo.Admins; 5 | import com.book.backend.service.AdminsService; 6 | import io.swagger.annotations.ApiOperation; 7 | import org.springframework.web.bind.annotation.PostMapping; 8 | import org.springframework.web.bind.annotation.RequestBody; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | import javax.annotation.Resource; 13 | 14 | /** 15 | * @author 程序员小白条 16 | */ 17 | @RestController 18 | @RequestMapping("/admin") 19 | public class AdminLoginController { 20 | @Resource 21 | private AdminsService adminsService; 22 | 23 | /** 24 | * 系统管理员登录 25 | * @param users 系统管理员 26 | * @return 返回R通用数据 27 | */ 28 | @PostMapping("/login") 29 | @ApiOperation("管理员登录") 30 | public R login(@RequestBody Admins users){ 31 | return adminsService.login(users); 32 | } 33 | 34 | /** 35 | * 返回给前端系统管理员的数据 36 | * @param admin 系统管理员 37 | * @return R 38 | */ 39 | @PostMapping ("/getData") 40 | @ApiOperation("获取管理员数据") 41 | public R getUserData(@RequestBody Admins admin){ 42 | return adminsService.getUserData(admin); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/controller/bookadmin/BookAdminLoginController.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.controller.bookadmin; 2 | 3 | import com.book.backend.common.R; 4 | import com.book.backend.pojo.BookAdmins; 5 | import com.book.backend.service.BookAdminsService; 6 | import io.swagger.annotations.ApiOperation; 7 | import org.springframework.web.bind.annotation.PostMapping; 8 | import org.springframework.web.bind.annotation.RequestBody; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | import javax.annotation.Resource; 13 | 14 | /** 15 | * @author 程序员小白条 16 | */ 17 | @RestController 18 | @RequestMapping("/bookadmin") 19 | public class BookAdminLoginController { 20 | @Resource 21 | private BookAdminsService bookAdminsService; 22 | 23 | 24 | /** 25 | * 图书管理员登录 26 | * 27 | * @param users 图书管理员 28 | * @return 返回R通用数据 29 | */ 30 | @PostMapping("/login") 31 | @ApiOperation("图书管理员登录") 32 | public R login(@RequestBody BookAdmins users) { 33 | return bookAdminsService.login(users); 34 | } 35 | 36 | /** 37 | * 返回给前端图书管理员的数据 38 | * 39 | * @param bookAdmins 图书管理员 40 | * @return R 41 | */ 42 | @PostMapping("/getData") 43 | @ApiOperation("获取图书管理员数据") 44 | public R getUserData(@RequestBody BookAdmins bookAdmins) { 45 | return bookAdminsService.getUserData(bookAdmins); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/controller/user/UserLoginController.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.controller.user; 2 | 3 | import com.book.backend.common.R; 4 | import com.book.backend.pojo.Users; 5 | import com.book.backend.service.UsersService; 6 | import io.swagger.annotations.ApiOperation; 7 | import org.springframework.web.bind.annotation.PostMapping; 8 | import org.springframework.web.bind.annotation.RequestBody; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | import javax.annotation.Resource; 13 | 14 | /** 15 | * @author 程序员小白条 16 | */ 17 | @RestController 18 | @RequestMapping("/user") 19 | public class UserLoginController { 20 | @Resource 21 | private UsersService usersService; 22 | 23 | /** 24 | * 借阅用户登录 25 | * 26 | * @param users 借阅者用户 27 | * @return 返回R通用数据 28 | */ 29 | @PostMapping("/login") 30 | @ApiOperation("用户登录") 31 | public R login(@RequestBody Users users) { 32 | return usersService.login(users); 33 | } 34 | 35 | /** 36 | * 根据用户id传给用户所需的信息 37 | * 38 | * @param users 用户 39 | * @return R 40 | */ 41 | @PostMapping("/getData") 42 | @ApiOperation("获取用户数据") 43 | public R getUserData(@RequestBody Users users) { 44 | return usersService.getUserData(users); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/interceptor/AuthInterceptorHandler.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.interceptor; 2 | 3 | import com.alibaba.fastjson.JSONObject; 4 | import com.book.backend.constant.Constant; 5 | import com.book.backend.common.JwtProperties; 6 | import com.book.backend.utils.JwtKit; 7 | import io.jsonwebtoken.Claims; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.web.method.HandlerMethod; 10 | import org.springframework.web.servlet.HandlerInterceptor; 11 | 12 | import javax.servlet.http.HttpServletRequest; 13 | import javax.servlet.http.HttpServletResponse; 14 | import java.io.PrintWriter; 15 | 16 | /** 17 | * @author 程序员小白条 18 | */ 19 | public class AuthInterceptorHandler implements HandlerInterceptor { 20 | @Autowired 21 | private JwtProperties jwtProperties; 22 | 23 | @Autowired 24 | private JwtKit jwtKit; 25 | 26 | /** 27 | * 前置拦截器 28 | */ 29 | @Override 30 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { 31 | 32 | if(!(handler instanceof HandlerMethod)){ 33 | return true; 34 | } 35 | 36 | HandlerMethod handlerMethod=(HandlerMethod)handler; 37 | //判断如果请求的类是swagger的控制器,直接通行。 38 | if(("springfox.documentation.swagger.web.ApiResourceController").equals(handlerMethod.getBean().getClass().getName())){ 39 | return true; 40 | } 41 | 42 | if ((Constant.OPTIONS).equals(request.getMethod())) { 43 | response.setStatus(HttpServletResponse.SC_OK); 44 | return true; 45 | } 46 | // 获取到JWT的Token 47 | String jwtToken = request.getHeader(jwtProperties.getTokenHeader()); 48 | // 截取中间payload部分 +1是Bearer + 空格(1) 49 | String payloadToken = null; 50 | // 创建json对象 51 | JSONObject jsonObject = new JSONObject(); 52 | 53 | if (jwtToken != null) { 54 | payloadToken = jwtToken.substring(jwtProperties.getTokenHead().length() + 1); 55 | } 56 | if (payloadToken != null && (!(Constant.NULL).equals(payloadToken))) { 57 | // 解析Token,获取Claims = Map 58 | Claims claims = null; 59 | try { 60 | claims = jwtKit.parseJwtToken(payloadToken); 61 | } catch (Exception e) { 62 | //token过期会捕捉到异常 63 | jsonObject.put("status", 401); 64 | jsonObject.put("msg", "登录过期,请重新登录"); 65 | String json1 = jsonObject.toJSONString(); 66 | renderJson(response, json1); 67 | } 68 | return claims != null; 69 | // 获取payload中的报文, 70 | } 71 | // 如果token不存在 72 | jsonObject.put("status", 401); 73 | jsonObject.put("msg", "登录非法"); 74 | String json2 = jsonObject.toJSONString(); 75 | renderJson(response, json2); 76 | 77 | return false; 78 | } 79 | 80 | private void renderJson(HttpServletResponse response, String json) { 81 | response.setCharacterEncoding("UTF-8"); 82 | response.setContentType("application/json;charset=UTF-8"); 83 | try (PrintWriter printWriter = response.getWriter()) { 84 | printWriter.print(json); 85 | } catch (Exception e) { 86 | e.printStackTrace(); 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/job/cycle/ConvertCommentListToRedis.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.job.cycle; 2 | 3 | import com.book.backend.pojo.Comment; 4 | import com.book.backend.pojo.dto.CommentDTO; 5 | import com.book.backend.service.CommentService; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.data.redis.core.RedisTemplate; 8 | import org.springframework.scheduling.annotation.EnableScheduling; 9 | import org.springframework.scheduling.annotation.Scheduled; 10 | 11 | import javax.annotation.Resource; 12 | import java.time.LocalDate; 13 | import java.util.List; 14 | import java.util.concurrent.TimeUnit; 15 | import java.util.stream.Collectors; 16 | 17 | /** 18 | * @author 小白条 19 | * @from 个人博客 20 | */ 21 | // todo 取消 @Component 注释开启任务 22 | // 程序启动时执行一次,然后每隔1天自动执行定时任务 23 | //@Component 24 | @EnableScheduling 25 | @Slf4j 26 | public class ConvertCommentListToRedis { 27 | 28 | @Resource 29 | private CommentService commentService; 30 | @Resource 31 | private RedisTemplate redisTemplate; 32 | 33 | public ConvertCommentListToRedis() { 34 | } 35 | 36 | /** 37 | * 每天凌晨三点将数据库中的留言列表转到 Redis 38 | * 39 | */ 40 | @Scheduled(cron = "0 0 3 * * ?") 41 | public void run() { 42 | log.info("准备将数据库中的留言列表转移到Redis"); 43 | LocalDate localDate = LocalDate.now(); 44 | String key = "comment:"+localDate; 45 | List list = commentService.list(); 46 | List commentDTOList = list.stream().map((item) -> { 47 | CommentDTO commentDTO = new CommentDTO(); 48 | commentDTO.setAvatar(item.getCommentAvatar()); 49 | commentDTO.setId(item.getCommentId()); 50 | commentDTO.setMsg(item.getCommentMessage()); 51 | commentDTO.setTime(item.getCommentTime()); 52 | commentDTO.setBarrageStyle(item.getCommentBarrageStyle()); 53 | return commentDTO; 54 | }).collect(Collectors.toList()); 55 | redisTemplate.opsForList().rightPushAll(key,commentDTOList); 56 | redisTemplate.expire(key,7, TimeUnit.DAYS); 57 | log.info("留言列表成功转移到Redis"); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/job/cycle/IncSyncDeleteAIMessage.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.job.cycle; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 4 | import com.book.backend.common.exception.BusinessException; 5 | import com.book.backend.common.exception.ErrorCode; 6 | import com.book.backend.pojo.AiIntelligent; 7 | import com.book.backend.pojo.UserInterfaceInfo; 8 | import com.book.backend.pojo.Users; 9 | import com.book.backend.service.AiIntelligentService; 10 | import com.book.backend.service.UserInterfaceInfoService; 11 | import com.book.backend.service.UsersService; 12 | import com.book.backend.service.impl.UserInterfaceInfoServiceImpl; 13 | import lombok.extern.slf4j.Slf4j; 14 | import org.springframework.scheduling.annotation.EnableScheduling; 15 | import org.springframework.scheduling.annotation.Scheduled; 16 | import org.springframework.stereotype.Component; 17 | 18 | import javax.annotation.Resource; 19 | import java.util.List; 20 | 21 | /** 22 | * 删除用户调用AI模型的无效回复 23 | * 24 | * @author 程序员小白条 25 | * 26 | */ 27 | // todo 取消 @Component 注释开启任务 28 | // 程序启动时执行一次,然后每隔1天自动执行定时任务 29 | //@Component 30 | @EnableScheduling 31 | @Slf4j 32 | public class IncSyncDeleteAIMessage { 33 | 34 | @Resource 35 | private AiIntelligentService aiIntelligentService; 36 | @Resource 37 | private UserInterfaceInfoService userInterfaceInfoService; 38 | 39 | 40 | /** 41 | * 每天执行一次 42 | * 43 | */ 44 | @Scheduled(fixedRate = 60 * 60 * 24 * 1000) 45 | public void run() { 46 | log.info("正在查询无效的AI回复数据"); 47 | // 查询无效的数据,并进行删除操作 48 | LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); 49 | queryWrapper.isNull(AiIntelligent::getAiResult).or().eq(AiIntelligent::getAiResult, ""); 50 | List list = aiIntelligentService.list(queryWrapper); 51 | // 先为用户恢复次数 52 | log.info("正在为用户恢复次数"); 53 | list.forEach(item -> { 54 | Long userId = item.getUserId(); 55 | UserInterfaceInfo user = userInterfaceInfoService.getById(userId); 56 | synchronized (IncSyncDeleteAIMessage.class) { 57 | // 用户恢复次数 58 | if (user != null) { 59 | user.setLeftNum(user.getLeftNum() + 1); 60 | boolean save = userInterfaceInfoService.save(user); 61 | if (!save) { 62 | log.info("定时任务执行失败"); 63 | throw new BusinessException(ErrorCode.OPERATION_ERROR, "操作定时任务失败"); 64 | } 65 | } 66 | } 67 | }); 68 | // 将无效的记录删除 69 | log.info("正在删除无效的AI回复记录"); 70 | boolean remove = false; 71 | try { 72 | remove = aiIntelligentService.remove(queryWrapper); 73 | if (!remove) { 74 | log.info("未发现无效的AI回复记录"); 75 | } 76 | } catch (Exception e) { 77 | log.info("定时任务执行失败"); 78 | throw new RuntimeException(e); 79 | } 80 | log.info("定时任务执行成功,删除无效的AI的结果集:"+list.size()+"个"); 81 | 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/job/once/EasyExcelBatchImportBookList.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.job.once; 2 | 3 | import com.alibaba.excel.EasyExcel; 4 | import com.alibaba.excel.context.AnalysisContext; 5 | import com.alibaba.excel.event.AnalysisEventListener; 6 | import com.book.backend.pojo.Books; 7 | import com.book.backend.pojo.dto.BookData; 8 | import com.book.backend.service.BooksService; 9 | import com.book.backend.utils.NumberUtil; 10 | import org.springframework.beans.BeanUtils; 11 | import org.springframework.boot.CommandLineRunner; 12 | import org.springframework.stereotype.Component; 13 | 14 | import javax.annotation.Resource; 15 | import java.util.ArrayList; 16 | 17 | /** 18 | * @author 小白条 19 | * @from 个人博客 20 | */ 21 | // 取消注释后,每次执行springboot项目,都会执行一次run方法 22 | //@Component 23 | public class EasyExcelBatchImportBookList implements CommandLineRunner { 24 | @Resource 25 | private BooksService booksService; 26 | 27 | @Override 28 | public void run(String... args) throws Exception { 29 | // 读取的excel文件路径 30 | String filename = "D:\\IDEAproject\\vue_book_backend\\src\\main\\resources\\test_excel.xlsx"; 31 | // 读取excel 32 | EasyExcel.read(filename, BookData.class, new AnalysisEventListener() { 33 | ArrayList booksList = new ArrayList<>(); 34 | // 每解析一行数据,该方法会被调用一次 35 | @Override 36 | public void invoke(BookData bookData, AnalysisContext analysisContext) { 37 | Books books = new Books(); 38 | // 生成11位数字的图书编号 39 | StringBuilder stringBuilder = NumberUtil.getNumber(11); 40 | long bookNumber = Long.parseLong(new String(stringBuilder)); 41 | BeanUtils.copyProperties(bookData,books); 42 | books.setBookNumber(bookNumber); 43 | booksList.add(books); 44 | // System.out.println("解析数据为:" + bookData.toString()); 45 | } 46 | // 全部解析完成被调用 47 | @Override 48 | public void doAfterAllAnalysed(AnalysisContext analysisContext) { 49 | // 全部加入到容器list中后,一次性批量导入,先判断容器是否为空 50 | if(!booksList.isEmpty()){ 51 | // 可以将解析的数据保存到数据库 52 | boolean flag = booksService.saveBatch(booksList); 53 | // 如果数据添加成功 54 | if(flag){ 55 | System.out.println("Excel批量添加图书成功"); 56 | }else{ 57 | System.out.println("Excel批量添加图书失败"); 58 | } 59 | }else{ 60 | System.out.println("空表无法进行数据导入"); 61 | } 62 | System.out.println("解析完成..."); 63 | 64 | } 65 | }).sheet().doRead(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/job/once/FetchInitBookList.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.job.once; 2 | 3 | import cn.hutool.http.HttpRequest; 4 | import cn.hutool.json.JSONArray; 5 | import cn.hutool.json.JSONObject; 6 | import cn.hutool.json.JSONUtil; 7 | import com.book.backend.pojo.Books; 8 | import com.book.backend.service.BooksService; 9 | import com.book.backend.utils.NumberUtil; 10 | import com.book.backend.utils.RandomNameUtils; 11 | import lombok.extern.slf4j.Slf4j; 12 | import org.springframework.boot.CommandLineRunner; 13 | import org.springframework.transaction.annotation.Transactional; 14 | 15 | import javax.annotation.Resource; 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | import java.util.Map; 19 | 20 | /** 21 | * @author 小白条 22 | * @from 个人博客 23 | */ 24 | // 取消注释后,每次执行springboot项目,都会执行一次run方法 25 | //@Component 26 | @Slf4j 27 | public class FetchInitBookList implements CommandLineRunner { 28 | @Resource 29 | private BooksService booksService; 30 | 31 | @Transactional(rollbackFor = Exception.class) 32 | @Override 33 | public void run(String... args) throws Exception { 34 | String[] bookLibraries = {"南图", "北图", "教师之家"}; 35 | String url = "https://api.ituring.com.cn/api/Search/Advanced"; 36 | // 可以手动修改page来改变获取不同的图书 37 | String json = "{\n" + 38 | " \"categoryId\": 1,\n" + 39 | " \"sort\": \"new\",\n" + 40 | " \"page\": 1,\n" + 41 | " \"name\": \"\",\n" + 42 | " \"edition\": 1\n" + 43 | "}"; 44 | String result2 = HttpRequest.post(url) 45 | .body(json) 46 | .execute().body(); 47 | Map map = JSONUtil.toBean(result2, Map.class); 48 | JSONArray bookItems = (JSONArray) map.get("bookItems"); 49 | List booksList = new ArrayList<>(); 50 | for (Object record : bookItems) { 51 | int randomLibrary = NumberUtil.getLibraryInt(); 52 | JSONObject tempRecord = (JSONObject) record; 53 | Books books = new Books(); 54 | // 生成11位数字的图书编号 55 | StringBuilder stringNumber = NumberUtil.getNumber(11); 56 | long bookNumber = Long.parseLong(new String(stringNumber)); 57 | String bookName = tempRecord.getStr("name"); 58 | String author = tempRecord.getStr("translatorNameString"); 59 | String bookDescription = tempRecord.getStr("abstract"); 60 | if(bookDescription.length()>=255){ 61 | bookDescription = bookDescription.substring(0,254); 62 | } 63 | books.setBookNumber(bookNumber); 64 | books.setBookName(bookName); 65 | books.setBookAuthor(author); 66 | books.setBookLibrary(bookLibraries[randomLibrary]); 67 | books.setBookType("计算机"); 68 | String location = RandomNameUtils.getRandomLocation(); 69 | books.setBookLocation(location); 70 | books.setBookStatus("未借出"); 71 | books.setBookDescription(bookDescription); 72 | booksList.add(books); 73 | } 74 | boolean b = booksService.saveBatch(booksList); 75 | if(b){ 76 | log.info("批量添加图书成功,成功插入的条数为:{}",booksList.size()); 77 | }else{ 78 | log.error("批量添加图书失败"); 79 | } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/AiManager.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager; 2 | 3 | import com.book.backend.common.exception.BusinessException; 4 | import com.book.backend.common.exception.ErrorCode; 5 | import com.yupi.yucongming.dev.client.YuCongMingClient; 6 | import com.yupi.yucongming.dev.common.BaseResponse; 7 | import com.yupi.yucongming.dev.model.DevChatRequest; 8 | import com.yupi.yucongming.dev.model.DevChatResponse; 9 | import org.springframework.stereotype.Service; 10 | 11 | import javax.annotation.Resource; 12 | 13 | /** 14 | * 用于对接 AI 平台 15 | */ 16 | @Service 17 | public class AiManager { 18 | 19 | 20 | 21 | /** 22 | * AI 对话 23 | * 24 | * @param modelId 25 | * @param message 26 | * @return 27 | */ 28 | public String doChat(long modelId, String message) { 29 | DevChatRequest devChatRequest = new DevChatRequest(); 30 | devChatRequest.setModelId(modelId); 31 | devChatRequest.setMessage(message); 32 | YuCongMingClient yuCongMingClient = new YuCongMingClient("xxxxxxxx", "xxxxxx"); 33 | BaseResponse response = yuCongMingClient.doChat(devChatRequest); 34 | if (response == null) { 35 | throw new BusinessException(ErrorCode.SYSTEM_ERROR, "AI 响应错误"); 36 | } 37 | return response.getData().getContent(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/AlibabaAIModel.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager; 2 | 3 | import cn.hutool.core.date.StopWatch; 4 | import com.aliyun.broadscope.bailian.sdk.AccessTokenClient; 5 | import com.aliyun.broadscope.bailian.sdk.ApplicationClient; 6 | import com.aliyun.broadscope.bailian.sdk.models.BaiLianConfig; 7 | import com.aliyun.broadscope.bailian.sdk.models.CompletionsRequest; 8 | import com.aliyun.broadscope.bailian.sdk.models.CompletionsResponse; 9 | import com.aliyun.broadscope.bailian.sdk.utils.UUIDGenerator; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.springframework.stereotype.Service; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | import java.util.concurrent.TimeUnit; 16 | import java.util.stream.Collectors; 17 | 18 | /** 19 | * 阿里AI模型 通义千问-Plus 工具类 20 | * 21 | * @author 小白条 22 | * @from 个人博客 23 | */ 24 | @Service 25 | @Slf4j 26 | public class AlibabaAIModel { 27 | // todo 替换你自己的密钥 阿里百炼官网:https://account.aliyun.com/login/login.html 28 | public static final String accessKeyId = "xxxx"; 29 | public static final String accessKeySecret = "xxxxxx"; 30 | public static final String agentKey = "xxxxx"; 31 | public static final String appId = "xxxxx"; 32 | /** 33 | * 阿里云百炼也支持调用侧自己维护上下文对话历史, 同时传入sessionId和history,会优先采用调用侧传入的上下文历史 34 | * CompletionsRequest.ChatQaPair chatQaPair = new CompletionsRequest.ChatQaPair("我想去北京", "北京的天气很不错"); 35 | * CompletionsRequest.ChatQaPair chatQaPair2 = new CompletionsRequest.ChatQaPair("北京有哪些景点", "北京有故宫、长城等"); 36 | * history.add(chatQaPair); 37 | * history.add(chatQaPair2); 38 | * request.setHistory(history); 39 | */ 40 | public static final List history = new ArrayList<>(); 41 | 42 | public static String doChatOnce(String prompt) { 43 | log.info("进入AI对话"); 44 | AccessTokenClient accessTokenClient = new AccessTokenClient(accessKeyId, accessKeySecret, agentKey); 45 | String token = accessTokenClient.getToken(); 46 | 47 | BaiLianConfig config = new BaiLianConfig() 48 | .setApiKey(token); 49 | CompletionsRequest request = new CompletionsRequest() 50 | .setAppId(appId) 51 | .setPrompt(prompt); 52 | 53 | ApplicationClient client = new ApplicationClient(config); 54 | CompletionsResponse response = client.completions(request); 55 | log.info("AI对话结束"); 56 | return response.getData().getText(); 57 | } 58 | 59 | public static String doChatWithHistory(String prompt, List recentHistory) { 60 | log.info("进入AI对话"); 61 | AccessTokenClient accessTokenClient = new AccessTokenClient(accessKeyId, accessKeySecret, agentKey); 62 | String token = accessTokenClient.getToken(); 63 | 64 | BaiLianConfig config = new BaiLianConfig() 65 | .setApiKey(token); 66 | // 通过sessionId 判断是否为同一个用户 67 | String sessionId = UUIDGenerator.generate(); 68 | // 将该用户最近的五条历史记录加入到绘画中 69 | recentHistory.forEach(item -> { 70 | CompletionsRequest.ChatQaPair chatQaPair = new CompletionsRequest.ChatQaPair(item[0], item[1]); 71 | history.add(chatQaPair); 72 | }); 73 | 74 | CompletionsRequest request = new CompletionsRequest() 75 | .setAppId(appId) 76 | .setPrompt(prompt) 77 | .setSessionId(sessionId) 78 | .setHistory(history); 79 | ApplicationClient client = new ApplicationClient(config); 80 | CompletionsResponse response = client.completions(request); 81 | log.info("AI对话结束"); 82 | return response.getData().getText(); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/GuavaRateLimiterManager.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager; 2 | 3 | import com.google.common.util.concurrent.RateLimiter; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.stereotype.Service; 6 | 7 | /** 8 | * @author 小白条 9 | * @from 个人博客 10 | */ 11 | @Service 12 | @Slf4j 13 | public class GuavaRateLimiterManager { 14 | public boolean doRateLimit(Long userId) { 15 | // 每秒允许的最大访问速率为1个许可 16 | RateLimiter rateLimiter = RateLimiter.create(1); 17 | if (rateLimiter.tryAcquire()) { 18 | // 可以进行处理的代码,表示限流允许通过 19 | log.info("用户id: " + userId + "请求一个令牌成功"); 20 | return true; 21 | } else { 22 | // 限流超过了速率限制的处理代码 23 | log.info("用户id: " + userId + "请求一个令牌失败"); 24 | return false; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/constant/SparkApiVersion.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.constant; 2 | 3 | /** 4 | * SparkApiVersion 5 | * 6 | * @author briqt 7 | * @date 2023/8/31 8 | */ 9 | public enum SparkApiVersion { 10 | 11 | /** 12 | * 1.5版本 13 | */ 14 | V1_5("v1.1", "https://spark-api.xf-yun.com/v1.1/chat", "general"), 15 | 16 | /** 17 | * 2.0版本 18 | */ 19 | V2_0("v2.1", "https://spark-api.xf-yun.com/v2.1/chat", "generalv2"), 20 | 21 | /** 22 | * 3.0版本 23 | */ 24 | V3_0("v3.1", "https://spark-api.xf-yun.com/v3.1/chat", "generalv3"), 25 | ; 26 | 27 | SparkApiVersion(String version, String url, String domain) { 28 | this.version = version; 29 | this.url = url; 30 | this.domain = domain; 31 | } 32 | 33 | private final String version; 34 | 35 | private final String url; 36 | 37 | private final String domain; 38 | 39 | public String getVersion() { 40 | return version; 41 | } 42 | 43 | public String getUrl() { 44 | return url; 45 | } 46 | 47 | public String getDomain() { 48 | return domain; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/constant/SparkErrorCode.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.constant; 2 | 3 | import java.util.LinkedHashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * SparkErrorCode 8 | * 9 | * @author briqt 10 | */ 11 | public class SparkErrorCode { 12 | public static final Map RESPONSE_ERROR_MAP = new LinkedHashMap<>(32); 13 | 14 | static { 15 | RESPONSE_ERROR_MAP.put(10000, "升级为ws出现错误"); 16 | RESPONSE_ERROR_MAP.put(10001, "通过ws读取用户的消息出错"); 17 | RESPONSE_ERROR_MAP.put(10002, "通过ws向用户发送消息错误"); 18 | RESPONSE_ERROR_MAP.put(10003, "用户的消息格式有错误"); 19 | RESPONSE_ERROR_MAP.put(10004, "用户数据的schema错误"); 20 | RESPONSE_ERROR_MAP.put(10005, "用户参数值有错误"); 21 | RESPONSE_ERROR_MAP.put(10006, "用户并发错误:当前用户已连接,同一用户不能多处同时连接"); 22 | RESPONSE_ERROR_MAP.put(10007, "用户流量受限:服务正在处理用户当前的问题,需等待处理完成后再发送新的请求"); 23 | RESPONSE_ERROR_MAP.put(10008, "服务容量不足,联系工作人员"); 24 | RESPONSE_ERROR_MAP.put(10009, "和引擎建立连接失败"); 25 | RESPONSE_ERROR_MAP.put(10010, "接收引擎数据的错误"); 26 | RESPONSE_ERROR_MAP.put(10011, "发送数据给引擎的错误"); 27 | RESPONSE_ERROR_MAP.put(10012, "引擎内部错误"); 28 | RESPONSE_ERROR_MAP.put(10013, "输入内容审核不通过,涉嫌违规,请重新调整输入内容"); 29 | RESPONSE_ERROR_MAP.put(10014, "输出内容涉及敏感信息,审核不通过,后续结果无法展示给用户"); 30 | RESPONSE_ERROR_MAP.put(10015, "appid在黑名单中"); 31 | RESPONSE_ERROR_MAP.put(10016, "appid授权类的错误。未开通此功能,未开通对应版本,token不足,并发超过授权等等"); 32 | RESPONSE_ERROR_MAP.put(10017, "清除历史失败"); 33 | RESPONSE_ERROR_MAP.put(10019, "本次会话内容有涉及违规信息的倾向"); 34 | RESPONSE_ERROR_MAP.put(10110, "服务忙,请稍后再试"); 35 | RESPONSE_ERROR_MAP.put(10163, "请求引擎的参数异常,引擎的schema检查不通过"); 36 | RESPONSE_ERROR_MAP.put(10222, "引擎网络异常"); 37 | RESPONSE_ERROR_MAP.put(10907, "token数量超过上限。对话历史+问题的字数太多,需要精简输入"); 38 | RESPONSE_ERROR_MAP.put(11200, "授权错误:该appId没有相关功能的授权或者业务量超过限制"); 39 | RESPONSE_ERROR_MAP.put(11201, "授权错误:日流控超限。超过当日最大访问量的限制"); 40 | RESPONSE_ERROR_MAP.put(11202, "授权错误:秒级流控超限。秒级并发超过授权路数限制"); 41 | RESPONSE_ERROR_MAP.put(11203, "授权错误:并发流控超限。并发路数超过授权路数限制"); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/constant/SparkMessageRole.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.constant; 2 | 3 | /** 4 | * 消息角色常量 5 | * 6 | * @author briqt 7 | */ 8 | public interface SparkMessageRole { 9 | 10 | /** 11 | * 用户 12 | */ 13 | String USER = "user"; 14 | 15 | /** 16 | * 机器人助手 17 | */ 18 | String ASSISTANT = "assistant"; 19 | 20 | /** 21 | * 系统指令 22 | */ 23 | String SYSTEM = "system"; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/exception/SparkException.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.exception; 2 | 3 | 4 | import com.book.backend.manager.constant.SparkErrorCode; 5 | 6 | /** 7 | * SparkException 8 | * 9 | * @author briqt 10 | */ 11 | public class SparkException extends RuntimeException { 12 | 13 | private static final long serialVersionUID = 3053312855506511893L; 14 | 15 | private Integer code; 16 | 17 | private String sid; 18 | 19 | public SparkException(Integer code, String message) { 20 | super(message); 21 | this.code = code; 22 | } 23 | 24 | public SparkException(Integer code, String message, Throwable t) { 25 | super(message, t); 26 | this.code = code; 27 | } 28 | 29 | public static SparkException bizFailed(Integer code) { 30 | String errorMessage = SparkErrorCode.RESPONSE_ERROR_MAP.get(code); 31 | if (null == errorMessage) { 32 | errorMessage = "未知的错误码"; 33 | } 34 | return new SparkException(code, errorMessage); 35 | } 36 | 37 | public Integer getCode() { 38 | return code; 39 | } 40 | 41 | public void setCode(Integer code) { 42 | this.code = code; 43 | } 44 | 45 | public String getSid() { 46 | return sid; 47 | } 48 | 49 | public void setSid(String sid) { 50 | this.sid = sid; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/listener/SparkConsoleListener.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.listener; 2 | 3 | import com.book.backend.manager.constant.SparkApiVersion; 4 | import com.book.backend.manager.model.SparkMessage; 5 | import com.book.backend.manager.model.request.SparkRequest; 6 | import com.book.backend.manager.model.response.SparkResponse; 7 | import com.book.backend.manager.model.response.SparkResponseFunctionCall; 8 | import com.book.backend.manager.model.response.SparkResponseUsage; 9 | import com.book.backend.manager.model.response.SparkTextUsage; 10 | import com.fasterxml.jackson.annotation.JsonInclude; 11 | import com.fasterxml.jackson.core.JsonProcessingException; 12 | import com.fasterxml.jackson.databind.ObjectMapper; 13 | 14 | import okhttp3.Response; 15 | import okhttp3.WebSocket; 16 | import org.jetbrains.annotations.NotNull; 17 | import org.slf4j.Logger; 18 | import org.slf4j.LoggerFactory; 19 | 20 | import java.util.List; 21 | import java.util.Map; 22 | 23 | /** 24 | * SparkConsoleListener 25 | * 26 | * @author briqt 27 | */ 28 | public class SparkConsoleListener extends SparkBaseListener { 29 | private static final Logger logger = LoggerFactory.getLogger(SparkConsoleListener.class); 30 | 31 | private final StringBuilder stringBuilder = new StringBuilder(); 32 | 33 | public ObjectMapper objectMapper = new ObjectMapper(); 34 | 35 | { 36 | objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 37 | } 38 | 39 | @Override 40 | public void onMessage(String content, SparkResponseUsage usage, Integer status, SparkRequest sparkRequest, SparkResponse sparkResponse, WebSocket webSocket) { 41 | stringBuilder.append(content); 42 | 43 | if (0 == status) { 44 | List messages = sparkRequest.getPayload().getMessage().getText(); 45 | try { 46 | SparkApiVersion apiVersion = sparkRequest.getApiVersion(); 47 | System.out.println("请求地址:" + apiVersion.getUrl()+" 版本:"+apiVersion.getVersion()); 48 | System.out.println("\n提问:" + objectMapper.writeValueAsString(messages)); 49 | } catch (JsonProcessingException e) { 50 | throw new RuntimeException(e); 51 | } 52 | System.out.println("\n收到回答:\n"); 53 | } 54 | 55 | try { 56 | System.out.println("--content:" + content + " --完整响应:" + objectMapper.writeValueAsString(sparkResponse)); 57 | } catch (JsonProcessingException e) { 58 | throw new RuntimeException(e); 59 | } 60 | 61 | if (2 == status) { 62 | System.out.println("\n完整回答:" + stringBuilder); 63 | SparkTextUsage textUsage = usage.getText(); 64 | System.out.println("\n回答结束;提问tokens:" + textUsage.getPromptTokens() 65 | + ",回答tokens:" + textUsage.getCompletionTokens() 66 | + ",总消耗tokens:" + textUsage.getTotalTokens()); 67 | } 68 | } 69 | 70 | @Override 71 | public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, Response response) { 72 | logger.error("讯飞星火api发生异常:", t); 73 | } 74 | 75 | /** 76 | * 收到functionCall调用此方法 77 | * 78 | * @param functionCall functionCall 79 | * @param usage tokens消耗统计 80 | * @param status 会话状态,取值为[0,1,2];0代表首次结果;1代表中间结果;2代表最后一个结果,当status为2时,webSocket连接会自动关闭 81 | * @param sparkRequest 本次会话的请求参数 82 | * @param sparkResponse 本次回调的响应数据 83 | * @param webSocket 本次会话的webSocket连接 84 | */ 85 | @Override 86 | public void onFunctionCall(SparkResponseFunctionCall functionCall, SparkResponseUsage usage, Integer status, SparkRequest sparkRequest, SparkResponse sparkResponse, WebSocket webSocket) { 87 | String functionCallName = functionCall.getName(); 88 | Map arguments = functionCall.getMapArguments(); 89 | 90 | // 在这里根据方法名和参数自行调用方法实现 91 | 92 | try { 93 | System.out.println("\n收到functionCall:方法名称:" + functionCallName + ",参数:" + objectMapper.writeValueAsString(arguments)); 94 | } catch (JsonProcessingException e) { 95 | throw new RuntimeException(e); 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/listener/SparkSyncChatListener.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.listener; 2 | 3 | 4 | import com.book.backend.manager.model.SparkSyncChatResponse; 5 | import com.book.backend.manager.model.request.SparkRequest; 6 | import com.book.backend.manager.model.response.SparkResponse; 7 | import com.book.backend.manager.model.response.SparkResponseFunctionCall; 8 | import com.book.backend.manager.model.response.SparkResponseUsage; 9 | import okhttp3.Response; 10 | import okhttp3.WebSocket; 11 | import org.jetbrains.annotations.NotNull; 12 | import org.slf4j.Logger; 13 | import org.slf4j.LoggerFactory; 14 | 15 | /** 16 | * SparkSyncChatListener 17 | * 18 | * @author briqt 19 | */ 20 | public class SparkSyncChatListener extends SparkBaseListener { 21 | private static final Logger logger = LoggerFactory.getLogger(SparkSyncChatListener.class); 22 | 23 | private final StringBuilder stringBuilder = new StringBuilder(); 24 | 25 | private final SparkSyncChatResponse sparkSyncChatResponse; 26 | 27 | public SparkSyncChatListener(SparkSyncChatResponse sparkSyncChatResponse) { 28 | this.sparkSyncChatResponse = sparkSyncChatResponse; 29 | } 30 | 31 | @Override 32 | public void onMessage(String content, SparkResponseUsage usage, Integer status, SparkRequest sparkRequest, SparkResponse sparkResponse, WebSocket webSocket) { 33 | stringBuilder.append(content); 34 | if (2 == status) { 35 | sparkSyncChatResponse.setContent(stringBuilder.toString()); 36 | sparkSyncChatResponse.setTextUsage(usage.getText()); 37 | sparkSyncChatResponse.setOk(true); 38 | } 39 | } 40 | 41 | @Override 42 | public void onFailure(@NotNull WebSocket webSocket, @NotNull Throwable t, Response response) { 43 | logger.error("讯飞星火api发生异常", t); 44 | sparkSyncChatResponse.setOk(true); 45 | sparkSyncChatResponse.setException(t); 46 | } 47 | 48 | /** 49 | * 收到functionCall调用此方法 50 | * 51 | * @param functionCall functionCall 52 | * @param sparkRequest 本次会话的请求参数 53 | * @param sparkResponse 本次回调的响应数据 54 | * @param webSocket 本次会话的webSocket连接 55 | */ 56 | @Override 57 | public void onFunctionCall(SparkResponseFunctionCall functionCall, SparkResponseUsage usage, Integer status, SparkRequest sparkRequest, SparkResponse sparkResponse, WebSocket webSocket) { 58 | if (2 == status) { 59 | sparkSyncChatResponse.setContent(stringBuilder.toString()); 60 | sparkSyncChatResponse.setTextUsage(usage.getText()); 61 | sparkSyncChatResponse.setFunctionCall(functionCall); 62 | sparkSyncChatResponse.setOk(true); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/SparkChatParameter.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * $.parameter.chat 9 | * 10 | * @author briqt 11 | */ 12 | public class SparkChatParameter implements Serializable { 13 | private static final long serialVersionUID = -1815416415486571475L; 14 | 15 | /** 16 | * 指定访问的领域
17 | * 必传,默认取值为 generalv2 18 | */ 19 | private String domain = "generalv2"; 20 | 21 | /** 22 | * 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高
23 | * 非必传,取值为[0,1],默认为0.5 24 | */ 25 | private Double temperature; 26 | 27 | /** 28 | * 模型回答的tokens的最大长度
29 | * 30 | * V1.5取值为[1,4096],默认为2048 31 | * V2.0取值为[1,8192],默认为2048。 32 | * V3.0取值为[1,8192],默认为2048。 33 | */ 34 | @JsonProperty("max_tokens") 35 | private Integer maxTokens; 36 | 37 | /** 38 | * 从k个候选中随机选择⼀个(⾮等概率)
39 | * 非必传,取值为[1,6],默认为4 40 | */ 41 | @JsonProperty("top_k") 42 | private Integer topK; 43 | 44 | /** 45 | * 用于关联用户会话
46 | * 非必传,需要保障用户下的唯一性 47 | */ 48 | @JsonProperty("chat_id") 49 | private String chatId; 50 | 51 | public static SparkChatParameter defaultParameter() { 52 | return new SparkChatParameter(); 53 | } 54 | 55 | public String getDomain() { 56 | return domain; 57 | } 58 | 59 | public void setDomain(String domain) { 60 | this.domain = domain; 61 | } 62 | 63 | public Double getTemperature() { 64 | return temperature; 65 | } 66 | 67 | public void setTemperature(Double temperature) { 68 | this.temperature = temperature; 69 | } 70 | 71 | public Integer getMaxTokens() { 72 | return maxTokens; 73 | } 74 | 75 | public void setMaxTokens(Integer maxTokens) { 76 | this.maxTokens = maxTokens; 77 | } 78 | 79 | public Integer getTopK() { 80 | return topK; 81 | } 82 | 83 | public void setTopK(Integer topK) { 84 | this.topK = topK; 85 | } 86 | 87 | public String getChatId() { 88 | return chatId; 89 | } 90 | 91 | public void setChatId(String chatId) { 92 | this.chatId = chatId; 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/SparkMessage.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model; 2 | 3 | 4 | import com.book.backend.manager.constant.SparkMessageRole; 5 | import com.book.backend.manager.model.response.SparkResponseFunctionCall; 6 | 7 | /** 8 | * 消息 9 | * 10 | * @author briqt 11 | */ 12 | public class SparkMessage { 13 | 14 | /** 15 | * 角色 16 | */ 17 | private String role; 18 | 19 | /** 20 | * 内容类型 21 | */ 22 | private String content_type; 23 | 24 | /** 25 | * 函数调用 26 | */ 27 | private SparkResponseFunctionCall function_call; 28 | 29 | /** 30 | * 内容 31 | */ 32 | private String content; 33 | 34 | /** 35 | * 响应时独有,请求入参请忽略 36 | */ 37 | private String index; 38 | 39 | /** 40 | * 创建用户消息 41 | * 42 | * @param content 内容 43 | */ 44 | public static SparkMessage userContent(String content) { 45 | return new SparkMessage(SparkMessageRole.USER, content); 46 | } 47 | 48 | /** 49 | * 创建机器人消息 50 | * 51 | * @param content 内容 52 | */ 53 | public static SparkMessage assistantContent(String content) { 54 | return new SparkMessage(SparkMessageRole.ASSISTANT, content); 55 | } 56 | 57 | /** 58 | * 创建system指令 59 | * @param content 内容 60 | */ 61 | public static SparkMessage systemContent(String content) { 62 | return new SparkMessage(SparkMessageRole.SYSTEM, content); 63 | } 64 | 65 | public SparkMessage() { 66 | } 67 | 68 | public SparkMessage(String role, String content) { 69 | this.role = role; 70 | this.content = content; 71 | } 72 | 73 | public String getRole() { 74 | return role; 75 | } 76 | 77 | public void setRole(String role) { 78 | this.role = role; 79 | } 80 | 81 | public String getContent() { 82 | return content; 83 | } 84 | 85 | public void setContent(String content) { 86 | this.content = content; 87 | } 88 | 89 | public String getIndex() { 90 | return index; 91 | } 92 | 93 | public String getContent_type() { 94 | return content_type; 95 | } 96 | 97 | public void setContent_type(String content_type) { 98 | this.content_type = content_type; 99 | } 100 | 101 | public SparkResponseFunctionCall getFunction_call() { 102 | return function_call; 103 | } 104 | 105 | public void setFunction_call(SparkResponseFunctionCall function_call) { 106 | this.function_call = function_call; 107 | } 108 | 109 | public void setIndex(String index) { 110 | this.index = index; 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/SparkSyncChatResponse.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model; 2 | 3 | 4 | 5 | import com.book.backend.manager.model.response.SparkResponseFunctionCall; 6 | import com.book.backend.manager.model.response.SparkTextUsage; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * SparkTextChatResponse 12 | * 13 | * @author briqt 14 | */ 15 | public class SparkSyncChatResponse implements Serializable { 16 | private static final long serialVersionUID = -6785055441385392782L; 17 | 18 | /** 19 | * 回答内容 20 | */ 21 | private String content; 22 | 23 | private SparkResponseFunctionCall functionCall; 24 | 25 | /** 26 | * tokens统计 27 | */ 28 | private SparkTextUsage textUsage; 29 | 30 | /** 31 | * 内部自用字段 32 | */ 33 | private boolean ok = false; 34 | 35 | private Throwable exception; 36 | 37 | public String getContent() { 38 | return content; 39 | } 40 | 41 | public void setContent(String content) { 42 | this.content = content; 43 | } 44 | 45 | public SparkResponseFunctionCall getFunctionCall() { 46 | return functionCall; 47 | } 48 | 49 | public void setFunctionCall(SparkResponseFunctionCall functionCall) { 50 | this.functionCall = functionCall; 51 | } 52 | 53 | public SparkTextUsage getTextUsage() { 54 | return textUsage; 55 | } 56 | 57 | public void setTextUsage(SparkTextUsage textUsage) { 58 | this.textUsage = textUsage; 59 | } 60 | 61 | public boolean isOk() { 62 | return ok; 63 | } 64 | 65 | public void setOk(boolean ok) { 66 | this.ok = ok; 67 | } 68 | 69 | public Throwable getException() { 70 | return exception; 71 | } 72 | 73 | public void setException(Throwable exception) { 74 | this.exception = exception; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/request/SparkRequest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.request; 2 | 3 | import com.book.backend.manager.constant.SparkApiVersion; 4 | import com.book.backend.manager.model.SparkRequestBuilder; 5 | import com.fasterxml.jackson.annotation.JsonIgnore; 6 | 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * SparkRequest 12 | * 13 | * @author briqt 14 | */ 15 | public class SparkRequest implements Serializable { 16 | private static final long serialVersionUID = 8142547165395379456L; 17 | 18 | private SparkRequestHeader header; 19 | 20 | private SparkRequestParameter parameter; 21 | 22 | private SparkRequestPayload payload; 23 | 24 | private transient SparkApiVersion apiVersion = SparkApiVersion.V3_0; 25 | 26 | public static SparkRequestBuilder builder() { 27 | return new SparkRequestBuilder(); 28 | } 29 | 30 | public SparkRequestHeader getHeader() { 31 | return header; 32 | } 33 | 34 | public void setHeader(SparkRequestHeader header) { 35 | this.header = header; 36 | } 37 | 38 | public SparkRequestParameter getParameter() { 39 | return parameter; 40 | } 41 | 42 | public void setParameter(SparkRequestParameter parameter) { 43 | this.parameter = parameter; 44 | } 45 | 46 | public SparkRequestPayload getPayload() { 47 | return payload; 48 | } 49 | 50 | public void setPayload(SparkRequestPayload payload) { 51 | this.payload = payload; 52 | } 53 | 54 | @JsonIgnore 55 | public SparkApiVersion getApiVersion() { 56 | return apiVersion; 57 | } 58 | 59 | @JsonIgnore 60 | public void setApiVersion(SparkApiVersion apiVersion) { 61 | this.apiVersion = apiVersion; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/request/SparkRequestHeader.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.request; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * $.header 9 | * 10 | * @author briqt 11 | */ 12 | public class SparkRequestHeader implements Serializable { 13 | private static final long serialVersionUID = -1426143090218924505L; 14 | 15 | /** 16 | * 应用appid,从开放平台控制台创建的应用中获取
17 | * 必传 18 | */ 19 | @JsonProperty("app_id") 20 | private String appId; 21 | 22 | /** 23 | * 每个用户的id,用于区分不同用户
24 | * 非必传,最大长度32 25 | */ 26 | private String uid; 27 | 28 | public String getAppId() { 29 | return appId; 30 | } 31 | 32 | public void setAppId(String appId) { 33 | this.appId = appId; 34 | } 35 | 36 | public String getUid() { 37 | return uid; 38 | } 39 | 40 | public void setUid(String uid) { 41 | this.uid = uid; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/request/SparkRequestMessage.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.request; 2 | 3 | 4 | import com.book.backend.manager.model.SparkMessage; 5 | 6 | import java.io.Serializable; 7 | import java.util.List; 8 | 9 | /** 10 | * $.payload.message 11 | * 12 | * @author briqt 13 | */ 14 | public class SparkRequestMessage implements Serializable { 15 | private static final long serialVersionUID = 6725091574720504980L; 16 | 17 | private List text; 18 | 19 | public SparkRequestMessage() { 20 | } 21 | 22 | public SparkRequestMessage(List text) { 23 | this.text = text; 24 | } 25 | 26 | public List getText() { 27 | return text; 28 | } 29 | 30 | public void setText(List text) { 31 | this.text = text; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/request/SparkRequestParameter.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.request; 2 | 3 | 4 | import com.book.backend.manager.model.SparkChatParameter; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * $.parameter 10 | * 11 | * @author briqt 12 | */ 13 | public class SparkRequestParameter implements Serializable { 14 | private static final long serialVersionUID = 4502096141480336425L; 15 | 16 | private SparkChatParameter chat; 17 | 18 | public SparkRequestParameter() { 19 | } 20 | 21 | public SparkRequestParameter(SparkChatParameter chat) { 22 | this.chat = chat; 23 | } 24 | 25 | public SparkChatParameter getChat() { 26 | return chat; 27 | } 28 | 29 | public void setChat(SparkChatParameter chat) { 30 | this.chat = chat; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/request/SparkRequestPayload.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.request; 2 | 3 | 4 | import com.book.backend.manager.model.request.function.SparkRequestFunctions; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * $.payload 10 | * 11 | * @author briqt 12 | */ 13 | public class SparkRequestPayload implements Serializable { 14 | private static final long serialVersionUID = 2084163918219863102L; 15 | 16 | private SparkRequestMessage message; 17 | 18 | private SparkRequestFunctions functions; 19 | 20 | public SparkRequestPayload() { 21 | } 22 | 23 | public SparkRequestPayload(SparkRequestMessage message) { 24 | this.message = message; 25 | } 26 | 27 | public SparkRequestPayload(SparkRequestMessage message, SparkRequestFunctions functions) { 28 | this.message = message; 29 | this.functions = functions; 30 | } 31 | 32 | public SparkRequestMessage getMessage() { 33 | return message; 34 | } 35 | 36 | public void setMessage(SparkRequestMessage message) { 37 | this.message = message; 38 | } 39 | 40 | public SparkRequestFunctions getFunctions() { 41 | return functions; 42 | } 43 | 44 | public void setFunctions(SparkRequestFunctions functions) { 45 | this.functions = functions; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/request/function/SparkFunctionBuilder.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.request.function; 2 | 3 | import java.util.ArrayList; 4 | import java.util.LinkedHashMap; 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | /** 9 | * SparkFunctionBuilder 10 | * 11 | * @author briqt 12 | * @date 2023/11/25 13 | */ 14 | public class SparkFunctionBuilder { 15 | 16 | private final SparkRequestFunctionMessage sparkRequestFunctionMessage; 17 | 18 | public SparkFunctionBuilder() { 19 | sparkRequestFunctionMessage = new SparkRequestFunctionMessage(); 20 | sparkRequestFunctionMessage.setParameters(new SparkRequestFunctionParameters("object", new LinkedHashMap<>(), new ArrayList<>())); 21 | } 22 | 23 | public static SparkFunctionBuilder functionName(String name) { 24 | return new SparkFunctionBuilder().name(name); 25 | } 26 | 27 | /** 28 | * 必传;function名称;用户输入命中后,会返回该名称 29 | */ 30 | public SparkFunctionBuilder name(String name) { 31 | sparkRequestFunctionMessage.setName(name); 32 | return this; 33 | } 34 | 35 | /** 36 | * 必传;function功能描述;描述function功能即可,越详细越有助于大模型理解该function 37 | */ 38 | public SparkFunctionBuilder description(String description) { 39 | sparkRequestFunctionMessage.setDescription(description); 40 | return this; 41 | } 42 | 43 | /** 44 | * 必传;参数类型;默认值:object 45 | */ 46 | public SparkFunctionBuilder parameterType(String type) { 47 | sparkRequestFunctionMessage.getParameters().setType(type); 48 | return this; 49 | } 50 | 51 | /** 52 | * 必传;参数信息描述;该内容由用户定义,命中该方法时需要返回哪些参数 53 | * 54 | * @param name 参数名称 55 | * @param type 参数类型 56 | * @param description 参数信息描述 57 | */ 58 | public SparkFunctionBuilder addParameterProperty(String name, String type, String description) { 59 | sparkRequestFunctionMessage.getParameters().getProperties().put(name, new SparkRequestFunctionProperty(type, description)); 60 | return this; 61 | } 62 | 63 | /** 64 | * 必须返回的参数列表 65 | */ 66 | public SparkFunctionBuilder addParameterRequired(String... name) { 67 | for (String s : name) { 68 | sparkRequestFunctionMessage.getParameters().getRequired().add(s); 69 | } 70 | return this; 71 | } 72 | 73 | public SparkFunctionBuilder parameters(String type, Map properties, List required) { 74 | sparkRequestFunctionMessage.setParameters(new SparkRequestFunctionParameters(type, properties, required)); 75 | return this; 76 | } 77 | 78 | public SparkRequestFunctionMessage build() { 79 | return sparkRequestFunctionMessage; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/request/function/SparkRequestFunctionMessage.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.request.function; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * $.payload.functions.text 7 | * 8 | * @author briqt 9 | */ 10 | public class SparkRequestFunctionMessage implements Serializable { 11 | 12 | private static final long serialVersionUID = 6587302404547694700L; 13 | 14 | /** 15 | * 必传;function名称;用户输入命中后,会返回该名称 16 | */ 17 | private String name; 18 | 19 | /** 20 | * 必传;function功能描述;描述function功能即可,越详细越有助于大模型理解该function 21 | */ 22 | private String description; 23 | 24 | /** 25 | * 必传;function参数列表 26 | */ 27 | private SparkRequestFunctionParameters parameters; 28 | 29 | public SparkRequestFunctionMessage() { 30 | } 31 | 32 | public SparkRequestFunctionMessage(String name, String description, SparkRequestFunctionParameters parameters) { 33 | this.name = name; 34 | this.description = description; 35 | this.parameters = parameters; 36 | } 37 | 38 | public String getName() { 39 | return name; 40 | } 41 | 42 | public void setName(String name) { 43 | this.name = name; 44 | } 45 | 46 | public String getDescription() { 47 | return description; 48 | } 49 | 50 | public void setDescription(String description) { 51 | this.description = description; 52 | } 53 | 54 | public SparkRequestFunctionParameters getParameters() { 55 | return parameters; 56 | } 57 | 58 | public void setParameters(SparkRequestFunctionParameters parameters) { 59 | this.parameters = parameters; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/request/function/SparkRequestFunctionParameters.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.request.function; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | /** 8 | * $.payload.functions.text 9 | * 10 | * @author briqt 11 | */ 12 | public class SparkRequestFunctionParameters implements Serializable { 13 | 14 | private static final long serialVersionUID = 1079801431462837232L; 15 | 16 | /** 17 | * 必传;参数类型 18 | */ 19 | private String type; 20 | 21 | /** 22 | * 必传;参数信息描述;该内容由用户定义,命中该方法时需要返回哪些参数
23 | * key:参数名称
24 | * value:参数信息描述 25 | */ 26 | private Map properties; 27 | 28 | /** 29 | * 必传;必须返回的参数列表;该内容由用户定义,命中方法时必须返回的字段;properties中的key 30 | */ 31 | private List required; 32 | 33 | public SparkRequestFunctionParameters() { 34 | } 35 | 36 | public SparkRequestFunctionParameters(String type, Map properties, List required) { 37 | this.type = type; 38 | this.properties = properties; 39 | this.required = required; 40 | } 41 | 42 | public String getType() { 43 | return type; 44 | } 45 | 46 | public void setType(String type) { 47 | this.type = type; 48 | } 49 | 50 | public Map getProperties() { 51 | return properties; 52 | } 53 | 54 | public void setProperties(Map properties) { 55 | this.properties = properties; 56 | } 57 | 58 | public List getRequired() { 59 | return required; 60 | } 61 | 62 | public void setRequired(List required) { 63 | this.required = required; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/request/function/SparkRequestFunctionProperty.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.request.function; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * $.payload.functions.text.parameters.properties.* 7 | * 8 | * @author briqt 9 | */ 10 | public class SparkRequestFunctionProperty implements Serializable { 11 | 12 | private static final long serialVersionUID = -343415637582994606L; 13 | 14 | /** 15 | * 必传;参数信息描述;该内容由用户定义,需要返回的参数是什么类型 16 | */ 17 | private String type; 18 | 19 | /** 20 | * 必传;参数详细描述;该内容由用户定义,需要返回的参数的具体描述 21 | */ 22 | private String description; 23 | 24 | public SparkRequestFunctionProperty() { 25 | } 26 | 27 | public SparkRequestFunctionProperty(String type, String description) { 28 | this.type = type; 29 | this.description = description; 30 | } 31 | 32 | public String getType() { 33 | return type; 34 | } 35 | 36 | public void setType(String type) { 37 | this.type = type; 38 | } 39 | 40 | public String getDescription() { 41 | return description; 42 | } 43 | 44 | public void setDescription(String description) { 45 | this.description = description; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/request/function/SparkRequestFunctions.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.request.function; 2 | 3 | import java.io.Serializable; 4 | import java.util.List; 5 | 6 | /** 7 | * $.payload.functions 8 | * 9 | * @author briqt 10 | */ 11 | public class SparkRequestFunctions implements Serializable { 12 | 13 | private static final long serialVersionUID = -7696196392354475586L; 14 | 15 | private List text; 16 | 17 | public SparkRequestFunctions() { 18 | } 19 | 20 | public SparkRequestFunctions(List text) { 21 | this.text = text; 22 | } 23 | 24 | public List getText() { 25 | return text; 26 | } 27 | 28 | public void setText(List text) { 29 | this.text = text; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/response/SparkResponse.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.response; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * SparkResponse 7 | * 8 | * @author briqt 9 | */ 10 | public class SparkResponse implements Serializable { 11 | private static final long serialVersionUID = 886720558849587945L; 12 | 13 | private SparkResponseHeader header; 14 | 15 | private SparkResponsePayload payload; 16 | 17 | public SparkResponseHeader getHeader() { 18 | return header; 19 | } 20 | 21 | public void setHeader(SparkResponseHeader header) { 22 | this.header = header; 23 | } 24 | 25 | public SparkResponsePayload getPayload() { 26 | return payload; 27 | } 28 | 29 | public void setPayload(SparkResponsePayload payload) { 30 | this.payload = payload; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/response/SparkResponseChoices.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.response; 2 | 3 | import com.book.backend.manager.model.SparkMessage; 4 | 5 | import java.io.Serializable; 6 | import java.util.List; 7 | 8 | /** 9 | * $.payload.choices 10 | * 11 | * @author briqt 12 | */ 13 | public class SparkResponseChoices implements Serializable { 14 | private static final long serialVersionUID = 3908073548592366629L; 15 | 16 | /** 17 | * 文本响应状态,取值为[0,1,2]; 0代表首个文本结果;1代表中间文本结果;2代表最后一个文本结果 18 | */ 19 | private Integer status; 20 | 21 | /** 22 | * 返回的数据序号,取值为[0,9999999] 23 | */ 24 | private Integer seq; 25 | 26 | /** 27 | * 消息列表 28 | */ 29 | private List text; 30 | 31 | public Integer getStatus() { 32 | return status; 33 | } 34 | 35 | public void setStatus(Integer status) { 36 | this.status = status; 37 | } 38 | 39 | public Integer getSeq() { 40 | return seq; 41 | } 42 | 43 | public void setSeq(Integer seq) { 44 | this.seq = seq; 45 | } 46 | 47 | public List getText() { 48 | return text; 49 | } 50 | 51 | public void setText(List text) { 52 | this.text = text; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/response/SparkResponseFunctionCall.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.response; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import com.fasterxml.jackson.core.JsonProcessingException; 5 | import com.fasterxml.jackson.core.type.TypeReference; 6 | import com.fasterxml.jackson.databind.ObjectMapper; 7 | 8 | import java.io.Serializable; 9 | import java.util.Map; 10 | 11 | /** 12 | * SparkResponseFunctionCall 13 | * 14 | * @author briqt 15 | * @date 2023/11/25 16 | */ 17 | public class SparkResponseFunctionCall implements Serializable { 18 | private static final long serialVersionUID = -1586729944571910329L; 19 | private final ObjectMapper objectMapper = new ObjectMapper(); 20 | 21 | { 22 | objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 23 | } 24 | 25 | private String arguments; 26 | 27 | private String name; 28 | 29 | public String getArguments() { 30 | return arguments; 31 | } 32 | 33 | public void setArguments(String arguments) { 34 | this.arguments = arguments; 35 | } 36 | 37 | public String getName() { 38 | return name; 39 | } 40 | 41 | public void setName(String name) { 42 | this.name = name; 43 | } 44 | 45 | public Map getMapArguments() { 46 | try { 47 | return objectMapper.readValue(arguments, new TypeReference>() { 48 | }); 49 | } catch (JsonProcessingException e) { 50 | throw new RuntimeException(e); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/response/SparkResponseHeader.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.response; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * $.header 7 | * 8 | * @author briqt 9 | */ 10 | public class SparkResponseHeader implements Serializable { 11 | private static final long serialVersionUID = -2828057068263022569L; 12 | 13 | /** 14 | * 错误码,0表示正常,非0表示出错;详细释义可在接口说明文档最后的错误码说明了解 15 | */ 16 | private Integer code; 17 | 18 | /** 19 | * 会话状态,取值为[0,1,2];0代表首次结果;1代表中间结果;2代表最后一个结果 20 | */ 21 | private Integer status; 22 | 23 | /** 24 | * 会话是否成功的描述信息 25 | */ 26 | private String message; 27 | 28 | /** 29 | * 会话的唯一id,用于讯飞技术人员查询服务端会话日志使用,出现调用错误时建议留存该字段 30 | */ 31 | private String sid; 32 | 33 | public Integer getCode() { 34 | return code; 35 | } 36 | 37 | public void setCode(Integer code) { 38 | this.code = code; 39 | } 40 | 41 | public Integer getStatus() { 42 | return status; 43 | } 44 | 45 | public void setStatus(Integer status) { 46 | this.status = status; 47 | } 48 | 49 | public String getMessage() { 50 | return message; 51 | } 52 | 53 | public void setMessage(String message) { 54 | this.message = message; 55 | } 56 | 57 | public String getSid() { 58 | return sid; 59 | } 60 | 61 | public void setSid(String sid) { 62 | this.sid = sid; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/response/SparkResponsePayload.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.response; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * $.payload 7 | * 8 | * @author briqt 9 | */ 10 | public class SparkResponsePayload implements Serializable { 11 | private static final long serialVersionUID = 8090192271782303700L; 12 | 13 | private SparkResponseChoices choices; 14 | 15 | private SparkResponseUsage usage; 16 | 17 | public SparkResponseChoices getChoices() { 18 | return choices; 19 | } 20 | 21 | public void setChoices(SparkResponseChoices choices) { 22 | this.choices = choices; 23 | } 24 | 25 | public SparkResponseUsage getUsage() { 26 | return usage; 27 | } 28 | 29 | public void setUsage(SparkResponseUsage usage) { 30 | this.usage = usage; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/response/SparkResponseUsage.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.response; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * $.payload.usage 7 | * 8 | * @author briqt 9 | */ 10 | public class SparkResponseUsage implements Serializable { 11 | private static final long serialVersionUID = 2181817132625461079L; 12 | 13 | private SparkTextUsage text; 14 | 15 | public SparkTextUsage getText() { 16 | return text; 17 | } 18 | 19 | public void setText(SparkTextUsage text) { 20 | this.text = text; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/manager/model/response/SparkTextUsage.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.manager.model.response; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | 5 | import java.io.Serializable; 6 | 7 | 8 | /** 9 | * $.payload.usage.text 10 | * 11 | * @author briqt 12 | */ 13 | public class SparkTextUsage implements Serializable { 14 | private static final long serialVersionUID = 8295933047877077971L; 15 | 16 | /** 17 | * 包含历史问题的总tokens大小(提问tokens大小) 18 | */ 19 | @JsonProperty("prompt_tokens") 20 | private Integer promptTokens; 21 | 22 | /** 23 | * 回答的tokens大小 24 | */ 25 | @JsonProperty("completion_tokens") 26 | private Integer completionTokens; 27 | 28 | /** 29 | * prompt_tokens和completion_tokens的和,也是本次交互计费的tokens大小 30 | */ 31 | @JsonProperty("total_tokens") 32 | private Integer totalTokens; 33 | 34 | /** 35 | * 保留字段,可忽略 36 | */ 37 | @JsonProperty("question_tokens") 38 | private Integer questionTokens; 39 | 40 | public Integer getPromptTokens() { 41 | return promptTokens; 42 | } 43 | 44 | public void setPromptTokens(Integer promptTokens) { 45 | this.promptTokens = promptTokens; 46 | } 47 | 48 | public Integer getCompletionTokens() { 49 | return completionTokens; 50 | } 51 | 52 | public void setCompletionTokens(Integer completionTokens) { 53 | this.completionTokens = completionTokens; 54 | } 55 | 56 | public Integer getTotalTokens() { 57 | return totalTokens; 58 | } 59 | 60 | public void setTotalTokens(Integer totalTokens) { 61 | this.totalTokens = totalTokens; 62 | } 63 | 64 | public Integer getQuestionTokens() { 65 | return questionTokens; 66 | } 67 | 68 | public void setQuestionTokens(Integer questionTokens) { 69 | this.questionTokens = questionTokens; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/AdminsMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.Admins; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author 程序员小白条 8 | * @description 针对表【t_admins】的数据库操作Mapper 9 | * @createDate 2023-02-03 20:01:01 10 | * @Entity com.book.backend.pojo.Admins 11 | */ 12 | public interface AdminsMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/AiIntelligentMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.AiIntelligent; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author xiaobaitiao 8 | * @description 针对表【t_ai_intelligent】的数据库操作Mapper 9 | * @createDate 2023-08-27 18:44:26 10 | * @Entity com.book.backend.pojo.AiIntelligent 11 | */ 12 | public interface AiIntelligentMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/BookAdminsMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.BookAdmins; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author 程序员小白条 8 | * @description 针对表【t_book_admins】的数据库操作Mapper 9 | * @createDate 2023-02-04 16:55:39 10 | * @Entity com.book.backend.pojo.BookAdmins 11 | */ 12 | public interface BookAdminsMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/BookRuleMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.BookRule; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author 程序员小白条 8 | * @description 针对表【t_book_rule】的数据库操作Mapper 9 | * @createDate 2023-02-05 15:11:20 10 | * @Entity com.book.backend.pojo.BookRule 11 | */ 12 | public interface BookRuleMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/BookTypeMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.BookType; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author 程序员小白条 8 | * @description 针对表【t_book_type】的数据库操作Mapper 9 | * @createDate 2023-02-04 18:51:24 10 | * @Entity com.book.backend.pojo.BookType 11 | */ 12 | public interface BookTypeMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/BooksBorrowMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.BooksBorrow; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author 程序员小白条 8 | * @description 针对表【t_books_borrow】的数据库操作Mapper 9 | * @createDate 2023-02-05 18:53:07 10 | * @Entity com.book.backend.pojo.BooksBorrow 11 | */ 12 | public interface BooksBorrowMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/BooksMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.Books; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author 程序员小白条 8 | * @description 针对表【t_books】的数据库操作Mapper 9 | * @createDate 2023-02-04 18:07:43 10 | * @Entity com.book.backend.pojo.Books 11 | */ 12 | public interface BooksMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/ChartMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.Chart; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author xiaobaitiao 8 | * @description 针对表【t_chart(图表信息表)】的数据库操作Mapper 9 | * @createDate 2023-08-30 11:05:22 10 | * @Entity com.book.backend.pojo.Chart 11 | */ 12 | public interface ChartMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/ChatMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.Chat; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author xiaobaitiao 8 | * @description 针对表【t_chat】的数据库操作Mapper 9 | * @createDate 2023-11-27 19:29:21 10 | * @Entity com.book.backend.pojo.Chat 11 | */ 12 | public interface ChatMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/CommentMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.Comment; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author 程序员小白条 8 | * @description 针对表【t_comment】的数据库操作Mapper 9 | * @createDate 2023-02-06 19:19:20 10 | * @Entity com.book.backend.pojo.Comment 11 | */ 12 | public interface CommentMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/NoticeMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.Notice; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author 程序员小白条 8 | * @description 针对表【t_notice】的数据库操作Mapper 9 | * @createDate 2023-02-05 16:14:03 10 | * @Entity com.book.backend.pojo.Notice 11 | */ 12 | public interface NoticeMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/UserInterfaceInfoMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.UserInterfaceInfo; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author xiaobaitiao 8 | * @description 针对表【t_user_interface_info】的数据库操作Mapper 9 | * @createDate 2023-09-03 19:42:54 10 | * @Entity com.book.backend.pojo.UserInterfaceInfo 11 | */ 12 | public interface UserInterfaceInfoMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/UsersMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.Users; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | /** 8 | * @author 程序员小白条 9 | * @description 针对表【t_users】的数据库操作Mapper 10 | * @createDate 2023-02-02 16:20:02 11 | * @Entity com.book.backend.pojo.Users 12 | */ 13 | @Mapper 14 | public interface UsersMapper extends BaseMapper { 15 | 16 | } 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/mapper/ViolationMapper.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.mapper; 2 | 3 | import com.book.backend.pojo.Violation; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author 程序员小白条 8 | * @description 针对表【t_violation】的数据库操作Mapper 9 | * @createDate 2023-02-06 16:31:20 10 | * @Entity com.book.backend.pojo.Violation 11 | */ 12 | public interface ViolationMapper extends BaseMapper { 13 | 14 | } 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/Admins.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * @TableName t_admins 12 | */ 13 | @TableName(value ="t_admins") 14 | @Data 15 | public class Admins implements Serializable { 16 | /** 17 | * 管理员表的唯一标识 18 | */ 19 | @TableId(type = IdType.AUTO) 20 | private Long adminId; 21 | 22 | /** 23 | * 用户名 24 | */ 25 | private String username; 26 | 27 | /** 28 | * 密码(MD5加密) 29 | */ 30 | private String password; 31 | 32 | /** 33 | * 管理员真实姓名 34 | */ 35 | private String adminName; 36 | 37 | /** 38 | * 1表示可用 0表示禁用 39 | */ 40 | private Integer status; 41 | 42 | /** 43 | * 创建时间 44 | */ 45 | @TableField(fill = FieldFill.INSERT) 46 | private String createTime; 47 | 48 | /** 49 | * 更新时间 50 | */ 51 | @TableField(fill = FieldFill.INSERT_UPDATE) 52 | private String updateTime; 53 | 54 | @TableField(exist = false) 55 | private static final long serialVersionUID = 1L; 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/AiIntelligent.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * @TableName t_ai_intelligent 12 | */ 13 | @TableName(value ="t_ai_intelligent") 14 | @Data 15 | public class AiIntelligent implements Serializable { 16 | /** 17 | * 18 | */ 19 | @TableId(type = IdType.ASSIGN_ID) 20 | private Long id; 21 | 22 | /** 23 | * 用户输入信息 24 | */ 25 | private String inputMessage; 26 | /** 27 | * AI生成的信息 28 | */ 29 | private String aiResult; 30 | 31 | /** 32 | * 用户id,标识是哪个用户的信息 可以为Null 33 | */ 34 | private Long userId; 35 | 36 | /** 37 | * 创建时间 38 | */ 39 | @TableField(fill = FieldFill.INSERT) 40 | private String createTime; 41 | 42 | /** 43 | * 更新时间 44 | */ 45 | @TableField(fill = FieldFill.INSERT_UPDATE) 46 | private String updateTime; 47 | 48 | @TableField(exist = false) 49 | private static final long serialVersionUID = 1L; 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/BookAdmins.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * @TableName t_book_admins 12 | */ 13 | @TableName(value ="t_book_admins") 14 | @Data 15 | public class BookAdmins implements Serializable { 16 | /** 17 | * 图书管理员表的唯一标识 18 | */ 19 | @TableId(type = IdType.AUTO) 20 | private Long bookAdminId; 21 | 22 | /** 23 | * 用户名 24 | */ 25 | private String username; 26 | 27 | /** 28 | * 密码md5加密 29 | */ 30 | private String password; 31 | 32 | /** 33 | * 图书管理员真实姓名 34 | */ 35 | private String bookAdminName; 36 | 37 | /** 38 | * 1表示可用 0表示禁用 39 | */ 40 | private Integer status; 41 | 42 | /** 43 | * 电子邮箱 44 | */ 45 | private String email; 46 | 47 | /** 48 | * 创建时间 49 | */ 50 | @TableField(fill = FieldFill.INSERT) 51 | private String createTime; 52 | 53 | /** 54 | * 更新时间 55 | */ 56 | @TableField(fill = FieldFill.INSERT_UPDATE) 57 | private String updateTime; 58 | 59 | @TableField(exist = false) 60 | private static final long serialVersionUID = 1L; 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/BookRule.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * @TableName t_book_rule 12 | */ 13 | @TableName(value ="t_book_rule") 14 | @Data 15 | public class BookRule implements Serializable { 16 | /** 17 | * 借阅规则记录的唯一标识 18 | */ 19 | @TableId(type = IdType.AUTO) 20 | private Integer ruleId; 21 | 22 | /** 23 | * 借阅规则编号 24 | */ 25 | private Integer bookRuleId; 26 | 27 | /** 28 | * 借阅天数 29 | */ 30 | private Integer bookDays; 31 | 32 | /** 33 | * 限制借阅的本数 34 | */ 35 | private Integer bookLimitNumber; 36 | 37 | /** 38 | * 限制的图书馆 39 | */ 40 | private String bookLimitLibrary; 41 | 42 | /** 43 | * 图书借阅后每天逾期费用 44 | */ 45 | private Double bookOverdueFee; 46 | 47 | /** 48 | * 创建时间 49 | */ 50 | @TableField(fill = FieldFill.INSERT) 51 | private String createTime; 52 | 53 | /** 54 | * 更新时间 55 | */ 56 | @TableField(fill = FieldFill.INSERT_UPDATE) 57 | private String updateTime; 58 | 59 | @TableField(exist = false) 60 | private static final long serialVersionUID = 1L; 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/BookType.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * @TableName t_book_type 12 | */ 13 | @TableName(value ="t_book_type") 14 | @Data 15 | public class BookType implements Serializable { 16 | /** 17 | * 图书类别唯一标识 18 | */ 19 | @TableId(type = IdType.AUTO) 20 | private Integer typeId; 21 | 22 | /** 23 | * 借阅类别的昵称 24 | */ 25 | private String typeName; 26 | 27 | /** 28 | * 借阅类别的描述 29 | */ 30 | private String typeContent; 31 | 32 | /** 33 | * 创建时间 34 | */ 35 | @TableField(fill = FieldFill.INSERT) 36 | private String createTime; 37 | 38 | /** 39 | * 更新时间 40 | */ 41 | @TableField(fill = FieldFill.INSERT_UPDATE) 42 | private String updateTime; 43 | 44 | @TableField(exist = false) 45 | private static final long serialVersionUID = 1L; 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/Books.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * @TableName t_books 12 | */ 13 | @TableName(value ="t_books") 14 | @Data 15 | public class Books implements Serializable { 16 | /** 17 | * 图书表唯一标识 18 | */ 19 | @TableId(type = IdType.AUTO) 20 | private Integer bookId; 21 | 22 | /** 23 | * 图书编号 图书的唯一标识 24 | */ 25 | private Long bookNumber; 26 | 27 | /** 28 | * 图书名称 29 | */ 30 | private String bookName; 31 | 32 | /** 33 | * 图书作者 34 | */ 35 | private String bookAuthor; 36 | 37 | /** 38 | * 图书所在图书馆名称 39 | */ 40 | private String bookLibrary; 41 | 42 | /** 43 | * 图书类别 44 | */ 45 | private String bookType; 46 | 47 | /** 48 | * 图书位置 49 | */ 50 | private String bookLocation; 51 | 52 | /** 53 | * 图书状态 54 | */ 55 | private String bookStatus; 56 | 57 | /** 58 | * 图书描述 59 | */ 60 | private String bookDescription; 61 | 62 | /** 63 | * 创建时间 64 | */ 65 | @TableField(fill = FieldFill.INSERT) 66 | private String createTime; 67 | 68 | /** 69 | * 更新时间 70 | */ 71 | @TableField(fill = FieldFill.INSERT_UPDATE) 72 | private String updateTime; 73 | 74 | @TableField(exist = false) 75 | private static final long serialVersionUID = 1L; 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/BooksBorrow.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.time.LocalDateTime; 7 | import java.util.Date; 8 | 9 | import com.fasterxml.jackson.annotation.JsonFormat; 10 | import lombok.Data; 11 | import org.springframework.format.annotation.DateTimeFormat; 12 | 13 | /** 14 | * 15 | * @TableName t_books_borrow 16 | */ 17 | @TableName(value ="t_books_borrow") 18 | @Data 19 | public class BooksBorrow implements Serializable { 20 | /** 21 | * 借阅表唯一标识 22 | */ 23 | @TableId(type = IdType.AUTO) 24 | private Integer borrowId; 25 | 26 | /** 27 | * 借阅证编号 固定11位随机生成 用户和图书关联的唯一标识 28 | */ 29 | private Long cardNumber; 30 | 31 | /** 32 | * 图书编号 图书唯一标识 33 | */ 34 | private Long bookNumber; 35 | 36 | /** 37 | * 借阅日期 38 | */ 39 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 40 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 41 | private LocalDateTime borrowDate; 42 | 43 | /** 44 | * 截止日期 45 | */ 46 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 47 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 48 | private LocalDateTime closeDate; 49 | 50 | /** 51 | * 归还日期 52 | */ 53 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 54 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 55 | private LocalDateTime returnDate; 56 | 57 | /** 58 | * 创建时间 59 | */ 60 | @TableField(fill = FieldFill.INSERT) 61 | private String createTime; 62 | 63 | /** 64 | * 更新时间 65 | */ 66 | @TableField(fill = FieldFill.INSERT_UPDATE) 67 | private String updateTime; 68 | 69 | @TableField(exist = false) 70 | private static final long serialVersionUID = 1L; 71 | 72 | public BooksBorrow(Integer borrowId, Long cardNumber, Long bookNumber, LocalDateTime borrowDate, LocalDateTime closeDate, LocalDateTime returnDate, String createTime, String updateTime) { 73 | this.borrowId = borrowId; 74 | this.cardNumber = cardNumber; 75 | this.bookNumber = bookNumber; 76 | this.borrowDate = borrowDate; 77 | this.closeDate = closeDate; 78 | this.returnDate = returnDate; 79 | this.createTime = createTime; 80 | this.updateTime = updateTime; 81 | } 82 | 83 | public BooksBorrow() { 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/Chart.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 图表信息表 11 | * @TableName t_chart 12 | */ 13 | @TableName(value ="t_chart") 14 | @Data 15 | public class Chart implements Serializable { 16 | /** 17 | * id 18 | */ 19 | @TableId(type = IdType.ASSIGN_ID) 20 | private Long id; 21 | 22 | /** 23 | * 图标名称 24 | */ 25 | private String name; 26 | 27 | /** 28 | * 分析目标 29 | */ 30 | private String goal; 31 | 32 | /** 33 | * 图标数据 34 | */ 35 | private String chartData; 36 | 37 | /** 38 | * 图标类型 39 | */ 40 | private String chartType; 41 | 42 | /** 43 | * 生成的图标数据 44 | */ 45 | private String genChart; 46 | 47 | /** 48 | * 生成的分析结论 49 | */ 50 | private String genResult; 51 | 52 | /** 53 | * wait,running,succeed,failed 54 | */ 55 | private String status; 56 | 57 | /** 58 | * 执行信息 59 | */ 60 | private String execMessage; 61 | 62 | /** 63 | * 创建管理员 id 64 | */ 65 | private Long adminId; 66 | 67 | /** 68 | * 创建时间 69 | */ 70 | @TableField(fill = FieldFill.INSERT) 71 | private String createTime; 72 | 73 | /** 74 | * 更新时间 75 | */ 76 | @TableField(fill = FieldFill.INSERT_UPDATE) 77 | private String updateTime; 78 | 79 | /** 80 | * 是否删除 81 | */ 82 | @TableLogic 83 | private Integer isDelete; 84 | 85 | @TableField(exist = false) 86 | private static final long serialVersionUID = 1L; 87 | } 88 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/Chat.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * @TableName t_chat 12 | */ 13 | @TableName(value ="t_chat") 14 | @Data 15 | public class Chat implements Serializable { 16 | /** 17 | * 聊天记录id 18 | 19 | */ 20 | @TableId(type = IdType.AUTO) 21 | private Long id; 22 | 23 | /** 24 | * 发送消息者id 25 | 26 | */ 27 | private Long fromId; 28 | 29 | /** 30 | * 接受消息者id,可以为空 31 | */ 32 | private Long toId; 33 | 34 | /** 35 | * 消息内容 36 | */ 37 | private String text; 38 | 39 | /** 40 | * 聊天类型 1-私聊 2-群聊 41 | */ 42 | private Integer chatType; 43 | 44 | /** 45 | * 创建时间 46 | */ 47 | @TableField(fill = FieldFill.INSERT) 48 | private String createTime; 49 | 50 | /** 51 | * 更新时间 52 | */ 53 | @TableField(fill = FieldFill.INSERT_UPDATE) 54 | private String updateTime; 55 | 56 | @TableField(exist = false) 57 | private static final long serialVersionUID = 1L; 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/Comment.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * @TableName t_comment 12 | */ 13 | @TableName(value ="t_comment") 14 | @Data 15 | public class Comment implements Serializable { 16 | /** 17 | * 留言表唯一标识 18 | */ 19 | @TableId(type = IdType.AUTO) 20 | private Integer commentId; 21 | 22 | /** 23 | * 留言的头像 链接 24 | */ 25 | private String commentAvatar; 26 | 27 | /** 28 | * 弹幕的高度(样式) 29 | */ 30 | private String commentBarrageStyle; 31 | 32 | /** 33 | * 弹幕的内容 34 | */ 35 | private String commentMessage; 36 | 37 | /** 38 | * 留言的时间(控制速度) 39 | */ 40 | private Integer commentTime; 41 | 42 | /** 43 | * 创建时间 44 | */ 45 | @TableField(fill = FieldFill.INSERT) 46 | private String createTime; 47 | 48 | /** 49 | * 更新时间 50 | */ 51 | @TableField(fill = FieldFill.INSERT_UPDATE) 52 | private String updateTime; 53 | 54 | @TableField(exist = false) 55 | private static final long serialVersionUID = 1L; 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/Notice.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * @TableName t_notice 12 | */ 13 | @TableName(value ="t_notice") 14 | @Data 15 | public class Notice implements Serializable { 16 | /** 17 | * 公告表唯一标识 18 | */ 19 | @TableId(type = IdType.AUTO) 20 | private Integer noticeId; 21 | 22 | /** 23 | * 公告题目 24 | */ 25 | private String noticeTitle; 26 | 27 | /** 28 | * 公告内容 29 | */ 30 | private String noticeContent; 31 | 32 | /** 33 | * 发布公告的管理员id 34 | */ 35 | private Integer noticeAdminId; 36 | 37 | /** 38 | * 创建时间 39 | */ 40 | @TableField(fill = FieldFill.INSERT) 41 | private String createTime; 42 | 43 | /** 44 | * 更新时间 45 | */ 46 | @TableField(fill = FieldFill.INSERT_UPDATE) 47 | private String updateTime; 48 | 49 | @TableField(exist = false) 50 | private static final long serialVersionUID = 1L; 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/UserInterfaceInfo.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * @TableName t_user_interface_info 12 | */ 13 | @TableName(value ="t_user_interface_info") 14 | @Data 15 | public class UserInterfaceInfo implements Serializable { 16 | /** 17 | * 18 | */ 19 | @TableId(type=IdType.AUTO) 20 | private Long id; 21 | 22 | /** 23 | * 用户id 24 | */ 25 | private Long userId; 26 | 27 | /** 28 | * 1 表示AI聊天接口 2表示智能分析接口 29 | */ 30 | private Long interfaceId; 31 | 32 | /** 33 | * 总共调用接口次数 34 | 35 | */ 36 | private Integer totalNum; 37 | 38 | /** 39 | * 剩余接口可用次数 40 | */ 41 | private Integer leftNum; 42 | 43 | /** 44 | * 创建时间 45 | */ 46 | @TableField(fill = FieldFill.INSERT) 47 | private String createTime; 48 | 49 | /** 50 | * 更新时间 51 | */ 52 | @TableField(fill = FieldFill.INSERT_UPDATE) 53 | private String updateTime; 54 | 55 | @TableField(exist = false) 56 | private static final long serialVersionUID = 1L; 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/Users.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | import lombok.Data; 8 | 9 | /** 10 | * 11 | * @author 程序员小白条 12 | * @TableName t_users 13 | */ 14 | @TableName(value ="t_users") 15 | @Data 16 | public class Users implements Serializable { 17 | /** 18 | * 用户表的唯一标识 19 | */ 20 | @TableId(type = IdType.AUTO) 21 | private Long userId; 22 | 23 | /** 24 | * 用户名 25 | */ 26 | private String username; 27 | 28 | /** 29 | * 密码 MD5加密 30 | */ 31 | private String password; 32 | 33 | /** 34 | * 真实姓名 35 | */ 36 | private String cardName; 37 | 38 | /** 39 | * 借阅证编号 固定11位随机生成 非空 40 | */ 41 | private Long cardNumber; 42 | 43 | /** 44 | * 规则编号 可以自定义也就是权限功能 45 | */ 46 | private Integer ruleNumber; 47 | 48 | /** 49 | * 1表示可用 0表示禁用 50 | */ 51 | private Integer status; 52 | 53 | /** 54 | * 创建时间 55 | */ 56 | @TableField(fill = FieldFill.INSERT) 57 | private String createTime; 58 | 59 | /** 60 | * 更新时间 61 | */ 62 | @TableField(fill = FieldFill.INSERT_UPDATE) 63 | private String updateTime; 64 | 65 | @TableField(exist = false) 66 | private static final long serialVersionUID = 1L; 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/Violation.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import java.time.LocalDateTime; 7 | import java.util.Date; 8 | 9 | import com.fasterxml.jackson.annotation.JsonFormat; 10 | import lombok.Data; 11 | import org.springframework.format.annotation.DateTimeFormat; 12 | 13 | /** 14 | * 15 | * @TableName t_violation 16 | */ 17 | @TableName(value ="t_violation") 18 | @Data 19 | public class Violation implements Serializable { 20 | /** 21 | * 违章表唯一标识 22 | */ 23 | @TableId(type = IdType.AUTO) 24 | private Integer violationId; 25 | 26 | /** 27 | * 借阅证编号 11位 随机生成 28 | */ 29 | private Long cardNumber; 30 | 31 | /** 32 | * 图书编号 图书唯一标识 33 | */ 34 | private Long bookNumber; 35 | 36 | /** 37 | * 借阅日期 38 | */ 39 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 40 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 41 | private LocalDateTime borrowDate; 42 | 43 | /** 44 | * 截止日期 45 | */ 46 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 47 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 48 | private LocalDateTime closeDate; 49 | 50 | /** 51 | * 归还日期 52 | */ 53 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 54 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 55 | private LocalDateTime returnDate; 56 | 57 | /** 58 | * 违章信息 59 | */ 60 | private String violationMessage; 61 | 62 | /** 63 | * 违章信息管理员的id 64 | */ 65 | private Integer violationAdminId; 66 | 67 | /** 68 | * 创建时间 69 | */ 70 | @TableField(fill = FieldFill.INSERT) 71 | private String createTime; 72 | 73 | /** 74 | * 更新时间 75 | */ 76 | @TableField(fill = FieldFill.INSERT_UPDATE) 77 | private String updateTime; 78 | 79 | @TableField(exist = false) 80 | private static final long serialVersionUID = 1L; 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/BookDTO.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto; 2 | 3 | import com.book.backend.pojo.Books; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author 程序员小白条 8 | */ 9 | @Data 10 | public class BookDTO extends Books { 11 | /** 12 | * 书籍类型 13 | */ 14 | public Integer bookTypeNumber; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/BookData.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto; 2 | 3 | import com.alibaba.excel.annotation.ExcelProperty; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 10 | * @TableName t_books 11 | */ 12 | @Data 13 | public class BookData implements Serializable { 14 | 15 | 16 | 17 | 18 | /** 19 | * 图书名称 20 | */ 21 | @ExcelProperty(value="图书名称",index = 0) 22 | private String bookName; 23 | 24 | /** 25 | * 图书作者 26 | */ 27 | @ExcelProperty(value="图书作者",index = 1) 28 | private String bookAuthor; 29 | 30 | /** 31 | * 图书所在图书馆名称 32 | */ 33 | @ExcelProperty(value="图书馆",index = 2) 34 | private String bookLibrary; 35 | 36 | /** 37 | * 图书类别 38 | */ 39 | @ExcelProperty(value="图书类别",index = 3) 40 | private String bookType; 41 | 42 | /** 43 | * 图书位置 44 | * 例如A12 B06 45 | */ 46 | @ExcelProperty(value="图书位置",index = 4) 47 | private String bookLocation; 48 | 49 | /** 50 | * 图书状态(已借出/未借出) 51 | */ 52 | @ExcelProperty(value="图书状态",index = 5) 53 | private String bookStatus; 54 | 55 | /** 56 | * 图书描述 57 | */ 58 | @ExcelProperty(value="图书描述",index = 6) 59 | private String bookDescription; 60 | 61 | 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/BookRuleDTO.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto; 2 | 3 | import com.book.backend.pojo.BookRule; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * @author 程序员小白条 10 | */ 11 | @Data 12 | public class BookRuleDTO extends BookRule implements Serializable { 13 | public String[] checkList; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/BooksBorrowDTO.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto; 2 | 3 | import com.book.backend.pojo.BooksBorrow; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * @author 程序员小白条 10 | */ 11 | @Data 12 | public class BooksBorrowDTO extends BooksBorrow implements Serializable { 13 | /** 14 | * 接受图书管理员的id 15 | */ 16 | public Integer bookAdminId; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/BorrowData.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | 8 | /** 9 | * @author 程序员小白条 10 | */ 11 | @Data 12 | public class BorrowData implements Serializable { 13 | /** 14 | * 借阅时期 一周为一个间隔 15 | */ 16 | public String [] borrowDates; 17 | /** 18 | * 借阅量 每个数值代表一周的借阅量 19 | */ 20 | public Integer [] borrowNumber; 21 | 22 | public BorrowData(String[] borrowDates, Integer[] borrowNumber) { 23 | this.borrowDates = borrowDates; 24 | this.borrowNumber = borrowNumber; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/BorrowTypeDTO.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author
小白条 7 | * @from 个人博客 8 | */ 9 | @Data 10 | public class BorrowTypeDTO { 11 | /** 12 | * 图书分类 13 | */ 14 | public String bookTypes; 15 | /** 16 | * 借阅量 17 | */ 18 | public Integer borrowNumbers; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/CommentDTO.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * @author 程序员小白条 9 | */ 10 | @Data 11 | public class CommentDTO implements Serializable { 12 | public Integer id; 13 | public String avatar; 14 | public String msg; 15 | public Integer time; 16 | public String barrageStyle; 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/UsersDTO.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto; 2 | 3 | import com.book.backend.pojo.Users; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * @author 程序员小白条 10 | */ 11 | @Data 12 | public class UsersDTO extends Users implements Serializable { 13 | public String userStatus; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/ViolationDTO.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto; 2 | 3 | import com.book.backend.pojo.Violation; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * @author 程序员小白条 10 | * DTO用于将管理员昵称传输 11 | */ 12 | @Data 13 | public class ViolationDTO extends Violation implements Serializable{ 14 | // /** 15 | // * 违章列表 16 | // */ 17 | // public Violation violation; 18 | /** 19 | * 违章信息处理人的姓名 20 | */ 21 | public String violationAdmin; 22 | /** 23 | * 还剩多少天逾期 24 | */ 25 | public long expireDays; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/chart/ChartAddRequest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto.chart; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * 创建请求 9 | * 10 | * @author 程序员小白条 11 | * 12 | */ 13 | @Data 14 | public class ChartAddRequest implements Serializable { 15 | 16 | /** 17 | * 名称 18 | */ 19 | private String name; 20 | 21 | /** 22 | * 分析目标 23 | */ 24 | private String goal; 25 | 26 | /** 27 | * 图表数据 28 | */ 29 | private String chartData; 30 | 31 | /** 32 | * 图表类型 33 | */ 34 | private String chartType; 35 | 36 | private static final long serialVersionUID = 1L; 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/chart/ChartEditRequest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto.chart; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * 编辑请求 9 | * 10 | * @author 程序员小白条 11 | * 12 | */ 13 | @Data 14 | public class ChartEditRequest implements Serializable { 15 | 16 | /** 17 | * 名称 18 | */ 19 | private String name; 20 | 21 | /** 22 | * id 23 | */ 24 | private Long id; 25 | 26 | /** 27 | * 分析目标 28 | */ 29 | private String goal; 30 | 31 | /** 32 | * 图表数据 33 | */ 34 | private String chartData; 35 | 36 | /** 37 | * 图表类型 38 | */ 39 | private String chartType; 40 | 41 | private static final long serialVersionUID = 1L; 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/chart/ChartUpdateRequest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto.chart; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableLogic; 6 | import lombok.Data; 7 | 8 | import java.io.Serializable; 9 | import java.util.Date; 10 | 11 | /** 12 | * 更新请求 13 | * 14 | * @author 程序员小白条 15 | * 16 | */ 17 | @Data 18 | public class ChartUpdateRequest implements Serializable { 19 | 20 | /** 21 | * id 22 | */ 23 | @TableId(type = IdType.ASSIGN_ID) 24 | private Long id; 25 | 26 | /** 27 | * 名称 28 | */ 29 | private String name; 30 | 31 | /** 32 | * 分析目标 33 | */ 34 | private String goal; 35 | 36 | /** 37 | * 图表数据 38 | */ 39 | private String chartData; 40 | 41 | /** 42 | * 图表类型 43 | */ 44 | private String chartType; 45 | 46 | /** 47 | * 生成的图表数据 48 | */ 49 | private String genChart; 50 | 51 | /** 52 | * 生成的分析结论 53 | */ 54 | private String genResult; 55 | 56 | /** 57 | * 创建时间 58 | */ 59 | private Date createTime; 60 | 61 | /** 62 | * 更新时间 63 | */ 64 | private Date updateTime; 65 | 66 | /** 67 | * 是否删除 68 | */ 69 | @TableLogic 70 | private Integer isDelete; 71 | 72 | private static final long serialVersionUID = 1L; 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/chart/GenChartByAiRequest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto.chart; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * 文件上传请求 9 | * 10 | * @author 程序员小白条 11 | * 12 | */ 13 | @Data 14 | public class GenChartByAiRequest implements Serializable { 15 | 16 | /** 17 | * 名称 18 | */ 19 | private String name; 20 | 21 | /** 22 | * 分析目标 23 | */ 24 | private String goal; 25 | 26 | /** 27 | * 图表类型 28 | */ 29 | private String chartType; 30 | /** 31 | * 用户id 32 | */ 33 | private Long adminId; 34 | private static final long serialVersionUID = 1L; 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/chat/ChatRequest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto.chat; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * @Author: QiMu 9 | * @Date: 2023年04月11日 11:55 10 | * @Version: 1.0 11 | * @Description: 12 | */ 13 | @Data 14 | public class ChatRequest implements Serializable { 15 | private static final long serialVersionUID = 1445805872513828206L; 16 | 17 | /** 18 | * 队伍聊天室id 19 | */ 20 | private Long teamId; 21 | 22 | /** 23 | * 接收消息id 24 | */ 25 | private Long toId; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/dto/chat/MessageRequest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.dto.chat; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * @Author: QiMu 9 | * @Date: 2023年04月10日 14:21 10 | * @Version: 1.0 11 | * @Description: 12 | */ 13 | @Data 14 | public class MessageRequest implements Serializable { 15 | private static final long serialVersionUID = 1324635911327892058L; 16 | private Long toId; 17 | private Long teamId; 18 | private String text; 19 | private Integer chatType; 20 | private boolean isAdmin; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/vo/BiResponse.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * Bi 的返回结果 7 | */ 8 | @Data 9 | public class BiResponse { 10 | 11 | private String genChart; 12 | 13 | private String genResult; 14 | 15 | private Long chartId; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/pojo/vo/ChatVo.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.pojo.vo; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.io.Serializable; 6 | import lombok.Data; 7 | 8 | /** 9 | * 10 | * @TableName t_chat 11 | */ 12 | @Data 13 | public class ChatVo implements Serializable { 14 | 15 | private static final long serialVersionUID = 1324635911327892059L; 16 | /** 17 | * 发送消息者id 18 | 19 | */ 20 | private Long fromId; 21 | 22 | /** 23 | * 接受消息者id,可以为空 24 | */ 25 | private Long toId; 26 | 27 | /** 28 | * 消息内容 29 | */ 30 | private String text; 31 | 32 | /** 33 | * 聊天类型 1-私聊 2-群聊 34 | */ 35 | private Integer chatType; 36 | 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/AdminsService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.book.backend.common.R; 5 | import com.book.backend.pojo.Admins; 6 | import com.book.backend.pojo.dto.UsersDTO; 7 | import org.springframework.web.multipart.MultipartFile; 8 | 9 | import java.io.IOException; 10 | 11 | /** 12 | * @author 程序员小白条 13 | * @description 针对表【t_admins】的数据库操作Service 14 | * @createDate 2023-02-03 20:01:01 15 | */ 16 | public interface AdminsService extends IService { 17 | 18 | /** 19 | * 添加借阅证 20 | * @param usersDTO 用户DTO 21 | * @return R 22 | */ 23 | R addRule(UsersDTO usersDTO); 24 | /** 25 | * 系统管理员登录 26 | * @param users 系统管理员 27 | * @return 返回R通用数据 28 | */ 29 | R login( Admins users); 30 | /** 31 | * 返回给前端系统管理员的数据 32 | * @param admin 系统管理员 33 | * @return R 34 | */ 35 | R getUserData( Admins admin); 36 | 37 | 38 | /** 39 | * Excel批量导入图书 40 | * @param file Excel文件 41 | * @return R 42 | */ 43 | R upload( MultipartFile file) throws IOException; 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/AiIntelligentService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.book.backend.common.R; 4 | import com.book.backend.pojo.AiIntelligent; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author xiaobaitiao 11 | * @description 针对表【t_ai_intelligent】的数据库操作Service 12 | * @createDate 2023-08-27 18:44:26 13 | */ 14 | public interface AiIntelligentService extends IService { 15 | /** 16 | * 调用AI接口,获取推荐的图书信息字符串 17 | * @param aiIntelligent 18 | * @return 19 | */ 20 | R getGenResult(AiIntelligent aiIntelligent); 21 | 22 | /** 23 | * 根据用户ID 获取该用户和AI聊天的最近的五条消息 24 | * @param userId 25 | * @return 26 | */ 27 | R> getAiInformationByUserId(Long userId); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/BookAdminsService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.book.backend.common.BasePage; 5 | import com.book.backend.common.R; 6 | import com.book.backend.pojo.BookAdmins; 7 | import com.baomidou.mybatisplus.extension.service.IService; 8 | import com.book.backend.pojo.dto.ViolationDTO; 9 | import org.springframework.web.bind.annotation.PathVariable; 10 | import org.springframework.web.bind.annotation.RequestBody; 11 | 12 | /** 13 | * @author 程序员小白条 14 | * @description 针对表【t_book_admins】的数据库操作Service 15 | * @createDate 2023-02-04 16:55:39 16 | */ 17 | public interface BookAdminsService extends IService { 18 | 19 | /** 20 | * 添加图书管理员 21 | * @param bookAdmins 图书管理员 22 | * @return R 23 | */ 24 | R addBookAdmin(BookAdmins bookAdmins); 25 | /** 26 | * 图书管理员登录 27 | * 28 | * @param users 图书管理员 29 | * @return 返回R通用数据 30 | */ 31 | R login( BookAdmins users); 32 | /** 33 | * 返回给前端图书管理员的数据 34 | * 35 | * @param bookAdmins 图书管理员 36 | * @return R 37 | */ 38 | R getUserData( BookAdmins bookAdmins); 39 | /** 40 | * 获取借书报表 41 | * 42 | * @param basePage 接受分页构造器和模糊查询的传参 43 | * @return R> 44 | */ 45 | R> getBorrowStatement( BasePage basePage); 46 | /** 47 | * 获取图书管理员的列表 48 | * 49 | * @param basePage 分页构造器传参 50 | * @return R> 51 | */ 52 | R> getBookAdminListByPage( BasePage basePage); 53 | /** 54 | * 获取图书管理员信息 通过图书管理员id 55 | * 56 | * @param bookAdminId 图书管理员id 57 | * @return R 58 | */ 59 | R getBookAdminById( Integer bookAdminId); 60 | /** 61 | * 删除图书管理员 根据图书管理员id 62 | * 63 | * @param bookAdminId 图书管理员id 64 | * @return R 65 | */ 66 | R deleteBookAdminById( Integer bookAdminId); 67 | /** 68 | * 修改图书管理员 69 | * 70 | * @param bookAdmins 图书管理员 71 | * @return R 72 | */ 73 | R updateBookAdmin( BookAdmins bookAdmins); 74 | } 75 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/BookRuleService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.book.backend.common.BasePage; 5 | import com.book.backend.common.R; 6 | import com.book.backend.pojo.BookRule; 7 | import com.baomidou.mybatisplus.extension.service.IService; 8 | import com.book.backend.pojo.dto.BookRuleDTO; 9 | import org.springframework.web.bind.annotation.PathVariable; 10 | import org.springframework.web.bind.annotation.RequestBody; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | * @author 程序员小白条 16 | * @description 针对表【t_book_rule】的数据库操作Service 17 | * @createDate 2023-02-05 15:11:20 18 | */ 19 | public interface BookRuleService extends IService { 20 | /** 21 | * 读者规则查询 22 | * 23 | * @return R> 24 | */ 25 | R> getRuleList(); 26 | /** 27 | * 获取规则列表(分页) 28 | * 29 | * @param basePage 分页构造器用于接受页数和页码 30 | * @return R> 31 | */ 32 | R> getRuleListByPage( BasePage basePage); 33 | /** 34 | * 添加规则 35 | * 36 | * @param bookRule 图书规则 37 | * @return R 38 | */ 39 | R addRule( BookRule bookRule); 40 | /** 41 | * 根据规则编号 查询规则 42 | * 43 | * @param ruleId 规则编号 44 | * @return R 45 | */ 46 | R getRuleByRuleId( Integer ruleId); 47 | /** 48 | * 修改规则 49 | * 50 | * @param bookRuleDTO 图书规则 51 | * @return R 52 | */ 53 | R updateRule( BookRuleDTO bookRuleDTO); 54 | /** 55 | * 删除规则 56 | * 57 | * @param ruleId 规则编号 58 | * @return R 59 | */ 60 | R deleteRule( Integer ruleId); 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/BookTypeService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.book.backend.common.BasePage; 5 | import com.book.backend.common.R; 6 | import com.book.backend.pojo.BookType; 7 | import com.baomidou.mybatisplus.extension.service.IService; 8 | import org.springframework.web.bind.annotation.PathVariable; 9 | import org.springframework.web.bind.annotation.RequestBody; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @author 程序员小白条 15 | * @description 针对表【t_book_type】的数据库操作Service 16 | * @createDate 2023-02-04 18:51:24 17 | */ 18 | public interface BookTypeService extends IService { 19 | /** 20 | * 查询书籍类型的列表 用于添加图书中回显分类 21 | * 22 | * @return R 23 | */ 24 | R> getBookTypeList(); 25 | 26 | /** 27 | * 书籍类别 获取书籍类别的列表 28 | * 29 | * @return R> 30 | */ 31 | R> getBookTypeListByPage(BasePage basePage); 32 | 33 | /** 34 | * 添加书籍类别 35 | * 36 | * @param bookType 书籍类别 37 | * @return R 38 | */ 39 | R addBookType(BookType bookType); 40 | /** 41 | * 根据书籍类别id 获取书籍类别信息 42 | * 43 | * @param typeId 书籍类别id 44 | * @return R 45 | */ 46 | R getBookTypeByTypeId(Integer typeId); 47 | /** 48 | * 更新书籍类别 49 | * 50 | * @param bookType 书籍类别 51 | * @return R 52 | */ 53 | R updateBookType( BookType bookType); 54 | /** 55 | * 删除书籍类别 根据书籍类别的ID 56 | * 57 | * @param typeId 书籍类别的id 58 | * @return R 59 | */ 60 | R deleteBookTypeByTypeId( Integer typeId); 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/BooksBorrowService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.book.backend.common.BasePage; 6 | import com.book.backend.common.R; 7 | import com.book.backend.pojo.BooksBorrow; 8 | import com.book.backend.pojo.Violation; 9 | import com.book.backend.pojo.dto.ViolationDTO; 10 | 11 | /** 12 | * @author 程序员小白条 13 | * @description 针对表【t_books_borrow】的数据库操作Service 14 | * @createDate 2023-02-05 18:53:07 15 | */ 16 | public interface BooksBorrowService extends IService { 17 | /** 18 | * 借阅信息查询 根据用户id,条件及其内容 19 | * 20 | * @param basePage 用于接受分页传参和用户id 21 | * @return R> 22 | */ 23 | R> getBookBorrowPage(BasePage basePage); 24 | 25 | /** 26 | * 获取图书逾期信息 27 | * 28 | * @param bookNumber 图书编号 29 | * @return R 30 | */ 31 | R queryExpireInformationByBookNumber(Long bookNumber); 32 | 33 | /** 34 | * 归还图书 35 | * 36 | * @param violation 违章表 37 | * @return R 38 | */ 39 | R returnBook(Violation violation); 40 | /** 41 | * 获取还书报表 42 | * 43 | * @param basePage 接受分页构造器和模糊查询的传参 44 | * @return R> 45 | */ 46 | R> getReturnStatement(BasePage basePage); 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/BooksService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.book.backend.common.BasePage; 6 | import com.book.backend.common.R; 7 | import com.book.backend.pojo.Books; 8 | import com.book.backend.pojo.dto.BookDTO; 9 | import com.book.backend.pojo.dto.BooksBorrowDTO; 10 | import com.book.backend.pojo.dto.BorrowTypeDTO; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | * @author 程序员小白条 16 | * @description 针对表【t_books】的数据库操作Service 17 | * @createDate 2023-02-04 18:07:43 18 | */ 19 | public interface BooksService extends IService { 20 | /** 21 | * 图书查询 分页和条件查询 (模糊查询) 22 | * 23 | * @param basePage 用于接受分页传参 24 | * @return R> 25 | */ 26 | R> searchBookPage(BasePage basePage); 27 | 28 | /** 29 | * 借阅图书根据借阅证号和图书编号 30 | * 31 | * @return R 32 | */ 33 | R borrowBookByCardNumberAndBookNumber(BooksBorrowDTO booksBorrowDTO); 34 | 35 | /** 36 | * 查看图书是否有逾期(查看是否借出) 37 | * 38 | * @param bookNumber 图书编号 39 | * @return R 40 | */ 41 | R queryBookExpireByBookNumber(Long bookNumber); 42 | 43 | /** 44 | * 获取图书列表 45 | * 46 | * @param basePage 页码,页数,条件和内容 47 | * @return R> 48 | */ 49 | R> getBookList(BasePage basePage); 50 | /** 51 | * 添加图书 利用DTO去接受 书籍类别的id 然后再通过id查询分类表获取分类名称 封装给图书 52 | * 53 | * @return R 54 | */ 55 | R addBook( BookDTO bookDTO); 56 | /** 57 | * 根据图书id删除对应的图书 58 | * 59 | * @param bookId 图书id 60 | * @return R 61 | */ 62 | R deleteBookByBookId( Integer bookId); 63 | /** 64 | * 根据图书id获得相对应的图书信息 65 | * 66 | * @param bookId 图书id 67 | * @return R 68 | */ 69 | R getBookInformationByBookId( Integer bookId); 70 | /** 71 | * 根据前端传输的图书信息更新图书 72 | * 73 | * @param books 图书 74 | * @return R 75 | */ 76 | R updateBookByEditForm( Books books); 77 | /** 78 | * 获取借书分类统计情况 79 | * 80 | * @return R> 81 | */ 82 | R> getBorrowTypeStatistic(); 83 | /** 84 | * 批量删除图书 85 | * 86 | * @param booksList 图书列表 87 | * @return R 88 | */ 89 | R deleteBookByBatch( List booksList); 90 | 91 | } 92 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/ChartService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.book.backend.common.R; 4 | import com.book.backend.pojo.Chart; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | import com.book.backend.pojo.dto.chart.GenChartByAiRequest; 7 | import com.book.backend.pojo.vo.BiResponse; 8 | import org.springframework.web.multipart.MultipartFile; 9 | 10 | import javax.servlet.http.HttpServletRequest; 11 | 12 | /** 13 | * @author xiaobaitiao 14 | * @description 针对表【t_chart(图表信息表)】的数据库操作Service 15 | * @createDate 2023-08-30 11:05:22 16 | */ 17 | public interface ChartService extends IService { 18 | R genChartByAi(MultipartFile multipartFile, 19 | GenChartByAiRequest genChartByAiRequest); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/ChatService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.book.backend.pojo.Chat; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | * @author xiaobaitiao 8 | * @description 针对表【t_chat】的数据库操作Service 9 | * @createDate 2023-11-27 19:29:21 10 | */ 11 | public interface ChatService extends IService { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/CommentService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.book.backend.common.R; 4 | import com.book.backend.pojo.Comment; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | import com.book.backend.pojo.dto.CommentDTO; 7 | import org.springframework.web.bind.annotation.RequestBody; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * @author 程序员小白条 13 | * @description 针对表【t_comment】的数据库操作Service 14 | * @createDate 2023-02-06 19:19:20 15 | */ 16 | public interface CommentService extends IService { 17 | /** 18 | * 获取弹幕列表 19 | * 20 | * @return R 21 | */ 22 | R> getCommentList(); 23 | 24 | /** 25 | * 添加弹幕 26 | * 27 | * @return R 28 | */ 29 | R addComment(CommentDTO commentDTO); 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/NoticeService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.book.backend.common.BasePage; 5 | import com.book.backend.common.R; 6 | import com.book.backend.pojo.Notice; 7 | import com.baomidou.mybatisplus.extension.service.IService; 8 | import org.springframework.web.bind.annotation.PathVariable; 9 | import org.springframework.web.bind.annotation.RequestBody; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @author 程序员小白条 15 | * @description 针对表【t_notice】的数据库操作Service 16 | * @createDate 2023-02-05 16:14:03 17 | */ 18 | public interface NoticeService extends IService { 19 | 20 | /** 21 | * 查询公告信息 22 | * 23 | * @return R> 24 | */ 25 | R> getNoticeList(); 26 | 27 | /** 28 | * 获取公告列表 29 | * 30 | * @return R 31 | */ 32 | R> getNoticeList(BasePage basePage); 33 | 34 | /** 35 | * 添加公告 36 | * 37 | * @param notice 公告 38 | * @return R 39 | */ 40 | R addNotice(Notice notice); 41 | 42 | /** 43 | * 删除公告根据指定的id 44 | * 45 | * @param noticeId 公告id 46 | * @return R 47 | */ 48 | R deleteNoticeById(Integer noticeId); 49 | 50 | /** 51 | * 根据指定id获取公告 52 | * 53 | * @param noticeId 公告id 54 | * @return R 55 | */ 56 | R getNoticeByNoticeId(Integer noticeId); 57 | /** 58 | * 更新公告根据公告id 59 | * 60 | * @param noticeId 公告id 61 | * @param notice 公告 62 | * @return R 63 | */ 64 | R updateNoticeByNoticeId(Integer noticeId, Notice notice); 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/UserInterfaceInfoService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.book.backend.pojo.UserInterfaceInfo; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | * @author xiaobaitiao 8 | * @description 针对表【t_user_interface_info】的数据库操作Service 9 | * @createDate 2023-09-03 19:42:54 10 | */ 11 | public interface UserInterfaceInfoService extends IService { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/UsersService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.book.backend.common.BasePage; 5 | import com.book.backend.common.R; 6 | import com.book.backend.pojo.Users; 7 | import com.baomidou.mybatisplus.extension.service.IService; 8 | import com.book.backend.pojo.dto.UsersDTO; 9 | import org.springframework.web.bind.annotation.PathVariable; 10 | import org.springframework.web.bind.annotation.RequestBody; 11 | 12 | /** 13 | * @author 程序员小白条 14 | * @description 针对表【t_users】的数据库操作Service 15 | * @createDate 2023-02-02 16:20:02 16 | */ 17 | public interface UsersService extends IService { 18 | /** 19 | * Rest接受参数 查询个人用户userId 20 | * 21 | * @param userId 用户id 22 | * @return R 23 | */ 24 | R getUserByUserId(Integer userId); 25 | 26 | /** 27 | * 修改密码 28 | * 29 | * @return R 30 | */ 31 | R updatePassword(Users users); 32 | 33 | /** 34 | * 借阅用户登录 35 | * 36 | * @param users 借阅者用户 37 | * @return 返回R通用数据 38 | */ 39 | R login(Users users); 40 | 41 | /** 42 | * 根据用户id传给用户所需的信息 43 | * @param users 用户 44 | * @return R 45 | */ 46 | R getUserData( Users users); 47 | /** 48 | * 获取借阅证列表(用户列表) 49 | * 50 | * @param basePage 用于接受模糊查询和分页构造的参数 51 | * @return R> 52 | */ 53 | R> getStatementList( BasePage basePage); 54 | /** 55 | * 获取用户信息 根据用户id 用于回显借阅证 56 | * 57 | * @param userId 用户id 58 | * @return R 59 | */ 60 | R getStatementByUserId( Integer userId); 61 | /** 62 | * 修改借阅证信息(用户信息) 63 | * 64 | * @param usersDTO 用户DTO 65 | * @return R 66 | */ 67 | R updateStatement( UsersDTO usersDTO); 68 | /** 69 | * 删除借阅证信息 根据用户id 70 | * 71 | * @param userId 用户id 72 | * @return R 73 | */ 74 | R deleteStatementByUserId( Integer userId); 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/ViolationService.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.book.backend.common.BasePage; 5 | import com.book.backend.common.R; 6 | import com.book.backend.pojo.Violation; 7 | import com.baomidou.mybatisplus.extension.service.IService; 8 | import com.book.backend.pojo.dto.BorrowData; 9 | import com.book.backend.pojo.dto.ViolationDTO; 10 | import org.springframework.web.bind.annotation.RequestBody; 11 | 12 | /** 13 | * @author 程序员小白条 14 | * @description 针对表【t_violation】的数据库操作Service 15 | * @createDate 2023-02-06 16:31:20 16 | */ 17 | public interface ViolationService extends IService { 18 | /** 19 | * 查询违章信息(借阅证) 20 | * 21 | * @param basePage 获取前端的分页参数,条件和内容,借阅证 22 | * @return R> 23 | */ 24 | R> getViolationListByPage( BasePage basePage); 25 | /** 26 | * 获取借阅量 27 | * 28 | * @return R 29 | */ 30 | R getBorrowDate(); 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/impl/BookTypeServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.toolkit.StringUtils; 4 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 5 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 6 | import com.book.backend.common.BasePage; 7 | import com.book.backend.common.R; 8 | import com.book.backend.pojo.BookType; 9 | import com.book.backend.service.BookTypeService; 10 | import com.book.backend.mapper.BookTypeMapper; 11 | import org.springframework.stereotype.Service; 12 | import org.springframework.transaction.annotation.Transactional; 13 | 14 | import java.util.List; 15 | 16 | /** 17 | * @author 程序员小白条 18 | * @description 针对表【t_book_type】的数据库操作Service实现 19 | * @createDate 2023-02-04 18:51:24 20 | */ 21 | @Service 22 | public class BookTypeServiceImpl extends ServiceImpl 23 | implements BookTypeService{ 24 | 25 | @Override 26 | public R> getBookTypeList() { 27 | List list = this.list(); 28 | R> result = new R<>(); 29 | if (list.isEmpty()) { 30 | return R.error("获取书籍分类失败"); 31 | } 32 | result.setData(list); 33 | result.setMsg("获取书籍分类成功"); 34 | result.setStatus(200); 35 | return result; 36 | } 37 | /** 38 | * 1.获取页码和页数 39 | * 2.调用服务的page分页 判断是否为空 40 | * 3.如果不为空,存入数据,200响应状态吗,请求成功信息 41 | */ 42 | @Override 43 | public R> getBookTypeListByPage(BasePage basePage) { 44 | 45 | // 页码 46 | int pageNum = basePage.getPageNum(); 47 | // 页数 48 | int pageSize = basePage.getPageSize(); 49 | Page pageInfo = new Page<>(pageNum, pageSize); 50 | Page page = this.page(pageInfo); 51 | if (page.getTotal() == 0) { 52 | return R.error("书籍分类列表为空"); 53 | } 54 | R> result = new R<>(); 55 | result.setData(pageInfo); 56 | result.setMsg("获取书籍分类列表成功"); 57 | result.setStatus(200); 58 | return result; 59 | } 60 | /** 61 | * 1.调用服务插入书籍类别 62 | * 2.判断是否成功 63 | * 3.成功返回响应状态码和请求信息 64 | */ 65 | @Override 66 | public R addBookType(BookType bookType) { 67 | boolean save = this.save(bookType); 68 | if (!save) { 69 | return R.error("添加书籍类别失败"); 70 | } 71 | return R.success(null,"添加书籍类型成功"); 72 | } 73 | /** 74 | * 1.根据typeId查询 75 | * 2.判断是否为空 不为空返回前端 76 | */ 77 | @Override 78 | public R getBookTypeByTypeId(Integer typeId) { 79 | BookType type = this.getById(typeId); 80 | if (type == null) { 81 | return R.error("获取书籍类别失败"); 82 | } 83 | R result = new R<>(); 84 | result.setData(type); 85 | result.setStatus(200); 86 | result.setMsg("获取书籍类别成功"); 87 | return result; 88 | } 89 | /** 90 | * 1.判断空参数 91 | * 2.更新书籍 判断是否成功 92 | * 3.成功->200 失败->错误信息 93 | */ 94 | @Override 95 | public R updateBookType(BookType bookType) { 96 | String typeContent = bookType.getTypeContent(); 97 | String typeName = bookType.getTypeName(); 98 | if (StringUtils.isBlank(typeContent) || StringUtils.isBlank(typeName)) { 99 | return R.error("更新书籍类别失败"); 100 | } 101 | boolean update = this.updateById(bookType); 102 | if (!update) { 103 | return R.error("更新书籍类别失败"); 104 | } 105 | 106 | return R.success(null,"更新书籍类别成功"); 107 | } 108 | /** 109 | * 1.先根据typeId查询是否有此书籍类别 110 | * 2.调用服务,删除书籍类别,判断是否成功 111 | * 3.成功->200 失败->错误信息 112 | */ 113 | @Transactional 114 | @Override 115 | public R deleteBookTypeByTypeId(Integer typeId) { 116 | BookType bookType = this.getById(typeId); 117 | if (bookType == null) { 118 | return R.error("删除书籍类别失败"); 119 | } 120 | boolean remove = this.removeById(typeId); 121 | if (!remove) { 122 | return R.error("删除书籍类别失败"); 123 | } 124 | return R.success(null,"删除书籍类别成功"); 125 | } 126 | } 127 | 128 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/impl/ChatServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.book.backend.pojo.Chat; 5 | import com.book.backend.service.ChatService; 6 | import com.book.backend.mapper.ChatMapper; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | * @author xiaobaitiao 11 | * @description 针对表【t_chat】的数据库操作Service实现 12 | * @createDate 2023-11-27 19:29:21 13 | */ 14 | @Service 15 | public class ChatServiceImpl extends ServiceImpl 16 | implements ChatService{ 17 | 18 | } 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/service/impl/UserInterfaceInfoServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.book.backend.pojo.UserInterfaceInfo; 5 | import com.book.backend.service.UserInterfaceInfoService; 6 | import com.book.backend.mapper.UserInterfaceInfoMapper; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | * @author xiaobaitiao 11 | * @description 针对表【t_user_interface_info】的数据库操作Service实现 12 | * @createDate 2023-09-03 19:42:54 13 | */ 14 | @Service 15 | public class UserInterfaceInfoServiceImpl extends ServiceImpl 16 | implements UserInterfaceInfoService{ 17 | 18 | } 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/utils/BorrowDateUtil.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.utils; 2 | 3 | import java.time.LocalDateTime; 4 | import java.time.format.DateTimeFormatter; 5 | 6 | /** 7 | * @author 程序员小白条 8 | */ 9 | public class BorrowDateUtil { 10 | public static String [] getDateArray(LocalDateTime now){ 11 | String nowFormat = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); 12 | LocalDateTime time1 = now.minusWeeks(1); 13 | LocalDateTime time2 = now.minusWeeks(2); 14 | LocalDateTime time3 = now.minusWeeks(3); 15 | LocalDateTime time4 = now.minusWeeks(4); 16 | String format1 = time1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); 17 | String format2 = time2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); 18 | String format3 = time3.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); 19 | String format4 = time4.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); 20 | String [] dateArrays = new String[4]; 21 | dateArrays[3]= format1+"-"+nowFormat; 22 | dateArrays[2]= format2+"-"+format1; 23 | dateArrays[1] = format3+"-"+format2; 24 | dateArrays[0] = format4+"-"+format3; 25 | return dateArrays; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/utils/ExcelUtils.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.utils; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import com.alibaba.excel.EasyExcel; 5 | import com.alibaba.excel.support.ExcelTypeEnum; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.apache.commons.lang3.ObjectUtils; 8 | import org.apache.commons.lang3.StringUtils; 9 | import org.springframework.web.multipart.MultipartFile; 10 | 11 | import java.io.IOException; 12 | import java.util.LinkedHashMap; 13 | import java.util.List; 14 | import java.util.Map; 15 | import java.util.stream.Collectors; 16 | 17 | /** 18 | * Excel 相关工具类 19 | */ 20 | @Slf4j 21 | public class ExcelUtils { 22 | 23 | /** 24 | * excel 转 csv 25 | * 26 | * @param multipartFile 27 | * @return 28 | */ 29 | public static String excelToCsv(MultipartFile multipartFile) { 30 | // File file = null; 31 | // try { 32 | // file = ResourceUtils.getFile("classpath:网站数据.xlsx"); 33 | // } catch (FileNotFoundException e) { 34 | // e.printStackTrace(); 35 | // } 36 | // 读取数据 37 | List> list = null; 38 | try { 39 | list = EasyExcel.read(multipartFile.getInputStream()) 40 | .excelType(ExcelTypeEnum.XLSX) 41 | .sheet() 42 | .headRowNumber(0) 43 | .doReadSync(); 44 | } catch (IOException e) { 45 | log.error("表格处理错误", e); 46 | } 47 | if (CollUtil.isEmpty(list)) { 48 | return ""; 49 | } 50 | // 转换为 csv 51 | StringBuilder stringBuilder = new StringBuilder(); 52 | // 读取表头 53 | LinkedHashMap headerMap = (LinkedHashMap) list.get(0); 54 | List headerList = headerMap.values().stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList()); 55 | stringBuilder.append(StringUtils.join(headerList, ",")).append("\n"); 56 | // 读取数据 57 | for (int i = 1; i < list.size(); i++) { 58 | LinkedHashMap dataMap = (LinkedHashMap) list.get(i); 59 | List dataList = dataMap.values().stream().filter(ObjectUtils::isNotEmpty).collect(Collectors.toList()); 60 | stringBuilder.append(StringUtils.join(dataList, ",")).append("\n"); 61 | } 62 | return stringBuilder.toString(); 63 | } 64 | 65 | public static void main(String[] args) { 66 | excelToCsv(null); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/utils/JwtKit.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.utils; 2 | 3 | 4 | import com.book.backend.common.JwtProperties; 5 | import com.book.backend.pojo.Users; 6 | import io.jsonwebtoken.Claims; 7 | import io.jsonwebtoken.Jwts; 8 | import io.jsonwebtoken.SignatureAlgorithm; 9 | import org.springframework.stereotype.Component; 10 | 11 | import javax.annotation.Resource; 12 | import java.util.Date; 13 | import java.util.HashMap; 14 | import java.util.Map; 15 | 16 | /** 17 | * 18 | * JWT工具类 19 | * 20 | * @author xiaobaitiao 21 | * 22 | * 23 | */ 24 | @Component 25 | public class JwtKit { 26 | @Resource 27 | private JwtProperties jwtProperties; 28 | 29 | /** 30 | * 生成Token 31 | * 32 | * @param user 自定义要存储的用户对象信息 33 | * @return string(Token) 34 | */ 35 | public String generateToken(T user) { 36 | Map claims = new HashMap(10); 37 | claims.put("username", user.toString()); 38 | claims.put("createdate", new Date()); 39 | claims.put("id", System.currentTimeMillis()); 40 | // 要存储的数据 41 | return Jwts.builder().addClaims(claims) 42 | // 过期时间 43 | .setExpiration(new Date(System.currentTimeMillis() + jwtProperties.getExpiration())) 44 | // 加密算法和密钥 45 | .signWith(SignatureAlgorithm.HS256, jwtProperties.getSecret()) 46 | .compact(); // 打包返回 3部分 47 | } 48 | 49 | public JwtKit() { 50 | } 51 | 52 | public JwtKit(JwtProperties jwtProperties) { 53 | this.jwtProperties = jwtProperties; 54 | } 55 | 56 | /** 57 | * 校验Token是否合法 58 | * 59 | * @param token 要校验的Token 60 | * @return Claims (过期时间,用户信息,创建时间) 61 | */ 62 | public Claims parseJwtToken(String token) { 63 | Claims claims = null; 64 | // 根据哪个密钥解密 65 | claims = Jwts.parser().setSigningKey(jwtProperties.getSecret()) 66 | // 设置要解析的Token 67 | .parseClaimsJws(token) 68 | .getBody(); 69 | return claims; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/utils/NetUtils.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.utils; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import java.net.InetAddress; 5 | 6 | /** 7 | * 网络工具类 8 | * 9 | */ 10 | public class NetUtils { 11 | 12 | /** 13 | * 获取客户端 IP 地址 14 | * 15 | * @param request 16 | * @return 17 | */ 18 | public static String getIpAddress(HttpServletRequest request) { 19 | String ip = request.getHeader("x-forwarded-for"); 20 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 21 | ip = request.getHeader("Proxy-Client-IP"); 22 | } 23 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 24 | ip = request.getHeader("WL-Proxy-Client-IP"); 25 | } 26 | if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 27 | ip = request.getRemoteAddr(); 28 | if (ip.equals("127.0.0.1")) { 29 | // 根据网卡取本机配置的 IP 30 | InetAddress inet = null; 31 | try { 32 | inet = InetAddress.getLocalHost(); 33 | } catch (Exception e) { 34 | e.printStackTrace(); 35 | } 36 | if (inet != null) { 37 | ip = inet.getHostAddress(); 38 | } 39 | } 40 | } 41 | // 多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 42 | if (ip != null && ip.length() > 15) { 43 | if (ip.indexOf(",") > 0) { 44 | ip = ip.substring(0, ip.indexOf(",")); 45 | } 46 | } 47 | if (ip == null) { 48 | return "127.0.0.1"; 49 | } 50 | return ip; 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/utils/NumberUtil.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.utils; 2 | import java.math.BigDecimal; 3 | import java.util.Random; 4 | 5 | /** 6 | * @author 程序员小白条 7 | */ 8 | public class NumberUtil { 9 | public static Integer getLibraryInt(){ 10 | return new Random().nextInt(3); 11 | } 12 | public static Integer getStatusInt() { 13 | //[0 - 5) 14 | return new Random().nextInt(5); 15 | } 16 | 17 | public static Integer getAgeInt() { 18 | // [10 - 60) 60 = 10 + 50 19 | return new Random().nextInt(50) + 10; 20 | } 21 | public static Integer getBarrageTime(){ 22 | // [5,9] 整数 23 | return new Random().nextInt(5)+5; 24 | } 25 | public static Integer getSexInt() { 26 | //[0 - 2) 27 | return new Random().nextInt(2); 28 | } 29 | 30 | public static Integer getLevelInt() { 31 | return new Random().nextInt(100); 32 | } 33 | 34 | public static BigDecimal accountDecimal() { 35 | float minF = 1000000.0f; 36 | float maxF = 1000.0f; 37 | 38 | //生成随机数 39 | BigDecimal bd = new BigDecimal(Math.random() * (maxF - minF) + minF); 40 | 41 | //返回保留两位小数的随机数。不进行四舍五入 42 | return bd.setScale(4,BigDecimal.ROUND_DOWN); 43 | } 44 | 45 | public static BigDecimal balanceDecimal() { 46 | float minF = 1000000.0f; 47 | float maxF = 1000.0f; 48 | 49 | //生成随机数 50 | BigDecimal bd = new BigDecimal(Math.random() * (maxF - minF) + minF); 51 | 52 | //返回保留两位小数的随机数。不进行四舍五入 53 | return bd.setScale(4,BigDecimal.ROUND_DOWN); 54 | } 55 | 56 | public static Long randomLong() { 57 | return Math.abs(new Random().nextLong()); 58 | } 59 | //num为随机数字字符串的长度 60 | public static StringBuilder getNumber(int num){ 61 | StringBuilder sb = new StringBuilder(); 62 | Random random = new Random(); 63 | for (int i = 0; i < num; i++){ 64 | sb.append(random.nextInt(10)); 65 | } 66 | return sb; 67 | } 68 | 69 | public static void main(String[] args) { 70 | for (int i = 0; i < 1000; i++) { 71 | Integer libraryInt = getLibraryInt(); 72 | System.out.println(libraryInt); 73 | } 74 | } 75 | 76 | } 77 | 78 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/utils/RandomNameUtils.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.utils; 2 | import cn.hutool.core.util.RandomUtil; 3 | 4 | import java.io.UnsupportedEncodingException; 5 | import java.util.Random; 6 | 7 | 8 | /** 9 | * @author 程序员小白条 10 | */ 11 | public class RandomNameUtils { 12 | 13 | /** 14 | * 随机获取姓名 15 | * 16 | * @return 17 | */ 18 | public static String fullName() { 19 | return surname() + name(2); 20 | } 21 | 22 | /** 23 | * 随机获取姓 24 | * 25 | * @return 26 | */ 27 | public static String surname() { 28 | return SURNAME[new Random().nextInt(SURNAME.length - 1)]; 29 | } 30 | 31 | /** 32 | * 获取N位常用字 33 | * 34 | * @param len 35 | * @return 36 | */ 37 | public static String name(int len) { 38 | StringBuilder ret = new StringBuilder(); 39 | for (int i = 0; i < len; i++) { 40 | String str = null; 41 | // 定义高低位 42 | int highPos, lowPos; 43 | Random random = new Random(); 44 | //获取高位值 45 | highPos = (176 + Math.abs(random.nextInt(39))); 46 | //获取低位值 47 | lowPos = (161 + Math.abs(random.nextInt(93))); 48 | byte[] b = new byte[2]; 49 | b[0] = (new Integer(highPos).byteValue()); 50 | b[1] = (new Integer(lowPos).byteValue()); 51 | try { 52 | //转成中文 53 | str = new String(b, "GBK"); 54 | } catch (UnsupportedEncodingException ex) { 55 | ex.printStackTrace(); 56 | } 57 | ret.append(str); 58 | } 59 | return ret.toString(); 60 | } 61 | public static String getRandomLocation(){ 62 | int i=(int)Math.round(Math.random()*26); 63 | int j=(int)'A'+i; 64 | char ch=(char)j; 65 | String s = RandomUtil.randomNumbers(6); 66 | return ch+s; 67 | } 68 | /** 69 | * 2021年姓排行100 70 | */ 71 | private final static String[] SURNAME = { 72 | "李", "王", "张", "刘", "陈", 73 | "杨", "赵", "黄", "周", "吴", 74 | "徐", "孙", "胡", "朱", "高", 75 | "林", "何", "郭", "马", "罗", 76 | "梁", "宋", "郑", "谢", "韩", 77 | "唐", "冯", "于", "董", "萧", 78 | "程", "曹", "袁", "邓", "许", 79 | "傅", "沈", "曾", "彭", "吕", 80 | "苏", "卢", "蒋", "蔡", "贾", 81 | "丁", "魏", "薛", "叶", "阎", 82 | "余", "潘", "杜", "戴", "夏", 83 | "钟", "汪", "田", "任", "姜", 84 | "范", "方", "石", "姚", "谭", 85 | "廖", "邹", "熊", "金", "陆", 86 | "郝", "孔", "白", "崔", "康", 87 | "毛", "邱", "秦", "江", "史", 88 | "顾", "侯", "邵", "孟", "龙", 89 | "万", "段", "漕", "钱", "汤", 90 | "尹", "黎", "易", "常", "武", 91 | "乔", "贺", "赖", "龚", "文"}; 92 | } 93 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/utils/SpringBootUtil.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.utils; 2 | 3 | import org.springframework.beans.BeansException; 4 | import org.springframework.context.ApplicationContext; 5 | import org.springframework.context.ApplicationContextAware; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * Spring上下文工具类,用以让普通类获取Spring容器中的Bean 10 | * @author 程序员小白条 11 | */ 12 | @Component 13 | public class SpringBootUtil implements ApplicationContextAware { 14 | 15 | private static ApplicationContext applicationContext = null; 16 | 17 | /** 18 | * 获取applicationContext 19 | * @return ApplicationContext 20 | */ 21 | public static ApplicationContext getApplicationContext() { 22 | return applicationContext; 23 | } 24 | 25 | @Override 26 | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 27 | if (SpringBootUtil.applicationContext == null) { 28 | SpringBootUtil.applicationContext = applicationContext; 29 | } 30 | } 31 | 32 | /** 33 | * 通过name获取 Bean 34 | * @param name 容器名 35 | * @return Object 36 | */ 37 | public static Object getBean(String name) { 38 | return getApplicationContext().getBean(name); 39 | } 40 | 41 | /** 42 | * 通过class获取Bean 43 | * @param clazz 类 44 | * @return 任意的容器 45 | * @param 泛型 46 | */ 47 | public static T getBean(Class clazz) { 48 | return getApplicationContext().getBean(clazz); 49 | } 50 | 51 | /** 52 | * 通过name,以及Clazz返回指定的Bean 53 | * @param name 容器名 54 | * @param clazz 容器类 55 | * @return 任意容器(组件) 56 | * @param 泛型 57 | */ 58 | public static T getBean(String name, Class clazz) { 59 | return getApplicationContext().getBean(name, clazz); 60 | } 61 | } 62 | 63 | 64 | -------------------------------------------------------------------------------- /src/main/java/com/book/backend/utils/SqlUtils.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.utils; 2 | 3 | import org.apache.commons.lang3.StringUtils; 4 | 5 | /** 6 | * SQL 工具 7 | * 8 | */ 9 | public class SqlUtils { 10 | 11 | /** 12 | * 校验排序字段是否合法(防止 SQL 注入) 13 | * 14 | * @param sortField 15 | * @return 16 | */ 17 | public static boolean validSortField(String sortField) { 18 | if (StringUtils.isBlank(sortField)) { 19 | return false; 20 | } 21 | return !StringUtils.containsAny(sortField, "=", "(", ")", " "); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/resources/application-dev.yml: -------------------------------------------------------------------------------- 1 | # application-dev.yml 开发配置 热更新(数据库、端口、JWT) 2 | spring: 3 | datasource: 4 | # 配置数据源类型 5 | type: com.zaxxer.hikari.HikariDataSource 6 | # 配置连接数据库信息 7 | driver-class-name: com.mysql.cj.jdbc.Driver 8 | url: jdbc:mysql://localhost:3306/bms_boot?characterEncoding=utf8&useSSL=false 9 | username: root 10 | password: hsp 11 | # todo 开启 redis 取消注释即可 12 | # redis: 13 | # host: 106.14.33.49 14 | # port: 6379 15 | # password: 663057 16 | ## database: 0 17 | # lettuce: 18 | # pool: 19 | # max-active: 10 20 | # max-idle: 10 21 | # min-idle: 1 22 | # time-between-eviction-runs: 10s 23 | 24 | server: 25 | port: 8889 #配置后端接口的端口号 26 | servlet: #配置后端请求的根路径 http://127.0.0.1:8889/api 27 | context-path: "/api" 28 | #jwt config 29 | jwt: 30 | tokenHeader: Authorization #JWT存储的请求头 31 | secret: mall-jwt-test #jwt加解密使用的密钥 32 | expiration: 36000000 #JWT的超时时间 33 | tokenHead: Bearer #JWT负载中拿到的开头 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | # 配置数据源信息 3 | application: 4 | #应用的名称 5 | name: BookManageSystem 6 | profiles: 7 | active: 'dev' # 指定开发配置文件 8 | # 指定返回给前端的时区和时间的格式化模式 9 | jackson: 10 | time-zone: GMT+8 11 | date-format: yyyy-MM-dd HH:mm:ss 12 | # 配置MyBatisPlus日志 13 | mybatis-plus: 14 | configuration: 15 | log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 16 | #在映射实体类或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射 17 | map-underscore-to-camel-case: true 18 | global-config: 19 | db-config: 20 | # 配置MyBatis-Plus操作表的默认前缀 21 | table-prefix: t_ 22 | # 配置MyBatis-Plus的主键策略 23 | # id-type: assign_id 24 | # 配置实体类的扫描包路径 注入容器 25 | type-aliases-package: com.book.backend.pojo 26 | 27 | # knife4j接口文档配置 28 | knife4j: 29 | enable: true 30 | openapi: 31 | title: "图书管理系统后台接口文档" 32 | description: "vue_book_backend" 33 | # aaa" 34 | version: "1.0" 35 | license: Apache 2.0 36 | license-url: https://stackoverflow.com/ 37 | terms-of-service-url: https://www.xiaobaitiao.top 38 | group: 39 | test1: 40 | group-name: default 41 | api-rule: package 42 | api-rule-resources: 43 | - com.book.backend.controller 44 | -------------------------------------------------------------------------------- /src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | by 程序员小白条 2 | GitEE: https://gitee.com/falle22222n-leaves 3 | GitHub: https://github.com/luoye6 4 | 个人博客: https://luoye6.github.io/ 5 | Knife4j后端接口在线调试地址: http://localhost:8889/api/doc.html 6 | -------------------------------------------------------------------------------- /src/main/resources/mapper/AdminsMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | admin_id,username,password, 19 | admin_name,status,create_time, 20 | update_time 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/main/resources/mapper/AiIntelligentMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | id,input_message,is_user, 18 | user_id,createTime,updateTime 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/main/resources/mapper/BookAdminsMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | book_admin_id,username,password, 20 | book_admin_name,status,email, 21 | create_time,update_time 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/main/resources/mapper/BookRuleMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | rule_id,book_rule_id,book_days, 20 | book_limit_number,book_limit_library,book_overdue_fee, 21 | create_time,update_time 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/main/resources/mapper/BookTypeMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | type_id,type_name,type_content, 17 | create_time,update_time 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/resources/mapper/BooksBorrowMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | borrow_id,card_number,book_number, 20 | borrow_date,close_date,return_date, 21 | create_time,update_time 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/main/resources/mapper/BooksMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | book_id,book_number,book_name, 23 | book_author,book_library,book_type, 24 | book_location,book_status,book_description, 25 | create_time,update_time 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/main/resources/mapper/ChartMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | id,name,goal, 25 | chartData,chartType,genChart, 26 | genResult,status,execMessage, 27 | userId,createTime,updateTime, 28 | isDelete 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/main/resources/mapper/ChatMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | id,from_id,to_id, 19 | text,chat_type,create_time, 20 | update_time 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/main/resources/mapper/CommentMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | comment_id,comment_avatar,comment_barrage_style, 19 | comment_message,comment_time,create_time, 20 | update_time 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/main/resources/mapper/NoticeMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | notice_id,notice_title,notice_content, 18 | notice_admin_id,create_time,update_time 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/main/resources/mapper/UserInterfaceInfoMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | id,user_id,interface_id, 19 | total_num,left_num,create_time, 20 | update_time 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/main/resources/mapper/UsersMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | user_id,username,password, 21 | card_name,card_number,rule_number, 22 | status,create_time,update_time 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/main/resources/mapper/ViolationMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | violation_id,card_number,book_number, 22 | borrow_date,close_date,return_date, 23 | violation_message,violation_admin_id,create_time, 24 | update_time 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/main/resources/test_excel.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/luoye6/Vue_BookManageSystem_backend/8409e7b75dc03790302e1084cc669d11f41d8a56/src/main/resources/test_excel.xlsx -------------------------------------------------------------------------------- /src/test/java/com/book/backend/AliAITest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend; 2 | 3 | import cn.hutool.core.date.StopWatch; 4 | import com.aliyun.broadscope.bailian.sdk.AccessTokenClient; 5 | import com.aliyun.broadscope.bailian.sdk.ApplicationClient; 6 | import com.aliyun.broadscope.bailian.sdk.models.BaiLianConfig; 7 | import com.aliyun.broadscope.bailian.sdk.models.CompletionsRequest; 8 | import com.aliyun.broadscope.bailian.sdk.models.CompletionsResponse; 9 | import com.aliyun.broadscope.bailian.sdk.utils.UUIDGenerator; 10 | import org.junit.jupiter.api.Test; 11 | import org.springframework.boot.test.context.SpringBootTest; 12 | 13 | import javax.annotation.Nullable; 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | import java.util.concurrent.TimeUnit; 17 | 18 | /** 19 | * @author 小白条 20 | * @from 个人博客 21 | */ 22 | @SpringBootTest 23 | public class AliAITest { 24 | public static void main(String[] args) { 25 | 26 | } 27 | 28 | // 单次对话 29 | @Test 30 | public void test1() { 31 | String accessKeyId = "xxxx"; 32 | String accessKeySecret = "xxxxx"; 33 | String agentKey = "xxxxx"; 34 | 35 | AccessTokenClient accessTokenClient = new AccessTokenClient(accessKeyId, accessKeySecret, agentKey); 36 | String token = accessTokenClient.getToken(); 37 | 38 | BaiLianConfig config = new BaiLianConfig() 39 | .setApiKey(token); 40 | 41 | String appId = "xxxxxx"; 42 | String prompt = "我想要Vue3的登录页面"; 43 | CompletionsRequest request = new CompletionsRequest() 44 | .setAppId(appId) 45 | .setPrompt(prompt); 46 | 47 | ApplicationClient client = new ApplicationClient(config); 48 | CompletionsResponse response = client.completions(request); 49 | System.out.println(response); 50 | } 51 | 52 | // 多次会话有记忆功能 53 | @Test 54 | public void test2() { 55 | StopWatch stopWatch = new StopWatch(); 56 | stopWatch.start(); 57 | String accessKeyId = "xxxxx"; 58 | String accessKeySecret = "xxxx"; 59 | String agentKey = "xxxx"; 60 | 61 | AccessTokenClient accessTokenClient = new AccessTokenClient(accessKeyId, accessKeySecret, agentKey); 62 | String token = accessTokenClient.getToken(); 63 | 64 | BaiLianConfig config = new BaiLianConfig() 65 | .setApiKey(token); 66 | 67 | String appId = "xxxx"; 68 | String prompt = "我想要Vue3的登录页面"; 69 | String sessionId = UUIDGenerator.generate(); 70 | CompletionsRequest request = new CompletionsRequest() 71 | .setAppId(appId) 72 | .setPrompt(prompt) 73 | .setSessionId(sessionId); 74 | ApplicationClient client = new ApplicationClient(config); 75 | CompletionsResponse response = client.completions(request); 76 | System.out.println(response); 77 | stopWatch.stop(); 78 | System.out.println(stopWatch.getTotal(TimeUnit.SECONDS)); 79 | 80 | 81 | 82 | //阿里云百炼也支持调用侧自己维护上下文对话历史, 同时传入sessionId和history,会优先采用调用侧传入的上下文历史 83 | // List history = new ArrayList<>(); 84 | // CompletionsRequest.ChatQaPair chatQaPair = new CompletionsRequest.ChatQaPair("我想去北京", "北京的天气很不错"); 85 | // CompletionsRequest.ChatQaPair chatQaPair2 = new CompletionsRequest.ChatQaPair("北京有哪些景点", "北京有故宫、长城等"); 86 | // history.add(chatQaPair); 87 | // history.add(chatQaPair2); 88 | // request.setHistory(history); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/test/java/com/book/backend/BenchmarkTest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend; 2 | 3 | import org.openjdk.jmh.annotations.*; 4 | import org.openjdk.jmh.results.format.ResultFormatType; 5 | import org.openjdk.jmh.runner.Runner; 6 | import org.openjdk.jmh.runner.options.Options; 7 | import org.openjdk.jmh.runner.options.OptionsBuilder; 8 | 9 | import java.util.concurrent.TimeUnit; 10 | 11 | @BenchmarkMode(Mode.Throughput) 12 | @OutputTimeUnit(TimeUnit.MILLISECONDS) 13 | @State(Scope.Thread) 14 | @Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS) 15 | @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) 16 | @Fork(1) 17 | @Threads(2) 18 | public class BenchmarkTest { 19 | @Benchmark 20 | public long shift() { 21 | long t = 455565655225562L; 22 | long a = 0; 23 | for (int i = 0; i < 1000; i++) { 24 | a = t >> 30; 25 | } 26 | return a; 27 | } 28 | 29 | @Benchmark 30 | public long div() { 31 | long t = 455565655225562L; 32 | long a = 0; 33 | for (int i = 0; i < 1000; i++) { 34 | a = t / 1024 / 1024 / 1024; 35 | } 36 | return a; 37 | } 38 | 39 | public static void main(String[] args) throws Exception { 40 | Options opts = new OptionsBuilder() 41 | .include(BenchmarkTest.class.getSimpleName()) 42 | .resultFormat(ResultFormatType.JSON) 43 | .build(); 44 | new Runner(opts).run(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/test/java/com/book/backend/OpenAPITest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend; 2 | 3 | import cn.hutool.http.HttpRequest; 4 | import cn.hutool.json.JSONArray; 5 | import cn.hutool.json.JSONObject; 6 | import cn.hutool.json.JSONUtil; 7 | import org.junit.jupiter.api.Test; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | 10 | import java.util.ArrayList; 11 | import java.util.HashMap; 12 | import java.util.List; 13 | import java.util.Map; 14 | import java.util.regex.Matcher; 15 | import java.util.regex.Pattern; 16 | 17 | /** 18 | * @author 小白条 19 | * @from 个人博客 20 | */ 21 | @SpringBootTest 22 | public class OpenAPITest { 23 | @Test 24 | public void testOpenApi() { 25 | String txt = "Hello"; 26 | 27 | Map paramMap = new HashMap<>(); 28 | paramMap.put("model", "gpt-3.5-turbo"); 29 | List> dataList = new ArrayList<>(); 30 | dataList.add(new HashMap() {{ 31 | put("role", "user"); 32 | put("content", txt); 33 | }}); 34 | paramMap.put("messages", dataList); 35 | JSONObject message = null; 36 | try { 37 | String body = HttpRequest.post("https://api.openai.com/v1/chat/completions").header("Authorization", "xxxxx").header("Content-Type", "application/json").body(JSONUtil.toJsonStr(paramMap)).execute().body(); 38 | JSONObject jsonObject = JSONUtil.parseObj(body); 39 | JSONArray choices = jsonObject.getJSONArray("choices"); 40 | JSONObject result = choices.get(0, JSONObject.class, Boolean.TRUE); 41 | message = result.getJSONObject("message"); 42 | System.out.println(message); 43 | }catch (Exception e){ 44 | System.out.println(e); 45 | } 46 | 47 | } 48 | @Test 49 | public void test2(){ 50 | String str = "{前端 Echarts V5 的 option 配置对象js代码}\n" + 51 | "var option = {\n" + 52 | " title: {\n" + 53 | " text: '用户增长趋势'\n" + 54 | " },\n" + 55 | " tooltip: {},\n" + 56 | " legend: {\n" + 57 | " data:['用户数']\n" + 58 | " },\n" + 59 | " xAxis: {\n" + 60 | " data: [\"1号\",\"2号\",\"3号\"]\n" + 61 | " },\n" + 62 | " yAxis: {},\n" + 63 | " series: [{\n" + 64 | " name: '用户数',\n" + 65 | " type: 'line',\n" + 66 | " data: [10, 20, 30]\n" + 67 | " }]\n" + 68 | "};"; 69 | Pattern pattern = Pattern.compile("var option = ([^;]+);"); 70 | Matcher matcher = pattern.matcher(str); 71 | 72 | if (matcher.find()) { 73 | String match = matcher.group(1); 74 | System.out.println(match); 75 | } 76 | } 77 | } 78 | 79 | -------------------------------------------------------------------------------- /src/test/java/com/book/backend/RedisTest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend; 2 | 3 | import cn.hutool.core.date.StopWatch; 4 | import com.book.backend.common.R; 5 | import com.book.backend.pojo.dto.CommentDTO; 6 | import com.book.backend.service.CommentService; 7 | import com.book.backend.utils.RedisUtil; 8 | import org.junit.jupiter.api.Test; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.boot.test.context.SpringBootTest; 11 | import org.springframework.data.redis.core.RedisTemplate; 12 | 13 | import java.time.LocalDate; 14 | import java.util.List; 15 | import java.util.concurrent.TimeUnit; 16 | 17 | /** 18 | * @author 小白条 19 | * @from 个人博客 20 | */ 21 | @SpringBootTest 22 | class RedisTest { 23 | @Autowired 24 | private RedisUtil redisUtil; 25 | @Autowired 26 | private RedisTemplate redisTemplate; 27 | @Autowired 28 | private CommentService commentService; 29 | @Test 30 | public void test1(){ 31 | Boolean cat = redisTemplate.expire("comment:2023-11-26", 1, TimeUnit.MINUTES); 32 | System.out.println(cat); 33 | } 34 | @Test 35 | public void convertCommentListToRedis(){ 36 | List range = (List) redisTemplate.opsForList().range("comment:2023-11-26", 0, -1); 37 | range.stream().forEach(System.out::println); 38 | } 39 | @Test 40 | public void getCommentListFromRedis(){ 41 | LocalDate localDate = LocalDate.now(); 42 | String key = "comment:"+localDate; 43 | R> commentList = commentService.getCommentList(); 44 | List data = commentList.getData(); 45 | redisTemplate.opsForList().rightPushAll(key,data); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/test/java/com/book/backend/SparkAITest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 4 | import com.book.backend.common.R; 5 | import com.book.backend.common.exception.VueBookException; 6 | import com.book.backend.manager.GuavaRateLimiterManager; 7 | import com.book.backend.manager.SparkAIManager; 8 | import com.book.backend.pojo.AiIntelligent; 9 | import com.book.backend.pojo.Books; 10 | import com.book.backend.pojo.UserInterfaceInfo; 11 | import com.book.backend.service.BooksService; 12 | import com.book.backend.service.impl.UserInterfaceInfoServiceImpl; 13 | import com.yupi.yucongming.dev.client.YuCongMingClient; 14 | import com.yupi.yucongming.dev.common.BaseResponse; 15 | import com.yupi.yucongming.dev.model.DevChatRequest; 16 | import com.yupi.yucongming.dev.model.DevChatResponse; 17 | import okhttp3.Request; 18 | import okhttp3.WebSocket; 19 | import okio.ByteString; 20 | import org.jetbrains.annotations.NotNull; 21 | import org.jetbrains.annotations.Nullable; 22 | import org.junit.jupiter.api.Test; 23 | import org.springframework.boot.test.context.SpringBootTest; 24 | 25 | import javax.annotation.Resource; 26 | import java.util.HashSet; 27 | import java.util.List; 28 | 29 | /** 30 | * @author 小白条 31 | * @from 个人博客 32 | */ 33 | @SpringBootTest 34 | public class SparkAITest { 35 | @Resource 36 | private BooksService booksService; 37 | @Resource 38 | private GuavaRateLimiterManager guavaRateLimiterManager; 39 | @Resource 40 | private UserInterfaceInfoServiceImpl userInterfaceInfoService; 41 | @Test 42 | public void test() throws Exception { 43 | // 判断用户输入文本是否过长,超过128字,直接返回,防止资源耗尽 44 | BigModelNew bigModelNew = new BigModelNew("23", false); 45 | StringBuilder stringBuilder = new StringBuilder(); 46 | HashSet hashSet = new HashSet<>(); 47 | String presetInformation = "请根据数据库内容和游客信息作出推荐,书籍必须是数据库里面有的,可以是一本也可以是多本,根据游客喜欢的信息作出推荐。"; 48 | 49 | List list = booksService.list(); 50 | stringBuilder.append(presetInformation).append("\n").append("数据库内容: "); 51 | for (Books books : list) { 52 | if(!hashSet.contains(books.getBookName())){ 53 | hashSet.add(books.getBookName()); 54 | stringBuilder.append(books.getBookName()).append(","); 55 | } 56 | } 57 | stringBuilder.append("\n"); 58 | String customerInformation = "我喜欢关于动物的书籍,请给我推荐图书"; 59 | stringBuilder.append("游客信息: ").append(customerInformation).append("\n"); 60 | // System.out.println(stringBuilder.toString()); 61 | String reallyMessage = stringBuilder.toString(); 62 | String result = bigModelNew.sendMessageAndGetResponse(reallyMessage); 63 | System.out.println(result); 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /src/test/java/com/book/backend/VueBookBackendApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.book.backend; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 4 | import com.book.backend.pojo.Admins; 5 | import com.book.backend.pojo.Users; 6 | import com.book.backend.pojo.Violation; 7 | import com.book.backend.service.AdminsService; 8 | import com.book.backend.service.BookAdminsService; 9 | import com.book.backend.service.UsersService; 10 | import com.book.backend.service.ViolationService; 11 | import com.book.backend.utils.BorrowDateUtil; 12 | import com.book.backend.utils.JwtKit; 13 | import com.book.backend.utils.NumberUtil; 14 | import com.book.backend.utils.RandomNameUtils; 15 | import io.jsonwebtoken.Claims; 16 | import org.junit.jupiter.api.Test; 17 | import org.springframework.beans.factory.annotation.Autowired; 18 | import org.springframework.boot.test.context.SpringBootTest; 19 | 20 | import javax.swing.text.DateFormatter; 21 | import java.text.DateFormat; 22 | import java.time.LocalDateTime; 23 | import java.time.format.DateTimeFormatter; 24 | import java.util.ArrayList; 25 | import java.util.List; 26 | 27 | @SpringBootTest 28 | 29 | class VueBookBackendApplicationTests { 30 | @Autowired 31 | private UsersService usersService; 32 | @Autowired 33 | private AdminsService adminsService; 34 | @Autowired 35 | private BookAdminsService bookAdminsService; 36 | @Autowired 37 | private ViolationService violationService; 38 | @Autowired 39 | private JwtKit jwtKit; 40 | @Test 41 | public void getUser(){ 42 | List list = usersService.list(); 43 | list.forEach(System.out::println); 44 | } 45 | @Test 46 | public void getAdmins(){ 47 | List list = adminsService.list(); 48 | list.forEach(System.out::println); 49 | } 50 | @Test 51 | public void getBookAdmins(){ 52 | bookAdminsService.list().forEach(System.out::println); 53 | } 54 | @Test 55 | public void tokenUse(){ 56 | Admins admins = new Admins(); 57 | admins.setAdminName("张三"); 58 | admins.setPassword("2313"); 59 | String s = jwtKit.generateToken(admins); 60 | Claims claims = jwtKit.parseJwtToken(s); 61 | System.out.println( claims.get("username")); 62 | } 63 | @Test 64 | public void testNumber(){ 65 | StringBuilder number = NumberUtil.getNumber(11); 66 | System.out.println(number); 67 | } 68 | @Test 69 | public void testName(){ 70 | String s = RandomNameUtils.fullName(); 71 | System.out.println(s); 72 | } 73 | @Test 74 | public void testBorrowData(){ 75 | LocalDateTime now = LocalDateTime.now(); 76 | String[] dateArray = BorrowDateUtil.getDateArray(now); 77 | for (String s : dateArray) { 78 | System.out.println(s); 79 | } 80 | } 81 | 82 | } 83 | -------------------------------------------------------------------------------- /src/test/java/com/book/backend/domain/BookData.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.domain; 2 | 3 | import com.alibaba.excel.annotation.ExcelProperty; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 10 | * @TableName t_books 11 | */ 12 | @Data 13 | public class BookData implements Serializable { 14 | 15 | 16 | 17 | 18 | /** 19 | * 图书名称 20 | */ 21 | @ExcelProperty(value="图书名称",index = 0) 22 | private String bookName; 23 | 24 | /** 25 | * 图书作者 26 | */ 27 | @ExcelProperty(value="图书作者",index = 1) 28 | private String bookAuthor; 29 | 30 | /** 31 | * 图书所在图书馆名称 32 | */ 33 | @ExcelProperty(value="图书馆",index = 2) 34 | private String bookLibrary; 35 | 36 | /** 37 | * 图书类别 38 | */ 39 | @ExcelProperty(value="图书类别",index = 3) 40 | private String bookType; 41 | 42 | /** 43 | * 图书位置 44 | * 例如A12 B06 45 | */ 46 | @ExcelProperty(value="图书位置",index = 4) 47 | private String bookLocation; 48 | 49 | /** 50 | * 图书状态(已借出/未借出) 51 | */ 52 | @ExcelProperty(value="图书状态",index = 5) 53 | private String bookStatus; 54 | 55 | /** 56 | * 图书描述 57 | */ 58 | @ExcelProperty(value="图书描述",index = 6) 59 | private String bookDescription; 60 | 61 | 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/test/java/com/book/backend/domain/DemoData.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.domain; 2 | 3 | import com.alibaba.excel.annotation.ExcelProperty; 4 | import lombok.Data; 5 | 6 | import java.util.Date; 7 | 8 | /** 9 | * @author 小白条 10 | * @from 个人博客 11 | */ 12 | @Data 13 | public class DemoData { 14 | @ExcelProperty(value="整数",index = 0) 15 | private Integer number; 16 | @ExcelProperty(value="字符串",index = 1) 17 | private String string; 18 | @ExcelProperty(value="小数",index =2) 19 | private Double price; 20 | @ExcelProperty(value="日期",index = 3) 21 | private Date datetime; 22 | } 23 | -------------------------------------------------------------------------------- /src/test/java/com/book/backend/testutils/EasyExcelTest.java: -------------------------------------------------------------------------------- 1 | package com.book.backend.testutils; 2 | 3 | import com.alibaba.excel.EasyExcel; 4 | import com.alibaba.excel.context.AnalysisContext; 5 | import com.alibaba.excel.event.AnalysisEventListener; 6 | import com.alibaba.excel.support.ExcelTypeEnum; 7 | import com.book.backend.domain.BookData; 8 | import com.book.backend.pojo.Books; 9 | import com.book.backend.service.BooksService; 10 | import com.book.backend.utils.NumberUtil; 11 | import org.junit.jupiter.api.Test; 12 | import org.springframework.beans.BeanUtils; 13 | import org.springframework.boot.test.context.SpringBootTest; 14 | import org.springframework.util.ResourceUtils; 15 | 16 | import javax.annotation.Resource; 17 | import java.io.File; 18 | import java.io.FileNotFoundException; 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | import java.util.Map; 22 | 23 | /** 24 | * EasyExcel 测试 25 | * 26 | * @author 程序员小白条 27 | * 28 | */ 29 | @SpringBootTest 30 | public class EasyExcelTest { 31 | @Resource 32 | private BooksService booksService; 33 | 34 | @Test 35 | public void doImport() throws FileNotFoundException { 36 | File file = ResourceUtils.getFile("classpath:test_excel.xlsx"); 37 | List> list = EasyExcel.read(file) 38 | .excelType(ExcelTypeEnum.XLSX) 39 | .sheet() 40 | .headRowNumber(0) 41 | .doReadSync(); 42 | System.out.println(list); 43 | } 44 | @Test 45 | public void testReadExcel() { 46 | // 读取的excel文件路径 47 | String filename = "D:\\IDEAproject\\vue_book_backend\\src\\main\\resources\\test_excel.xlsx"; 48 | // 读取excel 49 | EasyExcel.read(filename, BookData.class, new AnalysisEventListener() { 50 | ArrayList booksList = new ArrayList<>(); 51 | // 每解析一行数据,该方法会被调用一次 52 | @Override 53 | public void invoke(BookData bookData, AnalysisContext analysisContext) { 54 | Books books = new Books(); 55 | // 生成11位数字的图书编号 56 | StringBuilder stringBuilder = NumberUtil.getNumber(11); 57 | long bookNumber = Long.parseLong(new String(stringBuilder)); 58 | BeanUtils.copyProperties(bookData,books); 59 | books.setBookNumber(bookNumber); 60 | booksList.add(books); 61 | // System.out.println("解析数据为:" + bookData.toString()); 62 | } 63 | // 全部解析完成被调用 64 | @Override 65 | public void doAfterAllAnalysed(AnalysisContext analysisContext) { 66 | // 全部加入到容器list中后,一次性批量导入,先判断容器是否为空 67 | if(!booksList.isEmpty()){ 68 | // 可以将解析的数据保存到数据库 69 | boolean flag = booksService.saveBatch(booksList); 70 | // 如果数据添加成功 71 | if(flag){ 72 | System.out.println("Excel批量添加图书成功"); 73 | }else{ 74 | System.out.println("Excel批量添加图书失败"); 75 | } 76 | }else{ 77 | System.out.println("空表无法进行数据导入"); 78 | } 79 | 80 | } 81 | }).sheet().doRead(); 82 | } 83 | 84 | 85 | } 86 | --------------------------------------------------------------------------------