日期: 2026-06-09 状态: 设计稿 v1
在 浠艾福(CFC) 平台中新增文章和活动发布功能:
方案 B: 统一内容表 + 扩展表
contents 表存储文章和活动的公共字段activities_ext 表存储活动的独有字段CREATE TABLE IF NOT EXISTS contents (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL COMMENT '标题',
summary VARCHAR(500) COMMENT '摘要',
content TEXT COMMENT '富文本内容(HTML)',
cover_image VARCHAR(500) COMMENT '封面图URL',
type VARCHAR(20) NOT NULL COMMENT 'article/activity',
category_id BIGINT COMMENT '分类ID',
energy_dimension VARCHAR(20) COMMENT 'body/mind/wisdom/action/wealth',
author_id BIGINT NOT NULL COMMENT '发布者用户ID',
status VARCHAR(20) NOT NULL DEFAULT 'draft' COMMENT 'draft/pending/approved/rejected',
reject_reason VARCHAR(500) COMMENT '驳回原因',
view_count INT DEFAULT 0 COMMENT '浏览量',
publish_time DATETIME COMMENT '发布时间',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_type_status (type, status),
INDEX idx_energy_dimension (energy_dimension),
INDEX idx_author_id (author_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='统一内容表';
CREATE TABLE IF NOT EXISTS activities_ext (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
content_id BIGINT NOT NULL UNIQUE COMMENT '关联contents.id',
location VARCHAR(300) COMMENT '活动地点',
start_time DATETIME COMMENT '开始时间',
end_time DATETIME COMMENT '结束时间',
max_participants INT COMMENT '最大参与人数',
sign_up_deadline DATETIME COMMENT '报名截止时间',
contact_phone VARCHAR(20) COMMENT '联系电话',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_start_time (start_time),
FOREIGN KEY (content_id) REFERENCES contents(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动扩展信息';
CREATE TABLE IF NOT EXISTS content_categories (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL COMMENT '分类名称',
energy_dimension VARCHAR(20) COMMENT '关联能量维度',
sort_order INT DEFAULT 0 COMMENT '排序',
type VARCHAR(20) NOT NULL COMMENT 'article/activity/both',
status VARCHAR(20) DEFAULT 'active' COMMENT 'active/inactive',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_type (type),
INDEX idx_energy_dimension (energy_dimension)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='内容分类';
controller/article/ArticleController.java)| 端点 | 方法 | 说明 | 权限 |
|---|---|---|---|
/api/articles/create |
POST | 创建文章(draft) | 登录用户 |
/api/articles/submit |
POST | 提交审核(draft→pending) | 作者 |
/api/articles/update |
POST | 更新文章 | 作者 |
/api/articles/list |
POST | 已发布文章列表(分页) | 公开 |
/api/articles/detail |
POST | 文章详情 | 公开 |
/api/articles/my |
POST | 我的文章列表 | 登录用户 |
controller/admin/ArticleAdminController.java)| 端点 | 方法 | 说明 | 权限 |
|---|---|---|---|
/api/admin/articles/pending |
POST | 待审核列表 | admin |
/api/admin/articles/approve |
POST | 审核通过 | admin |
/api/admin/articles/reject |
POST | 审核驳回 | admin |
controller/activity/ActivityController.java)| 端点 | 方法 | 说明 | 权限 |
|---|---|---|---|
/api/activities/create |
POST | 创建活动 | admin |
/api/activities/update |
POST | 更新活动 | admin |
/api/activities/list |
POST | 活动列表(分页) | 公开 |
/api/activities/detail |
POST | 活动详情 | 公开 |
controller/content/ContentCategoryController.java)| 端点 | 方法 | 说明 | 权限 |
|---|---|---|---|
/api/content-categories/list |
POST | 分类列表 | 公开 |
/api/content-categories/create |
POST | 创建分类 | admin |
/api/content-categories/update |
POST | 更新分类 | admin |
/api/content-categories/delete |
POST | 删除分类 | admin |
src/main/java/com/etotem/cfc/
├── config/DatabaseInitializer.java # DDL迁移(追加)
├── entity/
│ ├── Content.java # 统一内容实体
│ ├── ActivityExt.java # 活动扩展实体
│ └── ContentCategory.java # 分类实体
├── mapper/
│ ├── ContentMapper.java
│ ├── ActivityExtMapper.java
│ └── ContentCategoryMapper.java
├── service/
│ ├── ArticleService.java # 文章业务+审核
│ ├── ActivityService.java # 活动业务
│ └── ContentCategoryService.java # 分类业务
├── controller/
│ ├── article/ArticleController.java
│ ├── admin/ArticleAdminController.java
│ ├── activity/ActivityController.java
│ └── content/ContentCategoryController.java
├── dto/
│ ├── ArticleCreateDTO.java
│ ├── ArticleUpdateDTO.java
│ ├── ActivityCreateDTO.java
│ ├── ActivityUpdateDTO.java
│ └── ContentCategoryDTO.java
pages/
├── article/
│ ├── index.vue # 文章列表
│ └── detail.vue # 文章详情
└── activity/
├── index.vue # 活动列表
└── detail.vue # 活动详情
components/
├── article-card.vue # 文章卡片组件
└── activity-card.vue # 活动卡片组件
src/test/java/com/etotem/cfc/
├── controller/
│ ├── ArticleControllerTest.java
│ ├── ArticleAdminControllerTest.java
│ ├── ActivityControllerTest.java
│ └── ContentCategoryControllerTest.java
└── service/
├── ArticleServiceTest.java
├── ActivityServiceTest.java
└── ContentCategoryServiceTest.java
draft ──submit──→ pending ──approve──→ approved
│ │
├──reject──→ rejected │
│ │
└──withdraw→ withdrawn │
│
rejected ──resubmit──→ pending
withdrawn ──resubmit──→ pending
活动由 admin 直接发布,无需审核:
draft ──publish──→ published ──close──→ closed
@RequestAttribute("userId") 获取用户Result<T> 包装