트랙 2 — BM / Landing / Pricing - schema.prisma: SubscriptionTier enum(free/pro/school) + User.subscriptionTier + User.subscriptionUntil. Migration 20260411161837_bm_and_problemsets. - auth.service.ts / me.service.ts safeUser/toView 에 구독 필드 포함. - frontend/lib/api.ts MeUser 에 subscriptionTier/subscriptionUntil 추가. - app/page.tsx 전면 재작성: 토큰 있으면 /dashboard, 없으면 비로그인 Landing (히어로 + 왜 ReLoop 3카드 + 페르소나 4장 + 4단계 루프 + 가격 티저 + FAQ 4개 + footer). - app/pricing/page.tsx 신규: Free/Pro/School 3 티어 카드(Pro 강조 PopBadge), 월/년 cycle 토글, 기능 비교 테이블(데스크탑 전용), FAQ 5개, 바닥 CTA. Pro ₩7,900/월, 연간 ₩79,000(2개월 무료), School ₩20,000/월·30시트. - app/profile/page.tsx: 구독 섹션 + 티어 배지 + pricing 으로 가는 업그레이드 버튼. 트랙 4 — 평가원 기출 ProblemSet 데모 - schema.prisma: ProblemSet + Problem 신규 모델. StudyLog.problemId (optional, SetNull). 각 ProblemSet 은 (year, examType, subjectName) 복합 unique. - prisma/seed.ts: 2024학년도 수능 수학 샘플 10 문항 (1/5/8/11/13/15/20/22/ 28/30번) 대략치 난이도+정답률로 upsert. 실제 KICE 수치로 교체 가능하도록 주석 명시. - backend/src/problem-sets/: ProblemSetsModule + Service + Controller. GET /api/problem-sets (list, subject/year 필터) + GET /api/problem-sets/:id (문제 배열 포함). JwtAuthGuard 적용. - study-logs.service/controller: problemId optional 필드 수용. - frontend/lib/api.ts: ProblemSetSummary/ProblemSetDetail/Problem 타입. - frontend/app/study/page.tsx 재설계: 상단 탭 [직접 입력 | 문제집에서 가져오기]. 문제집 탭은 set 드롭다운 + 문제 리스트 클릭 → title/difficulty/baseCorrectRate 자동 채움 + subjectName 매핑으로 사용자 과목 자동 선택 + topic 을 tag 이름과 매칭. 결과/메모/시간만 수동 입력.
46 lines
1.7 KiB
SQL
46 lines
1.7 KiB
SQL
-- AlterTable
|
|
ALTER TABLE `study_logs` ADD COLUMN `problemId` INTEGER NULL;
|
|
|
|
-- AlterTable
|
|
ALTER TABLE `users` ADD COLUMN `subscriptionTier` ENUM('free', 'pro', 'school') NOT NULL DEFAULT 'free',
|
|
ADD COLUMN `subscriptionUntil` DATETIME(3) NULL;
|
|
|
|
-- CreateTable
|
|
CREATE TABLE `problem_sets` (
|
|
`id` INTEGER NOT NULL AUTO_INCREMENT,
|
|
`title` VARCHAR(191) NOT NULL,
|
|
`examType` VARCHAR(191) NOT NULL,
|
|
`year` INTEGER NOT NULL,
|
|
`subjectName` VARCHAR(191) NOT NULL,
|
|
`sourceUrl` VARCHAR(191) NULL,
|
|
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
|
|
|
UNIQUE INDEX `problem_sets_year_examType_subjectName_key`(`year`, `examType`, `subjectName`),
|
|
PRIMARY KEY (`id`)
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
|
|
-- CreateTable
|
|
CREATE TABLE `problems` (
|
|
`id` INTEGER NOT NULL AUTO_INCREMENT,
|
|
`problemSetId` INTEGER NOT NULL,
|
|
`number` INTEGER NOT NULL,
|
|
`title` VARCHAR(191) NOT NULL,
|
|
`difficulty` DOUBLE NOT NULL,
|
|
`baseCorrectRate` DOUBLE NULL,
|
|
`topic` VARCHAR(191) NULL,
|
|
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
|
|
|
INDEX `problems_problemSetId_idx`(`problemSetId`),
|
|
UNIQUE INDEX `problems_problemSetId_number_key`(`problemSetId`, `number`),
|
|
PRIMARY KEY (`id`)
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX `study_logs_problemId_idx` ON `study_logs`(`problemId`);
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE `study_logs` ADD CONSTRAINT `study_logs_problemId_fkey` FOREIGN KEY (`problemId`) REFERENCES `problems`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE `problems` ADD CONSTRAINT `problems_problemSetId_fkey` FOREIGN KEY (`problemSetId`) REFERENCES `problem_sets`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|