diff --git a/src/main/java/com/yolo/keyborad/mapper/KeyboardUserThemesMapper.java b/src/main/java/com/yolo/keyborad/mapper/KeyboardUserThemesMapper.java new file mode 100644 index 0000000..5019da1 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/mapper/KeyboardUserThemesMapper.java @@ -0,0 +1,12 @@ +package com.yolo.keyborad.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yolo.keyborad.model.entity.KeyboardUserThemes; + +/* +* @author: ziin +* @date: 2025/12/11 13:31 +*/ + +public interface KeyboardUserThemesMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/model/entity/KeyboardThemes.java b/src/main/java/com/yolo/keyborad/model/entity/KeyboardThemes.java index 9f8cd3b..dc8c2a6 100644 --- a/src/main/java/com/yolo/keyborad/model/entity/KeyboardThemes.java +++ b/src/main/java/com/yolo/keyborad/model/entity/KeyboardThemes.java @@ -8,6 +8,8 @@ import com.yolo.keyborad.typehandler.StringArrayTypeHandler; import io.swagger.v3.oas.annotations.media.Schema; import java.math.BigDecimal; import java.util.Date; +import java.util.List; + import lombok.Data; /* @@ -31,9 +33,9 @@ public class KeyboardThemes { @Schema(description="键盘价格") private BigDecimal themePrice; - @TableField(value = "theme_tag", typeHandler = StringArrayTypeHandler.class) + @TableField(value = "theme_tag") @Schema(description="主题标签") - private String[] themeTag; + private List themeTag; @TableField(value = "theme_download") @Schema(description="主题下载次数") diff --git a/src/main/java/com/yolo/keyborad/model/entity/KeyboardUserThemes.java b/src/main/java/com/yolo/keyborad/model/entity/KeyboardUserThemes.java new file mode 100644 index 0000000..a56daa7 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/model/entity/KeyboardUserThemes.java @@ -0,0 +1,61 @@ +package com.yolo.keyborad.model.entity; + +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 io.swagger.v3.oas.annotations.media.Schema; +import java.util.Date; +import lombok.Data; + +/* +* @author: ziin +* @date: 2025/12/11 13:31 +*/ + +@Schema +@Data +@TableName(value = "keyboard_user_themes") +public class KeyboardUserThemes { + /** + * 主键 id + */ + @TableId(value = "id", type = IdType.AUTO) + @Schema(description="主键 id") + private Long id; + + /** + * 主题主键 + */ + @TableField(value = "theme_id") + @Schema(description="主题主键") + private Long themeId; + + /** + * 用户 Id + */ + @TableField(value = "user_id") + @Schema(description="用户 Id") + private Long userId; + + /** + * 创建时间 + */ + @TableField(value = "created_at") + @Schema(description="创建时间") + private Date createdAt; + + /** + * 是否从显示移除 + */ + @TableField(value = "view_deleted") + @Schema(description="是否从显示移除") + private Boolean viewDeleted; + + /** + * 更新时间 + */ + @TableField(value = "updated_at") + @Schema(description="更新时间") + private Boolean updatedAt; +} \ No newline at end of file diff --git a/src/main/java/com/yolo/keyborad/model/entity/ThemeTagItem.java b/src/main/java/com/yolo/keyborad/model/entity/ThemeTagItem.java new file mode 100644 index 0000000..57be423 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/model/entity/ThemeTagItem.java @@ -0,0 +1,10 @@ +package com.yolo.keyborad.model.entity; + +import lombok.Data; + +// ThemeTagItem.java +@Data +public class ThemeTagItem { + private String label; + private String color; +} diff --git a/src/main/java/com/yolo/keyborad/model/vo/themes/KeyboardThemesRespVO.java b/src/main/java/com/yolo/keyborad/model/vo/themes/KeyboardThemesRespVO.java index 21296af..428e289 100644 --- a/src/main/java/com/yolo/keyborad/model/vo/themes/KeyboardThemesRespVO.java +++ b/src/main/java/com/yolo/keyborad/model/vo/themes/KeyboardThemesRespVO.java @@ -1,9 +1,11 @@ package com.yolo.keyborad.model.vo.themes; +import com.yolo.keyborad.model.entity.ThemeTagItem; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.math.BigDecimal; +import java.util.List; /* * @author: ziin @@ -34,7 +36,7 @@ public class KeyboardThemesRespVO { * 主题标签 */ @Schema(description = "主题标签") - private String[] themeTag; + private List themeTag; /** * 主题下载次数 diff --git a/src/main/java/com/yolo/keyborad/service/KeyboardUserThemesService.java b/src/main/java/com/yolo/keyborad/service/KeyboardUserThemesService.java new file mode 100644 index 0000000..a73dd3e --- /dev/null +++ b/src/main/java/com/yolo/keyborad/service/KeyboardUserThemesService.java @@ -0,0 +1,13 @@ +package com.yolo.keyborad.service; + +import com.yolo.keyborad.model.entity.KeyboardUserThemes; +import com.baomidou.mybatisplus.extension.service.IService; + /* +* @author: ziin +* @date: 2025/12/11 13:31 +*/ + +public interface KeyboardUserThemesService extends IService{ + + +} diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardThemePurchaseServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardThemePurchaseServiceImpl.java index 6b4f58a..39e9adb 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/KeyboardThemePurchaseServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardThemePurchaseServiceImpl.java @@ -3,12 +3,14 @@ package com.yolo.keyborad.service.impl; import com.yolo.keyborad.common.ErrorCode; import com.yolo.keyborad.exception.BusinessException; import com.yolo.keyborad.model.entity.KeyboardThemes; +import com.yolo.keyborad.model.entity.KeyboardUserThemes; import com.yolo.keyborad.model.entity.KeyboardUserWallet; import com.yolo.keyborad.model.entity.KeyboardWalletTransaction; import com.yolo.keyborad.model.vo.purchase.ThemePurchaseListRespVO; import com.yolo.keyborad.model.vo.purchase.ThemePurchaseRespVO; import com.yolo.keyborad.model.vo.themes.KeyboardThemesRespVO; import com.yolo.keyborad.service.KeyboardThemesService; +import com.yolo.keyborad.service.KeyboardUserThemesService; import com.yolo.keyborad.service.KeyboardUserWalletService; import com.yolo.keyborad.service.KeyboardWalletTransactionService; import jakarta.annotation.Resource; @@ -42,6 +44,9 @@ public class KeyboardThemePurchaseServiceImpl extends ServiceImpl implements KeyboardUserThemesService{ + +} diff --git a/src/main/java/com/yolo/keyborad/typehandler/ThemeTagTypeHandler.java b/src/main/java/com/yolo/keyborad/typehandler/ThemeTagTypeHandler.java new file mode 100644 index 0000000..00bb694 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/typehandler/ThemeTagTypeHandler.java @@ -0,0 +1,67 @@ +// ThemeTagTypeHandler.java +package com.yolo.keyborad.typehandler; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.yolo.keyborad.model.entity.ThemeTagItem; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.postgresql.util.PGobject; + +import java.sql.*; +import java.util.List; + +@MappedTypes(List.class) +@MappedJdbcTypes(JdbcType.OTHER) // PostgreSQL jsonb = OTHER +public class ThemeTagTypeHandler extends BaseTypeHandler> { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, + List parameter, + JdbcType jdbcType) throws SQLException { + try { + String json = MAPPER.writeValueAsString(parameter); + + PGobject pgObject = new PGobject(); + pgObject.setType("jsonb"); + pgObject.setValue(json); + + ps.setObject(i, pgObject); + } catch (Exception e) { + throw new SQLException("Failed to convert themeTag to jsonb", e); + } + } + + @Override + public List getNullableResult(ResultSet rs, String columnName) throws SQLException { + String json = rs.getString(columnName); + return parseJson(json); + } + + @Override + public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + String json = rs.getString(columnIndex); + return parseJson(json); + } + + @Override + public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + String json = cs.getString(columnIndex); + return parseJson(json); + } + + private List parseJson(String json) throws SQLException { + if (json == null) { + return null; + } + try { + return MAPPER.readValue(json, new TypeReference>() {}); + } catch (Exception e) { + throw new SQLException("Failed to parse jsonb to List: " + json, e); + } + } +} diff --git a/src/main/resources/mapper/KeyboardThemesMapper.xml b/src/main/resources/mapper/KeyboardThemesMapper.xml index 19c3a90..b27d5b3 100644 --- a/src/main/resources/mapper/KeyboardThemesMapper.xml +++ b/src/main/resources/mapper/KeyboardThemesMapper.xml @@ -7,7 +7,7 @@ - + diff --git a/src/main/resources/mapper/KeyboardUserThemesMapper.xml b/src/main/resources/mapper/KeyboardUserThemesMapper.xml new file mode 100644 index 0000000..4a7eb28 --- /dev/null +++ b/src/main/resources/mapper/KeyboardUserThemesMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + id, theme_id, user_id, created_at, view_deleted, updated_at + + \ No newline at end of file