commit 525a40c2b08bb4ee0801b66dcdac294eac53115f
Author: Li YeFan <2806354450@qq.com>
Date: Tue Mar 12 14:27:02 2024 +0800
初始化 1.0.0
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5ff6309
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/dictionaries b/.idea/dictionaries
new file mode 100644
index 0000000..d2130c4
--- /dev/null
+++ b/.idea/dictionaries
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..08195d5
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..13e436e
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/brook-auth/pom.xml b/brook-auth/pom.xml
new file mode 100644
index 0000000..ea78757
--- /dev/null
+++ b/brook-auth/pom.xml
@@ -0,0 +1,31 @@
+
+
+ 4.0.0
+
+ com.brook
+ brook_week3
+ 1.0.0
+
+
+ brook-auth
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+ com.brook
+ brook-common
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
\ No newline at end of file
diff --git a/brook-auth/src/main/java/com/brook/auth/AuthApplication.java b/brook-auth/src/main/java/com/brook/auth/AuthApplication.java
new file mode 100644
index 0000000..8d01508
--- /dev/null
+++ b/brook-auth/src/main/java/com/brook/auth/AuthApplication.java
@@ -0,0 +1,23 @@
+package com.brook.auth;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.auth
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:AuthApplication
+ * @Date 2024/3/12:9:43
+ */
+@SpringBootApplication
+@EnableFeignClients(basePackages = "com.brook.**")
+public class AuthApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AuthApplication.class,args);
+ }
+
+}
diff --git a/brook-auth/src/main/java/com/brook/auth/controller/AuthController.java b/brook-auth/src/main/java/com/brook/auth/controller/AuthController.java
new file mode 100644
index 0000000..5907072
--- /dev/null
+++ b/brook-auth/src/main/java/com/brook/auth/controller/AuthController.java
@@ -0,0 +1,67 @@
+package com.brook.auth.controller;
+
+import com.brook.auth.service.AuthService;
+import com.brook.common.domain.UserInfo;
+import com.brook.common.domain.request.auth.LoginAuth;
+import com.brook.common.domain.response.auth.LoginAuthResp;
+import com.brook.common.result.Result;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.auth.controller
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:AuthController
+ * @Date 2024/3/12:9:26
+ */
+@RestController
+@RequestMapping("/auth")
+public class AuthController {
+
+ private final AuthService authService;
+
+ public AuthController(AuthService authService) {
+ this.authService = authService;
+ }
+
+ @GetMapping("/sendCode")
+ public Result sendCode(@RequestParam String phone){
+
+ if(phone==null || phone.equals("")){
+ return Result.error(
+ "手机号不能为空"
+ );
+ }
+
+ return Result.success(
+ authService.sendCode(phone)
+ );
+ }
+
+ @PostMapping("/login")
+ public Result login(@RequestBody LoginAuth loginAuth){
+
+ return Result.success(
+ authService.login(loginAuth)
+ );
+ }
+
+ @GetMapping("/info")
+ public Result getInfo(){
+ return authService.getInfo();
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/brook-auth/src/main/java/com/brook/auth/service/AuthService.java b/brook-auth/src/main/java/com/brook/auth/service/AuthService.java
new file mode 100644
index 0000000..bc71617
--- /dev/null
+++ b/brook-auth/src/main/java/com/brook/auth/service/AuthService.java
@@ -0,0 +1,24 @@
+package com.brook.auth.service;
+
+import com.brook.common.domain.UserInfo;
+import com.brook.common.domain.request.auth.LoginAuth;
+import com.brook.common.domain.response.auth.LoginAuthResp;
+import com.brook.common.result.Result;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.auth.service
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:AuthService
+ * @Date 2024/3/12:9:26
+ */
+public interface AuthService {
+ String sendCode(String phone);
+
+ LoginAuthResp login(LoginAuth loginAuth);
+
+ Result getInfo();
+
+
+}
diff --git a/brook-auth/src/main/java/com/brook/auth/service/impl/AuthServiceImpl.java b/brook-auth/src/main/java/com/brook/auth/service/impl/AuthServiceImpl.java
new file mode 100644
index 0000000..fc85b9e
--- /dev/null
+++ b/brook-auth/src/main/java/com/brook/auth/service/impl/AuthServiceImpl.java
@@ -0,0 +1,119 @@
+package com.brook.auth.service.impl;
+
+import cn.hutool.core.util.RandomUtil;
+import com.alibaba.fastjson.JSON;
+import com.brook.auth.service.AuthService;
+import com.brook.common.constants.JwtConstants;
+import com.brook.common.constants.TokenConstants;
+import com.brook.common.domain.UserInfo;
+import com.brook.common.domain.request.auth.LoginAuth;
+import com.brook.common.domain.response.auth.LoginAuthResp;
+import com.brook.common.redis.RedisCache;
+import com.brook.common.remote.RemoteUserInfoService;
+import com.brook.common.result.Result;
+import com.brook.common.utils.JwtUtils;
+import io.jsonwebtoken.lang.Assert;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.auth.service.impl
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:AuthServiceImpl
+ * @Date 2024/3/12:9:26
+ */
+@Service
+public class AuthServiceImpl implements AuthService {
+
+
+ private final RemoteUserInfoService remoteUserInfoService;
+
+
+
+ private final HttpServletRequest request;
+ private final RedisCache redisCache;
+
+ public AuthServiceImpl(RemoteUserInfoService remoteUserInfoService, HttpServletRequest request, RedisCache redisCache) {
+ this.remoteUserInfoService = remoteUserInfoService;
+
+ this.request = request;
+ this.redisCache = redisCache;
+ }
+
+ @Override
+ public String sendCode(String phone) {
+
+ Result userInfoResult = remoteUserInfoService.findByPhone(phone);
+
+ UserInfo userInfo = userInfoResult.getData();
+
+ Assert.notNull(userInfo,"手机号不是系统用户");
+
+ String code = RandomUtil.randomNumbers(4);
+
+ System.out.println("验证码是:"+code);
+
+
+ redisCache.setCacheObject(phone,code,1L,TimeUnit.MINUTES);
+
+
+ return code;
+ }
+
+ @Override
+ public LoginAuthResp login(LoginAuth loginAuth) {
+
+ Result userInfoResult = remoteUserInfoService.findByPhone(loginAuth.getPhone());
+ Assert.isTrue(userInfoResult.isSuccess(),"登陆失败");
+ UserInfo userInfo = userInfoResult.getData();
+ Assert.notNull(userInfo,"手机号不是系统用户");
+
+ Assert.isTrue(redisCache.hasKey(loginAuth.getPhone()),"验证码已经过期");
+
+ String code = (String) redisCache.getCacheObject(loginAuth.getPhone());
+ Assert.isTrue(
+ loginAuth.getCode().equals(code),
+ "验证码错误"
+ );
+
+ String userKey = UUID.randomUUID().toString().replace("_", "");
+ HashMap map = new HashMap<>();
+ map.put(JwtConstants.USER_KEY,userKey);
+ map.put(JwtConstants.DETAILS_USER_ID,userInfo.getId());
+ map.put(JwtConstants.DETAILS_USERNAME,userInfo.getUserName());
+
+ String token = JwtUtils.createToken(map);
+
+ redisCache.setCacheObject(
+ TokenConstants.LOGIN_TOKEN_KEY+userKey,
+ JSON.toJSONString(userInfo),
+ TokenConstants.EXPIRATION,
+ TimeUnit.MINUTES
+ );
+
+
+ return LoginAuthResp.builder()
+ .token(token)
+ .outTime(TokenConstants.EXPIRATION)
+ .build();
+ }
+
+ @Override
+ public Result getInfo() {
+
+ String token = request.getHeader(JwtConstants.USER_KEY);
+
+ String userKey = redisCache.getCacheObject(TokenConstants.LOGIN_TOKEN_KEY + token);
+
+ UserInfo userInfo = JSON.parseObject(userKey, UserInfo.class);
+
+ return Result.success(userInfo);
+ }
+}
diff --git a/brook-auth/src/main/resources/bootstrap.yml b/brook-auth/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..cdf314c
--- /dev/null
+++ b/brook-auth/src/main/resources/bootstrap.yml
@@ -0,0 +1,31 @@
+# Tomcat
+server:
+ port: 9001
+# Spring
+spring:
+ main:
+ allow-circular-references: true
+ jackson:
+ date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: GMT+8
+ application:
+ # 应用名称
+ name: brook-auth
+ profiles:
+ # 环境配置
+ active: dev
+ cloud:
+ nacos:
+ discovery:
+ # 服务注册地址
+ server-addr: 49.232.227.52:8848
+ namespace: 4cf48ba0-2ae3-4427-8892-ca501c8b740e
+ config:
+ # 配置中心地址
+ server-addr: 49.232.227.52:8848
+ # 配置文件格式
+ file-extension: yml
+ # 共享配置
+ shared-configs:
+ - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+ namespace: 4cf48ba0-2ae3-4427-8892-ca501c8b740e
diff --git a/brook-common/pom.xml b/brook-common/pom.xml
new file mode 100644
index 0000000..9199e0f
--- /dev/null
+++ b/brook-common/pom.xml
@@ -0,0 +1,170 @@
+
+
+ 4.0.0
+
+ com.brook
+ brook_week3
+ 1.0.0
+
+
+ brook-common
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ 3.12.0
+
+
+ com.github.tobato
+ fastdfs-client
+ 1.26.5
+
+
+
+
+ org.redisson
+ redisson
+ 3.16.0
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-bootstrap
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-sentinel
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-loadbalancer
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
+
+
+ io.jsonwebtoken
+ jjwt
+ 0.9.1
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.80
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ com.alibaba.fastjson2
+ fastjson2
+ 2.0.42
+
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ 1.2.8
+
+
+
+ mysql
+ mysql-connector-java
+ 8.0.33
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.5.4.1
+
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 2.2.2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+ org.projectlombok
+ lombok
+
+
+ cn.hutool
+ hutool-all
+ 5.8.22
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.2.1
+
+
+ org.apache.httpcomponents
+ httpcore
+ 4.2.1
+
+
+ commons-lang
+ commons-lang
+ 2.6
+
+
+ org.eclipse.jetty
+ jetty-util
+ 9.3.7.v20160115
+
+
+
+
+
+
\ No newline at end of file
diff --git a/brook-common/src/main/java/com/brook/common/config/MybatisPlusConfig.java b/brook-common/src/main/java/com/brook/common/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..bd485f2
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/config/MybatisPlusConfig.java
@@ -0,0 +1,30 @@
+package com.brook.common.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author DongZl
+ * @description: Mybatis-Plus配置
+ * @Date 2024-1-10 下午 05:12
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+ public MybatisPlusConfig () {
+ System.out.println("初始化-----------");
+ }
+
+ /**
+ * 添加分页插件
+ */
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+ return interceptor;
+ }
+}
diff --git a/brook-common/src/main/java/com/brook/common/constants/Constants.java b/brook-common/src/main/java/com/brook/common/constants/Constants.java
new file mode 100644
index 0000000..a9254b6
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/constants/Constants.java
@@ -0,0 +1,21 @@
+package com.brook.common.constants;
+
+/**
+ * @ClassName Constants
+ * @Description 系统常量
+ * @Author ChenLong
+ * @Date 2023/2/23 16:04
+ * @Version 1.0
+ */
+public class Constants {
+ /**
+ * 成功标记
+ */
+ public static final Integer SUCCESS = 200;
+ public static final String SUCCESS_MSG = "操作成功";
+ /**
+ * 失败标记
+ */
+ public static final Integer ERROR = 500;
+ public static final String ERROR_MSG = "操作异常";
+}
diff --git a/brook-common/src/main/java/com/brook/common/constants/GoodsConstants.java b/brook-common/src/main/java/com/brook/common/constants/GoodsConstants.java
new file mode 100644
index 0000000..f278e9a
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/constants/GoodsConstants.java
@@ -0,0 +1,15 @@
+package com.brook.common.constants;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.constants
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:GoodsConstants
+ * @Date 2024/3/12:10:09
+ */
+public class GoodsConstants {
+
+ public final static String GOODS_NAME = "brook-goods";
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/constants/JwtConstants.java b/brook-common/src/main/java/com/brook/common/constants/JwtConstants.java
new file mode 100644
index 0000000..6810586
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/constants/JwtConstants.java
@@ -0,0 +1,30 @@
+package com.brook.common.constants;
+
+/**
+ * @ClassName JwtConstants
+ * @Description Jwt常量
+ * @Author ChenLong
+ * @Date 2023/2/23 16:07
+ * @Version 1.0
+ */
+public class JwtConstants {
+ /**
+ * 用户ID字段
+ */
+ public static final String DETAILS_USER_ID = "user_id";
+
+ /**
+ * 用户名字段
+ */
+ public static final String DETAILS_USERNAME = "username";
+
+ /**
+ * 用户标识
+ */
+ public static final String USER_KEY = "user_key";
+
+ /**
+ * 令牌秘钥
+ */
+ public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";
+}
diff --git a/brook-common/src/main/java/com/brook/common/constants/LoginConstants.java b/brook-common/src/main/java/com/brook/common/constants/LoginConstants.java
new file mode 100644
index 0000000..43a8691
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/constants/LoginConstants.java
@@ -0,0 +1,21 @@
+package com.brook.common.constants;
+
+/**
+ * @ClassName:
+ * @Description:
+ * @Author: zhuwenqiang
+ * @Date: 2023/10/25
+ */
+public class LoginConstants {
+
+ /**
+ * 登录成功
+ */
+ public static final int LOGIN_SUCCESS = 1;
+
+ /**
+ * 登录失败
+ */
+ public static final int LOGIN_FAIL = 2;
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/constants/MQQueueNameConstants.java b/brook-common/src/main/java/com/brook/common/constants/MQQueueNameConstants.java
new file mode 100644
index 0000000..9034861
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/constants/MQQueueNameConstants.java
@@ -0,0 +1,27 @@
+package com.brook.common.constants;
+
+/**
+ * @ClassName:
+ * @Description:
+ * @Author: zhuwenqiang
+ * @Date: 2023/10/25
+ */
+public class MQQueueNameConstants {
+
+ /**
+ * 登录日志队列名称
+ */
+ public static final String LOGIN_LOG_QUEUE_NAME = "login_log_queue_name";
+
+ /**
+ * 添加
+ */
+ public static final String ADD_GOODS_ES_QUEUE_NAME = "add_goods_es_queue_name";
+
+
+ /**
+ * 统计网站每日访问人次
+ */
+ public static final String WEBSITE_STATS_QUEUE = "website_stats_queue";
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/constants/RabbitMqConstants.java b/brook-common/src/main/java/com/brook/common/constants/RabbitMqConstants.java
new file mode 100644
index 0000000..5232599
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/constants/RabbitMqConstants.java
@@ -0,0 +1,6 @@
+package com.brook.common.constants;
+
+
+public class RabbitMqConstants {
+ public static final String SEND_CODE="send_code";
+}
diff --git a/brook-common/src/main/java/com/brook/common/constants/RoleConstants.java b/brook-common/src/main/java/com/brook/common/constants/RoleConstants.java
new file mode 100644
index 0000000..ac119ae
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/constants/RoleConstants.java
@@ -0,0 +1,21 @@
+package com.brook.common.constants;
+
+/**
+ * @ClassName:
+ * @Description:
+ * @Author: zhuwenqiang
+ * @Date: 2023/10/18
+ */
+public class RoleConstants {
+
+ /**
+ * 管理员
+ */
+ public static final int ADMIN = 1;
+
+ /**
+ * 普通用户
+ */
+ public static final int ORDINARY_USERS = 2;
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/constants/TokenConstants.java b/brook-common/src/main/java/com/brook/common/constants/TokenConstants.java
new file mode 100644
index 0000000..e762032
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/constants/TokenConstants.java
@@ -0,0 +1,27 @@
+package com.brook.common.constants;
+
+/**
+ * @ClassName TokenConstants
+ * @Description 令牌常量
+ * @Author ChenLong
+ * @Date 2023/2/23 16:08
+ * @Version 1.0
+ */
+public class TokenConstants {
+ /**
+ * 缓存有效期,默认720(分钟)
+ */
+ public final static long EXPIRATION = 1800;
+ /**
+ * 缓存刷新时间,默认120(分钟)
+ */
+ public final static long REFRESH_TIME = 120;
+ /**
+ * 权限缓存前缀
+ */
+ public final static String LOGIN_TOKEN_KEY = "login_tokens:";
+ /**
+ * token标识
+ */
+ public static final String TOKEN = "token";
+}
diff --git a/brook-common/src/main/java/com/brook/common/constants/UserInfoConstants.java b/brook-common/src/main/java/com/brook/common/constants/UserInfoConstants.java
new file mode 100644
index 0000000..a6da104
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/constants/UserInfoConstants.java
@@ -0,0 +1,18 @@
+package com.brook.common.constants;
+
+
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.constants
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:UserInfoConstants
+ * @Date 2024/3/12:9:23
+ */
+
+public class UserInfoConstants{
+
+ public static final String USER_INFO = "brook-system";
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/Address.java b/brook-common/src/main/java/com/brook/common/domain/Address.java
new file mode 100644
index 0000000..3405368
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/Address.java
@@ -0,0 +1,27 @@
+package com.brook.common.domain;
+
+import com.alibaba.nacos.shaded.org.checkerframework.checker.initialization.qual.NotOnlyInitialized;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:Address
+ * @Date 2024/3/12:13:09
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class Address {
+
+ private Long addressId;
+ private Long userId;
+ private String addressName;
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/Brand.java b/brook-common/src/main/java/com/brook/common/domain/Brand.java
new file mode 100644
index 0000000..f98c5a2
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/Brand.java
@@ -0,0 +1,33 @@
+package com.brook.common.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:Brand
+ * @Date 2024/3/12:11:43
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName(value = "brand")
+@Builder
+public class Brand {
+
+ @TableField(value = "brand_id")
+ @TableId(type = IdType.AUTO)
+ private Long brandId;
+ @TableField(value = "brand_name")
+ private String brandName;
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/Cart.java b/brook-common/src/main/java/com/brook/common/domain/Cart.java
new file mode 100644
index 0000000..9a10bcf
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/Cart.java
@@ -0,0 +1,54 @@
+package com.brook.common.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:Cart
+ * @Date 2024/3/12:10:52
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@TableName(value = "cart")
+public class Cart {
+
+ @TableId(type = IdType.AUTO)
+ @TableField(value = "cart_id")
+ private Long cartId;
+
+ @TableField(value = "goods_id")
+ private Long goodsId;
+
+ @TableField(value = "goods_name")
+ private String goodsName;
+
+ @TableField(value = "brand_name")
+ private String brandName;
+ @TableField(value = "goods_price")
+ private BigDecimal goodsPrice;
+
+ private Integer total;
+
+ @TableField(value = "total_price")
+ private BigDecimal totalPrice;
+
+ private Integer isTrue;
+
+
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/Goods.java b/brook-common/src/main/java/com/brook/common/domain/Goods.java
new file mode 100644
index 0000000..cd35e01
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/Goods.java
@@ -0,0 +1,49 @@
+package com.brook.common.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:Goods
+ * @Date 2024/3/12:10:02
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@TableName(value = "goods")
+public class Goods {
+
+ private Long goodsId;
+
+ private String goodsName;
+
+ private Integer brandId;
+
+ private String brandName;
+
+ private String goodsInfo;
+
+ private BigDecimal goodsPrice;
+
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT-8")
+ private Date createTime;
+
+ private Integer isTrue;
+
+
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/Single.java b/brook-common/src/main/java/com/brook/common/domain/Single.java
new file mode 100644
index 0000000..d716bf1
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/Single.java
@@ -0,0 +1,47 @@
+package com.brook.common.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:Single
+ * @Date 2024/3/12:13:29
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@TableName(value = "single")
+public class Single {
+
+ @TableId(type = IdType.AUTO)
+ @TableField(value = "single_id")
+ private Long singleId;
+ @TableField(value = "goods_id")
+ private Long goodsId;
+ private Integer total;
+ @TableField(value = "total_price")
+ private BigDecimal totalPrice;
+ @TableField(value = "user_id")
+ private Long userId;
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT-8")
+ @TableField(value = "create_time")
+ private Date createTime;
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/UserInfo.java b/brook-common/src/main/java/com/brook/common/domain/UserInfo.java
new file mode 100644
index 0000000..83d1466
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/UserInfo.java
@@ -0,0 +1,36 @@
+package com.brook.common.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:UserInfo
+ * @Date 2024/3/12:9:19
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@TableName(value = "user_info")
+public class UserInfo {
+
+ @TableId(type = IdType.AUTO)
+ private Long id;
+
+ private String phone;
+
+ @TableField(value = "user_name")
+ private String userName;
+
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/request/address/AddressReq.java b/brook-common/src/main/java/com/brook/common/domain/request/address/AddressReq.java
new file mode 100644
index 0000000..0235375
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/request/address/AddressReq.java
@@ -0,0 +1,23 @@
+package com.brook.common.domain.request.address;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain.request.address
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:AddressReq
+ * @Date 2024/3/12:13:46
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AddressReq {
+
+ private Long userId;
+ private String addressName;
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/request/auth/LoginAuth.java b/brook-common/src/main/java/com/brook/common/domain/request/auth/LoginAuth.java
new file mode 100644
index 0000000..7c92c57
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/request/auth/LoginAuth.java
@@ -0,0 +1,24 @@
+package com.brook.common.domain.request.auth;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain.request.auth
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:LoginAuth
+ * @Date 2024/3/12:9:34
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LoginAuth {
+
+ private String phone;
+
+ private String code;
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/request/cart/CartAddReq.java b/brook-common/src/main/java/com/brook/common/domain/request/cart/CartAddReq.java
new file mode 100644
index 0000000..667d656
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/request/cart/CartAddReq.java
@@ -0,0 +1,38 @@
+package com.brook.common.domain.request.cart;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain.request.cart
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:CartAdd
+ * @Date 2024/3/12:12:21
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CartAddReq {
+
+ private Long goodsId;
+ @TableField(value = "goods_name")
+ private String goodsName;
+
+ @TableField(value = "brand_name")
+ private String brandName;
+ @TableField(value = "goods_price")
+ private BigDecimal goodsPrice;
+
+ private Integer total;
+
+ @TableField(value = "total_price")
+ private BigDecimal totalPrice;
+
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/request/es/GoodsReq.java b/brook-common/src/main/java/com/brook/common/domain/request/es/GoodsReq.java
new file mode 100644
index 0000000..76c4636
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/request/es/GoodsReq.java
@@ -0,0 +1,25 @@
+package com.brook.common.domain.request.es;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain.request.es
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:GoodsRwq
+ * @Date 2024/3/12:10:13
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class GoodsReq {
+
+ private String goodsName;
+ private Integer brandId;
+ private Integer pageNum;
+ private Integer pageSize;
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/request/single/SingleReq.java b/brook-common/src/main/java/com/brook/common/domain/request/single/SingleReq.java
new file mode 100644
index 0000000..e4be427
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/request/single/SingleReq.java
@@ -0,0 +1,37 @@
+package com.brook.common.domain.request.single;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain.request.single
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:SingleReq
+ * @Date 2024/3/12:13:33
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class SingleReq {
+
+ @TableField(value = "goods_id")
+ private Long goodsId;
+ private Integer total;
+ @TableField(value = "total_price")
+ private BigDecimal totalPrice;
+ @TableField(value = "user_id")
+ private Long userId;
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT-8")
+ @TableField(value = "create_time")
+ private Date createTime;
+}
diff --git a/brook-common/src/main/java/com/brook/common/domain/response/auth/LoginAuthResp.java b/brook-common/src/main/java/com/brook/common/domain/response/auth/LoginAuthResp.java
new file mode 100644
index 0000000..5380749
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/domain/response/auth/LoginAuthResp.java
@@ -0,0 +1,25 @@
+package com.brook.common.domain.response.auth;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author YanShuLing
+ * @Package:com.brook.common.domain.response.auth
+ * @Project: brook_week3
+ * @Description TODO
+ * @name:LoginAuthResp
+ * @Date 2024/3/12:9:35
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class LoginAuthResp {
+
+ private String token;
+ private Long outTime;
+
+}
diff --git a/brook-common/src/main/java/com/brook/common/handler/GlobalExceptionHandler.java b/brook-common/src/main/java/com/brook/common/handler/GlobalExceptionHandler.java
new file mode 100644
index 0000000..79ca558
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/handler/GlobalExceptionHandler.java
@@ -0,0 +1,39 @@
+package com.brook.common.handler;
+import com.alibaba.fastjson.JSONObject;
+import com.brook.common.result.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * @author DongZl
+ * @description: 全局异常处理
+ * @Date 2024-1-10 下午 08:49
+ */
+@RestControllerAdvice
+@Configuration
+@Slf4j
+public class GlobalExceptionHandler {
+
+ @ExceptionHandler(value = MethodArgumentNotValidException.class)
+ public Result runtimeException (MethodArgumentNotValidException exception) {
+ return Result.error(
+ JSONObject.toJSONString(
+ exception.getBindingResult().getAllErrors()
+ .stream()
+ .map(ObjectError::getDefaultMessage)
+ .toList()
+ )
+ );
+ }
+
+
+ @ExceptionHandler(value = IllegalArgumentException.class)
+ public Result illegalArgumentExceptionHandler(IllegalArgumentException exception){
+ log.error("请求异常:[{}]", exception.getMessage(), exception);
+ return Result.error(exception.getMessage());
+ }
+}
diff --git a/brook-common/src/main/java/com/brook/common/redis/RedisCache.java b/brook-common/src/main/java/com/brook/common/redis/RedisCache.java
new file mode 100644
index 0000000..473929d
--- /dev/null
+++ b/brook-common/src/main/java/com/brook/common/redis/RedisCache.java
@@ -0,0 +1,260 @@
+package com.brook.common.redis;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.BoundSetOperations;
+import org.springframework.data.redis.core.HashOperations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * spring redis 工具类
+ *
+ * @author ruoyi
+ **/
+@SuppressWarnings(value = {"unchecked", "rawtypes"})
+@Component
+public class RedisCache {
+ @Autowired
+ public RedisTemplate redisTemplate;
+
+ /**
+ * 缓存基本的对象,Integer、String、实体类等
+ *
+ * @param key 缓存的键值
+ * @param value 缓存的值
+ */
+ public void setCacheObject (final String key, final T value) {
+ redisTemplate.opsForValue().set(key, value);
+ }
+
+ /**
+ * 缓存基本的对象,Integer、String、实体类等
+ *
+ * @param key 缓存的键值
+ * @param value 缓存的值
+ * @param timeout 时间
+ * @param timeUnit 时间颗粒度
+ */
+ public void setCacheObject (final String key, final T value, final Long timeout, final TimeUnit timeUnit) {
+ redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
+ }
+
+ /**
+ * 设置有效时间
+ *
+ * @param key Redis键
+ * @param timeout 超时时间
+ *
+ * @return true=设置成功;false=设置失败
+ */
+ public boolean expire (final String key, final long timeout) {
+ return expire(key, timeout, TimeUnit.SECONDS);
+ }
+
+ /**
+ * 设置有效时间
+ *
+ * @param key Redis键
+ * @param timeout 超时时间
+ * @param unit 时间单位
+ *
+ * @return true=设置成功;false=设置失败
+ */
+ public boolean expire (final String key, final long timeout, final TimeUnit unit) {
+ return Boolean.TRUE.equals(redisTemplate.expire(key, timeout, unit));
+ }
+
+ /**
+ * 获取有效时间
+ *
+ * @param key Redis键
+ *
+ * @return 有效时间
+ */
+ public long getExpire (final String key) {
+ return redisTemplate.getExpire(key);
+ }
+
+ /**
+ * 判断 key是否存在
+ *
+ * @param key 键
+ *
+ * @return true 存在 false不存在
+ */
+ public Boolean hasKey (String key) {
+ return redisTemplate.hasKey(key);
+ }
+
+ /**
+ * 获得缓存的基本对象。
+ *
+ * @param key 缓存键值
+ *
+ * @return 缓存键值对应的数据
+ */
+ public T getCacheObject (final String key) {
+ ValueOperations operation = redisTemplate.opsForValue();
+ return operation.get(key);
+ }
+
+ /**
+ * 删除单个对象
+ *
+ * @param key
+ */
+ public boolean deleteObject (final String key) {
+ return redisTemplate.delete(key);
+ }
+
+ /**
+ * 删除集合对象
+ *
+ * @param collection 多个对象
+ *
+ * @return
+ */
+ public boolean deleteObject (final Collection collection) {
+ return redisTemplate.delete(collection) > 0;
+ }
+
+ /**
+ * 缓存List数据
+ *
+ * @param key 缓存的键值
+ * @param dataList 待缓存的List数据
+ *
+ * @return 缓存的对象
+ */
+ public long setCacheList (final String key, final List dataList) {
+ Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
+ return count == null ? 0 : count;
+ }
+
+ /**
+ * 获得缓存的list对象
+ *
+ * @param key 缓存的键值
+ *
+ * @return 缓存键值对应的数据
+ */
+ public List getCacheList (final String key) {
+ return redisTemplate.opsForList().range(key, 0, -1);
+ }
+
+ /**
+ * 缓存Set
+ *
+ * @param key 缓存键值
+ * @param dataSet 缓存的数据
+ *
+ * @return 缓存数据的对象
+ */
+ public BoundSetOperations setCacheSet (final String key, final Set dataSet) {
+ BoundSetOperations setOperation = redisTemplate.boundSetOps(key);
+ for (T t : dataSet) {
+ setOperation.add(t);
+ }
+ return setOperation;
+ }
+
+ /**
+ * 获得缓存的set
+ *
+ * @param key
+ *
+ * @return
+ */
+ public Set getCacheSet (final String key) {
+ return redisTemplate.opsForSet().members(key);
+ }
+
+ /**
+ * 缓存Map
+ *
+ * @param key
+ * @param dataMap
+ */
+ public void setCacheMap (final String key, final Map dataMap) {
+ if (dataMap != null) {
+ redisTemplate.opsForHash().putAll(key, dataMap);
+ }
+ }
+
+ /**
+ * 获得缓存的Map
+ *
+ * @param key
+ *
+ * @return
+ */
+ public Map getCacheMap (final String key) {
+ return redisTemplate.opsForHash().entries(key);
+ }
+
+ /**
+ * 往Hash中存入数据
+ *
+ * @param key Redis键
+ * @param hKey Hash键
+ * @param value 值
+ */
+ public void setCacheMapValue (final String key, final String hKey, final T value) {
+ redisTemplate.opsForHash().put(key, hKey, value);
+ }
+
+ /**
+ * 获取Hash中的数据
+ *
+ * @param key Redis键
+ * @param hKey Hash键
+ *
+ * @return Hash中的对象
+ */
+ public T getCacheMapValue (final String key, final String hKey) {
+ HashOperations opsForHash = redisTemplate.opsForHash();
+ return opsForHash.get(key, hKey);
+ }
+
+ /**
+ * 获取多个Hash中的数据
+ *
+ * @param key Redis键
+ * @param hKeys Hash键集合
+ *
+ * @return Hash对象集合
+ */
+ public List getMultiCacheMapValue (final String key, final Collection