diff --git a/backend/app/http/v1/dto/creator.go b/backend/app/http/v1/dto/creator.go
index bc474c3..1781586 100644
--- a/backend/app/http/v1/dto/creator.go
+++ b/backend/app/http/v1/dto/creator.go
@@ -30,6 +30,7 @@ type ContentCreateForm struct {
Genre string `json:"genre"`
Key string `json:"key"`
Price float64 `json:"price"`
+ Status string `json:"status"`
CoverIDs []string `json:"cover_ids"`
MediaIDs []string `json:"media_ids"`
}
diff --git a/backend/app/services/creator.go b/backend/app/services/creator.go
index 27d0351..5963dbe 100644
--- a/backend/app/services/creator.go
+++ b/backend/app/services/creator.go
@@ -201,6 +201,10 @@ func (s *creator) CreateContent(ctx context.Context, userID int64, form *creator
uid := userID
return models.Q.Transaction(func(tx *models.Query) error {
+ status := consts.ContentStatusPublished
+ if form.Status != "" {
+ status = consts.ContentStatus(form.Status)
+ }
// 1. Create Content
content := &models.Content{
TenantID: tid,
@@ -208,7 +212,7 @@ func (s *creator) CreateContent(ctx context.Context, userID int64, form *creator
Title: form.Title,
Genre: form.Genre,
Key: form.Key,
- Status: consts.ContentStatusPublished,
+ Status: status,
}
if err := tx.Content.WithContext(ctx).Create(content); err != nil {
return err
diff --git a/frontend/portal/src/views/creator/ContentsEditView.vue b/frontend/portal/src/views/creator/ContentsEditView.vue
index 3c938fb..bbda531 100644
--- a/frontend/portal/src/views/creator/ContentsEditView.vue
+++ b/frontend/portal/src/views/creator/ContentsEditView.vue
@@ -16,9 +16,9 @@
-
-
@@ -448,9 +448,13 @@ const removeMediaItem = async (type, index, item) => {
}
};
-const submit = async () => {
- if (!form.title || !form.genre) {
- toast.add({ severity: 'warn', summary: '信息不完整', detail: '请填写标题和曲种', life: 3000 });
+const saveContent = async (targetStatus) => {
+ if (!form.title) {
+ toast.add({ severity: 'warn', summary: '提示', detail: '请至少填写标题', life: 3000 });
+ return;
+ }
+ if (targetStatus === 'published' && !form.genre) {
+ toast.add({ severity: 'warn', summary: '提示', detail: '发布需要填写曲种', life: 3000 });
return;
}
@@ -462,10 +466,10 @@ const submit = async () => {
description: form.abstract,
genre: form.genre,
key: form.key,
- status: 'published', // Direct publish for demo
+ status: targetStatus,
visibility: 'public',
preview_seconds: form.enableTrial ? form.trialTime : 0,
- price: form.priceType === 'paid' ? parseFloat(form.price) : 0, // API expects float price, service handles conversion
+ price: form.priceType === 'paid' ? parseFloat(form.price) : 0,
cover_ids: [],
media_ids: []
};
@@ -475,15 +479,15 @@ const submit = async () => {
if (isEditMode.value) {
await creatorApi.updateContent(contentId.value, payload);
- toast.add({ severity: 'success', summary: '更新成功', detail: '内容已更新', life: 3000 });
+ toast.add({ severity: 'success', summary: '保存成功', detail: targetStatus === 'draft' ? '已保存为草稿' : '内容已更新', life: 3000 });
} else {
await creatorApi.createContent(payload);
- toast.add({ severity: 'success', summary: '发布成功', detail: '内容已提交审核', life: 3000 });
+ toast.add({ severity: 'success', summary: targetStatus === 'draft' ? '保存成功' : '发布成功', detail: targetStatus === 'draft' ? '已保存为草稿' : '内容已提交审核', life: 3000 });
}
setTimeout(() => router.push('/creator/contents'), 1500);
} catch (e) {
- toast.add({ severity: 'error', summary: '提交失败', detail: e.message, life: 3000 });
+ toast.add({ severity: 'error', summary: '操作失败', detail: e.message, life: 3000 });
} finally {
isSubmitting.value = false;
}