diff --git a/backend/app/services/creator.go b/backend/app/services/creator.go
index 5963dbe..c52f675 100644
--- a/backend/app/services/creator.go
+++ b/backend/app/services/creator.go
@@ -20,6 +20,16 @@ import (
// @provider
type creator struct{}
+var genreMap = map[string]string{
+ "Jingju": "京剧",
+ "Kunqu": "昆曲",
+ "Yueju": "越剧",
+ "Yuju": "豫剧",
+ "Huangmeixi": "黄梅戏",
+ "Pingju": "评剧",
+ "Qinqiang": "秦腔",
+}
+
func (s *creator) Apply(ctx context.Context, userID int64, form *creator_dto.ApplyForm) error {
if userID == 0 {
return errorx.ErrUnauthorized
@@ -111,7 +121,12 @@ func (s *creator) ListContents(
q = q.Where(tbl.Status.Eq(consts.ContentStatus(*filter.Status)))
}
if filter.Genre != nil && *filter.Genre != "" {
- q = q.Where(tbl.Genre.Eq(*filter.Genre))
+ val := *filter.Genre
+ if cn, ok := genreMap[val]; ok {
+ q = q.Where(tbl.Genre.In(val, cn))
+ } else {
+ q = q.Where(tbl.Genre.Eq(val))
+ }
}
if filter.Keyword != nil && *filter.Keyword != "" {
q = q.Where(tbl.Title.Like("%" + *filter.Keyword + "%"))
diff --git a/frontend/portal/src/views/creator/ContentsEditView.vue b/frontend/portal/src/views/creator/ContentsEditView.vue
index bbda531..5e39f80 100644
--- a/frontend/portal/src/views/creator/ContentsEditView.vue
+++ b/frontend/portal/src/views/creator/ContentsEditView.vue
@@ -33,7 +33,7 @@
曲种 *
-
+
主定调
@@ -239,6 +239,9 @@ const currentUploadType = ref('');
const isSubmitting = ref(false);
const isEditMode = ref(false);
const contentId = ref('');
+const genreOptions = ref([]);
+
+const autoSaveStatus = ref('已自动保存');
const form = reactive({
genre: null,
@@ -255,7 +258,19 @@ const form = reactive({
images: [] // { name, size, url, id }
});
+const fetchOptions = async () => {
+ try {
+ const res = await commonApi.getOptions();
+ if (res) {
+ genreOptions.value = res.content_genre || [];
+ }
+ } catch (e) {
+ console.error(e);
+ }
+};
+
onMounted(async () => {
+ fetchOptions();
if (route.params.id) {
isEditMode.value = true;
contentId.value = route.params.id;
@@ -306,7 +321,6 @@ const loadContent = async (id) => {
}
};
-const genres = ['京剧', '昆曲', '越剧', '黄梅戏', '豫剧', '评剧'];
const keys = ['C大调', 'D大调', 'E大调', 'F大调', 'G大调', 'A大调', 'B大调', '降E大调'];
const triggerUpload = (type) => {
diff --git a/frontend/portal/src/views/creator/ContentsView.vue b/frontend/portal/src/views/creator/ContentsView.vue
index 804999d..b586d8e 100644
--- a/frontend/portal/src/views/creator/ContentsView.vue
+++ b/frontend/portal/src/views/creator/ContentsView.vue
@@ -53,14 +53,13 @@
-
-
-
{{
- item.genre }}
-
{{ item.key
- }}
-
+
+
+ [{{ getGenreLabel(item.genre) }}]
+ [{{ item.key }}]
+
{{ item.title }}
@@ -173,6 +172,11 @@ const handleSearch = () => {
fetchContents();
};
+const getGenreLabel = (key) => {
+ const opt = genreOptions.value.find(o => o.key === key);
+ return opt ? opt.value : key;
+};
+
const statusStyle = (status) => {
// Map backend status to UI style. Labels should ideally come from backend option value/label map if needed,
// but for style/color mapping we can keep it here or use a helper.