From b94aa543651f410843c93487fb36379e76c88899 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Thu, 28 Aug 2025 19:38:21 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BA=90=EB=A6=AD=ED=84=B0=20=EC=B1=97?= =?UTF-8?q?=EB=B4=87=20=ED=81=90=EB=A0=88=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/character.js | 59 ++- src/components/SideMenu.vue | 5 + src/router/index.js | 10 + src/views/Chat/CharacterCuration.vue | 341 ++++++++++++++++ src/views/Chat/CharacterCurationDetail.vue | 429 +++++++++++++++++++++ 5 files changed, 843 insertions(+), 1 deletion(-) create mode 100644 src/views/Chat/CharacterCuration.vue create mode 100644 src/views/Chat/CharacterCurationDetail.vue diff --git a/src/api/character.js b/src/api/character.js index 5e70f90..62b7829 100644 --- a/src/api/character.js +++ b/src/api/character.js @@ -200,6 +200,53 @@ async function updateCharacterImageOrder(characterId, imageIds) { return Vue.axios.put('/admin/chat/character/image/orders', { characterId, ids: imageIds }) } +// 캐릭터 큐레이션 목록 +async function getCharacterCurationList() { + return Vue.axios.get('/admin/chat/character/curation/list') +} + +// 캐릭터 큐레이션 등록 +async function createCharacterCuration({ title, isAdult, isActive }) { + return Vue.axios.post('/admin/chat/character/curation/register', { title, isAdult, isActive }) +} + +// 캐릭터 큐레이션 수정 +// payload: { id: Long, title?, isAdult?, isActive? } +async function updateCharacterCuration(payload) { + return Vue.axios.put('/admin/chat/character/curation/update', payload) +} + +// 캐릭터 큐레이션 삭제 +async function deleteCharacterCuration(curationId) { + return Vue.axios.delete(`/admin/chat/character/curation/${curationId}`) +} + +// 캐릭터 큐레이션 정렬 순서 변경 +async function updateCharacterCurationOrder(ids) { + return Vue.axios.put('/admin/chat/character/curation/reorder', { ids }) +} + +// 큐레이션에 캐릭터 등록 (다중 등록) +// characterIds: Array +async function addCharacterToCuration(curationId, characterIds) { + return Vue.axios.post(`/admin/chat/character/curation/${curationId}/characters`, { characterIds }) +} + +// 큐레이션에서 캐릭터 삭제 +async function removeCharacterFromCuration(curationId, characterId) { + return Vue.axios.delete(`/admin/chat/character/curation/${curationId}/characters/${characterId}`) +} + +// 큐레이션 내 캐릭터 정렬 순서 변경 +async function updateCurationCharactersOrder(curationId, characterIds) { + return Vue.axios.put(`/admin/chat/character/curation/${curationId}/characters/reorder`, { characterIds }) +} + +// 큐레이션 캐릭터 목록 조회 (가정된 엔드포인트) +async function getCharactersInCuration(curationId) { + return Vue.axios.get(`/admin/chat/character/curation/${curationId}/characters`) +} + export { getCharacterList, searchCharacters, @@ -216,5 +263,15 @@ export { createCharacterImage, updateCharacterImage, deleteCharacterImage, - updateCharacterImageOrder + updateCharacterImageOrder, + // Character Curation + getCharacterCurationList, + createCharacterCuration, + updateCharacterCuration, + deleteCharacterCuration, + updateCharacterCurationOrder, + addCharacterToCuration, + removeCharacterFromCuration, + updateCurationCharactersOrder, + getCharactersInCuration } diff --git a/src/components/SideMenu.vue b/src/components/SideMenu.vue index 841a0c0..16a3ade 100644 --- a/src/components/SideMenu.vue +++ b/src/components/SideMenu.vue @@ -111,6 +111,11 @@ export default { title: '캐릭터 리스트', route: '/character', items: null + }, + { + title: '큐레이션', + route: '/character/curation', + items: null } ] }) diff --git a/src/router/index.js b/src/router/index.js index 5afc84a..5cbf3a9 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -280,6 +280,16 @@ const routes = [ name: 'CharacterImageForm', component: () => import(/* webpackChunkName: "character" */ '../views/Chat/CharacterImageForm.vue') }, + { + path: '/character/curation', + name: 'CharacterCuration', + component: () => import(/* webpackChunkName: "character" */ '../views/Chat/CharacterCuration.vue') + }, + { + path: '/character/curation/detail', + name: 'CharacterCurationDetail', + component: () => import(/* webpackChunkName: "character" */ '../views/Chat/CharacterCurationDetail.vue') + }, ] }, { diff --git a/src/views/Chat/CharacterCuration.vue b/src/views/Chat/CharacterCuration.vue new file mode 100644 index 0000000..d5e3240 --- /dev/null +++ b/src/views/Chat/CharacterCuration.vue @@ -0,0 +1,341 @@ + + + + + diff --git a/src/views/Chat/CharacterCurationDetail.vue b/src/views/Chat/CharacterCurationDetail.vue new file mode 100644 index 0000000..e010038 --- /dev/null +++ b/src/views/Chat/CharacterCurationDetail.vue @@ -0,0 +1,429 @@ + + + + +