feat(product): 新增商品及SKU实体和相关配置
- 添加商品实体类MtProduct及其Mapper接口 - 添加商品SKU实体类MtProductSku及其Mapper接口 - 配置MyBatis-Plus分页插件和自动填充处理器 - 完善实体字段注释和数据类型定义 - 集成SLF4J日志功能并添加详细使用指南文档
This commit is contained in:
218
mt-pay/LOGGING_GUIDE.md
Normal file
218
mt-pay/LOGGING_GUIDE.md
Normal file
@@ -0,0 +1,218 @@
|
||||
# 日志使用指南
|
||||
|
||||
## 概述
|
||||
|
||||
项目已全面集成SLF4J日志功能,使用Logback作为日志实现框架。所有关键类都已添加日志记录,便于问题排查和系统监控。
|
||||
|
||||
## 日志配置
|
||||
|
||||
### 日志配置文件
|
||||
|
||||
- **位置**: `src/main/resources/logback-spring.xml`
|
||||
- **功能**: 配置日志输出格式、文件路径、日志级别等
|
||||
|
||||
### 日志级别
|
||||
|
||||
- **DEBUG**: 详细的调试信息,通常只在开发环境使用
|
||||
- **INFO**: 一般信息,记录系统运行状态和关键操作
|
||||
- **WARN**: 警告信息,表示潜在问题但不影响系统运行
|
||||
- **ERROR**: 错误信息,表示系统错误需要关注
|
||||
|
||||
### 日志输出
|
||||
|
||||
1. **控制台输出**: 开发环境默认输出到控制台
|
||||
2. **文件输出**:
|
||||
- 所有日志: `logs/mt-pay.{日期}.log`
|
||||
- 错误日志: `logs/mt-pay-error.{日期}.log`
|
||||
3. **日志轮转**: 按天轮转,保留30天,单文件最大10MB
|
||||
|
||||
## 已添加日志的类
|
||||
|
||||
### 1. 配置类
|
||||
|
||||
- ✅ `MyBatisPlusConfig` - MyBatis-Plus配置日志
|
||||
- ✅ `RestClientConfig` - RestClient配置日志
|
||||
- ✅ `WebConfig` - Web配置(跨域)日志
|
||||
- ✅ `DruidDataSourceConfig` - 数据源配置日志(已有)
|
||||
- ✅ `MyMetaObjectHandler` - 自动填充日志(已有)
|
||||
|
||||
### 2. 控制器类
|
||||
|
||||
- ✅ `ProductController` - 商品管理接口日志(已有)
|
||||
- ✅ `PaymentController` - 支付接口日志(已有)
|
||||
- ✅ `CallbackController` - 回调接口日志(已有)
|
||||
|
||||
### 3. 服务实现类
|
||||
|
||||
- ✅ `ProductServiceImpl` - 商品服务日志(已增强)
|
||||
- ✅ `PaymentOrderServiceImpl` - 支付订单服务日志(已增强)
|
||||
- ✅ `PingPongPayServiceImpl` - PingPong支付服务日志(已有)
|
||||
- ✅ `SignatureServiceImpl` - 签名服务日志(已有)
|
||||
- ✅ `CallbackServiceImpl` - 回调服务日志(已有)
|
||||
- ✅ `OssServiceImpl` - OSS服务日志(已有)
|
||||
|
||||
### 4. 工具类
|
||||
|
||||
- ✅ `OrderIdGenerator` - 订单号生成器日志(已添加)
|
||||
|
||||
### 5. 异常处理
|
||||
|
||||
- ✅ `GlobalExceptionHandler` - 全局异常处理日志(已有)
|
||||
|
||||
### 6. 主应用类
|
||||
|
||||
- ✅ `MtPayApplication` - 应用启动日志(已增强)
|
||||
|
||||
## 日志使用示例
|
||||
|
||||
### 在类中使用日志
|
||||
|
||||
```java
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class YourService {
|
||||
|
||||
public void doSomething() {
|
||||
// 记录信息日志
|
||||
log.info("开始执行操作,参数: {}", param);
|
||||
|
||||
try {
|
||||
// 业务逻辑
|
||||
log.debug("调试信息: {}", debugInfo);
|
||||
|
||||
} catch (Exception e) {
|
||||
// 记录错误日志
|
||||
log.error("操作失败,参数: {}", param, e);
|
||||
throw e;
|
||||
}
|
||||
|
||||
log.info("操作完成,结果: {}", result);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 日志级别使用建议
|
||||
|
||||
1. **DEBUG**:
|
||||
- 详细的执行流程
|
||||
- 中间变量值
|
||||
- SQL参数值(MyBatis)
|
||||
|
||||
2. **INFO**:
|
||||
- 关键业务操作开始/结束
|
||||
- 重要状态变更
|
||||
- 外部接口调用
|
||||
|
||||
3. **WARN**:
|
||||
- 业务异常(如订单不存在但继续处理)
|
||||
- 配置问题
|
||||
- 性能警告
|
||||
|
||||
4. **ERROR**:
|
||||
- 系统异常
|
||||
- 数据库操作失败
|
||||
- 外部接口调用失败
|
||||
|
||||
## 日志格式
|
||||
|
||||
### 控制台格式
|
||||
```
|
||||
2025-12-19 16:37:50.530 [restartedMain] INFO com.mtkj.mtpay.MtPayApplication - 应用启动成功!
|
||||
```
|
||||
|
||||
### 文件格式
|
||||
```
|
||||
2025-12-19 16:37:50.530 [http-nio-8080-exec-1] INFO com.mtkj.mtpay.controller.ProductController - 创建商品请求:ProductRequestDTO(...)
|
||||
```
|
||||
|
||||
## 环境配置
|
||||
|
||||
### 开发环境 (dev)
|
||||
- 控制台输出: ✅
|
||||
- 文件输出: ✅
|
||||
- 日志级别: DEBUG
|
||||
- MyBatis SQL日志: ✅
|
||||
|
||||
### 测试环境 (test)
|
||||
- 控制台输出: ❌
|
||||
- 文件输出: ✅
|
||||
- 日志级别: INFO
|
||||
- MyBatis SQL日志: ❌
|
||||
|
||||
### 生产环境 (prod)
|
||||
- 控制台输出: ❌
|
||||
- 文件输出: ✅
|
||||
- 日志级别: INFO
|
||||
- MyBatis SQL日志: ❌
|
||||
|
||||
## 日志文件位置
|
||||
|
||||
- **日志目录**: `./logs/`(项目根目录)
|
||||
- **所有日志**: `logs/mt-pay.{日期}.log`
|
||||
- **错误日志**: `logs/mt-pay-error.{日期}.log`
|
||||
|
||||
## 日志查看
|
||||
|
||||
### 开发环境
|
||||
- 直接在IDE控制台查看
|
||||
- 或查看 `logs/` 目录下的日志文件
|
||||
|
||||
### 生产环境
|
||||
- 使用 `tail -f logs/mt-pay-*.log` 实时查看
|
||||
- 使用 `grep ERROR logs/mt-pay-*.log` 查找错误
|
||||
- 使用日志分析工具(如ELK、Graylog等)
|
||||
|
||||
## 最佳实践
|
||||
|
||||
1. **使用占位符**: 使用 `{}` 占位符而不是字符串拼接
|
||||
```java
|
||||
// ✅ 推荐
|
||||
log.info("用户ID: {}, 操作: {}", userId, action);
|
||||
|
||||
// ❌ 不推荐
|
||||
log.info("用户ID: " + userId + ", 操作: " + action);
|
||||
```
|
||||
|
||||
2. **异常日志**: 记录异常时包含堆栈信息
|
||||
```java
|
||||
// ✅ 推荐
|
||||
log.error("操作失败", e);
|
||||
|
||||
// ❌ 不推荐
|
||||
log.error("操作失败: " + e.getMessage());
|
||||
```
|
||||
|
||||
3. **敏感信息**: 不要记录密码、密钥等敏感信息
|
||||
```java
|
||||
// ❌ 不要这样做
|
||||
log.info("用户密码: {}", password);
|
||||
```
|
||||
|
||||
4. **日志级别**: 根据重要性选择合适的日志级别
|
||||
- 关键业务操作: INFO
|
||||
- 调试信息: DEBUG
|
||||
- 警告: WARN
|
||||
- 错误: ERROR
|
||||
|
||||
## 常见问题
|
||||
|
||||
### Q: 如何修改日志级别?
|
||||
A: 修改 `logback-spring.xml` 中对应环境的日志级别配置。
|
||||
|
||||
### Q: 如何查看SQL日志?
|
||||
A: 开发环境默认开启,生产环境已关闭。可在 `logback-spring.xml` 中修改 `com.mtkj.mtpay.mapper` 的日志级别。
|
||||
|
||||
### Q: 日志文件太大怎么办?
|
||||
A: 已配置日志轮转,按天轮转,单文件最大10MB,保留30天。
|
||||
|
||||
### Q: 如何禁用某个类的日志?
|
||||
A: 在 `logback-spring.xml` 中添加:
|
||||
```xml
|
||||
<logger name="com.mtkj.mtpay.YourClass" level="OFF"/>
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
项目已全面集成SLF4J日志功能,所有关键操作都有日志记录。通过合理的日志级别和格式,可以快速定位问题、监控系统运行状态。
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.mtkj.mtpay.config;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.DbType;
|
||||
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
||||
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* MyBatis-Plus配置类
|
||||
*/
|
||||
@Slf4j
|
||||
@Configuration
|
||||
@MapperScan("com.mtkj.mtpay.mapper")
|
||||
public class MyBatisPlusConfig {
|
||||
|
||||
/**
|
||||
* 分页插件配置
|
||||
*/
|
||||
@Bean
|
||||
public MybatisPlusInterceptor mybatisPlusInterceptor() {
|
||||
log.info("初始化MyBatis-Plus分页插件,数据库类型: {}", DbType.MYSQL);
|
||||
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
|
||||
// 添加分页插件
|
||||
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
|
||||
log.info("MyBatis-Plus分页插件配置完成");
|
||||
return interceptor;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.mtkj.mtpay.config;
|
||||
|
||||
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.reflection.MetaObject;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* MyBatis-Plus自动填充处理器
|
||||
* 用于自动填充创建时间和更新时间
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class MyMetaObjectHandler implements MetaObjectHandler {
|
||||
|
||||
@Override
|
||||
public void insertFill(MetaObject metaObject) {
|
||||
log.debug("开始插入填充...");
|
||||
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
|
||||
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateFill(MetaObject metaObject) {
|
||||
log.debug("开始更新填充...");
|
||||
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
|
||||
}
|
||||
}
|
||||
|
||||
64
mt-pay/src/main/java/com/mtkj/mtpay/entity/MtProduct.java
Normal file
64
mt-pay/src/main/java/com/mtkj/mtpay/entity/MtProduct.java
Normal file
@@ -0,0 +1,64 @@
|
||||
package com.mtkj.mtpay.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 商品实体类
|
||||
*/
|
||||
@TableName(value = "mt_product")
|
||||
@Data
|
||||
public class MtProduct {
|
||||
|
||||
/**
|
||||
* 商品ID
|
||||
*/
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 商品名称
|
||||
*/
|
||||
@TableField(value = "name", jdbcType = org.apache.ibatis.type.JdbcType.VARCHAR)
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 商品价格(基础价格,SKU可能有不同价格)
|
||||
*/
|
||||
@TableField(value = "price", jdbcType = org.apache.ibatis.type.JdbcType.DECIMAL)
|
||||
private BigDecimal price;
|
||||
|
||||
/**
|
||||
* 主图URL(最大4000字符)
|
||||
*/
|
||||
@TableField(value = "main_image", jdbcType = org.apache.ibatis.type.JdbcType.VARCHAR)
|
||||
private String mainImage;
|
||||
|
||||
/**
|
||||
* 商品状态:ACTIVE-上架,INACTIVE-下架,DELETED-已删除
|
||||
*/
|
||||
@TableField(value = "status", jdbcType = org.apache.ibatis.type.JdbcType.VARCHAR)
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 店铺ID
|
||||
*/
|
||||
@TableField(value = "shop_id", jdbcType = org.apache.ibatis.type.JdbcType.BIGINT)
|
||||
private Long shopId;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@TableField(value = "create_time", fill = FieldFill.INSERT)
|
||||
private LocalDateTime createTime;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
|
||||
private LocalDateTime updateTime;
|
||||
}
|
||||
|
||||
100
mt-pay/src/main/java/com/mtkj/mtpay/entity/MtProductSku.java
Normal file
100
mt-pay/src/main/java/com/mtkj/mtpay/entity/MtProductSku.java
Normal file
@@ -0,0 +1,100 @@
|
||||
package com.mtkj.mtpay.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 商品SKU实体类
|
||||
*/
|
||||
@TableName(value = "mt_product_sku")
|
||||
@Data
|
||||
public class MtProductSku {
|
||||
|
||||
/**
|
||||
* SKU ID
|
||||
*/
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 商品ID
|
||||
*/
|
||||
@TableField(value = "product_id", jdbcType = org.apache.ibatis.type.JdbcType.BIGINT)
|
||||
private Long productId;
|
||||
|
||||
/**
|
||||
* SKU编码(最大2000字符)
|
||||
*/
|
||||
@TableField(value = "sku", jdbcType = org.apache.ibatis.type.JdbcType.VARCHAR)
|
||||
private String sku;
|
||||
|
||||
/**
|
||||
* 价格
|
||||
*/
|
||||
@TableField(value = "price", jdbcType = org.apache.ibatis.type.JdbcType.DECIMAL)
|
||||
private BigDecimal price;
|
||||
|
||||
/**
|
||||
* 货币(ISO 4217三位币种代码,如USD、CNY)
|
||||
*/
|
||||
@TableField(value = "currency", jdbcType = org.apache.ibatis.type.JdbcType.VARCHAR)
|
||||
private String currency;
|
||||
|
||||
/**
|
||||
* 库存数量
|
||||
*/
|
||||
@TableField(value = "stock", jdbcType = org.apache.ibatis.type.JdbcType.INTEGER)
|
||||
private Integer stock;
|
||||
|
||||
/**
|
||||
* 销售属性名称(LONGTEXT,JSON格式,如:[{"name":"颜色","value":"红色"},{"name":"尺寸","value":"大号"}])
|
||||
*/
|
||||
@TableField(value = "sales_attrs", jdbcType = org.apache.ibatis.type.JdbcType.LONGVARCHAR)
|
||||
private String salesAttrs;
|
||||
|
||||
/**
|
||||
* SKU图片URL(最大4000字符)
|
||||
*/
|
||||
@TableField(value = "sku_image", jdbcType = org.apache.ibatis.type.JdbcType.VARCHAR)
|
||||
private String skuImage;
|
||||
|
||||
/**
|
||||
* 重量(单位:克)
|
||||
*/
|
||||
@TableField(value = "weight", jdbcType = org.apache.ibatis.type.JdbcType.DECIMAL)
|
||||
private BigDecimal weight;
|
||||
|
||||
/**
|
||||
* 大小/尺寸(JSON格式,如:{"length":10,"width":5,"height":3},单位:厘米)
|
||||
*/
|
||||
@TableField(value = "size", jdbcType = org.apache.ibatis.type.JdbcType.VARCHAR)
|
||||
private String size;
|
||||
|
||||
/**
|
||||
* 规格(文本描述,最大2000字符)
|
||||
*/
|
||||
@TableField(value = "specification", jdbcType = org.apache.ibatis.type.JdbcType.VARCHAR)
|
||||
private String specification;
|
||||
|
||||
/**
|
||||
* SKU状态:ACTIVE-启用,INACTIVE-禁用
|
||||
*/
|
||||
@TableField(value = "status", jdbcType = org.apache.ibatis.type.JdbcType.VARCHAR)
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@TableField(value = "create_time", fill = FieldFill.INSERT)
|
||||
private LocalDateTime createTime;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
|
||||
private LocalDateTime updateTime;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.mtkj.mtpay.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.mtkj.mtpay.entity.MtProduct;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
* 商品Mapper接口
|
||||
*/
|
||||
@Mapper
|
||||
public interface MtProductMapper extends BaseMapper<MtProduct> {
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.mtkj.mtpay.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.mtkj.mtpay.entity.MtProductSku;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
* 商品SKU Mapper接口
|
||||
*/
|
||||
@Mapper
|
||||
public interface MtProductSkuMapper extends BaseMapper<MtProductSku> {
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user