Spaces:
Paused
Paused
| <template> | |
| <div> | |
| <section class="section-white section-compact"> | |
| <div class="app-container max-w-[800px]"> | |
| <div class="page-header page-header--row"> | |
| <div class="shrink-0 text-5xl">📚</div> | |
| <div> | |
| <h1 class="font-display">Hướng dẫn sử dụng LinguaIELTS</h1> | |
| <p class="page-subtitle">Tìm hiểu cách sử dụng từng tính năng để tối ưu hành trình luyện thi IELTS của bạn.</p> | |
| </div> | |
| </div> | |
| <div class="mb-6 flex flex-wrap gap-2"> | |
| <a v-for="s in sections" :key="s.id" :href="'#' + s.id" class="flex items-center gap-1.5 rounded-full border border-[var(--border2)] bg-[var(--surface)] px-3.5 py-1.5 text-xs font-medium text-[var(--ink2)] transition-colors hover:border-[var(--green-l)] hover:bg-[var(--green-bg)] hover:text-[var(--green)]"> | |
| <span>{{ s.icon }}</span> {{ s.title }} | |
| </a> | |
| </div> | |
| <div class="flex flex-col gap-3"> | |
| <div | |
| v-for="section in sections" | |
| :key="section.id" | |
| :id="section.id" | |
| class="overflow-hidden rounded-[var(--r)] border border-[var(--border)] bg-[var(--surface)]" | |
| > | |
| <div | |
| class="flex cursor-pointer items-center justify-between px-5.5 py-4.5 transition-colors hover:bg-[var(--bg)]" | |
| @click="toggleSection(section.id)" | |
| > | |
| <div class="flex items-center gap-2.5"> | |
| <span class="text-xl">{{ section.icon }}</span> | |
| <h2 class="font-display m-0 text-base font-semibold text-[var(--ink)]">{{ section.title }}</h2> | |
| <span class="rounded-full bg-[var(--green-bg)] px-2 py-0.5 text-[10px] font-bold text-[var(--green)]" v-if="section.badge">{{ section.badge }}</span> | |
| </div> | |
| <span class="text-[var(--ink3)] transition-transform" :class="{ 'rotate-180': openSections[section.id] }"> | |
| <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"/></svg> | |
| </span> | |
| </div> | |
| <Transition name="accordion"> | |
| <div v-if="openSections[section.id]" class="border-t border-[var(--border)] px-5.5 pb-5.5"> | |
| <div v-if="section.steps" class="mt-4.5 flex flex-col gap-3.5"> | |
| <div v-for="(step, i) in section.steps" :key="i" class="flex items-start gap-3.5"> | |
| <div class="font-display flex h-7.5 w-7.5 shrink-0 items-center justify-center rounded-full bg-[var(--ink)] text-sm font-bold text-white">{{ i + 1 }}</div> | |
| <div> | |
| <div class="mb-0.5 text-sm font-semibold text-[var(--ink)]">{{ step.title }}</div> | |
| <div class="text-[13px] leading-6 text-[var(--ink3)]">{{ step.desc }}</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div v-if="section.tips" class="mt-4.5 grid grid-cols-1 gap-3 md:grid-cols-3"> | |
| <div v-for="tip in section.tips" :key="tip.title" class="rounded-[var(--r-sm)] border border-[var(--border)] bg-[var(--bg2)] p-4"> | |
| <div class="mb-2 text-2xl">{{ tip.icon }}</div> | |
| <div class="mb-1 text-[13px] font-semibold text-[var(--ink)]">{{ tip.title }}</div> | |
| <div class="text-xs leading-5 text-[var(--ink3)]">{{ tip.desc }}</div> | |
| </div> | |
| </div> | |
| <div v-if="section.table" class="mt-4.5 overflow-x-auto"> | |
| <table class="w-full border-collapse text-[13px]"> | |
| <thead> | |
| <tr> | |
| <th v-for="col in section.table.cols" :key="col" class="border-b-2 border-[var(--border)] bg-[var(--bg2)] px-3.5 py-2.5 text-left text-[11px] font-semibold uppercase tracking-[0.08em] text-[var(--ink3)]">{{ col }}</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr v-for="row in section.table.rows" :key="row[0]"> | |
| <td v-for="(cell, ci) in row" :key="ci" class="border-b border-[var(--border)] px-3.5 py-2.5 text-[var(--ink2)]">{{ cell }}</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| <div v-if="section.note" class="mt-4 flex items-start gap-2 rounded-[var(--r-sm)] border border-[rgba(144,96,10,0.2)] bg-[var(--gold-bg)] px-4 py-3 text-[13px] text-[var(--gold)]"> | |
| <span class="shrink-0">💡</span> | |
| {{ section.note }} | |
| </div> | |
| </div> | |
| </Transition> | |
| </div> | |
| </div> | |
| </div> | |
| </section> | |
| <WaveDivider fill="var(--section-cream)" /> | |
| <section class="section-cream"> | |
| <div class="app-container max-w-[800px] text-center"> | |
| <div class="font-display mb-2 text-[var(--text-section-title)] font-bold text-[var(--ink)]">Sẵn sàng bắt đầu?</div> | |
| <div class="mb-5 text-[var(--text-caption)] text-[var(--ink2)]">Hãy bắt đầu luyện tập ngay hôm nay và chinh phục band điểm mục tiêu của bạn!</div> | |
| <router-link to="/dashboard" class="btn-hero-cta inline-block rounded-full px-7 py-2.5">Về Dashboard →</router-link> | |
| </div> | |
| </section> | |
| </div> | |
| </template> | |
| <script setup> | |
| import { reactive } from 'vue' | |
| import WaveDivider from '@/components/layout/WaveDivider.vue' | |
| const openSections = reactive({ | |
| start: true, | |
| dashboard: false, | |
| reading: false, | |
| listening: false, | |
| writing: false, | |
| speaking: false, | |
| vocabulary: false, | |
| tips: false, | |
| }) | |
| function toggleSection(id) { | |
| openSections[id] = !openSections[id] | |
| } | |
| const sections = [ | |
| { | |
| id: 'start', | |
| icon: '🚀', | |
| title: 'Bắt đầu với LinguaIELTS', | |
| steps: [ | |
| { title: 'Đăng ký tài khoản', desc: 'Tạo tài khoản miễn phí với email của bạn. Tất cả dữ liệu học tập sẽ được lưu tự động.' }, | |
| { title: 'Thiết lập mục tiêu', desc: 'Vào Profile → Chỉnh sửa band score mục tiêu và ngày thi dự kiến để kích hoạt đồng hồ đếm ngược.' }, | |
| { title: 'Làm bài kiểm tra đầu vào', desc: 'Hoàn thành bài test thử để hệ thống gợi ý lộ trình học phù hợp với trình độ hiện tại.' }, | |
| { title: 'Luyện tập hàng ngày', desc: 'Duy trì streak bằng cách luyện ít nhất 1 bài mỗi ngày. Streak càng dài, XP thưởng càng nhiều!' }, | |
| ], | |
| }, | |
| { | |
| id: 'dashboard', | |
| icon: '📊', | |
| title: 'Dashboard — Tổng quan học tập', | |
| steps: [ | |
| { title: 'Band Score Grid', desc: '5 ô điểm hiển thị band score hiện tại và mục tiêu cho từng kỹ năng. Click vào ô để chỉnh sửa mục tiêu.' }, | |
| { title: 'Biểu đồ chăm chỉ', desc: 'Calendar heatmap hiển thị ngày bạn đã luyện tập. Màu xanh đậm hơn = luyện nhiều bài hơn.' }, | |
| { title: 'Đếm ngược lịch thi', desc: 'Số ngày còn lại đến kỳ thi IELTS. Cập nhật ngày thi trong phần Profile.' }, | |
| { title: 'Thống kê tuần', desc: 'Bảng tổng hợp số bài đã làm và thời gian luyện tập từng kỹ năng trong tuần.' }, | |
| ], | |
| note: 'Mẹo: Nhấp vào các skill card ở dưới Dashboard để chuyển nhanh đến trang luyện tập tương ứng.', | |
| }, | |
| { | |
| id: 'reading', | |
| icon: '📖', | |
| title: 'Luyện Reading', | |
| steps: [ | |
| { title: 'Chọn bài đọc', desc: 'Lọc theo Part (1/2/3), độ khó (Dễ/Trung bình/Khó) hoặc tìm kiếm theo tên bài.' }, | |
| { title: 'Chọn chế độ', desc: 'Luyện tập (không giới hạn thời gian) hoặc Thi thật (20 phút, như điều kiện thực tế).' }, | |
| { title: 'Đọc passage & làm câu hỏi', desc: 'Sử dụng thanh công cụ highlight để đánh dấu thông tin quan trọng trong bài đọc.' }, | |
| { title: 'Xem kết quả', desc: 'Sau khi nộp bài, xem band score ước tính, câu trả lời đúng/sai và giải thích chi tiết.' }, | |
| ], | |
| tips: [ | |
| { icon: '⏱️', title: 'Quản lý thời gian', desc: 'Dành ~17 phút mỗi passage. Đừng dừng quá lâu ở một câu hỏi.' }, | |
| { icon: '🔍', title: 'Kỹ thuật skimming', desc: 'Đọc lướt tiêu đề, từ khóa và câu đầu tiên của mỗi đoạn trước khi đọc kỹ.' }, | |
| { icon: '📝', title: 'Highlight từ khóa', desc: 'Dùng tính năng highlight để đánh dấu thông tin quan trọng trong câu trả lời.' }, | |
| ], | |
| }, | |
| { | |
| id: 'listening', | |
| icon: '🎧', | |
| title: 'Luyện Listening', | |
| steps: [ | |
| { title: 'Chọn Section', desc: 'IELTS Listening có 4 Section. Bắt đầu từ Section 1 (dễ nhất) và tăng dần độ khó.' }, | |
| { title: 'Nghe và điền câu trả lời', desc: 'File audio chỉ phát 1 lần như thi thật. Sử dụng nút tua nhỏ (+/-5s) để ôn lại.' }, | |
| { title: 'Điều chỉnh tốc độ', desc: 'Bắt đầu với 0.75x nếu cần, sau đó tăng dần lên 1x và 1.25x khi đã quen.' }, | |
| { title: 'Nộp và xem kết quả', desc: 'Sau khi nộp bài, xem đáp án và transcript để học từ lỗi sai.' }, | |
| ], | |
| note: 'Luyện nghe tiếng Anh mọi lúc mọi nơi — podcast, BBC, CNN giúp cải thiện khả năng nghe hiểu tự nhiên.', | |
| }, | |
| { | |
| id: 'writing', | |
| icon: '✍️', | |
| title: 'Luyện Writing', | |
| steps: [ | |
| { title: 'Task 1 — Biểu đồ', desc: 'Phân tích biểu đồ/sơ đồ được cung cấp. Tối thiểu 150 từ, thời gian đề xuất 20 phút.' }, | |
| { title: 'Task 2 — Essay', desc: 'Viết essay theo đề bài. Tối thiểu 250 từ, thời gian đề xuất 40 phút.' }, | |
| { title: 'AI Feedback', desc: 'Nộp bài để nhận band score ước tính (TA, CC, LR, GRA) và gợi ý cải thiện từ AI.' }, | |
| { title: 'Học từ câu mẫu', desc: 'Xem câu được cải thiện để học cách diễn đạt tốt hơn và đa dạng từ vựng hơn.' }, | |
| ], | |
| table: { | |
| cols: ['Tiêu chí', 'Ký hiệu', 'Trọng số'], | |
| rows: [ | |
| ['Task Achievement / Response', 'TA/TR', '25%'], | |
| ['Coherence & Cohesion', 'CC', '25%'], | |
| ['Lexical Resource', 'LR', '25%'], | |
| ['Grammatical Range & Accuracy', 'GRA', '25%'], | |
| ], | |
| }, | |
| }, | |
| { | |
| id: 'speaking', | |
| icon: '🎤', | |
| title: 'Luyện Speaking', | |
| steps: [ | |
| { title: 'Hiểu cấu trúc 3 Part', desc: 'Part 1: Q&A đơn giản (4-5 phút). Part 2: Monologue theo cue card (3-4 phút). Part 3: Thảo luận sâu (4-5 phút).' }, | |
| { title: 'Xem câu hỏi', desc: 'Đọc kỹ câu hỏi và ghi chú ý tưởng trước khi ghi âm (đặc biệt Part 2 có 1 phút prep).' }, | |
| { title: 'Ghi âm câu trả lời', desc: 'Nhấn nút mic để bắt đầu ghi âm. Cố gắng nói liên tục, tránh dừng quá lâu giữa câu.' }, | |
| { title: 'Nhận phân tích AI', desc: 'Xem phân tích phát âm (màu xanh=tốt, vàng=khá, đỏ=cần cải thiện) và band score ước tính.' }, | |
| ], | |
| tips: [ | |
| { icon: '🗣️', title: 'Nói nhiều hơn', desc: 'Thực hành nói tiếng Anh mỗi ngày, dù chỉ 5-10 phút.' }, | |
| { icon: '📱', title: 'Tự ghi âm', desc: 'Nghe lại recording để phát hiện lỗi phát âm và cải thiện.' }, | |
| { icon: '🌍', title: 'Mở rộng vốn từ', desc: 'Học idioms và collocations để câu trả lời tự nhiên hơn.' }, | |
| ], | |
| }, | |
| { | |
| id: 'vocabulary', | |
| icon: '📚', | |
| title: 'Học Từ vựng với FSRS', | |
| steps: [ | |
| { title: 'Flashcard mode', desc: 'Xem từ ở mặt trước (word + IPA), bấm để lật xem nghĩa và ví dụ ở mặt sau.' }, | |
| { title: 'Đánh giá độ nhớ', desc: 'Sau khi lật card, chọn mức độ nhớ: Quên rồi / Khó / Ổn / Dễ.' }, | |
| { title: 'Thuật toán FSRS', desc: 'Hệ thống tự động lên lịch ôn tập dựa trên đánh giá: từ dễ ôn ít, từ khó ôn nhiều hơn.' }, | |
| { title: 'Word detail', desc: 'Sau khi lật card, xem thêm từ liên quan và ví dụ trong context IELTS thực tế.' }, | |
| ], | |
| table: { | |
| cols: ['Mức đánh giá', 'Ý nghĩa', 'Lịch ôn tiếp'], | |
| rows: [ | |
| ['😰 Quên rồi', 'Không nhớ gì', '1 ngày'], | |
| ['😓 Khó', 'Nhớ mờ mờ', '3 ngày'], | |
| ['😊 Ổn', 'Nhớ khá tốt', '7 ngày'], | |
| ['🎉 Dễ', 'Nhớ rất chắc', '14 ngày'], | |
| ], | |
| }, | |
| }, | |
| { | |
| id: 'tips', | |
| icon: '💡', | |
| title: 'Mẹo học hiệu quả', | |
| tips: [ | |
| { icon: '📅', title: 'Học đều đặn', desc: 'Luyện 30-60 phút mỗi ngày hiệu quả hơn học nhồi nhiều giờ cuối tuần.' }, | |
| { icon: '🎯', title: 'Tập trung điểm yếu', desc: 'Dựa vào band score mỗi kỹ năng, dành thêm 60% thời gian cho kỹ năng thấp điểm nhất.' }, | |
| { icon: '🔥', title: 'Duy trì streak', desc: 'Streak là động lực học mỗi ngày. Đừng để đứt chuỗi — ngay cả 1 bài nhỏ cũng tính!' }, | |
| { icon: '📖', title: 'Đọc tiếng Anh mỗi ngày', desc: 'BBC, The Guardian, National Geographic — đọc 1 bài/ngày để quen văn phong Academic.' }, | |
| { icon: '🎧', title: 'Podcast tiếng Anh', desc: 'TED Talks, BBC Global News — nghe trong lúc đi lại để tận dụng thời gian rảnh.' }, | |
| { icon: '✍️', title: 'Viết nhật ký', desc: 'Viết 100-150 từ về ngày hôm nay bằng tiếng Anh để duy trì kỹ năng writing.' }, | |
| ], | |
| }, | |
| ] | |
| </script> | |