diff --git a/src/main/java/com/aida/lanecarford/common/constant/CommonConstants.java b/src/main/java/com/aida/lanecarford/common/constant/CommonConstants.java new file mode 100644 index 0000000..0c368ea --- /dev/null +++ b/src/main/java/com/aida/lanecarford/common/constant/CommonConstants.java @@ -0,0 +1,12 @@ +package com.aida.lanecarford.common.constant; + +public class CommonConstants { + + public static final String REQUEST_OUTFIT = "http://18.167.251.121:10004/api/v1/chatbot"; + + public static final String CHAT = "http://18.167.251.121:10004/api/v1/agent"; + + public static final int MINIO_PATH_TIMEOUT = 7 * 24 * 60 * 60; // minio图片临时访问地址 7 天过期(second) + + +} diff --git a/src/main/java/com/aida/lanecarford/common/constant/RedisURIConstants.java b/src/main/java/com/aida/lanecarford/common/constant/RedisURIConstants.java index b0b6448..551c13d 100644 --- a/src/main/java/com/aida/lanecarford/common/constant/RedisURIConstants.java +++ b/src/main/java/com/aida/lanecarford/common/constant/RedisURIConstants.java @@ -8,5 +8,9 @@ public class RedisURIConstants { // 验证码 10分钟过期 public static final Long verifyCodeTimeout = 10 * 60L; + public static final String outfitResultCache = "OutfitResultCache:"; + + public static final String minioPathCache = "MinioPathCache:"; + } diff --git a/src/main/java/com/aida/lanecarford/common/enums/StatusEnum.java b/src/main/java/com/aida/lanecarford/common/enums/StatusEnum.java new file mode 100644 index 0000000..3611fed --- /dev/null +++ b/src/main/java/com/aida/lanecarford/common/enums/StatusEnum.java @@ -0,0 +1,13 @@ +package com.aida.lanecarford.common.enums; + + +public enum StatusEnum { + SUCCEEDED, + + FAILED, + + PENDING, + + RUNNING + +} diff --git a/src/main/java/com/aida/lanecarford/common/enums/StylistPathEnum.java b/src/main/java/com/aida/lanecarford/common/enums/StylistPathEnum.java new file mode 100644 index 0000000..9f50235 --- /dev/null +++ b/src/main/java/com/aida/lanecarford/common/enums/StylistPathEnum.java @@ -0,0 +1,25 @@ +package com.aida.lanecarford.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +@Getter +@AllArgsConstructor +public enum StylistPathEnum { + + STYLIST_ONE("crystal", "lanecarford/stylist_guide/crystal_en.md"), + + STYLIST_TWO("mini", "lanecarford/stylist_guide/mini_en.md"); + + private String name; + + private String path; + + public static StylistPathEnum of(String name) { + return Stream.of(StylistPathEnum.values()).filter(v -> v.name().equals(name)).findFirst().orElse(null); + } + + +} diff --git a/src/main/java/com/aida/lanecarford/common/security/JwtUtil.java b/src/main/java/com/aida/lanecarford/common/security/JwtUtil.java index 7781ea2..b2e7eb0 100644 --- a/src/main/java/com/aida/lanecarford/common/security/JwtUtil.java +++ b/src/main/java/com/aida/lanecarford/common/security/JwtUtil.java @@ -30,17 +30,18 @@ public class JwtUtil { // 生成JWT token public String generateToken(AuthPrincipalVO principal) { - return Jwts.builder() + String token = Jwts.builder() .subject(JSONObject.toJSONString(principal)) .issuedAt(new Date()) .expiration(new Date(System.currentTimeMillis() + jwtProperties.getJwtExpiration())) .signWith(getSigningKey()) .compact(); + return jwtProperties.getJwtTokenPrefix() + token; } // 从token中提取用户信息 public String extractUserinfo(String token) { - return parseClaims(token).getSubject(); + return parser(token).getSubject(); } // 验证token是否有效 @@ -62,11 +63,7 @@ public class JwtUtil { token = token.substring(jwtProperties.getJwtTokenPrefix().length()).trim(); } - return Jwts.parser() - .verifyWith(getSigningKey()) - .build() - .parseSignedClaims(token) - .getPayload(); + return parseClaims(token); } catch (ExpiredJwtException e) { log.error("Token已过期: {}", e.getMessage()); diff --git a/src/main/java/com/aida/lanecarford/config/WebConfig.java b/src/main/java/com/aida/lanecarford/config/WebConfig.java index c788fc5..6417d72 100644 --- a/src/main/java/com/aida/lanecarford/config/WebConfig.java +++ b/src/main/java/com/aida/lanecarford/config/WebConfig.java @@ -38,9 +38,9 @@ public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(jwtInterceptor) - .addPathPatterns("/api/protected/**") // 保护这些路径 + .addPathPatterns("/api/**/**") // 保护这些路径 .excludePathPatterns(Arrays.asList("/api/auth/precheckAndSendEmail", "/api/auth/register", - "/api/auth/login", "/api/auth/forgotPwd")); // 排除登录接口 + "/api/auth/login", "/api/auth/forgotPwd", "/api/style/callback")); // 排除登录接口 } /** diff --git a/src/main/java/com/aida/lanecarford/controller/CustomerController.java b/src/main/java/com/aida/lanecarford/controller/CustomerController.java index e2d2435..3ee8051 100644 --- a/src/main/java/com/aida/lanecarford/controller/CustomerController.java +++ b/src/main/java/com/aida/lanecarford/controller/CustomerController.java @@ -1,15 +1,17 @@ package com.aida.lanecarford.controller; +import com.aida.lanecarford.common.ApiResponse; +import com.aida.lanecarford.dto.BaseRequest; import com.aida.lanecarford.service.CustomerService; +import com.aida.lanecarford.vo.CustomerCheckInVO; +import com.aida.lanecarford.vo.CustomerVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * 顾客控制器 - * - * @author AI Assistant - * @since 2024-01-01 */ @RestController @RequestMapping("/api/customers") @@ -18,4 +20,14 @@ public class CustomerController { private final CustomerService customerService; + @GetMapping("/checkIn") + public ApiResponse customerCheckIn(@RequestParam String name, @RequestParam String email) { + return ApiResponse.success(customerService.customerCheckIn(name, email)); + } + + @PostMapping("/getAllCustomer") + public ApiResponse> getAllCustomer(@Valid @RequestBody BaseRequest request) { + return ApiResponse.success(customerService.getAllCustomer(request)); + } + } \ No newline at end of file diff --git a/src/main/java/com/aida/lanecarford/controller/LoginController.java b/src/main/java/com/aida/lanecarford/controller/LoginController.java index 98bdd3f..085c72d 100644 --- a/src/main/java/com/aida/lanecarford/controller/LoginController.java +++ b/src/main/java/com/aida/lanecarford/controller/LoginController.java @@ -6,10 +6,7 @@ import com.aida.lanecarford.service.LoginService; import com.aida.lanecarford.vo.LoginVO; import jakarta.annotation.Resource; import jakarta.validation.Valid; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/auth") @@ -24,14 +21,15 @@ public class LoginController { return ApiResponse.success(); } - @PostMapping("/register") - public ApiResponse register(@Valid @RequestBody LoginRequest loginRequest) { - return ApiResponse.success(loginService.register(loginRequest)); + @PostMapping("/registerOrLogin") + public ApiResponse registerOrLogin(@Valid @RequestBody LoginRequest loginRequest) { + return ApiResponse.success(loginService.registerOrLogin(loginRequest)); } - @PostMapping("/login") - public ApiResponse login(@Valid @RequestBody LoginRequest loginRequest) { - return ApiResponse.success(loginService.login(loginRequest)); + @GetMapping("/logout") + public ApiResponse logout() { + loginService.logout(); + return ApiResponse.success(); } @PostMapping("/forgotPwd") @@ -40,5 +38,14 @@ public class LoginController { return ApiResponse.success(); } + @GetMapping("/checkLoginStatus") + public ApiResponse checkLoginStatus() { + boolean isLogin = loginService.checkLoginStatus(); + if (isLogin){ + return ApiResponse.success(); + } else { + return ApiResponse.error("Please log in again."); + } + } } diff --git a/src/main/java/com/aida/lanecarford/controller/StyleController.java b/src/main/java/com/aida/lanecarford/controller/StyleController.java index ec08b9c..f223988 100644 --- a/src/main/java/com/aida/lanecarford/controller/StyleController.java +++ b/src/main/java/com/aida/lanecarford/controller/StyleController.java @@ -1,7 +1,11 @@ package com.aida.lanecarford.controller; +import com.aida.lanecarford.dto.OutfitCallbackDTO; import com.aida.lanecarford.service.StyleService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -11,11 +15,17 @@ import org.springframework.web.bind.annotation.RestController; * @author AI Assistant * @since 2024-01-01 */ +@Slf4j @RestController -@RequestMapping("/api/styles") +@RequestMapping("/api/style") @RequiredArgsConstructor public class StyleController { private final StyleService styleService; + @PostMapping("/callback") + public void callback(@RequestBody OutfitCallbackDTO callbackDTO) { + styleService.callback(callbackDTO); + } + } \ No newline at end of file diff --git a/src/main/java/com/aida/lanecarford/dto/LoginRequest.java b/src/main/java/com/aida/lanecarford/dto/LoginRequest.java index b183671..f933d65 100644 --- a/src/main/java/com/aida/lanecarford/dto/LoginRequest.java +++ b/src/main/java/com/aida/lanecarford/dto/LoginRequest.java @@ -9,14 +9,15 @@ import lombok.Data; public class LoginRequest { private String name; - @NotBlank(message = "邮箱不能为空") - @Email(message = "邮箱格式不正确") + @NotBlank(message = "email cannot be empty") + @Email(message = "Email format is incorrect.") private String email; - @NotBlank(message = "密码不能为空") - @Size(min = 6, message = "密码至少6位") + @NotBlank(message = "password cannot be empty") + @Size(min = 6, message = "Password must be at least 6 characters.") private String password; + @NotBlank(message = "operation type cannot be empty") private String operationType; private String verifyCode; diff --git a/src/main/java/com/aida/lanecarford/dto/OutfitCallbackDTO.java b/src/main/java/com/aida/lanecarford/dto/OutfitCallbackDTO.java new file mode 100644 index 0000000..aaaeaf7 --- /dev/null +++ b/src/main/java/com/aida/lanecarford/dto/OutfitCallbackDTO.java @@ -0,0 +1,18 @@ +package com.aida.lanecarford.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class OutfitCallbackDTO { + + private String outfit_id; + + // 取值范围:ok || failed || stop + private String status; + + private String path; + + private List items; +} diff --git a/src/main/java/com/aida/lanecarford/dto/RequestOutfitDTO.java b/src/main/java/com/aida/lanecarford/dto/RequestOutfitDTO.java new file mode 100644 index 0000000..633fdfb --- /dev/null +++ b/src/main/java/com/aida/lanecarford/dto/RequestOutfitDTO.java @@ -0,0 +1,28 @@ +package com.aida.lanecarford.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + + +@Data +public class RequestOutfitDTO { + + // 顾客id + @NotNull(message = "customer id cannot be empty") + private Long customerId; + + // 进店id + @NotNull(message = "customer check-in id cannot be empty") + private Long checkInId; + + // 选择的设计师 + @NotNull(message = "please select a stylist") + private String stylist; + + @NotNull(message = "please select gender") + private String gender; + + // 生成数量 + private int num; + +} diff --git a/src/main/java/com/aida/lanecarford/entity/Customer.java b/src/main/java/com/aida/lanecarford/entity/Customer.java index 0b73113..928f547 100644 --- a/src/main/java/com/aida/lanecarford/entity/Customer.java +++ b/src/main/java/com/aida/lanecarford/entity/Customer.java @@ -11,9 +11,6 @@ import java.time.LocalDateTime; /** * 顾客实体类 - * - * @author AI Assistant - * @since 2024-01-01 */ @Data @NoArgsConstructor diff --git a/src/main/java/com/aida/lanecarford/entity/OutfitRequest.java b/src/main/java/com/aida/lanecarford/entity/OutfitRequest.java new file mode 100644 index 0000000..d1e7133 --- /dev/null +++ b/src/main/java/com/aida/lanecarford/entity/OutfitRequest.java @@ -0,0 +1,32 @@ +package com.aida.lanecarford.entity; + +import lombok.Data; + +@Data +public class OutfitRequest extends BaseEntity{ + + /** + * 顾客id + */ + private Long customerId; + + /** + * 进店记录id + */ + private Long visitRecordId; + + /** + * 选择的设计师风格 + */ + private String stylist; + + /** + * 选择的性别 + */ + private String gender; + + /** + * 当前任务状态 + */ + private String status; +} diff --git a/src/main/java/com/aida/lanecarford/entity/Style.java b/src/main/java/com/aida/lanecarford/entity/Style.java index d88919d..27640c8 100644 --- a/src/main/java/com/aida/lanecarford/entity/Style.java +++ b/src/main/java/com/aida/lanecarford/entity/Style.java @@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -import java.time.LocalDateTime; +import java.util.List; /** * 风格配置实体类 @@ -35,6 +35,11 @@ public class Style extends BaseEntity { @TableField("visit_record_id") private Long visitRecordId; + /** + * 请求搭配id + */ + private Long outfitRequestId; + /** * 是否选中(0-未选中,1-已选中) */ @@ -53,6 +58,11 @@ public class Style extends BaseEntity { @TableField("python_request_id") private String pythonRequestId; + /** + * 单品的唯一id + */ + private List items; + /** * 生成状态(pending-等待中,processing-处理中,completed-已完成,failed-失败) */ diff --git a/src/main/java/com/aida/lanecarford/entity/VisitRecord.java b/src/main/java/com/aida/lanecarford/entity/VisitRecord.java index 024f62d..136338c 100644 --- a/src/main/java/com/aida/lanecarford/entity/VisitRecord.java +++ b/src/main/java/com/aida/lanecarford/entity/VisitRecord.java @@ -33,8 +33,8 @@ public class VisitRecord extends BaseEntity { /** * 导购ID */ - @TableField("sales_id") - private Long salesId; + @TableField("user_id") + private Long userId; /** * 进店日期 diff --git a/src/main/java/com/aida/lanecarford/mapper/OutfitRequestMapper.java b/src/main/java/com/aida/lanecarford/mapper/OutfitRequestMapper.java new file mode 100644 index 0000000..a891880 --- /dev/null +++ b/src/main/java/com/aida/lanecarford/mapper/OutfitRequestMapper.java @@ -0,0 +1,9 @@ +package com.aida.lanecarford.mapper; + +import com.aida.lanecarford.entity.OutfitRequest; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OutfitRequestMapper extends BaseMapper { +} diff --git a/src/main/java/com/aida/lanecarford/service/ChatService.java b/src/main/java/com/aida/lanecarford/service/ChatService.java new file mode 100644 index 0000000..6d1df7c --- /dev/null +++ b/src/main/java/com/aida/lanecarford/service/ChatService.java @@ -0,0 +1,4 @@ +package com.aida.lanecarford.service; + +public interface ChatService { +} diff --git a/src/main/java/com/aida/lanecarford/service/CustomerService.java b/src/main/java/com/aida/lanecarford/service/CustomerService.java index e79851d..c5abcf3 100644 --- a/src/main/java/com/aida/lanecarford/service/CustomerService.java +++ b/src/main/java/com/aida/lanecarford/service/CustomerService.java @@ -1,14 +1,19 @@ package com.aida.lanecarford.service; +import com.aida.lanecarford.dto.BaseRequest; import com.aida.lanecarford.entity.Customer; +import com.aida.lanecarford.vo.CustomerCheckInVO; +import com.aida.lanecarford.vo.CustomerVO; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; /** * 顾客服务接口 - * - * @author AI Assistant - * @since 2024-01-01 */ public interface CustomerService extends IService { + CustomerCheckInVO customerCheckIn(String name, String email); + + IPage getAllCustomer(BaseRequest request); + } \ No newline at end of file diff --git a/src/main/java/com/aida/lanecarford/service/LoginService.java b/src/main/java/com/aida/lanecarford/service/LoginService.java index ad25577..f25ca9b 100644 --- a/src/main/java/com/aida/lanecarford/service/LoginService.java +++ b/src/main/java/com/aida/lanecarford/service/LoginService.java @@ -17,9 +17,11 @@ public interface LoginService extends IService { void preCheckAndSendEmail(LoginRequest loginRequest); - LoginVO register(LoginRequest loginRequest); + LoginVO registerOrLogin(LoginRequest loginRequest); - LoginVO login(LoginRequest loginRequest); + void logout(); void forgotPwd(LoginRequest loginRequest); + + boolean checkLoginStatus(); } diff --git a/src/main/java/com/aida/lanecarford/service/StyleService.java b/src/main/java/com/aida/lanecarford/service/StyleService.java index 89c456f..0603623 100644 --- a/src/main/java/com/aida/lanecarford/service/StyleService.java +++ b/src/main/java/com/aida/lanecarford/service/StyleService.java @@ -1,5 +1,6 @@ package com.aida.lanecarford.service; +import com.aida.lanecarford.dto.OutfitCallbackDTO; import com.aida.lanecarford.entity.Style; import com.baomidou.mybatisplus.extension.service.IService; @@ -11,4 +12,6 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface StyleService extends IService