Skip to content

Commit

Permalink
Merge pull request #28 from MARU-EGG/admin-generate-new-question
Browse files Browse the repository at this point in the history
[Admin] generate-new custom question page
  • Loading branch information
swgvenghy authored Aug 12, 2024
2 parents 4abf697 + 985ac03 commit 0ef9595
Show file tree
Hide file tree
Showing 8 changed files with 130 additions and 17 deletions.
32 changes: 32 additions & 0 deletions src/api/admin-generate-question.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { server_axiosInstance } from '../utils/axios';

interface AdminGenerateQuestionProps {
category: string;
type: string;
questionContent: string;
answerContent: string;
}

export async function AdminGenerateQuestion({
category,
type,
questionContent,
answerContent,
}: AdminGenerateQuestionProps) {
const year = new Date().getFullYear();
const data = {
content: questionContent,
questionType: type,
questionCategory: category,
answer: {
content: answerContent,
renewalYear: year,
},
};
try {
const response = await server_axiosInstance.post('/api/questions/new', JSON.stringify(data));
return response.data;
} catch (error: any) {
throw new Error('created failed');
}
}
2 changes: 1 addition & 1 deletion src/api/admin-retrieve-file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ interface AdminRetrieveFileProps {

export async function adminRetrieveFile({ type, category }: AdminRetrieveFileProps) {
try {
const response = await llm_axiosInstance.get('/retrieve_documents_by_type_and_category', {
const response = await llm_axiosInstance.get('/retrieve_documents', {
params: {
type,
category,
Expand Down
2 changes: 2 additions & 0 deletions src/routes/admin-routes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import Login from '../ui/pages/admin/login';
import AdminLayout from '../ui/components/admin/Layout/admin-layout';
import { getCookie } from '../utils/cookies';
import QuestionCheck from '../ui/pages/admin/question-check';
import GenerateQuestion from '../ui/pages/admin/generate-question';
const AdminRoutes: React.FC = () => {
const token = getCookie('accessToken');
return (
Expand All @@ -14,6 +15,7 @@ const AdminRoutes: React.FC = () => {
<Route path="/" element={<PrivateRoute component={<AdminLayout />} authenticated={token} />}>
<Route path="setting/file" element={<FileList />} />
<Route path="question/list" element={<QuestionCheck />} />
<Route path="generate/question" element={<GenerateQuestion />} />
</Route>
</Routes>
);
Expand Down
3 changes: 2 additions & 1 deletion src/ui/components/admin/Layout/admin-layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ const AdminLayout: React.FC = () => {

const breadcrumpItem1 = pathname.split('/')[1];
const breadcrumpItem2 = pathname.split('/')[2];
const breadcrumpItem3 = pathname.split('/')[3];

const breadcrumpItems = [{ title: breadcrumpItem1 }, { title: breadcrumpItem2 }];
const breadcrumpItems = [{ title: breadcrumpItem1 }, { title: breadcrumpItem2 }, { title: breadcrumpItem3 }];
return (
<Layout style={{ minHeight: '100vh' }}>
<Sider style={{ background: '#002968' }}>
Expand Down
5 changes: 2 additions & 3 deletions src/ui/components/admin/slide-menu/slide-menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,10 @@ export default function SlideMenu(props: MenuProps) {
return [
{ key: '/admin/question/list', label: '질문 목록' },
{ type: 'divider' },
{ key: '/admin/setting/preset', label: '질문 프리셋 변경' },
{ type: 'divider' },
{ key: '/admin/setting/category', label: '카테고리 변경' },
{ type: 'divider' },
{ key: '/admin/setting/file', label: '파일 확인' },
{ type: 'divider' },
{ key: '/admin/generate/question', label: '질문답변 생성' },
];
}, []);

Expand Down
28 changes: 17 additions & 11 deletions src/ui/pages/admin/file-list.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,24 +39,30 @@ const FileList: React.FC = () => {
console.error('Upload failed', error);
}
setUploading(false);
setFileList([]);
};

useEffect(() => {
const fetchData = async () => {
setLoading(true);
try {
const response = await adminRetrieveFile({ type, category });
const formattedData = response.documents.reduce((acc: DataListType[], item: any) => {
const exists = acc.find((data) => data.title === item.title);
if (!exists) {
acc.push({
title: item.title,
createdAt: item.created_at,
});
}
return acc;
}, []);
console.log(dataList);
const formattedData: DataListType[] = [];

Object.keys(response.documents).forEach((key) => {
const documentsArray = response.documents[key];

documentsArray.forEach((item: any) => {
const exists = formattedData.find((data) => data.title === item.title);
if (!exists) {
formattedData.push({
title: item.title,
createdAt: item.created_at,
});
}
});
});

setDataList(formattedData);
} catch (error) {
console.error('다운로드 에러', error);
Expand Down
72 changes: 72 additions & 0 deletions src/ui/pages/admin/generate-question.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import React, { useState } from 'react';
import { Button, Divider, Input, Select } from 'antd';
import TextArea from 'antd/es/input/TextArea';
import { AdminGenerateQuestion } from '../../../api/admin-generate-question';

const GenerateQuestion = () => {
const [type, setType] = useState('SUSI');
const [category, setCategory] = useState('ADMISSION_GUIDELINE');
const [question, setQuestion] = useState('');
const [answer, setAnswer] = useState('');
const handleTypeChange = (value: string) => {
setType(value);
};

const handleCategoryChange = (value: string) => {
setCategory(value);
};

const handleQuestionInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setQuestion(e.target.value);
};

const handleAnswerInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {
setAnswer(e.target.value);
};
return (
<div className="w-full">
<Divider orientation="left">챗봇 질문-답변 생성하기</Divider>
<div className="mx-8 my-2">
전형선택
<Select
defaultValue="수시"
className="ml-10 w-40"
onChange={handleTypeChange}
options={[
{ value: 'SUSI', label: '수시' },
{ value: 'JEONGSI', label: '정시' },
{ value: 'PYEONIP', label: '편입학' },
]}
/>
</div>
<div className="mx-8 my-2">
카테고리 선택
<Select
defaultValue="모집요강"
className="ml-3 w-40"
onChange={handleCategoryChange}
options={[
{ value: 'ADMISSION_GUIDELINE', label: '모집요강' },
{ value: 'PASSING_RESULT', label: '입시결과' },
{ value: 'PAST_QUESTIONS', label: '기출문제' },
{ value: 'INTERVIEW_PRACTICAL_TEST', label: '면접/실기' },
]}
/>
</div>
<Divider orientation="left">질문 내용</Divider>
<Input onChange={handleQuestionInputChange} placeholder="질문 내용을 적어주세요 (ex. 수시 모집요강 요약해줘)" />
<Divider orientation="left">답변 내용</Divider>
<div className="mb-5 text-xl">볼드체: **볼드단어**</div>
<TextArea rows={10} onChange={handleAnswerInputChange} placeholder="답변 내용을 적어주세요" />
<Button
className="my-3"
type="primary"
onClick={() => AdminGenerateQuestion({ category, type, questionContent: question, answerContent: answer })}
>
답변 생성하기
</Button>
</div>
);
};

export default GenerateQuestion;
3 changes: 2 additions & 1 deletion src/ui/pages/admin/login.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@ export default function Login() {
setIsLoading(true);
try {
await AdminLogin(email, password);
setLoginSuccess(true);
} catch (err: any) {
setError(err.message);
setLoginSuccess(false);
} finally {
setIsLoading(false);
setLoginSuccess(true);
}
};

Expand Down

0 comments on commit 0ef9595

Please sign in to comment.