feat: 캐릭터 등록 폼 추가

This commit is contained in:
Yu Sung
2025-08-05 15:59:58 +09:00
parent 439cc21e57
commit 94a989ea57
4 changed files with 766 additions and 236 deletions

View File

@@ -1,16 +1,112 @@
import Vue from 'vue';
// 캐릭터 리스트
async function getCharacterList() {
return Vue.axios.get('/api/admin/characters')
async function getCharacterList(page = 1, size = 10) {
return Vue.axios.get('/api/admin/characters', {
params: { page, size }
})
}
// 캐릭터 검색
async function searchCharacters(keyword, page = 1, size = 10) {
return Vue.axios.get('/api/admin/characters/search', {
params: { keyword, page, size }
})
}
// 캐릭터 상세 조회
async function getCharacter(id) {
return Vue.axios.get(`/api/admin/characters/${id}`)
}
// 캐릭터 등록
async function createCharacter(characterData) {
const formData = new FormData()
// 기본 필드 추가
formData.append('name', characterData.name)
formData.append('description', characterData.description)
formData.append('isActive', characterData.isActive)
// 추가 필드가 있는 경우 추가
if (characterData.personality) formData.append('personality', characterData.personality)
if (characterData.gender) formData.append('gender', characterData.gender)
if (characterData.birthDate) formData.append('birthDate', characterData.birthDate)
if (characterData.mbti) formData.append('mbti', characterData.mbti)
if (characterData.ageRestricted !== undefined) formData.append('ageRestricted', characterData.ageRestricted)
if (characterData.worldView) formData.append('worldView', characterData.worldView)
if (characterData.relationships) formData.append('relationships', characterData.relationships)
if (characterData.speechPattern) formData.append('speechPattern', characterData.speechPattern)
if (characterData.systemPrompt) formData.append('systemPrompt', characterData.systemPrompt)
// 태그와 메모리는 배열이므로 JSON 문자열로 변환
if (characterData.tags && characterData.tags.length > 0) {
formData.append('tags', JSON.stringify(characterData.tags))
}
if (characterData.memories && characterData.memories.length > 0) {
formData.append('memories', JSON.stringify(characterData.memories))
}
// 이미지가 있는 경우 추가
if (characterData.image) formData.append('image', characterData.image)
return Vue.axios.post('/api/admin/characters', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
}
// 캐릭터 수정
async function updateCharacter(characterData) {
const formData = new FormData()
// 기본 필드 추가
formData.append('name', characterData.name)
formData.append('description', characterData.description)
formData.append('isActive', characterData.isActive)
// 추가 필드가 있는 경우 추가
if (characterData.personality) formData.append('personality', characterData.personality)
if (characterData.gender) formData.append('gender', characterData.gender)
if (characterData.birthDate) formData.append('birthDate', characterData.birthDate)
if (characterData.mbti) formData.append('mbti', characterData.mbti)
if (characterData.ageRestricted !== undefined) formData.append('ageRestricted', characterData.ageRestricted)
if (characterData.worldView) formData.append('worldView', characterData.worldView)
if (characterData.relationships) formData.append('relationships', characterData.relationships)
if (characterData.speechPattern) formData.append('speechPattern', characterData.speechPattern)
if (characterData.systemPrompt) formData.append('systemPrompt', characterData.systemPrompt)
// 태그와 메모리는 배열이므로 JSON 문자열로 변환
if (characterData.tags && characterData.tags.length > 0) {
formData.append('tags', JSON.stringify(characterData.tags))
}
if (characterData.memories && characterData.memories.length > 0) {
formData.append('memories', JSON.stringify(characterData.memories))
}
// 이미지가 있는 경우 추가
if (characterData.image) formData.append('image', characterData.image)
return Vue.axios.put(`/api/admin/characters/${characterData.id}`, formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
}
// 캐릭터 삭제
async function deleteCharacter(id) {
return Vue.axios.delete(`/api/admin/characters/${id}`)
}
export {
getCharacterList
getCharacterList,
searchCharacters,
getCharacter,
createCharacter,
updateCharacter,
deleteCharacter
}