diff --git a/db/create_tables.sql b/db/create_tables.sql index 0b5984b..c309b66 100644 --- a/db/create_tables.sql +++ b/db/create_tables.sql @@ -149,7 +149,7 @@ CREATE TABLE `cms_content` ( `title` varchar(255) NOT NULL COMMENT '标题', `subtitle` varchar(255) DEFAULT NULL COMMENT '副标题', `content_type` tinyint(1) NOT NULL COMMENT '内容类型(1文章,2视频,3图片)', - `category_id` bigint(20) DEFAULT NULL COMMENT '分类ID', + `category_ids` varchar(255) DEFAULT NULL COMMENT '分类ID列表,逗号分隔', `summary` varchar(500) DEFAULT NULL COMMENT '内容摘要', `content` longtext DEFAULT NULL COMMENT '内容详情', `cover_image` varchar(255) DEFAULT NULL COMMENT '封面图片', @@ -175,7 +175,6 @@ CREATE TABLE `cms_content` ( `update_by` varchar(50) DEFAULT NULL COMMENT '更新人', `delete_flag` tinyint(1) DEFAULT '0' COMMENT '是否删除 :0 未删除,1已删除', PRIMARY KEY (`content_id`), - KEY `idx_category_id` (`category_id`), KEY `idx_author_id` (`author_id`), KEY `idx_audit_status` (`audit_status`), KEY `idx_publish_status` (`publish_status`), diff --git a/src/main/java/com/kexue/skills/entity/CmsContent.java b/src/main/java/com/kexue/skills/entity/CmsContent.java index 8a230f0..f2d4013 100644 --- a/src/main/java/com/kexue/skills/entity/CmsContent.java +++ b/src/main/java/com/kexue/skills/entity/CmsContent.java @@ -2,10 +2,12 @@ package com.kexue.skills.entity; import java.math.BigDecimal; import java.util.Date; +import java.util.List; import java.io.Serializable; import com.kexue.skills.entity.base.BaseEntity; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -28,8 +30,8 @@ public class CmsContent extends BaseEntity implements Serializable { @Schema(description ="是否是官方:0否,1是") private Boolean isOfficial; - @Schema(description ="分类ID") - private Long categoryId; + @Schema(description ="分类ID列表,逗号分隔") + private String categoryIds; @Schema(description ="图标") private String icon; @@ -59,9 +61,6 @@ public class CmsContent extends BaseEntity implements Serializable { @Schema(description ="内容类型(1文章,2视频,3图片)") private Integer contentType; - @Schema(description ="父分类ID") - private Long parentCategoryId; - @Schema(description ="内容详情") private String content; @@ -130,4 +129,24 @@ public class CmsContent extends BaseEntity implements Serializable { @Schema(description ="副标题") private String subtitle; -} \ No newline at end of file + // 用于接收前端发送的分类ID数组 + @JsonProperty("categoryIds") + public void setCategoryIdsFromArray(List categoryIdList) { + if (categoryIdList != null && !categoryIdList.isEmpty()) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < categoryIdList.size(); i++) { + sb.append(categoryIdList.get(i)); + if (i < categoryIdList.size() - 1) { + sb.append(","); + } + } + this.categoryIds = sb.toString(); + } + } + + // 用于接收前端发送的分类ID字符串 + public void setCategoryIds(String categoryIds) { + this.categoryIds = categoryIds; + } + +} diff --git a/src/main/java/com/kexue/skills/entity/dto/CmsContentDto.java b/src/main/java/com/kexue/skills/entity/dto/CmsContentDto.java index 5ab88ea..c6bf18b 100644 --- a/src/main/java/com/kexue/skills/entity/dto/CmsContentDto.java +++ b/src/main/java/com/kexue/skills/entity/dto/CmsContentDto.java @@ -3,6 +3,8 @@ package com.kexue.skills.entity.dto; import com.kexue.skills.entity.base.BaseQueryDto; import lombok.Data; +import java.util.List; + /** * (CmsContent)查询DTO类 * @@ -18,9 +20,11 @@ public class CmsContentDto extends BaseQueryDto { private Integer contentType; + private String categoryIds; + private Long categoryId; - private Long parentCategoryId; + private List categoryIdList; private Boolean isOfficial; @@ -38,4 +42,4 @@ public class CmsContentDto extends BaseQueryDto { private Integer deleteFlag; -} \ No newline at end of file +} diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 49063cd..637365a 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -46,7 +46,7 @@ sa-token: # 验证码配置 captcha: # 是否启用验证码验证 - enabled: false + enabled: true # 验证码有效期(秒) expire-time: 300 # 验证码长度 diff --git a/src/main/resources/mapper/CmsContentMapper.xml b/src/main/resources/mapper/CmsContentMapper.xml index eafb90b..be9def7 100644 --- a/src/main/resources/mapper/CmsContentMapper.xml +++ b/src/main/resources/mapper/CmsContentMapper.xml @@ -7,13 +7,7 @@ - - - - - - - + @@ -29,19 +23,28 @@ + + + + + + + + + @@ -49,9 +52,9 @@ select - content_id, title, subtitle, content_type, category_id, parent_category_id, is_official, share_count, file_url, icon, background, summary, content, cover_image, author_id, author_name, + content_id, title, subtitle, content_type, category_ids, summary, content, cover_image, author_id, author_name, reviewer_id, reviewer_name, audit_status, audit_comment, publish_status, publish_time, - view_count, like_count, comment_count, sort, create_time, update_time, create_by, update_by, delete_flag + view_count, like_count, comment_count, sort, is_paid, price, required_points, support_points_pay, is_official, share_count, file_url, icon, background, create_time, update_time, create_by, update_by, delete_flag from cms_content @@ -112,7 +119,17 @@ and content_type = #{contentType} - and category_id = #{categoryId} + and find_in_set(#{categoryId}, category_ids) + + + + find_in_set(#{catId}, category_ids) + + + + + find_in_set(#{catId}, category_ids) + and author_id = #{authorId} @@ -132,12 +149,12 @@ - insert into cms_content(title, subtitle, content_type, category_id, parent_category_id, is_official, share_count, file_url, icon, background, summary, content, cover_image, author_id, author_name, + insert into cms_content(title, subtitle, content_type, category_ids, summary, content, cover_image, author_id, author_name, reviewer_id, reviewer_name, audit_status, audit_comment, publish_status, publish_time, - view_count, like_count, comment_count, sort, create_time, update_time, create_by, update_by, delete_flag) - values (#{title}, #{subtitle}, #{contentType}, #{categoryId}, #{parentCategoryId}, #{isOfficial}, #{shareCount}, #{fileUrl}, #{icon}, #{background}, #{summary}, #{content}, #{coverImage}, #{authorId}, #{authorName}, + view_count, like_count, comment_count, sort, is_paid, price, required_points, support_points_pay, is_official, share_count, file_url, icon, background, create_time, update_time, create_by, update_by, delete_flag) + values (#{title}, #{subtitle}, #{contentType}, #{categoryIds}, #{summary}, #{content}, #{coverImage}, #{authorId}, #{authorName}, #{reviewerId}, #{reviewerName}, #{auditStatus}, #{auditComment}, #{publishStatus}, #{publishTime}, - #{viewCount}, #{likeCount}, #{commentCount}, #{sort}, #{createTime}, #{updateTime}, #{createBy}, #{updateBy}, #{deleteFlag}) + #{viewCount}, #{likeCount}, #{commentCount}, #{sort}, #{isPaid}, #{price}, #{requiredPoints}, #{supportPointsPay}, #{isOfficial}, #{shareCount}, #{fileUrl}, #{icon}, #{background}, #{createTime}, #{updateTime}, #{createBy}, #{updateBy}, #{deleteFlag}) @@ -153,26 +170,8 @@ content_type = #{contentType}, - - category_id = #{categoryId}, - - - parent_category_id = #{parentCategoryId}, - - - is_official = #{isOfficial}, - - - share_count = #{shareCount}, - - - file_url = #{fileUrl}, - - - icon = #{icon}, - - - background = #{background}, + + category_ids = #{categoryIds}, summary = #{summary}, @@ -219,6 +218,33 @@ sort = #{sort}, + + is_paid = #{isPaid}, + + + price = #{price}, + + + required_points = #{requiredPoints}, + + + support_points_pay = #{supportPointsPay}, + + + is_official = #{isOfficial}, + + + share_count = #{shareCount}, + + + file_url = #{fileUrl}, + + + icon = #{icon}, + + + background = #{background}, + update_time = #{updateTime}, @@ -278,4 +304,4 @@ limit #{limit} - \ No newline at end of file + diff --git a/src/main/resources/sql/alter_cms_content.sql b/src/main/resources/sql/alter_cms_content.sql index df2c8d1..574feb3 100644 --- a/src/main/resources/sql/alter_cms_content.sql +++ b/src/main/resources/sql/alter_cms_content.sql @@ -1,9 +1,14 @@ --- 修改cms_content表,添加新字段 +-- 修改cms_content表,添加新字段并修改分类ID字段 ALTER TABLE cms_content +-- 修改分类ID字段为分类ID列表 +MODIFY COLUMN category_id VARCHAR(255) COMMENT '分类ID列表,逗号分隔', -- 添加新字段 -ADD COLUMN parent_category_id BIGINT COMMENT '父分类ID', ADD COLUMN is_official BIT(1) DEFAULT 0 COMMENT '是否是官方:0否,1是', ADD COLUMN share_count INT DEFAULT 0 COMMENT '分享数量', ADD COLUMN file_url VARCHAR(255) COMMENT '文件URL', ADD COLUMN icon VARCHAR(255) COMMENT '图标', ADD COLUMN background VARCHAR(255) COMMENT '背景'; + +-- 重命名字段名 +ALTER TABLE cms_content +CHANGE COLUMN category_id category_ids VARCHAR(255) COMMENT '分类ID列表,逗号分隔'; diff --git a/src/main/resources/sql/init_cms_category.sql b/src/main/resources/sql/init_cms_category.sql index d16861e..b1fd09b 100644 --- a/src/main/resources/sql/init_cms_category.sql +++ b/src/main/resources/sql/init_cms_category.sql @@ -1,47 +1,51 @@ --- AI相关分类初始化数据 +-- CMS分类初始化数据 +-- 先清空现有数据 +TRUNCATE TABLE cms_category; + -- 一级分类 INSERT INTO cms_category (category_name, parent_id, level, sort, status, delete_flag, create_time, update_time, create_by, update_by) VALUES -('AI技术', NULL, 1, 1, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI应用', NULL, 1, 2, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI工具', NULL, 1, 3, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI伦理', NULL, 1, 4, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI新闻', NULL, 1, 5, 1, 0, NOW(), NOW(), 'admin', 'admin'); +('官方', 0, 1, 1, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('coze', 0, 1, 2, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('用户发布', 0, 1, 3, 1, 0, NOW(), NOW(), 'admin', 'admin'); --- 二级分类 - AI技术 +-- 二级分类 - 官方 INSERT INTO cms_category (category_name, parent_id, level, sort, status, delete_flag, create_time, update_time, create_by, update_by) VALUES -('机器学习', 1, 2, 1, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('深度学习', 1, 2, 2, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('自然语言处理', 1, 2, 3, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('计算机视觉', 1, 2, 4, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('语音识别', 1, 2, 5, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('强化学习', 1, 2, 6, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI大模型', 1, 2, 7, 1, 0, NOW(), NOW(), 'admin', 'admin'); +('工具', 1, 2, 1, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('编程', 1, 2, 2, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('设计', 1, 2, 3, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('前端', 1, 2, 4, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('测试', 1, 2, 5, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('AI', 1, 2, 6, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('数据分析', 1, 2, 7, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('写作', 1, 2, 8, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('管理', 1, 2, 9, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('内容', 1, 2, 10, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('自动化', 1, 2, 11, 1, 0, NOW(), NOW(), 'admin', 'admin'); --- 二级分类 - AI应用 +-- 二级分类 - coze INSERT INTO cms_category (category_name, parent_id, level, sort, status, delete_flag, create_time, update_time, create_by, update_by) VALUES -('ChatGPT应用', 2, 2, 1, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI绘画', 2, 2, 2, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI写作', 2, 2, 3, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI编程', 2, 2, 4, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI教育', 2, 2, 5, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI医疗', 2, 2, 6, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI金融', 2, 2, 7, 1, 0, NOW(), NOW(), 'admin', 'admin'); +('工具', 2, 2, 1, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('编程', 2, 2, 2, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('设计', 2, 2, 3, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('前端', 2, 2, 4, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('测试', 2, 2, 5, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('AI', 2, 2, 6, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('数据分析', 2, 2, 7, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('写作', 2, 2, 8, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('管理', 2, 2, 9, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('内容', 2, 2, 10, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('自动化', 2, 2, 11, 1, 0, NOW(), NOW(), 'admin', 'admin'); --- 二级分类 - AI工具 +-- 二级分类 - 用户发布 INSERT INTO cms_category (category_name, parent_id, level, sort, status, delete_flag, create_time, update_time, create_by, update_by) VALUES -('AI生成工具', 3, 2, 1, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI数据分析工具', 3, 2, 2, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI开发框架', 3, 2, 3, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI部署工具', 3, 2, 4, 1, 0, NOW(), NOW(), 'admin', 'admin'); - --- 二级分类 - AI伦理 -INSERT INTO cms_category (category_name, parent_id, level, sort, status, delete_flag, create_time, update_time, create_by, update_by) VALUES -('AI隐私', 4, 2, 1, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI偏见', 4, 2, 2, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI安全', 4, 2, 3, 1, 0, NOW(), NOW(), 'admin', 'admin'); - --- 二级分类 - AI新闻 -INSERT INTO cms_category (category_name, parent_id, level, sort, status, delete_flag, create_time, update_time, create_by, update_by) VALUES -('AI行业动态', 5, 2, 1, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI企业新闻', 5, 2, 2, 1, 0, NOW(), NOW(), 'admin', 'admin'), -('AI技术进展', 5, 2, 3, 1, 0, NOW(), NOW(), 'admin', 'admin'); +('工具', 3, 2, 1, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('编程', 3, 2, 2, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('设计', 3, 2, 3, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('前端', 3, 2, 4, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('测试', 3, 2, 5, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('AI', 3, 2, 6, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('数据分析', 3, 2, 7, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('写作', 3, 2, 8, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('管理', 3, 2, 9, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('内容', 3, 2, 10, 1, 0, NOW(), NOW(), 'admin', 'admin'), +('自动化', 3, 2, 11, 1, 0, NOW(), NOW(), 'admin', 'admin');