AnhviNguyen
Forecast, dashboard, pronunciation, nginx fixes (exclude large ML weights)
3092643
Raw
History Blame Contribute Delete
13.7 kB
<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>