
一个集成DeepSeek AI、支持PWA的现代化塔罗牌Web应用开发实战分享 📖 前言
在这个快节奏的时代,人们越来越需要一些放松和自我探索的方式。塔罗牌作为一种古老的占卜工具,不仅具有神秘色彩,更是一种心理投射和自我反思的媒介。本文将分享如何使用现代前端技术栈,结合AI能力,打造一个功能完整、体验优秀的塔罗牌占卜应用。
🎯 项目概览
核心功能
- 🤖 AI智能解读:集成DeepSeek API,提供个性化塔罗解读
- 🃏 多种牌阵:支持单张牌、三张牌、凯尔特十字等经典牌阵
- 📚 完整牌库:包含78张塔罗牌的详细信息和寓意
- 📝 历史记录:存储用户的占卜历史
- 🎨 沉浸式UI:神秘主题设计,流畅的动画效果
- 📱 PWA支持:可安装到桌面,支持离线访问
技术栈
- 前端框架:Vue 3 + Composition API
- 开发语言:TypeScript
- 构建工具:Vite
- 状态管理:Pinia + 持久化插件
- UI组件:Ant Design Vue
- 样式方案:TailwindCSS
- AI服务:DeepSeek API
🏗️ 架构设计
项目结构
bash
src/
├── views/ # 页面组件
│ ├── Home.vue # 首页
│ ├── SpreadSelection.vue # 牌阵选择
│ ├── CardDrawing.vue # 抽牌页面
│ ├── ReadingResult.vue # 解读结果
│ ├── TarotLibrary.vue # 塔罗牌库
│ └── History.vue # 历史记录
├── stores/ # 状态管理
│ └── tarot.ts # 塔罗相关状态
├── services/ # 服务层
│ └── deepseek.ts # AI服务
└── router/ # 路由配置
└── index.ts
核心设计思路
1. 状态管理设计
使用Pinia进行状态管理,结合持久化插件实现数据本地存储:
typescript
export const useTarotStore = defineStore('tarot', {
state: (): TarotState => ({
selectedSpread: null,
currentQuestion: '',
drawnCards: [],
readingHistory: [],
dailyUsage: {
date: new Date().toDateString(),
count: 0,
maxCount: 3
},
tarotCards: TAROT_CARDS_DATA
}),
actions: {
drawCards(count: number) {
// 随机抽取指定数量的牌
},
saveReading(reading: ReadingRecord) {
// 保存占卜记录
}
}
}, {
persist: true // 启用持久化
})
2. AI服务集成
封装DeepSeek API调用,提供智能解读能力:
typescript
class DeepSeekService {
private buildPrompt(spread: string, question: string, cards: DrawnCard[]): string {
return `你是一位专业的塔罗牌解读师...
牌阵类型:${spread}
问题:${question}
抽到的牌:${cards.map(card => `${card.name}(${card.isReversed ? '逆位' : '正位'})`).join('、')}
请提供详细的解读...`
}
async generateReading(request: AIReadingRequest): Promise<AIReadingResponse> {
try {
const response = await fetch('/api/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.apiKey}`
},
body: JSON.stringify({
model: 'deepseek-chat',
messages: [{
role: 'user',
content: this.buildPrompt(request.spread, request.question, request.cards)
}]
})
})
// 处理响应...
} catch (error) {
// 降级到本地解读
return this.generateFallbackReading(request)
}
}
}
🎨 用户体验优化
1. 神秘主题设计
使用深色主题配合金色点缀,营造神秘氛围:
css
/* 主题色彩 */
:root {
--primary-bg: #1a1a2e;
--secondary-bg: #16213e;
--accent-color: #ffd700;
--text-primary: #ffffff;
--text-secondary: #cccccc;
}
/* 卡牌翻转动画 */
.card-flip {
transform-style: preserve-3d;
transition: transform 0.6s;
}
.card-flip.flipped {
transform: rotateY(180deg);
}
2. 响应式设计
使用TailwindCSS实现完美的移动端适配:
vue
<template>
<div class="min-h-screen bg-gradient-to-br from-purple-900 via-blue-900 to-indigo-900">
<!-- 标题自适应字体大小 -->
<h1 class="text-4xl sm:text-5xl md:text-6xl lg:text-7xl xl:text-8xl font-bold text-center text-transparent bg-clip-text bg-gradient-to-r from-yellow-400 to-orange-500">
AI塔罗占卜
</h1>
<!-- 功能卡片网格布局 -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 p-6">
<article class="bg-white/10 backdrop-blur-sm rounded-xl p-6 hover:bg-white/20 transition-all duration-300 flex flex-col h-full">
<!-- 卡片内容 -->
</article>
</div>
</div>
</template>
3. 交互动画
添加流畅的过渡动画提升用户体验:
vue
<script setup>
import { ref, onMounted } from 'vue'
const cards = ref([])
const isDrawing = ref(false)
const drawCard = async () => {
isDrawing.value = true
// 模拟抽牌动画
await new Promise(resolve => setTimeout(resolve, 1000))
// 更新卡牌状态
cards.value = store.drawCards(3)
isDrawing.value = false
}
</script>
<template>
<transition-group name="card" tag="div" class="flex justify-center space-x-4">
<div
v-for="(card, index) in cards"
:key="card.id"
class="card transform transition-all duration-500 hover:scale-105"
:style="{ transitionDelay: `${index * 200}ms` }"
>
<!-- 卡牌内容 -->
</div>
</transition-group>
</template>
<style>
.card-enter-active {
transition: all 0.5s ease;
}
.card-enter-from {
opacity: 0;
transform: translateY(-50px) rotateY(90deg);
}
</style>
🚀 性能优化
1. 代码分割
使用Vue Router的懒加载实现按需加载:
typescript
const routes = [
{
path: '/',
name: 'Home',
component: () => import('../views/Home.vue')
},
{
path: '/spread-selection',
name: 'SpreadSelection',
component: () => import('../views/SpreadSelection.vue')
}
]
2. PWA配置
配置Service Worker实现离线访问:
javascript
// vite.config.ts
import { VitePWA } from 'vite-plugin-pwa'
export default defineConfig({
plugins: [
vue(),
VitePWA({
registerType: 'autoUpdate',
workbox: {
globPatterns: ['**/*.{js,css,html,ico,png,svg}']
},
manifest: {
name: 'AI塔罗占卜',
short_name: 'AI塔罗',
description: '专业的AI塔罗牌占卜应用',
theme_color: '#1a1a2e',
icons: [
{
src: 'pwa-192x192.png',
sizes: '192x192',
type: 'image/png'
}
]
}
})
]
})
🔧 开发实践
1. TypeScript类型定义
完善的类型定义提升开发体验:
typescript
interface TarotCard {
id: number
name: string
suit: 'major' | 'cups' | 'wands' | 'swords' | 'pentacles'
uprightMeaning: string
reversedMeaning: string
keywords: string[]
symbolism: string
description: string
}
interface DrawnCard extends TarotCard {
isReversed: boolean
position?: string
}
interface ReadingRecord {
id: string
timestamp: number
spread: string
question: string
cards: DrawnCard[]
interpretation: string
}
2. 错误处理
完善的错误处理机制:
typescript
// 全局错误处理
app.config.errorHandler = (err, vm, info) => {
console.error('Global error:', err, info)
// 发送错误报告
}
// API调用错误处理
const handleApiError = (error: Error) => {
if (error.name === 'NetworkError') {
message.error('网络连接失败,请检查网络设置')
} else {
message.error('服务暂时不可用,请稍后重试')
}
}
📊 SEO优化
1. 元标签配置
html
<!-- index.html -->
<meta name="description" content="专业的AI塔罗牌占卜应用,提供多种牌阵和智能解读">
<meta name="keywords" content="塔罗牌,占卜,AI,Vue3,TypeScript">
<meta property="og:title" content="AI塔罗占卜 - 专业的在线塔罗牌应用">
<meta property="og:description" content="体验AI驱动的塔罗牌占卜,多种牌阵选择,专业解读">
2. 结构化数据
html
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebApplication",
"name": "AI塔罗占卜",
"description": "专业的AI塔罗牌占卜应用",
"applicationCategory": "Entertainment",
"operatingSystem": "Any"
}
</script>
📈 数据统计
集成百度统计进行用户行为分析:
html
<!-- 百度统计代码 -->
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?your_site_id";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
🔮 未来规划
- 多语言支持:国际化配置,支持多种语言
- 社交分享:分享占卜结果到社交平台
- 个人中心:用户注册登录,云端同步数据
- 付费功能:高级牌阵和专业解读
- 移动端App:使用Capacitor打包原生应用
💡 总结
通过这个项目的开发实践,我们成功将传统的塔罗牌占卜与现代AI技术相结合,创造了一个既有神秘色彩又具备现代化用户体验的Web应用。本文分享了Vue 3生态系统的强大能力,以及如何通过合理的架构设计和技术选型,快速构建一个功能完整、性能优秀的现代化应用。 希望这个项目的技术分享能为大家在前端开发和AI应用集成方面提供一些参考和启发。如果你对技术实现有任何问题或建议,欢迎在评论区交流讨论!
🌐 在线体验 :younglina.wang/tarot/#/