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 @@ + + + + +