diff --git a/mt-pay/pom.xml b/mt-pay/pom.xml index 13a7aa4..295ff68 100644 --- a/mt-pay/pom.xml +++ b/mt-pay/pom.xml @@ -5,12 +5,13 @@ org.springframework.boot spring-boot-starter-parent - 4.0.0 + 3.2.0 com.mtkj mt-pay 0.0.1-SNAPSHOT + jar mt-pay mt-pay @@ -30,26 +31,27 @@ 17 + org.springframework.boot - spring-boot-starter-restclient - - - org.springframework.boot - spring-boot-starter-webmvc + spring-boot-starter-web + org.springframework.boot spring-boot-devtools runtime true + + com.mysql mysql-connector-j runtime + com.baomidou @@ -63,29 +65,31 @@ aliyun-sdk-oss 3.17.4 + com.alibaba druid-spring-boot-3-starter 1.2.20 + + org.springframework.boot spring-boot-starter-validation + + org.projectlombok lombok true + + org.springframework.boot - spring-boot-starter-restclient-test - test - - - org.springframework.boot - spring-boot-starter-webmvc-test + spring-boot-starter-test test @@ -100,6 +104,7 @@ org.projectlombok lombok + ${lombok.version} @@ -116,6 +121,13 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + true + + diff --git a/mt-pay/src/main/java/com/mtkj/mtpay/MtPayApplication.java b/mt-pay/src/main/java/com/mtkj/mtpay/MtPayApplication.java index c393579..90a760c 100644 --- a/mt-pay/src/main/java/com/mtkj/mtpay/MtPayApplication.java +++ b/mt-pay/src/main/java/com/mtkj/mtpay/MtPayApplication.java @@ -11,30 +11,77 @@ public class MtPayApplication { public static void main(String[] args) { try { + log.info(""" + + ╔══════════════════════════════════════════════════════════╗ + ║ ║ + ║ MTKJ PAY 支付系统正在启动... ║ + ║ ║ + ╚══════════════════════════════════════════════════════════╝ + """); + SpringApplication app = new SpringApplication(MtPayApplication.class); Environment env = app.run(args).getEnvironment(); String applicationName = env.getProperty("spring.application.name", "mt-pay"); - String serverPort = env.getProperty("server.port", "8080"); + String serverPort = env.getProperty("server.port", "8082"); String contextPath = env.getProperty("server.servlet.context-path", ""); String activeProfiles = String.join(",", env.getActiveProfiles()); + // 构建完整的访问地址 + String baseUrl = "http://localhost:" + serverPort + contextPath; + String apiUrl = baseUrl + "/api"; + String druidUrl = baseUrl + "/druid"; + + // 打印醒目的启动成功标识 log.info(""" - ======================================== - 应用启动成功! - ======================================== - 应用名称: {} - 运行环境: {} - 访问地址: http://localhost:{}{} - ======================================== + ╔══════════════════════════════════════════════════════════╗ + ║ ║ + ║ ✅ MTKJ PAY 支付系统启动成功! ✅ ║ + ║ ║ + ╠══════════════════════════════════════════════════════════╣ + ║ 应用信息 ║ + ╠══════════════════════════════════════════════════════════╣ + ║ 应用名称: {:<45} ║ + ║ 运行环境: {:<45} ║ + ║ 服务端口: {:<45} ║ + ╠══════════════════════════════════════════════════════════╣ + ║ 访问地址 ║ + ╠══════════════════════════════════════════════════════════╣ + ║ 后端服务: {:<45} ║ + ║ API接口: {:<45} ║ + ║ Druid监控: {:<45} ║ + ╠══════════════════════════════════════════════════════════╣ + ║ 状态: 🟢 服务运行中,可以接收请求 ║ + ╚══════════════════════════════════════════════════════════╝ """, - applicationName, + applicationName, activeProfiles.isEmpty() ? "default" : activeProfiles, - serverPort, - contextPath); + serverPort, + baseUrl, + apiUrl, + druidUrl); + + // 额外提示信息 + log.info(""" + + 📌 提示: + - 前端代理地址: http://localhost:3000 + - 后端API地址: {} + - 图片上传接口: {}/product/upload/image + - 商品管理接口: {}/product + """, apiUrl, apiUrl, apiUrl); + } catch (Exception e) { - log.error("应用启动失败", e); + log.error(""" + + ╔══════════════════════════════════════════════════════════╗ + ║ ║ + ║ ❌ MTKJ PAY 支付系统启动失败! ❌ ║ + ║ ║ + ╚══════════════════════════════════════════════════════════╝ + """, e); throw e; } } diff --git a/mt-pay/src/main/java/com/mtkj/mtpay/dto/request/CreateProductRequestDTO.java b/mt-pay/src/main/java/com/mtkj/mtpay/dto/request/CreateProductRequestDTO.java index b492640..1c1108c 100644 --- a/mt-pay/src/main/java/com/mtkj/mtpay/dto/request/CreateProductRequestDTO.java +++ b/mt-pay/src/main/java/com/mtkj/mtpay/dto/request/CreateProductRequestDTO.java @@ -30,11 +30,16 @@ public class CreateProductRequestDTO implements Serializable { private BigDecimal price; /** - * 主图URL + * 主图URL(单个URL,兼容旧版本) */ @Size(max = 4000, message = "主图URL长度不能超过4000") private String mainImage; + /** + * 主图URL列表(支持多张主图,JSON格式存储) + */ + private List mainImages; + /** * 商品状态:ACTIVE-上架,INACTIVE-下架 */ diff --git a/mt-pay/src/main/java/com/mtkj/mtpay/exception/GlobalExceptionHandler.java b/mt-pay/src/main/java/com/mtkj/mtpay/exception/GlobalExceptionHandler.java index a47649b..df71045 100644 --- a/mt-pay/src/main/java/com/mtkj/mtpay/exception/GlobalExceptionHandler.java +++ b/mt-pay/src/main/java/com/mtkj/mtpay/exception/GlobalExceptionHandler.java @@ -42,8 +42,9 @@ public class GlobalExceptionHandler { }); log.warn("参数验证失败: {}", errors); - return ResponseEntity.badRequest() - .body(Result.fail(ResultCode.VALIDATION_ERROR.getCode(), ResultCode.VALIDATION_ERROR.getMessage(), errors)); + Result> result = Result.fail(ResultCode.VALIDATION_ERROR.getCode(), ResultCode.VALIDATION_ERROR.getMessage()); + result.setData(errors); + return ResponseEntity.badRequest().body(result); } /** diff --git a/mt-pay/src/main/java/com/mtkj/mtpay/mapper/PaymentOrderMapper.java b/mt-pay/src/main/java/com/mtkj/mtpay/mapper/PaymentOrderMapper.java index 2793044..2da1e6a 100644 --- a/mt-pay/src/main/java/com/mtkj/mtpay/mapper/PaymentOrderMapper.java +++ b/mt-pay/src/main/java/com/mtkj/mtpay/mapper/PaymentOrderMapper.java @@ -1,5 +1,6 @@ package com.mtkj.mtpay.mapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mtkj.mtpay.entity.PaymentOrder; import org.apache.ibatis.annotations.Mapper; @@ -16,10 +17,9 @@ public interface PaymentOrderMapper extends BaseMapper { * 根据商户订单号查询 */ default Optional findByMerchantTransactionId(String merchantTransactionId) { - PaymentOrder order = selectOne( - com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper.lambdaQuery() - .eq(PaymentOrder::getMerchantTransactionId, merchantTransactionId) - ); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(PaymentOrder::getMerchantTransactionId, merchantTransactionId); + PaymentOrder order = selectOne(wrapper); return Optional.ofNullable(order); } @@ -27,10 +27,9 @@ public interface PaymentOrderMapper extends BaseMapper { * 根据PingPong交易流水号查询 */ default Optional findByTransactionId(String transactionId) { - PaymentOrder order = selectOne( - com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper.lambdaQuery() - .eq(PaymentOrder::getTransactionId, transactionId) - ); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(PaymentOrder::getTransactionId, transactionId); + PaymentOrder order = selectOne(wrapper); return Optional.ofNullable(order); } } diff --git a/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/OssServiceImpl.java b/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/OssServiceImpl.java index 2c3ee19..770d44c 100644 --- a/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/OssServiceImpl.java +++ b/mt-pay/src/main/java/com/mtkj/mtpay/service/impl/OssServiceImpl.java @@ -4,7 +4,7 @@ import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.auth.CredentialsProvider; import com.aliyun.oss.common.auth.CredentialsProviderFactory; -import com.aliyun.oss.exception.OSSException; +import com.aliyun.oss.OSSException; import com.mtkj.mtpay.config.AliyunOSSProperties; import com.mtkj.mtpay.service.OssService; import lombok.extern.slf4j.Slf4j; diff --git a/mt-pay/src/main/java/com/mtkj/mtpay/entity/MtProduct.java b/mt-pay/src/main/resources/MtProduct.java similarity index 100% rename from mt-pay/src/main/java/com/mtkj/mtpay/entity/MtProduct.java rename to mt-pay/src/main/resources/MtProduct.java diff --git a/mt-pay/src/main/resources/application.yml b/mt-pay/src/main/resources/application.yml index ceb7436..8951c48 100644 --- a/mt-pay/src/main/resources/application.yml +++ b/mt-pay/src/main/resources/application.yml @@ -71,7 +71,7 @@ pingpong: # 服务器配置 server: - port: 8080 + port: 8082 servlet: context-path: / # 文件上传配置 @@ -83,6 +83,12 @@ server: # 文件写入磁盘的阈值(超过此大小会写入临时文件) file-size-threshold: 2MB +# 应用配置 +app: + # 前端访问地址(用于生成商品详情页URL等) + frontend: + url: http://localhost:3000 + # 阿里云OSS相关配置 aliyun: oss: diff --git a/mt-pay/src/main/resources/logback-spring.xml b/mt-pay/src/main/resources/logback-spring.xml index ee483f9..a2c2f07 100644 --- a/mt-pay/src/main/resources/logback-spring.xml +++ b/mt-pay/src/main/resources/logback-spring.xml @@ -100,7 +100,7 @@ - + diff --git a/pom.xml b/pom.xml index 93cf5ee..e496643 100644 --- a/pom.xml +++ b/pom.xml @@ -5,12 +5,13 @@ org.springframework.boot spring-boot-starter-parent - 4.0.0 + 3.2.0 com.mtkj MTKJPAY 0.0.1-SNAPSHOT + jar MTKJPAY MTKJPAY @@ -30,36 +31,33 @@ 17 + - org.springframework.boot - spring-boot-starter-restclient + com.mtkj + mt-pay + 0.0.1-SNAPSHOT + + org.springframework.boot spring-boot-starter-webmvc - + + org.springframework.boot spring-boot-devtools runtime true - - com.mysql - mysql-connector-j - runtime - + + org.projectlombok lombok true - - org.springframework.boot - spring-boot-starter-restclient-test - test - @@ -72,6 +70,7 @@ org.projectlombok lombok + ${lombok.version} diff --git a/src/main/java/com/mtkj/mtkjpay/MtkjpayApplication.java b/src/main/java/com/mtkj/mtkjpay/MtkjpayApplication.java index c4c0450..55328b0 100644 --- a/src/main/java/com/mtkj/mtkjpay/MtkjpayApplication.java +++ b/src/main/java/com/mtkj/mtkjpay/MtkjpayApplication.java @@ -1,13 +1,93 @@ package com.mtkj.mtkjpay; +import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.core.env.Environment; -@SpringBootApplication +/** + * MTKJ PAY 支付系统启动类 + * 这是项目的唯一启动入口 + */ +@Slf4j +@SpringBootApplication(scanBasePackages = {"com.mtkj.mtpay", "com.mtkj.mtkjpay"}) public class MtkjpayApplication { public static void main(String[] args) { - SpringApplication.run(MtkjpayApplication.class, args); + try { + log.info(""" + + ╔══════════════════════════════════════════════════════════╗ + ║ ║ + ║ MTKJ PAY 支付系统正在启动... ║ + ║ ║ + ╚══════════════════════════════════════════════════════════╝ + """); + + SpringApplication app = new SpringApplication(MtkjpayApplication.class); + Environment env = app.run(args).getEnvironment(); + + String applicationName = env.getProperty("spring.application.name", "MTKJPAY"); + String serverPort = env.getProperty("server.port", "8082"); + String contextPath = env.getProperty("server.servlet.context-path", ""); + String activeProfiles = String.join(",", env.getActiveProfiles()); + + // 构建完整的访问地址 + String baseUrl = "http://localhost:" + serverPort + contextPath; + String apiUrl = baseUrl + "/api"; + String druidUrl = baseUrl + "/druid"; + + // 打印醒目的启动成功标识 + log.info(""" + + ╔══════════════════════════════════════════════════════════╗ + ║ ║ + ║ ✅ MTKJ PAY 支付系统启动成功! ✅ ║ + ║ ║ + ╠══════════════════════════════════════════════════════════╣ + ║ 应用信息 ║ + ╠══════════════════════════════════════════════════════════╣ + ║ 应用名称: {:<45} ║ + ║ 运行环境: {:<45} ║ + ║ 服务端口: {:<45} ║ + ╠══════════════════════════════════════════════════════════╣ + ║ 访问地址 ║ + ╠══════════════════════════════════════════════════════════╣ + ║ 后端服务: {:<45} ║ + ║ API接口: {:<45} ║ + ║ Druid监控: {:<45} ║ + ╠══════════════════════════════════════════════════════════╣ + ║ 状态: 🟢 服务运行中,可以接收请求 ║ + ╚══════════════════════════════════════════════════════════╝ + """, + applicationName, + activeProfiles.isEmpty() ? "default" : activeProfiles, + serverPort, + baseUrl, + apiUrl, + druidUrl); + + // 额外提示信息 + log.info(""" + + 📌 提示: + - 前端代理地址: http://localhost:3000 + - 后端API地址: {} + - 图片上传接口: {}/product/upload/image + - 商品管理接口: {}/product + """, apiUrl, apiUrl, apiUrl); + + } catch (Exception e) { + log.error(""" + + ╔══════════════════════════════════════════════════════════╗ + ║ ║ + ║ ❌ MTKJ PAY 支付系统启动失败! ❌ ║ + ║ ║ + ╚══════════════════════════════════════════════════════════╝ + """, e); + throw e; + } } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b596f7e..f4bd4a9 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,3 @@ spring.application.name=MTKJPAY -server.port=8080 +server.port=8082 spring.profiles.active=dev