這是 vTaiwan Neo 的 Vue 版本,使用 Vue 3 + Vite + Tailwind CSS + Firebase 建構。
本專案的後端也是開源的,分為兩個專案:
- Jisti視訊服務的JWT生成: https://github.com/g0v/vtaiwan-jaas-jwt-worker
- 音訊轉錄、逐字稿管理與AI大綱整理: https://github.com/g0v/vtaiwan-transcription-worker
- 🏠 首頁展示(完整複刻原始設計)
- 📝 部落格系統(支援 Markdown 渲染)
- 🔐 Google 登入(全域狀態管理)
- ✍️ 發布文章功能
- 📱 響應式設計
- 🎨 Tailwind CSS 樣式系統
- 🔷 TypeScript 支援
- 📊 專案管理頁面
- 📅 會議管理頁面
- ❓ FAQ 頁面
- 👥 貢獻者頁面
- ℹ️ 關於我們頁面
- 🎥 即時視訊頁面,(支援即時逐字稿共同校對功能,開發中,目前只限英文可以運作)
- 前端框架: Vue 3 (Composition API)
- 建置工具: Vite
- 路由: Vue Router 4
- 樣式: Tailwind CSS
- 圖標: Lucide Vue Next
- 後端服務: Firebase
- Authentication (Google 登入)
- Realtime Database (部落格資料)
- Markdown 渲染: Marked
- 語言: JavaScript / TypeScript
- 安裝依賴:
npm install- 啟動開發伺服器:
npm run dev- 類型檢查:
npm run type-check- 建置生產版本:
npm run build- 預覽生產版本Preview:
npm run previewsrc/
├── components/ # Vue 組件
│ ├── Header.vue # 頁面標題(含導航和登入)
│ ├── Footer.vue # 頁尾組件
│ ├── IconWrapper.vue # 圖標包裝組件
│ ├── LanguageSwitcher.vue # 語言切換器
│ ├── NewsCarousel.vue # 新聞輪播組件
│ └── GoogleLogin.vue # Google 登入組件
├── views/ # 頁面視圖
│ ├── HomeView.vue # 首頁
│ ├── BlogsView.vue # 部落格列表
│ ├── BlogDetailView.vue # 部落格詳情(支援 Markdown)
│ ├── PostBlogView.vue # 發布文章
│ ├── ProjectsView.vue # 專案列表
│ ├── MeetupsView.vue # 會議列表
│ ├── FAQView.vue # 常見問題
│ ├── AboutView.vue # 關於我們
│ └── ContributorsView.vue # 貢獻者
├── data/ # 靜態資料檔案
│ ├── projects.ts # 專案資料
│ ├── meetups.ts # 會議資料
│ └── faqs.ts # FAQ 資料
├── router/ # 路由配置
│ └── index.ts
├── lib/ # 工具函數
│ └── firebase.ts # Firebase 配置
├── assets/ # 靜態資源
│ └── images/ # 圖片資源
└── style.css # 全域樣式
/- 首頁/blogs- 部落格列表/blogs/:title- 部落格詳情(動態路由,支援中文標題)/post_blog- 發布新文章/projects- 專案列表/meetups- 會議列表/faq- 常見問題/about- 關於我們/contributors- 貢獻者
專案使用靜態資料檔案來管理內容,方便協作和維護:
- 用途: 管理專案列表資料
- 內容: 專案標題、描述、狀態、圖標、分類、參與人數
- 協作方式: 新增專案、修改專案資訊、更新狀態
- 用途: 管理會議資料
- 內容: 會議標題、日期、時間、地點、描述、相關專案
- 協作方式: 新增會議、更新會議資訊、管理報名連結
- 用途: 管理常見問題與答案
- 內容: 問題、答案、詳細說明列表
- 協作方式: 新增問題、更新答案、補充詳細說明
- 響應式導航選單
- Google 登入狀態管理
- 語言切換器
- 行動裝置選單
- 統一圖標管理
- 支援 Lucide 圖標庫
- 顏色和尺寸自訂
- Google 登入功能
- 用戶資料管理
- 登入狀態同步
專案使用 Firebase 作為後端服務:
- Authentication: Google 登入
- Realtime Database: 部落格文章儲存
- 資料結構:
/blogs/{id} - title: 標題 - content: 內容 (Markdown) - author: 作者 - date: 日期 - tags: 標籤陣列
- Firebase 配置: 確保
.env檔案包含正確的 Firebase 配置 - 中文標題處理: 動態路由使用
encodeURIComponent處理中文標題 - Markdown 支援: 使用
marked套件渲染部落格內容 - 響應式設計: 所有頁面都支援行動裝置和桌面版
- 圖標管理: 統一使用
IconWrapper組件管理圖標 - 靜態資料: 新增內容時優先使用
src/data/中的靜態檔案
- 編輯
src/data/projects.ts - 在
projects陣列中新增專案資料 - 確保圖標名稱在 Lucide 圖標庫中存在
- 編輯
src/data/meetups.ts - 在
meetups陣列中新增會議資料 - 設定正確的日期格式 (YYYY-MM-DD)
- 編輯
src/data/faqs.ts - 在
faqs陣列中新增問題和答案 - 可選的
details陣列用於詳細說明
- 使用 Tailwind CSS 類別
- 自訂樣式放在組件的
<style>區塊 - 全域樣式修改
src/style.css
- 建置專案:
npm run build- 部署到 Firebase Hosting:
firebase deployThis is the Vue version of vTaiwan Neo, built with Vue 3 + Vite + Tailwind CSS + Firebase.
The backend of this project is also open source and consists of two projects:
- JWT generation for Jitsi video service: https://github.com/g0v/vtaiwan-jaas-jwt-worker
- Audio transcription, transcript management, and AI outline generation: https://github.com/g0v/vtaiwan-transcription-worker
- 🏠 Homepage display (complete replica of original design)
- 📝 Blog system (Markdown rendering support)
- 🔐 Google login (global state management)
- ✍️ Post articles functionality
- 📱 Responsive design
- 🎨 Tailwind CSS styling system
- 🔷 TypeScript support
- 📊 Project management page
- 📅 Meeting management page
- ❓ FAQ page
- 👥 Contributors page
- ℹ️ About Us page
- 🎥 Live video page (supports real-time transcript collaborative editing, in development, currently only works with English)
- Frontend Framework: Vue 3 (Composition API)
- Build Tool: Vite
- Routing: Vue Router 4
- Styling: Tailwind CSS
- Icons: Lucide Vue Next
- Backend Service: Firebase
- Authentication (Google login)
- Realtime Database (blog data)
- Markdown Rendering: Marked
- Languages: JavaScript / TypeScript
- Install dependencies:
npm install- Start development server:
npm run dev- Type checking:
npm run type-check- Build production version:
npm run build- Preview production version:
npm run previewsrc/
├── components/ # Vue components
│ ├── Header.vue # Page header (navigation and login)
│ ├── Footer.vue # Footer component
│ ├── IconWrapper.vue # Icon wrapper component
│ ├── LanguageSwitcher.vue # Language switcher
│ ├── NewsCarousel.vue # News carousel component
│ └── GoogleLogin.vue # Google login component
├── views/ # Page views
│ ├── HomeView.vue # Homepage
│ ├── BlogsView.vue # Blog list
│ ├── BlogDetailView.vue # Blog detail (Markdown support)
│ ├── PostBlogView.vue # Post article
│ ├── ProjectsView.vue # Project list
│ ├── MeetupsView.vue # Meeting list
│ ├── FAQView.vue # FAQ
│ ├── AboutView.vue # About Us
│ └── ContributorsView.vue # Contributors
├── data/ # Static data files
│ ├── projects.ts # Project data
│ ├── meetups.ts # Meeting data
│ └── faqs.ts # FAQ data
├── router/ # Route configuration
│ └── index.ts
├── lib/ # Utility functions
│ └── firebase.ts # Firebase configuration
├── assets/ # Static resources
│ └── images/ # Image resources
└── style.css # Global styles
/- Homepage/blogs- Blog list/blogs/:title- Blog detail (dynamic route, supports Chinese titles)/post_blog- Post new article/projects- Project list/meetups- Meeting list/faq- FAQ/about- About Us/contributors- Contributors
The project uses static data files to manage content, making collaboration and maintenance easier:
- Purpose: Manage project list data
- Content: Project title, description, status, icon, category, participant count
- Collaboration: Add projects, modify project information, update status
- Purpose: Manage meeting data
- Content: Meeting title, date, time, location, description, related projects
- Collaboration: Add meetings, update meeting information, manage registration links
- Purpose: Manage frequently asked questions and answers
- Content: Questions, answers, detailed explanation lists
- Collaboration: Add questions, update answers, supplement detailed explanations
- Responsive navigation menu
- Google login state management
- Language switcher
- Mobile menu
- Unified icon management
- Supports Lucide icon library
- Customizable colors and sizes
- Google login functionality
- User data management
- Login state synchronization
The project uses Firebase as backend service:
- Authentication: Google login
- Realtime Database: Blog article storage
- Data Structure:
/blogs/{id} - title: Title - content: Content (Markdown) - author: Author - date: Date - tags: Tags array
- Firebase Configuration: Ensure
.envfile contains correct Firebase configuration - Chinese Title Handling: Dynamic routes use
encodeURIComponentto handle Chinese titles - Markdown Support: Uses
markedpackage to render blog content - Responsive Design: All pages support mobile and desktop versions
- Icon Management: Use
IconWrappercomponent uniformly for icon management - Static Data: Prioritize using static files in
src/data/when adding content
- Edit
src/data/projects.ts - Add project data to the
projectsarray - Ensure icon names exist in the Lucide icon library
- Edit
src/data/meetups.ts - Add meeting data to the
meetupsarray - Set correct date format (YYYY-MM-DD)
- Edit
src/data/faqs.ts - Add questions and answers to the
faqsarray - Optional
detailsarray for detailed explanations
- Use Tailwind CSS classes
- Custom styles in component
<style>blocks - Global styles modify
src/style.css
- Build the project:
npm run build- Deploy to Firebase Hosting:
firebase deploy